@krizaka/ui 2.2.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.
- package/README.md +17 -7
- package/dist/{button-Cgfkg_3y.d.ts → button-BMAO7dKF.d.ts} +29 -2
- package/dist/button.d.ts +32 -5
- package/dist/button.js +62 -9
- package/dist/button.js.map +1 -1
- package/dist/chip-link.d.ts +53 -0
- package/dist/chip-link.js +32 -0
- package/dist/chip-link.js.map +1 -0
- package/dist/chunk-43PTCDTL.js +31 -0
- package/dist/chunk-43PTCDTL.js.map +1 -0
- package/dist/chunk-6ISW63JI.js +11 -0
- package/dist/chunk-6ISW63JI.js.map +1 -0
- package/dist/chunk-HAQWKORZ.js +117 -0
- package/dist/chunk-HAQWKORZ.js.map +1 -0
- package/dist/{chunk-FHYZSO2S.js → chunk-R6SDS7JM.js} +5 -3
- package/dist/chunk-R6SDS7JM.js.map +1 -0
- package/dist/chunk-RUPNPMP3.js +103 -0
- package/dist/chunk-RUPNPMP3.js.map +1 -0
- package/dist/chunk-VDR2EP6K.js +49 -0
- package/dist/chunk-VDR2EP6K.js.map +1 -0
- package/dist/chunk-WEVYKZIF.js +33 -0
- package/dist/chunk-WEVYKZIF.js.map +1 -0
- package/dist/command.d.ts +7 -7
- package/dist/command.js +3 -2
- package/dist/command.js.map +1 -1
- package/dist/confirm-button.d.ts +1 -1
- package/dist/confirm-button.js +2 -1
- package/dist/confirm-button.js.map +1 -1
- package/dist/{dialog-GQ4Nvuyf.d.ts → dialog-D42QwYb_.d.ts} +11 -1
- package/dist/dialog.d.ts +1 -1
- package/dist/dialog.js +3 -2
- package/dist/dialog.js.map +1 -1
- package/dist/glow-card.d.ts +20 -0
- package/dist/glow-card.js +30 -0
- package/dist/glow-card.js.map +1 -0
- package/dist/index.d.ts +2 -20
- package/dist/index.js +7 -64
- package/dist/index.js.map +1 -1
- package/dist/iso.d.ts +400 -0
- package/dist/iso.js +363 -0
- package/dist/iso.js.map +1 -0
- package/dist/loader.d.ts +206 -0
- package/dist/loader.js +138 -0
- package/dist/loader.js.map +1 -0
- package/dist/marquee.d.ts +33 -0
- package/dist/marquee.js +52 -0
- package/dist/marquee.js.map +1 -0
- package/dist/meter.d.ts +146 -0
- package/dist/meter.js +107 -0
- package/dist/meter.js.map +1 -0
- package/dist/motion.css +394 -3
- package/dist/motion.d.ts +46 -0
- package/dist/motion.js +10 -0
- package/dist/motion.js.map +1 -0
- package/dist/nav-bar.d.ts +178 -0
- package/dist/nav-bar.js +157 -0
- package/dist/nav-bar.js.map +1 -0
- package/dist/number-ticker.d.ts +32 -0
- package/dist/number-ticker.js +61 -0
- package/dist/number-ticker.js.map +1 -0
- package/dist/progress.d.ts +56 -1
- package/dist/progress.js +72 -25
- package/dist/progress.js.map +1 -1
- package/dist/skeleton.d.ts +18 -3
- package/dist/skeleton.js +9 -1
- package/dist/skeleton.js.map +1 -1
- package/dist/spinner.d.ts +21 -5
- package/dist/spinner.js +13 -12
- package/dist/spinner.js.map +1 -1
- package/dist/stepper.d.ts +112 -0
- package/dist/stepper.js +67 -0
- package/dist/stepper.js.map +1 -0
- package/dist/tabs.d.ts +1 -1
- package/dist/tabs.js +14 -8
- package/dist/tabs.js.map +1 -1
- package/dist/theme.d.ts +1 -1
- package/dist/theme.js +2 -1
- package/dist/theme.js.map +1 -1
- package/dist/toast.d.ts +39 -4
- package/dist/toast.js +81 -7
- package/dist/toast.js.map +1 -1
- package/package.json +148 -8
- package/registry/alert.json +1 -1
- package/registry/avatar.json +1 -1
- package/registry/badge.json +1 -1
- package/registry/button.json +232 -26
- package/registry/card.json +1 -1
- package/registry/checkbox.json +1 -1
- package/registry/chip-link.json +158 -0
- package/registry/chip.json +1 -1
- package/registry/command.json +1 -1
- package/registry/confirm-button.json +91 -7
- package/registry/countdown.json +1 -1
- package/registry/dialog.json +15 -7
- package/registry/dropdown-menu.json +1 -1
- package/registry/empty-state.json +1 -1
- package/registry/examples/button/error.js +11 -0
- package/registry/examples/button/error.tsx +10 -0
- package/registry/examples/button/loading.tsx +1 -1
- package/registry/examples/button/save-flow.d.ts +4 -0
- package/registry/examples/button/save-flow.js +28 -0
- package/registry/examples/button/save-flow.tsx +24 -0
- package/registry/examples/button/signature.d.ts +4 -0
- package/registry/examples/button/signature.js +17 -0
- package/registry/examples/button/signature.tsx +19 -0
- package/registry/examples/button/upload-progress.d.ts +4 -0
- package/registry/examples/button/upload-progress.js +23 -0
- package/registry/examples/button/upload-progress.tsx +26 -0
- package/registry/examples/chip-link/filters.d.ts +4 -0
- package/registry/examples/chip-link/filters.js +12 -0
- package/registry/examples/chip-link/filters.tsx +17 -0
- package/registry/examples/dialog/left.d.ts +4 -0
- package/registry/examples/dialog/left.js +22 -0
- package/registry/examples/dialog/left.tsx +32 -0
- package/registry/examples/glow-card/link-card.d.ts +4 -0
- package/registry/examples/glow-card/link-card.js +14 -0
- package/registry/examples/glow-card/link-card.tsx +13 -0
- package/registry/examples/glow-card/plans.d.ts +4 -0
- package/registry/examples/glow-card/plans.js +25 -0
- package/registry/examples/glow-card/plans.tsx +26 -0
- package/registry/examples/glow-card/spotlight.d.ts +4 -0
- package/registry/examples/glow-card/spotlight.js +14 -0
- package/registry/examples/glow-card/spotlight.tsx +15 -0
- package/registry/examples/iso/compose.d.ts +4 -0
- package/registry/examples/iso/compose.js +22 -0
- package/registry/examples/iso/compose.tsx +19 -0
- package/registry/examples/iso/orazaka-hero.d.ts +4 -0
- package/registry/examples/iso/orazaka-hero.js +26 -0
- package/registry/examples/iso/orazaka-hero.tsx +21 -0
- package/registry/examples/iso/orochia-hero.d.ts +4 -0
- package/registry/examples/iso/orochia-hero.js +29 -0
- package/registry/examples/iso/orochia-hero.tsx +23 -0
- package/registry/examples/iso/still.d.ts +4 -0
- package/registry/examples/iso/still.js +21 -0
- package/registry/examples/iso/still.tsx +15 -0
- package/registry/examples/loader/endings.d.ts +4 -0
- package/registry/examples/loader/endings.js +14 -0
- package/registry/examples/loader/endings.tsx +11 -0
- package/registry/examples/loader/fetch-flow.d.ts +4 -0
- package/registry/examples/loader/fetch-flow.js +24 -0
- package/registry/examples/loader/fetch-flow.tsx +24 -0
- package/registry/examples/loader/minimal.d.ts +4 -0
- package/registry/examples/loader/minimal.js +11 -0
- package/registry/examples/loader/minimal.tsx +6 -0
- package/registry/examples/loader/overlay.d.ts +4 -0
- package/registry/examples/loader/overlay.js +16 -0
- package/registry/examples/loader/overlay.tsx +13 -0
- package/registry/examples/loader/region-handover.d.ts +4 -0
- package/registry/examples/loader/region-handover.js +42 -0
- package/registry/examples/loader/region-handover.tsx +29 -0
- package/registry/examples/loader/upload-eta.d.ts +4 -0
- package/registry/examples/loader/upload-eta.js +11 -0
- package/registry/examples/loader/upload-eta.tsx +10 -0
- package/registry/examples/marquee/cards.d.ts +4 -0
- package/registry/examples/marquee/cards.js +23 -0
- package/registry/examples/marquee/cards.tsx +21 -0
- package/registry/examples/marquee/logos.d.ts +4 -0
- package/registry/examples/marquee/logos.js +12 -0
- package/registry/examples/marquee/logos.tsx +17 -0
- package/registry/examples/meter/balance.d.ts +4 -0
- package/registry/examples/meter/balance.js +14 -0
- package/registry/examples/meter/balance.tsx +15 -0
- package/registry/examples/meter/quota.d.ts +4 -0
- package/registry/examples/meter/quota.js +15 -0
- package/registry/examples/meter/quota.tsx +12 -0
- package/registry/examples/meter/split.d.ts +4 -0
- package/registry/examples/meter/split.js +18 -0
- package/registry/examples/meter/split.tsx +18 -0
- package/registry/examples/nav-bar/app-bar.d.ts +4 -0
- package/registry/examples/nav-bar/app-bar.js +22 -0
- package/registry/examples/nav-bar/app-bar.tsx +21 -0
- package/registry/examples/nav-bar/menu-open.d.ts +4 -0
- package/registry/examples/nav-bar/menu-open.js +26 -0
- package/registry/examples/nav-bar/menu-open.tsx +26 -0
- package/registry/examples/nav-bar/site.d.ts +4 -0
- package/registry/examples/nav-bar/site.js +31 -0
- package/registry/examples/nav-bar/site.tsx +36 -0
- package/registry/examples/number-ticker/gradient.d.ts +4 -0
- package/registry/examples/number-ticker/gradient.js +11 -0
- package/registry/examples/number-ticker/gradient.tsx +10 -0
- package/registry/examples/number-ticker/live-total.d.ts +4 -0
- package/registry/examples/number-ticker/live-total.js +17 -0
- package/registry/examples/number-ticker/live-total.tsx +21 -0
- package/registry/examples/number-ticker/stats.d.ts +4 -0
- package/registry/examples/number-ticker/stats.js +19 -0
- package/registry/examples/number-ticker/stats.tsx +23 -0
- package/registry/examples/progress/buffer.d.ts +4 -0
- package/registry/examples/progress/buffer.js +11 -0
- package/registry/examples/progress/buffer.tsx +10 -0
- package/registry/examples/progress/statuses.d.ts +4 -0
- package/registry/examples/progress/statuses.js +14 -0
- package/registry/examples/progress/statuses.tsx +11 -0
- package/registry/examples/progress/steps.d.ts +4 -0
- package/registry/examples/progress/steps.js +14 -0
- package/registry/examples/progress/steps.tsx +13 -0
- package/registry/examples/progress/upload.d.ts +4 -0
- package/registry/examples/progress/upload.js +11 -0
- package/registry/examples/progress/upload.tsx +10 -0
- package/registry/examples/skeleton/paragraph.d.ts +4 -0
- package/registry/examples/skeleton/paragraph.js +14 -0
- package/registry/examples/skeleton/paragraph.tsx +12 -0
- package/registry/examples/skeleton/shape-of-content.d.ts +4 -0
- package/registry/examples/skeleton/shape-of-content.js +23 -0
- package/registry/examples/skeleton/shape-of-content.tsx +26 -0
- package/registry/examples/spinner/default.js +5 -2
- package/registry/examples/spinner/default.tsx +7 -1
- package/registry/examples/spinner/sizes.js +2 -1
- package/registry/examples/spinner/sizes.tsx +2 -0
- package/registry/examples/spinner/value.d.ts +4 -0
- package/registry/examples/spinner/value.js +11 -0
- package/registry/examples/spinner/value.tsx +12 -0
- package/registry/examples/stepper/checkout.d.ts +4 -0
- package/registry/examples/stepper/checkout.js +22 -0
- package/registry/examples/stepper/checkout.tsx +17 -0
- package/registry/examples/stepper/failed.d.ts +4 -0
- package/registry/examples/stepper/failed.js +26 -0
- package/registry/examples/stepper/failed.tsx +21 -0
- package/registry/examples/stepper/job.d.ts +4 -0
- package/registry/examples/stepper/job.js +32 -0
- package/registry/examples/stepper/job.tsx +28 -0
- package/registry/examples/toast/grouped.d.ts +4 -0
- package/registry/examples/toast/grouped.js +21 -0
- package/registry/examples/toast/grouped.tsx +23 -0
- package/registry/examples/toast/undo.d.ts +4 -0
- package/registry/examples/toast/undo.js +29 -0
- package/registry/examples/toast/undo.tsx +30 -0
- package/registry/examples/toast/upload-progress.d.ts +4 -0
- package/registry/examples/toast/upload-progress.js +29 -0
- package/registry/examples/toast/upload-progress.tsx +31 -0
- package/registry/field.json +1 -1
- package/registry/glow-card.json +162 -0
- package/registry/index.json +191 -20
- package/registry/iso.json +1355 -0
- package/registry/kbd.json +1 -1
- package/registry/loader.json +399 -0
- package/registry/marquee.json +225 -0
- package/registry/mascots.json +3 -3
- package/registry/meter.json +324 -0
- package/registry/nav-bar.json +480 -0
- package/registry/number-ticker.json +219 -0
- package/registry/page-header.json +1 -1
- package/registry/popover.json +1 -1
- package/registry/progress.json +116 -11
- package/registry/radio-group.json +1 -1
- package/registry/section-backdrop.json +1 -1
- package/registry/separator.json +1 -1
- package/registry/skeleton.json +69 -13
- package/registry/slider.json +1 -1
- package/registry/slot.json +1 -1
- package/registry/spinner.json +91 -27
- package/registry/stat.json +1 -1
- package/registry/stepper.json +174 -0
- package/registry/switch.json +1 -1
- package/registry/tabs.json +11 -7
- package/registry/theme.json +3 -3
- package/registry/toast.json +41 -13
- package/registry/tooltip.json +1 -1
- package/dist/chunk-FHYZSO2S.js.map +0 -1
- package/dist/chunk-PESA2R4U.js +0 -51
- package/dist/chunk-PESA2R4U.js.map +0 -1
- package/registry/examples/spinner/muted.js +0 -11
- package/registry/examples/spinner/muted.tsx +0 -6
- /package/registry/examples/{spinner/muted.d.ts → button/error.d.ts} +0 -0
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import * as tailwind_variants from 'tailwind-variants';
|
|
2
|
+
import { NavigationMenu } from 'radix-ui';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
|
|
5
|
+
declare const navBar: tailwind_variants.TVReturnType<{
|
|
6
|
+
floating: {
|
|
7
|
+
true: {
|
|
8
|
+
root: string;
|
|
9
|
+
};
|
|
10
|
+
false: {
|
|
11
|
+
root: string;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
}, {
|
|
15
|
+
root: string;
|
|
16
|
+
brand: string;
|
|
17
|
+
items: string;
|
|
18
|
+
list: string;
|
|
19
|
+
item: string;
|
|
20
|
+
chevron: string;
|
|
21
|
+
viewport: string;
|
|
22
|
+
panel: string;
|
|
23
|
+
menuLink: string;
|
|
24
|
+
menuIcon: string;
|
|
25
|
+
menuTitle: string;
|
|
26
|
+
menuText: string;
|
|
27
|
+
actions: string;
|
|
28
|
+
toggle: string;
|
|
29
|
+
mobile: string;
|
|
30
|
+
mobileLink: string;
|
|
31
|
+
}, undefined, {
|
|
32
|
+
floating: {
|
|
33
|
+
true: {
|
|
34
|
+
root: string;
|
|
35
|
+
};
|
|
36
|
+
false: {
|
|
37
|
+
root: string;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
}, {
|
|
41
|
+
root: string;
|
|
42
|
+
brand: string;
|
|
43
|
+
items: string;
|
|
44
|
+
list: string;
|
|
45
|
+
item: string;
|
|
46
|
+
chevron: string;
|
|
47
|
+
viewport: string;
|
|
48
|
+
panel: string;
|
|
49
|
+
menuLink: string;
|
|
50
|
+
menuIcon: string;
|
|
51
|
+
menuTitle: string;
|
|
52
|
+
menuText: string;
|
|
53
|
+
actions: string;
|
|
54
|
+
toggle: string;
|
|
55
|
+
mobile: string;
|
|
56
|
+
mobileLink: string;
|
|
57
|
+
}, tailwind_variants.TVReturnTypeLike<{
|
|
58
|
+
floating: {
|
|
59
|
+
true: {
|
|
60
|
+
root: string;
|
|
61
|
+
};
|
|
62
|
+
false: {
|
|
63
|
+
root: string;
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
}, {
|
|
67
|
+
root: string;
|
|
68
|
+
brand: string;
|
|
69
|
+
items: string;
|
|
70
|
+
list: string;
|
|
71
|
+
item: string;
|
|
72
|
+
chevron: string;
|
|
73
|
+
viewport: string;
|
|
74
|
+
panel: string;
|
|
75
|
+
menuLink: string;
|
|
76
|
+
menuIcon: string;
|
|
77
|
+
menuTitle: string;
|
|
78
|
+
menuText: string;
|
|
79
|
+
actions: string;
|
|
80
|
+
toggle: string;
|
|
81
|
+
mobile: string;
|
|
82
|
+
mobileLink: string;
|
|
83
|
+
}>>;
|
|
84
|
+
type NavBarRootProps = React.ComponentProps<"header"> & {
|
|
85
|
+
/** The accessible name of the navigation (“Main”) — passed translated. */
|
|
86
|
+
label: string;
|
|
87
|
+
/**
|
|
88
|
+
* Pixels of scroll after which the bar tightens (denser, lower, lifted). `false`: never.
|
|
89
|
+
* @default 24
|
|
90
|
+
*/
|
|
91
|
+
compactAfter?: number | false;
|
|
92
|
+
/**
|
|
93
|
+
* A floating pill (the Krizaka bar) or a full-width bar with a hairline under it.
|
|
94
|
+
* @default true
|
|
95
|
+
*/
|
|
96
|
+
floating?: boolean;
|
|
97
|
+
};
|
|
98
|
+
/** The bar. Place it in a `sticky top-3` (floating) or `sticky top-0` wrapper — or let it scroll. */
|
|
99
|
+
declare function NavBarRoot({ label, compactAfter, floating, className, children, ...props }: NavBarRootProps): React.JSX.Element;
|
|
100
|
+
type NavBarBrandProps = React.ComponentProps<"a"> & {
|
|
101
|
+
/** Renders your link (a router `<Link>`) with the brand's look. */
|
|
102
|
+
asChild?: boolean;
|
|
103
|
+
};
|
|
104
|
+
/** The brand: a mark and a name, linking home. */
|
|
105
|
+
declare function NavBarBrand({ asChild, className, ...props }: NavBarBrandProps): React.JSX.Element;
|
|
106
|
+
/** The desktop navigation: links and menus, with the light that glides between them. Hidden below `md` (see `NavBar.Mobile`). */
|
|
107
|
+
declare function NavBarItems({ className, children, ...props }: Omit<React.ComponentProps<typeof NavigationMenu.Root>, "orientation">): React.JSX.Element;
|
|
108
|
+
type NavBarLinkProps = Omit<React.ComponentProps<typeof NavigationMenu.Link>, "active"> & {
|
|
109
|
+
/** The current page: `aria-current="page"`, and the light rests on it. */
|
|
110
|
+
active?: boolean;
|
|
111
|
+
};
|
|
112
|
+
/** A link of the bar. `asChild` renders your router's `<Link>`. */
|
|
113
|
+
declare function NavBarLink({ active, className, ...props }: NavBarLinkProps): React.JSX.Element;
|
|
114
|
+
type NavBarMenuProps = Omit<React.ComponentProps<typeof NavigationMenu.Item>, "children"> & {
|
|
115
|
+
/** The trigger's words (“Products”) — passed translated. */
|
|
116
|
+
label: string;
|
|
117
|
+
/** The current page is inside this menu: the light rests on its trigger. */
|
|
118
|
+
active?: boolean;
|
|
119
|
+
/** The menu's links (`NavBar.MenuLink`), laid out in a panel; `columns` sets the grid. */
|
|
120
|
+
children: React.ReactNode;
|
|
121
|
+
/**
|
|
122
|
+
* Columns of the panel.
|
|
123
|
+
* @default 1
|
|
124
|
+
*/
|
|
125
|
+
columns?: 1 | 2;
|
|
126
|
+
};
|
|
127
|
+
/** A menu of the bar: its trigger, and its links in a panel that opens under the bar. */
|
|
128
|
+
declare function NavBarMenu({ label, active, columns, children, className, ...props }: NavBarMenuProps): React.JSX.Element;
|
|
129
|
+
type NavBarMenuLinkProps = Omit<React.ComponentProps<typeof NavigationMenu.Link>, "title" | "active"> & {
|
|
130
|
+
/** The link's name — passed translated. */
|
|
131
|
+
title: string;
|
|
132
|
+
/** One line under it — passed translated. */
|
|
133
|
+
description?: string;
|
|
134
|
+
/** An icon (a signature icon of `@krizaka/icons`: its node lights up on hover). */
|
|
135
|
+
icon?: React.ReactNode;
|
|
136
|
+
/** The current page. */
|
|
137
|
+
active?: boolean;
|
|
138
|
+
};
|
|
139
|
+
/** A link inside a menu: an icon, a name and a line of text. */
|
|
140
|
+
declare function NavBarMenuLink({ title, description, icon, active, href, className, asChild, children, ...props }: NavBarMenuLinkProps): React.JSX.Element;
|
|
141
|
+
/** The right side: search, theme, language, the call to action. */
|
|
142
|
+
declare function NavBarActions({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
143
|
+
type NavBarMobileProps = React.ComponentProps<"nav"> & {
|
|
144
|
+
/** The toggle's name when closed (“Open the menu”) — passed translated. */
|
|
145
|
+
openLabel: string;
|
|
146
|
+
/** The toggle's name when open (“Close the menu”) — passed translated. */
|
|
147
|
+
closeLabel: string;
|
|
148
|
+
};
|
|
149
|
+
/**
|
|
150
|
+
* Below `md`: a toggle, and a panel under the bar with its links (`NavBar.MobileLink`). A disclosure: Escape and a click
|
|
151
|
+
* on a link close it, the focus returns to the toggle.
|
|
152
|
+
*/
|
|
153
|
+
declare function NavBarMobile({ openLabel, closeLabel, className, children, ...props }: NavBarMobileProps): React.JSX.Element;
|
|
154
|
+
type NavBarMobileLinkProps = React.ComponentProps<"a"> & {
|
|
155
|
+
/** The current page. */
|
|
156
|
+
active?: boolean;
|
|
157
|
+
/** Renders your router's `<Link>`. */
|
|
158
|
+
asChild?: boolean;
|
|
159
|
+
};
|
|
160
|
+
/** A link of the mobile panel. */
|
|
161
|
+
declare function NavBarMobileLink({ active, asChild, className, ...props }: NavBarMobileLinkProps): React.JSX.Element;
|
|
162
|
+
/**
|
|
163
|
+
* `NavBar.Root/Brand/Items/Link/Menu/MenuLink/Actions/Mobile/MobileLink` — the Krizaka navigation bar: floating, tightening
|
|
164
|
+
* on scroll, one light gliding between its items, accessible menus, a mobile panel.
|
|
165
|
+
*/
|
|
166
|
+
declare const NavBar: {
|
|
167
|
+
Root: typeof NavBarRoot;
|
|
168
|
+
Brand: typeof NavBarBrand;
|
|
169
|
+
Items: typeof NavBarItems;
|
|
170
|
+
Link: typeof NavBarLink;
|
|
171
|
+
Menu: typeof NavBarMenu;
|
|
172
|
+
MenuLink: typeof NavBarMenuLink;
|
|
173
|
+
Actions: typeof NavBarActions;
|
|
174
|
+
Mobile: typeof NavBarMobile;
|
|
175
|
+
MobileLink: typeof NavBarMobileLink;
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
export { NavBar, NavBarActions, NavBarBrand, type NavBarBrandProps, NavBarItems, NavBarLink, type NavBarLinkProps, NavBarMenu, NavBarMenuLink, type NavBarMenuLinkProps, type NavBarMenuProps, NavBarMobile, NavBarMobileLink, type NavBarMobileLinkProps, type NavBarMobileProps, NavBarRoot, type NavBarRootProps, navBar };
|
package/dist/nav-bar.js
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
useSlidingIndicator
|
|
4
|
+
} from "./chunk-VDR2EP6K.js";
|
|
5
|
+
import {
|
|
6
|
+
cn
|
|
7
|
+
} from "./chunk-5AXLA4LK.js";
|
|
8
|
+
|
|
9
|
+
// src/nav-bar/nav-bar.tsx
|
|
10
|
+
import { NavigationMenu as Nav, Slot } from "radix-ui";
|
|
11
|
+
import * as React from "react";
|
|
12
|
+
import { tv } from "tailwind-variants";
|
|
13
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
14
|
+
var navBar = tv({
|
|
15
|
+
slots: {
|
|
16
|
+
root: "group/nav relative z-40 mx-auto flex h-14 w-full items-center gap-2 border-border-subtle bg-surface-1/75 backdrop-blur-xl backdrop-saturate-150 transition-[height,background-color,border-color,box-shadow] duration-300 motion-reduce:transition-none data-compact:h-12 data-compact:border-border-default data-compact:bg-surface-1/90 data-compact:shadow-lg",
|
|
17
|
+
brand: "mr-2 inline-flex shrink-0 items-center gap-2 font-display text-[15px] font-bold tracking-tight text-fg no-underline rounded-md focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring",
|
|
18
|
+
items: "relative hidden md:block",
|
|
19
|
+
list: "group/list relative isolate flex items-center gap-0.5 before:absolute before:left-0 before:top-0 before:-z-10 before:h-(--kz-ind-h) before:w-(--kz-ind-w) before:translate-x-(--kz-ind-x) before:translate-y-(--kz-ind-y) before:rounded-full before:bg-surface-3 before:opacity-0 before:transition-[translate,width,opacity] before:duration-300 motion-reduce:before:transition-none data-[indicator=on]:before:opacity-100",
|
|
20
|
+
item: "inline-flex h-9 select-none items-center gap-1 rounded-full px-3.5 text-sm font-medium text-fg-secondary no-underline transition-colors hover:text-fg data-active:text-fg data-[state=open]:text-fg focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring group-not-data-[indicator=on]/list:data-active:bg-surface-3",
|
|
21
|
+
chevron: "h-3.5 w-3.5 transition-transform duration-300 group-data-[state=open]/trigger:rotate-180 motion-reduce:transition-none",
|
|
22
|
+
viewport: "kz-pop absolute left-0 top-full mt-2 h-(--radix-navigation-menu-viewport-height) w-(--radix-navigation-menu-viewport-width) origin-top-left overflow-hidden rounded-2xl border border-border-default bg-surface-1 shadow-lg transition-[width,height] duration-300 motion-reduce:transition-none",
|
|
23
|
+
panel: "grid w-max max-w-[min(92vw,30rem)] gap-1 p-2",
|
|
24
|
+
menuLink: "group/link flex items-start gap-3 rounded-xl p-3 text-left no-underline outline-hidden transition-colors hover:bg-surface-2 focus-visible:bg-surface-2 focus-visible:ring-2 focus-visible:ring-ring data-active:bg-accent-soft",
|
|
25
|
+
menuIcon: "mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-border-default bg-surface-2 text-fg-accent transition-[transform,border-color] duration-300 group-hover/link:-translate-y-0.5 group-hover/link:border-accent [&>svg]:h-4.5 [&>svg]:w-4.5 motion-reduce:transform-none",
|
|
26
|
+
menuTitle: "block text-sm font-semibold text-fg",
|
|
27
|
+
menuText: "mt-0.5 block text-xs leading-relaxed text-fg-secondary",
|
|
28
|
+
actions: "ml-auto flex items-center gap-2",
|
|
29
|
+
toggle: "inline-flex h-9 w-9 items-center justify-center rounded-full border border-border-subtle bg-surface-2/60 text-fg md:hidden focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring",
|
|
30
|
+
mobile: "kz-pop absolute inset-x-0 top-full mt-2 grid gap-1 rounded-2xl border border-border-default bg-surface-1 p-2 shadow-lg md:hidden",
|
|
31
|
+
mobileLink: "flex items-center justify-between rounded-xl px-3 py-3 text-[15px] font-medium text-fg no-underline hover:bg-surface-2 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring aria-[current=page]:text-fg-accent"
|
|
32
|
+
},
|
|
33
|
+
variants: {
|
|
34
|
+
floating: {
|
|
35
|
+
true: { root: "max-w-5xl rounded-full border pl-5 pr-2 data-compact:max-w-4xl" },
|
|
36
|
+
false: { root: "border-b px-4 md:px-6" }
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
defaultVariants: { floating: true }
|
|
40
|
+
});
|
|
41
|
+
var s = navBar();
|
|
42
|
+
var Context = React.createContext(null);
|
|
43
|
+
var useNavBar = () => {
|
|
44
|
+
const ctx = React.useContext(Context);
|
|
45
|
+
if (!ctx) throw new Error("NavBar parts must be inside <NavBar.Root>.");
|
|
46
|
+
return ctx;
|
|
47
|
+
};
|
|
48
|
+
function NavBarRoot({ label, compactAfter = 24, floating = true, className, children, ...props }) {
|
|
49
|
+
const [compact, setCompact] = React.useState(false);
|
|
50
|
+
const [open, setOpen] = React.useState(false);
|
|
51
|
+
const panelId = React.useId();
|
|
52
|
+
React.useEffect(() => {
|
|
53
|
+
if (compactAfter === false) return;
|
|
54
|
+
const onScroll = () => setCompact(window.scrollY > compactAfter);
|
|
55
|
+
onScroll();
|
|
56
|
+
window.addEventListener("scroll", onScroll, { passive: true });
|
|
57
|
+
return () => window.removeEventListener("scroll", onScroll);
|
|
58
|
+
}, [compactAfter]);
|
|
59
|
+
const ctx = React.useMemo(() => ({ label, open, setOpen, panelId }), [label, open, panelId]);
|
|
60
|
+
return /* @__PURE__ */ jsx(Context.Provider, { value: ctx, children: /* @__PURE__ */ jsx("header", { "data-compact": compact ? "" : void 0, "data-floating": floating, className: navBar({ floating }).root({ className }), ...props, children }) });
|
|
61
|
+
}
|
|
62
|
+
function NavBarBrand({ asChild, className, ...props }) {
|
|
63
|
+
const Comp = asChild ? Slot.Root : "a";
|
|
64
|
+
return /* @__PURE__ */ jsx(Comp, { className: s.brand({ className }), ...props });
|
|
65
|
+
}
|
|
66
|
+
function NavBarItems({ className, children, ...props }) {
|
|
67
|
+
const { label } = useNavBar();
|
|
68
|
+
const { ref, handlers } = useSlidingIndicator({ item: "[data-nav-item]", active: "[data-nav-item][data-active]", follow: true });
|
|
69
|
+
return /* @__PURE__ */ jsxs(Nav.Root, { "aria-label": label, className: s.items({ className }), delayDuration: 80, ...props, children: [
|
|
70
|
+
/* @__PURE__ */ jsx(Nav.List, { ref, className: s.list(), ...handlers, children }),
|
|
71
|
+
/* @__PURE__ */ jsx(Nav.Viewport, { className: s.viewport() })
|
|
72
|
+
] });
|
|
73
|
+
}
|
|
74
|
+
function NavBarLink({ active, className, ...props }) {
|
|
75
|
+
return /* @__PURE__ */ jsx(Nav.Item, { children: /* @__PURE__ */ jsx(Nav.Link, { "data-nav-item": "", "data-active": active ? "" : void 0, active, "aria-current": active ? "page" : void 0, className: s.item({ className }), ...props }) });
|
|
76
|
+
}
|
|
77
|
+
function NavBarMenu({ label, active, columns = 1, children, className, ...props }) {
|
|
78
|
+
return /* @__PURE__ */ jsxs(Nav.Item, { className, ...props, children: [
|
|
79
|
+
/* @__PURE__ */ jsxs(Nav.Trigger, { "data-nav-item": "", "data-active": active ? "" : void 0, className: cn(s.item(), "group/trigger"), children: [
|
|
80
|
+
label,
|
|
81
|
+
/* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", className: s.chevron(), fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", "aria-hidden": true, children: /* @__PURE__ */ jsx("path", { d: "m6 9 6 6 6-6" }) })
|
|
82
|
+
] }),
|
|
83
|
+
/* @__PURE__ */ jsx(Nav.Content, { className: cn(s.panel(), columns === 2 && "md:grid-cols-2"), children })
|
|
84
|
+
] });
|
|
85
|
+
}
|
|
86
|
+
function NavBarMenuLink({ title, description, icon, active, href, className, asChild, children, ...props }) {
|
|
87
|
+
const body = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
88
|
+
icon && /* @__PURE__ */ jsx("span", { className: s.menuIcon(), children: icon }),
|
|
89
|
+
/* @__PURE__ */ jsxs("span", { className: "min-w-0", children: [
|
|
90
|
+
/* @__PURE__ */ jsx("span", { className: s.menuTitle(), children: title }),
|
|
91
|
+
description && /* @__PURE__ */ jsx("span", { className: s.menuText(), children: description })
|
|
92
|
+
] })
|
|
93
|
+
] });
|
|
94
|
+
return /* @__PURE__ */ jsx(Nav.Link, { asChild, href: asChild ? void 0 : href, active, "aria-current": active ? "page" : void 0, "data-active": active ? "" : void 0, className: s.menuLink({ className }), ...props, children: asChild && React.isValidElement(children) ? React.cloneElement(children, void 0, body) : body });
|
|
95
|
+
}
|
|
96
|
+
function NavBarActions({ className, ...props }) {
|
|
97
|
+
return /* @__PURE__ */ jsx("div", { className: s.actions({ className }), ...props });
|
|
98
|
+
}
|
|
99
|
+
function NavBarMobile({ openLabel, closeLabel, className, children, ...props }) {
|
|
100
|
+
const { label, open, setOpen, panelId } = useNavBar();
|
|
101
|
+
const toggle = React.useRef(null);
|
|
102
|
+
React.useEffect(() => {
|
|
103
|
+
if (!open) return;
|
|
104
|
+
const onKey = (e) => {
|
|
105
|
+
if (e.key !== "Escape") return;
|
|
106
|
+
setOpen(false);
|
|
107
|
+
toggle.current?.focus();
|
|
108
|
+
};
|
|
109
|
+
document.addEventListener("keydown", onKey);
|
|
110
|
+
return () => document.removeEventListener("keydown", onKey);
|
|
111
|
+
}, [open, setOpen]);
|
|
112
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
113
|
+
/* @__PURE__ */ jsx("button", { ref: toggle, type: "button", "aria-expanded": open, "aria-controls": panelId, "aria-label": open ? closeLabel : openLabel, onClick: () => setOpen(!open), className: s.toggle(), children: /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", className: "h-4.5 w-4.5", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", "aria-hidden": true, children: open ? /* @__PURE__ */ jsx("path", { d: "M18 6 6 18M6 6l12 12" }) : /* @__PURE__ */ jsx("path", { d: "M4 7h16M4 12h16M4 17h10" }) }) }),
|
|
114
|
+
open && /* @__PURE__ */ jsx(
|
|
115
|
+
"nav",
|
|
116
|
+
{
|
|
117
|
+
id: panelId,
|
|
118
|
+
"aria-label": label,
|
|
119
|
+
className: s.mobile({ className }),
|
|
120
|
+
onClick: (e) => {
|
|
121
|
+
if (e.target.closest("a")) setOpen(false);
|
|
122
|
+
},
|
|
123
|
+
...props,
|
|
124
|
+
children
|
|
125
|
+
}
|
|
126
|
+
)
|
|
127
|
+
] });
|
|
128
|
+
}
|
|
129
|
+
function NavBarMobileLink({ active, asChild, className, ...props }) {
|
|
130
|
+
const Comp = asChild ? Slot.Root : "a";
|
|
131
|
+
return /* @__PURE__ */ jsx(Comp, { "aria-current": active ? "page" : void 0, className: s.mobileLink({ className }), ...props });
|
|
132
|
+
}
|
|
133
|
+
var NavBar = {
|
|
134
|
+
Root: NavBarRoot,
|
|
135
|
+
Brand: NavBarBrand,
|
|
136
|
+
Items: NavBarItems,
|
|
137
|
+
Link: NavBarLink,
|
|
138
|
+
Menu: NavBarMenu,
|
|
139
|
+
MenuLink: NavBarMenuLink,
|
|
140
|
+
Actions: NavBarActions,
|
|
141
|
+
Mobile: NavBarMobile,
|
|
142
|
+
MobileLink: NavBarMobileLink
|
|
143
|
+
};
|
|
144
|
+
export {
|
|
145
|
+
NavBar,
|
|
146
|
+
NavBarActions,
|
|
147
|
+
NavBarBrand,
|
|
148
|
+
NavBarItems,
|
|
149
|
+
NavBarLink,
|
|
150
|
+
NavBarMenu,
|
|
151
|
+
NavBarMenuLink,
|
|
152
|
+
NavBarMobile,
|
|
153
|
+
NavBarMobileLink,
|
|
154
|
+
NavBarRoot,
|
|
155
|
+
navBar
|
|
156
|
+
};
|
|
157
|
+
//# sourceMappingURL=nav-bar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/nav-bar/nav-bar.tsx"],"sourcesContent":["// Client (scroll, a sliding indicator, menus). Radix NavigationMenu does the menus' semantics and keyboard (Enter, Space\n// and ↓ open; ↑ ↓ Home End walk; Escape closes and returns the focus; Tab out closes); this file draws the Krizaka bar:\n// a floating pill that tightens once the page scrolls, one light that glides to the item under the pointer or the\n// focus and rests on the current page, and a mobile panel that is a plain disclosure (no focus trap, Escape closes).\nimport { NavigationMenu as Nav, Slot } from \"radix-ui\";\nimport * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nimport { cn } from \"../cn\";\nimport { useSlidingIndicator } from \"../sliding-indicator\";\n\nexport const navBar = tv({\n slots: {\n root:\n \"group/nav relative z-40 mx-auto flex h-14 w-full items-center gap-2 border-border-subtle bg-surface-1/75 backdrop-blur-xl backdrop-saturate-150 \" +\n \"transition-[height,background-color,border-color,box-shadow] duration-300 motion-reduce:transition-none \" +\n \"data-compact:h-12 data-compact:border-border-default data-compact:bg-surface-1/90 data-compact:shadow-lg\",\n brand:\n \"mr-2 inline-flex shrink-0 items-center gap-2 font-display text-[15px] font-bold tracking-tight text-fg no-underline \" +\n \"rounded-md focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring\",\n items: \"relative hidden md:block\",\n list:\n \"group/list relative isolate flex items-center gap-0.5 \" +\n // The light: under the item that is pointed at or focused, resting on the current page.\n \"before:absolute before:left-0 before:top-0 before:-z-10 before:h-(--kz-ind-h) before:w-(--kz-ind-w) before:translate-x-(--kz-ind-x) before:translate-y-(--kz-ind-y) \" +\n \"before:rounded-full before:bg-surface-3 before:opacity-0 before:transition-[translate,width,opacity] before:duration-300 motion-reduce:before:transition-none \" +\n \"data-[indicator=on]:before:opacity-100\",\n item:\n \"inline-flex h-9 select-none items-center gap-1 rounded-full px-3.5 text-sm font-medium text-fg-secondary no-underline transition-colors \" +\n \"hover:text-fg data-active:text-fg data-[state=open]:text-fg focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring \" +\n // Before the light is ready (server render), the current page carries its own tint.\n \"group-not-data-[indicator=on]/list:data-active:bg-surface-3\",\n chevron: \"h-3.5 w-3.5 transition-transform duration-300 group-data-[state=open]/trigger:rotate-180 motion-reduce:transition-none\",\n viewport:\n \"kz-pop absolute left-0 top-full mt-2 h-(--radix-navigation-menu-viewport-height) w-(--radix-navigation-menu-viewport-width) origin-top-left overflow-hidden \" +\n \"rounded-2xl border border-border-default bg-surface-1 shadow-lg transition-[width,height] duration-300 motion-reduce:transition-none\",\n panel: \"grid w-max max-w-[min(92vw,30rem)] gap-1 p-2\",\n menuLink:\n \"group/link flex items-start gap-3 rounded-xl p-3 text-left no-underline outline-hidden transition-colors \" +\n \"hover:bg-surface-2 focus-visible:bg-surface-2 focus-visible:ring-2 focus-visible:ring-ring data-active:bg-accent-soft\",\n menuIcon:\n \"mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-border-default bg-surface-2 text-fg-accent \" +\n \"transition-[transform,border-color] duration-300 group-hover/link:-translate-y-0.5 group-hover/link:border-accent [&>svg]:h-4.5 [&>svg]:w-4.5 motion-reduce:transform-none\",\n menuTitle: \"block text-sm font-semibold text-fg\",\n menuText: \"mt-0.5 block text-xs leading-relaxed text-fg-secondary\",\n actions: \"ml-auto flex items-center gap-2\",\n toggle:\n \"inline-flex h-9 w-9 items-center justify-center rounded-full border border-border-subtle bg-surface-2/60 text-fg md:hidden \" +\n \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring\",\n mobile: \"kz-pop absolute inset-x-0 top-full mt-2 grid gap-1 rounded-2xl border border-border-default bg-surface-1 p-2 shadow-lg md:hidden\",\n mobileLink:\n \"flex items-center justify-between rounded-xl px-3 py-3 text-[15px] font-medium text-fg no-underline hover:bg-surface-2 \" +\n \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring aria-[current=page]:text-fg-accent\",\n },\n variants: {\n floating: {\n true: { root: \"max-w-5xl rounded-full border pl-5 pr-2 data-compact:max-w-4xl\" },\n false: { root: \"border-b px-4 md:px-6\" },\n },\n },\n defaultVariants: { floating: true },\n});\nconst s = navBar();\n\ninterface NavBarContext {\n label: string;\n open: boolean;\n setOpen: (open: boolean) => void;\n panelId: string;\n}\nconst Context = React.createContext<NavBarContext | null>(null);\nconst useNavBar = () => {\n const ctx = React.useContext(Context);\n if (!ctx) throw new Error(\"NavBar parts must be inside <NavBar.Root>.\");\n return ctx;\n};\n\nexport type NavBarRootProps = React.ComponentProps<\"header\"> & {\n /** The accessible name of the navigation (“Main”) — passed translated. */\n label: string;\n /**\n * Pixels of scroll after which the bar tightens (denser, lower, lifted). `false`: never.\n * @default 24\n */\n compactAfter?: number | false;\n /**\n * A floating pill (the Krizaka bar) or a full-width bar with a hairline under it.\n * @default true\n */\n floating?: boolean;\n};\n\n/** The bar. Place it in a `sticky top-3` (floating) or `sticky top-0` wrapper — or let it scroll. */\nexport function NavBarRoot({ label, compactAfter = 24, floating = true, className, children, ...props }: NavBarRootProps) {\n const [compact, setCompact] = React.useState(false);\n const [open, setOpen] = React.useState(false);\n const panelId = React.useId();\n React.useEffect(() => {\n if (compactAfter === false) return;\n const onScroll = () => setCompact(window.scrollY > compactAfter);\n onScroll();\n window.addEventListener(\"scroll\", onScroll, { passive: true });\n return () => window.removeEventListener(\"scroll\", onScroll);\n }, [compactAfter]);\n const ctx = React.useMemo(() => ({ label, open, setOpen, panelId }), [label, open, panelId]);\n return (\n <Context.Provider value={ctx}>\n <header data-compact={compact ? \"\" : undefined} data-floating={floating} className={navBar({ floating }).root({ className })} {...props}>\n {children}\n </header>\n </Context.Provider>\n );\n}\n\nexport type NavBarBrandProps = React.ComponentProps<\"a\"> & {\n /** Renders your link (a router `<Link>`) with the brand's look. */\n asChild?: boolean;\n};\n\n/** The brand: a mark and a name, linking home. */\nexport function NavBarBrand({ asChild, className, ...props }: NavBarBrandProps) {\n const Comp = asChild ? Slot.Root : \"a\";\n return <Comp className={s.brand({ className })} {...props} />;\n}\n\n/** The desktop navigation: links and menus, with the light that glides between them. Hidden below `md` (see `NavBar.Mobile`). */\nexport function NavBarItems({ className, children, ...props }: Omit<React.ComponentProps<typeof Nav.Root>, \"orientation\">) {\n const { label } = useNavBar();\n const { ref, handlers } = useSlidingIndicator<HTMLUListElement>({ item: \"[data-nav-item]\", active: \"[data-nav-item][data-active]\", follow: true });\n return (\n <Nav.Root aria-label={label} className={s.items({ className })} delayDuration={80} {...props}>\n <Nav.List ref={ref} className={s.list()} {...handlers}>\n {children}\n </Nav.List>\n <Nav.Viewport className={s.viewport()} />\n </Nav.Root>\n );\n}\n\nexport type NavBarLinkProps = Omit<React.ComponentProps<typeof Nav.Link>, \"active\"> & {\n /** The current page: `aria-current=\"page\"`, and the light rests on it. */\n active?: boolean;\n};\n\n/** A link of the bar. `asChild` renders your router's `<Link>`. */\nexport function NavBarLink({ active, className, ...props }: NavBarLinkProps) {\n return (\n <Nav.Item>\n <Nav.Link data-nav-item=\"\" data-active={active ? \"\" : undefined} active={active} aria-current={active ? \"page\" : undefined} className={s.item({ className })} {...props} />\n </Nav.Item>\n );\n}\n\nexport type NavBarMenuProps = Omit<React.ComponentProps<typeof Nav.Item>, \"children\"> & {\n /** The trigger's words (“Products”) — passed translated. */\n label: string;\n /** The current page is inside this menu: the light rests on its trigger. */\n active?: boolean;\n /** The menu's links (`NavBar.MenuLink`), laid out in a panel; `columns` sets the grid. */\n children: React.ReactNode;\n /**\n * Columns of the panel.\n * @default 1\n */\n columns?: 1 | 2;\n};\n\n/** A menu of the bar: its trigger, and its links in a panel that opens under the bar. */\nexport function NavBarMenu({ label, active, columns = 1, children, className, ...props }: NavBarMenuProps) {\n return (\n <Nav.Item className={className} {...props}>\n <Nav.Trigger data-nav-item=\"\" data-active={active ? \"\" : undefined} className={cn(s.item(), \"group/trigger\")}>\n {label}\n <svg viewBox=\"0 0 24 24\" className={s.chevron()} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" aria-hidden>\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </Nav.Trigger>\n <Nav.Content className={cn(s.panel(), columns === 2 && \"md:grid-cols-2\")}>{children}</Nav.Content>\n </Nav.Item>\n );\n}\n\nexport type NavBarMenuLinkProps = Omit<React.ComponentProps<typeof Nav.Link>, \"title\" | \"active\"> & {\n /** The link's name — passed translated. */\n title: string;\n /** One line under it — passed translated. */\n description?: string;\n /** An icon (a signature icon of `@krizaka/icons`: its node lights up on hover). */\n icon?: React.ReactNode;\n /** The current page. */\n active?: boolean;\n};\n\n/** A link inside a menu: an icon, a name and a line of text. */\nexport function NavBarMenuLink({ title, description, icon, active, href, className, asChild, children, ...props }: NavBarMenuLinkProps) {\n const body = (\n <>\n {icon && <span className={s.menuIcon()}>{icon}</span>}\n <span className=\"min-w-0\">\n <span className={s.menuTitle()}>{title}</span>\n {description && <span className={s.menuText()}>{description}</span>}\n </span>\n </>\n );\n return (\n <Nav.Link asChild={asChild} href={asChild ? undefined : href} active={active} aria-current={active ? \"page\" : undefined} data-active={active ? \"\" : undefined} className={s.menuLink({ className })} {...props}>\n {asChild && React.isValidElement<{ children?: React.ReactNode }>(children) ? React.cloneElement(children, undefined, body) : body}\n </Nav.Link>\n );\n}\n\n/** The right side: search, theme, language, the call to action. */\nexport function NavBarActions({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div className={s.actions({ className })} {...props} />;\n}\n\nexport type NavBarMobileProps = React.ComponentProps<\"nav\"> & {\n /** The toggle's name when closed (“Open the menu”) — passed translated. */\n openLabel: string;\n /** The toggle's name when open (“Close the menu”) — passed translated. */\n closeLabel: string;\n};\n\n/**\n * Below `md`: a toggle, and a panel under the bar with its links (`NavBar.MobileLink`). A disclosure: Escape and a click\n * on a link close it, the focus returns to the toggle.\n */\nexport function NavBarMobile({ openLabel, closeLabel, className, children, ...props }: NavBarMobileProps) {\n const { label, open, setOpen, panelId } = useNavBar();\n const toggle = React.useRef<HTMLButtonElement>(null);\n React.useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\") return;\n setOpen(false);\n toggle.current?.focus();\n };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [open, setOpen]);\n return (\n <>\n <button ref={toggle} type=\"button\" aria-expanded={open} aria-controls={panelId} aria-label={open ? closeLabel : openLabel} onClick={() => setOpen(!open)} className={s.toggle()}>\n <svg viewBox=\"0 0 24 24\" className=\"h-4.5 w-4.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" aria-hidden>\n {open ? <path d=\"M18 6 6 18M6 6l12 12\" /> : <path d=\"M4 7h16M4 12h16M4 17h10\" />}\n </svg>\n </button>\n {open && (\n <nav\n id={panelId}\n aria-label={label}\n className={s.mobile({ className })}\n onClick={(e) => {\n if ((e.target as Element).closest(\"a\")) setOpen(false);\n }}\n {...props}\n >\n {children}\n </nav>\n )}\n </>\n );\n}\n\nexport type NavBarMobileLinkProps = React.ComponentProps<\"a\"> & {\n /** The current page. */\n active?: boolean;\n /** Renders your router's `<Link>`. */\n asChild?: boolean;\n};\n\n/** A link of the mobile panel. */\nexport function NavBarMobileLink({ active, asChild, className, ...props }: NavBarMobileLinkProps) {\n const Comp = asChild ? Slot.Root : \"a\";\n return <Comp aria-current={active ? \"page\" : undefined} className={s.mobileLink({ className })} {...props} />;\n}\n\n/**\n * `NavBar.Root/Brand/Items/Link/Menu/MenuLink/Actions/Mobile/MobileLink` — the Krizaka navigation bar: floating, tightening\n * on scroll, one light gliding between its items, accessible menus, a mobile panel.\n */\nexport const NavBar = {\n Root: NavBarRoot,\n Brand: NavBarBrand,\n Items: NavBarItems,\n Link: NavBarLink,\n Menu: NavBarMenu,\n MenuLink: NavBarMenuLink,\n Actions: NavBarActions,\n Mobile: NavBarMobile,\n MobileLink: NavBarMobileLink,\n};\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
interface NumberTickerProps extends Omit<React.ComponentProps<"span">, "children"> {
|
|
4
|
+
/** The value to show. */
|
|
5
|
+
value: number;
|
|
6
|
+
/** The locale of the digits and separators (`"fr"`: 1 204,5) — the app's locale. */
|
|
7
|
+
locale?: string;
|
|
8
|
+
/** How to write it (`{ style: "currency", currency: "EUR" }`, `{ maximumFractionDigits: 1 }`…): Intl.NumberFormat options. */
|
|
9
|
+
format?: Intl.NumberFormatOptions;
|
|
10
|
+
/**
|
|
11
|
+
* `view`: climbs from 0 once, the first time it scrolls into view. `change`: each digit rolls to the new value
|
|
12
|
+
* whenever `value` changes (a live total).
|
|
13
|
+
* @default "view"
|
|
14
|
+
*/
|
|
15
|
+
trigger?: "view" | "change";
|
|
16
|
+
/**
|
|
17
|
+
* Milliseconds of the climb.
|
|
18
|
+
* @default 1100
|
|
19
|
+
*/
|
|
20
|
+
duration?: number;
|
|
21
|
+
/** Announce each new value politely (`trigger="change"`): a live total the reader should hear. */
|
|
22
|
+
announce?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Where the figure sits in the box its final width reserves.
|
|
25
|
+
* @default "end"
|
|
26
|
+
*/
|
|
27
|
+
align?: "start" | "end";
|
|
28
|
+
}
|
|
29
|
+
/** A figure that climbs into view, or rolls digit by digit to each new value. */
|
|
30
|
+
declare function NumberTicker({ value, locale, format, trigger, duration, announce, align, className, ...props }: NumberTickerProps): React.JSX.Element;
|
|
31
|
+
|
|
32
|
+
export { NumberTicker, type NumberTickerProps };
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
cx
|
|
4
|
+
} from "./chunk-6ISW63JI.js";
|
|
5
|
+
|
|
6
|
+
// src/number-ticker/number-ticker.tsx
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
var easeOut = (t) => 1 - Math.pow(1 - t, 4);
|
|
10
|
+
function NumberTicker({ value, locale, format, trigger = "view", duration = 1100, announce, align = "end", className, ...props }) {
|
|
11
|
+
const formatter = React.useMemo(() => new Intl.NumberFormat(locale, format), [locale, format]);
|
|
12
|
+
const text = formatter.format(value);
|
|
13
|
+
const live = React.useRef(null);
|
|
14
|
+
const [previous, setPrevious] = React.useState(value);
|
|
15
|
+
const [trend, setTrend] = React.useState(void 0);
|
|
16
|
+
if (value !== previous) {
|
|
17
|
+
setPrevious(value);
|
|
18
|
+
setTrend(value > previous ? "up" : "down");
|
|
19
|
+
}
|
|
20
|
+
React.useEffect(() => {
|
|
21
|
+
const el = live.current;
|
|
22
|
+
if (trigger !== "view" || !el || window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
|
|
23
|
+
let first = true;
|
|
24
|
+
let frame = 0;
|
|
25
|
+
const io = new IntersectionObserver(
|
|
26
|
+
([entry]) => {
|
|
27
|
+
const wasFirst = first;
|
|
28
|
+
first = false;
|
|
29
|
+
if (!entry?.isIntersecting) return;
|
|
30
|
+
io.disconnect();
|
|
31
|
+
if (wasFirst) return;
|
|
32
|
+
const start = performance.now();
|
|
33
|
+
const tick = (now) => {
|
|
34
|
+
const p = Math.min(1, (now - start) / duration);
|
|
35
|
+
el.textContent = formatter.format(value * easeOut(p));
|
|
36
|
+
if (p < 1) frame = requestAnimationFrame(tick);
|
|
37
|
+
};
|
|
38
|
+
el.textContent = formatter.format(0);
|
|
39
|
+
frame = requestAnimationFrame(tick);
|
|
40
|
+
},
|
|
41
|
+
{ threshold: 0.6 }
|
|
42
|
+
);
|
|
43
|
+
io.observe(el);
|
|
44
|
+
return () => {
|
|
45
|
+
io.disconnect();
|
|
46
|
+
cancelAnimationFrame(frame);
|
|
47
|
+
el.textContent = formatter.format(value);
|
|
48
|
+
};
|
|
49
|
+
}, [trigger, value, duration, formatter]);
|
|
50
|
+
return /* @__PURE__ */ jsxs("span", { "data-align": align, "data-trend": trigger === "change" ? trend : void 0, className: cx("kz-count", className), ...props, children: [
|
|
51
|
+
/* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "kz-count-ghost", children: text }),
|
|
52
|
+
trigger === "change" ? /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "kz-count-roll", children: [...text].map(
|
|
53
|
+
(char, i, all) => /\d/.test(char) ? /* @__PURE__ */ jsx("span", { className: "kz-count-digit", style: { "--kz-digit": char }, children: /* @__PURE__ */ jsx("span", { children: "0123456789".split("").map((d) => /* @__PURE__ */ jsx("span", { children: d }, d)) }) }, all.length - i) : /* @__PURE__ */ jsx("span", { children: char }, all.length - i)
|
|
54
|
+
) }) : /* @__PURE__ */ jsx("span", { "aria-hidden": true, ref: live, children: text }),
|
|
55
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", "aria-live": announce ? "polite" : void 0, children: text })
|
|
56
|
+
] });
|
|
57
|
+
}
|
|
58
|
+
export {
|
|
59
|
+
NumberTicker
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=number-ticker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/number-ticker/number-ticker.tsx"],"sourcesContent":["// Client (an observer, a short count). A figure that climbs — without the faults of the usual counters: the server\n// renders the final value (crawlers, screen readers, no-JS and reduced-motion readers all read it), an invisible copy\n// holds its width from the first paint (no layout shift), a figure already on screen at load does not drop to 0 in\n// front of the reader, the count is a bounded loop (~1 s) that stops for good, and assistive technology reads only the\n// final value. On `trigger=\"change\"` each digit rolls to its new value (a live total: tips, bids) and the change can be\n// announced.\nimport * as React from \"react\";\n\nimport { cx } from \"../cx\";\n\nexport interface NumberTickerProps extends Omit<React.ComponentProps<\"span\">, \"children\"> {\n /** The value to show. */\n value: number;\n /** The locale of the digits and separators (`\"fr\"`: 1 204,5) — the app's locale. */\n locale?: string;\n /** How to write it (`{ style: \"currency\", currency: \"EUR\" }`, `{ maximumFractionDigits: 1 }`…): Intl.NumberFormat options. */\n format?: Intl.NumberFormatOptions;\n /**\n * `view`: climbs from 0 once, the first time it scrolls into view. `change`: each digit rolls to the new value\n * whenever `value` changes (a live total).\n * @default \"view\"\n */\n trigger?: \"view\" | \"change\";\n /**\n * Milliseconds of the climb.\n * @default 1100\n */\n duration?: number;\n /** Announce each new value politely (`trigger=\"change\"`): a live total the reader should hear. */\n announce?: boolean;\n /**\n * Where the figure sits in the box its final width reserves.\n * @default \"end\"\n */\n align?: \"start\" | \"end\";\n}\n\nconst easeOut = (t: number) => 1 - Math.pow(1 - t, 4);\n\n/** A figure that climbs into view, or rolls digit by digit to each new value. */\nexport function NumberTicker({ value, locale, format, trigger = \"view\", duration = 1100, announce, align = \"end\", className, ...props }: NumberTickerProps) {\n const formatter = React.useMemo(() => new Intl.NumberFormat(locale, format), [locale, format]);\n const text = formatter.format(value);\n const live = React.useRef<HTMLSpanElement>(null);\n // The previous value, kept in state (React's pattern for “adjusting state when a prop changes”): the trend of the last change.\n const [previous, setPrevious] = React.useState(value);\n const [trend, setTrend] = React.useState<\"up\" | \"down\" | undefined>(undefined);\n if (value !== previous) {\n setPrevious(value);\n setTrend(value > previous ? \"up\" : \"down\");\n }\n\n React.useEffect(() => {\n const el = live.current;\n if (trigger !== \"view\" || !el || window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches) return;\n let first = true;\n let frame = 0;\n const io = new IntersectionObserver(\n ([entry]) => {\n const wasFirst = first;\n first = false;\n if (!entry?.isIntersecting) return;\n io.disconnect();\n if (wasFirst) return; // already on screen at load: it stays, nothing drops to 0 in front of the reader\n const start = performance.now();\n const tick = (now: number) => {\n const p = Math.min(1, (now - start) / duration);\n el.textContent = formatter.format(value * easeOut(p));\n if (p < 1) frame = requestAnimationFrame(tick);\n };\n el.textContent = formatter.format(0);\n frame = requestAnimationFrame(tick);\n },\n { threshold: 0.6 },\n );\n io.observe(el);\n return () => {\n io.disconnect();\n cancelAnimationFrame(frame);\n el.textContent = formatter.format(value);\n };\n }, [trigger, value, duration, formatter]);\n\n return (\n <span data-align={align} data-trend={trigger === \"change\" ? trend : undefined} className={cx(\"kz-count\", className)} {...props}>\n <span aria-hidden className=\"kz-count-ghost\">\n {text}\n </span>\n {trigger === \"change\" ? (\n <span aria-hidden className=\"kz-count-roll\">\n {/* Keyed from the right: when a digit is added (999 → 1,000), the units stay the units. */}\n {[...text].map((char, i, all) =>\n /\\d/.test(char) ? (\n <span key={all.length - i} className=\"kz-count-digit\" style={{ \"--kz-digit\": char } as React.CSSProperties}>\n <span>\n {\"0123456789\".split(\"\").map((d) => (\n <span key={d}>{d}</span>\n ))}\n </span>\n </span>\n ) : (\n <span key={all.length - i}>{char}</span>\n ),\n )}\n </span>\n ) : (\n <span aria-hidden ref={live}>\n {text}\n </span>\n )}\n <span className=\"sr-only\" aria-live={announce ? \"polite\" : undefined}>\n {text}\n </span>\n </span>\n );\n}\n"],"mappings":";;;;;;AAMA,YAAY,WAAW;AA8EnB,SACE,KADF;AA/CJ,IAAM,UAAU,CAAC,MAAc,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC;AAG7C,SAAS,aAAa,EAAE,OAAO,QAAQ,QAAQ,UAAU,QAAQ,WAAW,MAAM,UAAU,QAAQ,OAAO,WAAW,GAAG,MAAM,GAAsB;AAC1J,QAAM,YAAkB,cAAQ,MAAM,IAAI,KAAK,aAAa,QAAQ,MAAM,GAAG,CAAC,QAAQ,MAAM,CAAC;AAC7F,QAAM,OAAO,UAAU,OAAO,KAAK;AACnC,QAAM,OAAa,aAAwB,IAAI;AAE/C,QAAM,CAAC,UAAU,WAAW,IAAU,eAAS,KAAK;AACpD,QAAM,CAAC,OAAO,QAAQ,IAAU,eAAoC,MAAS;AAC7E,MAAI,UAAU,UAAU;AACtB,gBAAY,KAAK;AACjB,aAAS,QAAQ,WAAW,OAAO,MAAM;AAAA,EAC3C;AAEA,EAAM,gBAAU,MAAM;AACpB,UAAM,KAAK,KAAK;AAChB,QAAI,YAAY,UAAU,CAAC,MAAM,OAAO,WAAW,kCAAkC,EAAE,QAAS;AAChG,QAAI,QAAQ;AACZ,QAAI,QAAQ;AACZ,UAAM,KAAK,IAAI;AAAA,MACb,CAAC,CAAC,KAAK,MAAM;AACX,cAAM,WAAW;AACjB,gBAAQ;AACR,YAAI,CAAC,OAAO,eAAgB;AAC5B,WAAG,WAAW;AACd,YAAI,SAAU;AACd,cAAM,QAAQ,YAAY,IAAI;AAC9B,cAAM,OAAO,CAAC,QAAgB;AAC5B,gBAAM,IAAI,KAAK,IAAI,IAAI,MAAM,SAAS,QAAQ;AAC9C,aAAG,cAAc,UAAU,OAAO,QAAQ,QAAQ,CAAC,CAAC;AACpD,cAAI,IAAI,EAAG,SAAQ,sBAAsB,IAAI;AAAA,QAC/C;AACA,WAAG,cAAc,UAAU,OAAO,CAAC;AACnC,gBAAQ,sBAAsB,IAAI;AAAA,MACpC;AAAA,MACA,EAAE,WAAW,IAAI;AAAA,IACnB;AACA,OAAG,QAAQ,EAAE;AACb,WAAO,MAAM;AACX,SAAG,WAAW;AACd,2BAAqB,KAAK;AAC1B,SAAG,cAAc,UAAU,OAAO,KAAK;AAAA,IACzC;AAAA,EACF,GAAG,CAAC,SAAS,OAAO,UAAU,SAAS,CAAC;AAExC,SACE,qBAAC,UAAK,cAAY,OAAO,cAAY,YAAY,WAAW,QAAQ,QAAW,WAAW,GAAG,YAAY,SAAS,GAAI,GAAG,OACvH;AAAA,wBAAC,UAAK,eAAW,MAAC,WAAU,kBACzB,gBACH;AAAA,IACC,YAAY,WACX,oBAAC,UAAK,eAAW,MAAC,WAAU,iBAEzB,WAAC,GAAG,IAAI,EAAE;AAAA,MAAI,CAAC,MAAM,GAAG,QACvB,KAAK,KAAK,IAAI,IACZ,oBAAC,UAA0B,WAAU,kBAAiB,OAAO,EAAE,cAAc,KAAK,GAChF,8BAAC,UACE,uBAAa,MAAM,EAAE,EAAE,IAAI,CAAC,MAC3B,oBAAC,UAAc,eAAJ,CAAM,CAClB,GACH,KALS,IAAI,SAAS,CAMxB,IAEA,oBAAC,UAA2B,kBAAjB,IAAI,SAAS,CAAS;AAAA,IAErC,GACF,IAEA,oBAAC,UAAK,eAAW,MAAC,KAAK,MACpB,gBACH;AAAA,IAEF,oBAAC,UAAK,WAAU,WAAU,aAAW,WAAW,WAAW,QACxD,gBACH;AAAA,KACF;AAEJ;","names":[]}
|
package/dist/progress.d.ts
CHANGED
|
@@ -19,11 +19,25 @@ declare const progress: tailwind_variants.TVReturnType<{
|
|
|
19
19
|
md: {};
|
|
20
20
|
lg: {};
|
|
21
21
|
};
|
|
22
|
+
status: {
|
|
23
|
+
active: {};
|
|
24
|
+
paused: {
|
|
25
|
+
indicator: string;
|
|
26
|
+
};
|
|
27
|
+
error: {
|
|
28
|
+
indicator: string;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
22
31
|
}, {
|
|
23
32
|
root: string;
|
|
24
33
|
track: string;
|
|
25
34
|
indicator: string;
|
|
26
35
|
center: string;
|
|
36
|
+
buffer: string;
|
|
37
|
+
frame: string;
|
|
38
|
+
header: string;
|
|
39
|
+
caption: string;
|
|
40
|
+
figure: string;
|
|
27
41
|
}, undefined, {
|
|
28
42
|
variant: {
|
|
29
43
|
bar: {
|
|
@@ -41,11 +55,25 @@ declare const progress: tailwind_variants.TVReturnType<{
|
|
|
41
55
|
md: {};
|
|
42
56
|
lg: {};
|
|
43
57
|
};
|
|
58
|
+
status: {
|
|
59
|
+
active: {};
|
|
60
|
+
paused: {
|
|
61
|
+
indicator: string;
|
|
62
|
+
};
|
|
63
|
+
error: {
|
|
64
|
+
indicator: string;
|
|
65
|
+
};
|
|
66
|
+
};
|
|
44
67
|
}, {
|
|
45
68
|
root: string;
|
|
46
69
|
track: string;
|
|
47
70
|
indicator: string;
|
|
48
71
|
center: string;
|
|
72
|
+
buffer: string;
|
|
73
|
+
frame: string;
|
|
74
|
+
header: string;
|
|
75
|
+
caption: string;
|
|
76
|
+
figure: string;
|
|
49
77
|
}, tailwind_variants.TVReturnTypeLike<{
|
|
50
78
|
variant: {
|
|
51
79
|
bar: {
|
|
@@ -63,11 +91,25 @@ declare const progress: tailwind_variants.TVReturnType<{
|
|
|
63
91
|
md: {};
|
|
64
92
|
lg: {};
|
|
65
93
|
};
|
|
94
|
+
status: {
|
|
95
|
+
active: {};
|
|
96
|
+
paused: {
|
|
97
|
+
indicator: string;
|
|
98
|
+
};
|
|
99
|
+
error: {
|
|
100
|
+
indicator: string;
|
|
101
|
+
};
|
|
102
|
+
};
|
|
66
103
|
}, {
|
|
67
104
|
root: string;
|
|
68
105
|
track: string;
|
|
69
106
|
indicator: string;
|
|
70
107
|
center: string;
|
|
108
|
+
buffer: string;
|
|
109
|
+
frame: string;
|
|
110
|
+
header: string;
|
|
111
|
+
caption: string;
|
|
112
|
+
figure: string;
|
|
71
113
|
}>>;
|
|
72
114
|
type ProgressVariants = VariantProps<typeof progress>;
|
|
73
115
|
type ProgressProps = Omit<React.ComponentProps<"div">, "children"> & ProgressVariants & {
|
|
@@ -85,8 +127,21 @@ type ProgressProps = Omit<React.ComponentProps<"div">, "children"> & ProgressVar
|
|
|
85
127
|
valueText?: string;
|
|
86
128
|
/** A ring's centre: an amount, a percentage, an icon. */
|
|
87
129
|
children?: React.ReactNode;
|
|
130
|
+
/** How far is already available beyond the value (a video buffered ahead), between 0 and `max` — bar only. */
|
|
131
|
+
buffer?: number;
|
|
132
|
+
/** Splits the bar or the ring into this many segments: the steps of a task, the parts of a goal. */
|
|
133
|
+
segments?: number;
|
|
134
|
+
/**
|
|
135
|
+
* active · paused (the fill rests, striped: waiting for someone) · error (the fill turns to the danger colour where it stopped).
|
|
136
|
+
* @default "active"
|
|
137
|
+
*/
|
|
138
|
+
status?: ProgressVariants["status"];
|
|
139
|
+
/** Shows the label above the bar, with the percentage (or `valueText`) and `eta` — bar only. */
|
|
140
|
+
showLabel?: boolean;
|
|
141
|
+
/** The time left, in words (“About 2 min left”), shown with `showLabel` and read with the value — passed translated. */
|
|
142
|
+
eta?: string;
|
|
88
143
|
};
|
|
89
144
|
/** A progress bar or ring: `value` / `max`, indeterminate without a value. State: `data-state` (loading · complete · indeterminate). */
|
|
90
|
-
declare function Progress({ variant, size, value, max, label, valueText, className, children, ...props }: ProgressProps): React.JSX.Element;
|
|
145
|
+
declare function Progress({ variant, size, value, max, label, valueText, className, children, buffer, segments, status, showLabel, eta, ...props }: ProgressProps): React.JSX.Element;
|
|
91
146
|
|
|
92
147
|
export { Progress, type ProgressProps, type ProgressVariants, progress };
|