beez-ui 0.6.2 → 0.8.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 (127) hide show
  1. package/CHANGELOG.md +150 -96
  2. package/README.md +33 -6
  3. package/dist/components/account-menu.d.ts +53 -0
  4. package/dist/components/account-menu.js +405 -0
  5. package/dist/components/alert.js +1 -1
  6. package/dist/components/animated-collapse.d.ts +19 -0
  7. package/dist/components/animated-collapse.js +81 -0
  8. package/dist/components/animated-count.d.ts +13 -0
  9. package/dist/components/animated-count.js +105 -0
  10. package/dist/components/animated-list-item.d.ts +25 -0
  11. package/dist/components/animated-list-item.js +132 -0
  12. package/dist/components/avatar.d.ts +2 -1
  13. package/dist/components/avatar.js +4 -3
  14. package/dist/components/bouncing-dots-loader.d.ts +19 -0
  15. package/dist/components/bouncing-dots-loader.js +47 -0
  16. package/dist/components/calendar.js +102 -0
  17. package/dist/components/carousel.js +61 -48
  18. package/dist/components/checkbox.js +1 -1
  19. package/dist/components/confirm-delete-button.d.ts +29 -0
  20. package/dist/components/confirm-delete-button.js +254 -0
  21. package/dist/components/data-table.js +34 -4
  22. package/dist/components/dropdown-menu.js +5 -2
  23. package/dist/components/empty-state.d.ts +24 -0
  24. package/dist/components/empty-state.js +37 -0
  25. package/dist/components/error-state.d.ts +20 -0
  26. package/dist/components/error-state.js +145 -0
  27. package/dist/components/external-browser-handoff.d.ts +27 -0
  28. package/dist/components/external-browser-handoff.js +306 -0
  29. package/dist/components/file-upload.d.ts +78 -0
  30. package/dist/components/file-upload.js +678 -0
  31. package/dist/components/filter-query-bar.js +11 -6
  32. package/dist/components/form.d.ts +5 -0
  33. package/dist/components/form.js +11 -9
  34. package/dist/components/info-popover.d.ts +23 -0
  35. package/dist/components/info-popover.js +158 -0
  36. package/dist/components/input-group.js +1 -1
  37. package/dist/components/input.js +1 -1
  38. package/dist/components/month-calendar-header.d.ts +65 -0
  39. package/dist/components/month-calendar-header.js +337 -0
  40. package/dist/components/month-grid.d.ts +59 -0
  41. package/dist/components/month-grid.js +301 -0
  42. package/dist/components/notification-bell.d.ts +50 -0
  43. package/dist/components/notification-bell.js +338 -0
  44. package/dist/components/notification-panel.d.ts +56 -0
  45. package/dist/components/notification-panel.js +281 -0
  46. package/dist/components/open-in-browser-cta.d.ts +22 -0
  47. package/dist/components/open-in-browser-cta.js +61 -0
  48. package/dist/components/pagination.d.ts +1 -0
  49. package/dist/components/pagination.js +9 -4
  50. package/dist/components/presence-swap.d.ts +22 -0
  51. package/dist/components/presence-swap.js +162 -0
  52. package/dist/components/progress-ring.d.ts +20 -0
  53. package/dist/components/progress-ring.js +53 -0
  54. package/dist/components/pwa-update-control.d.ts +18 -0
  55. package/dist/components/pwa-update-control.js +119 -0
  56. package/dist/components/radio-group.js +1 -1
  57. package/dist/components/reaction-button.d.ts +26 -0
  58. package/dist/components/reaction-button.js +114 -0
  59. package/dist/components/rich-link-editor.d.ts +25 -0
  60. package/dist/components/rich-link-editor.js +320 -0
  61. package/dist/components/rich-markdown-content.d.ts +10 -0
  62. package/dist/components/rich-markdown-content.js +56 -0
  63. package/dist/components/rich-text-content.d.ts +19 -0
  64. package/dist/components/rich-text-content.js +26 -0
  65. package/dist/components/select.js +1 -1
  66. package/dist/components/sheet.js +12 -9
  67. package/dist/components/sidebar.js +9 -5
  68. package/dist/components/skeleton.d.ts +6 -0
  69. package/dist/components/skeleton.js +7 -1
  70. package/dist/components/switch.js +1 -1
  71. package/dist/components/textarea.js +1 -1
  72. package/dist/components/typing-animation.js +42 -15
  73. package/dist/emoji-picker.d.ts +27 -0
  74. package/dist/emoji-picker.js +283 -0
  75. package/dist/hooks/use-horizontal-swipe.d.ts +23 -0
  76. package/dist/hooks/use-horizontal-swipe.js +80 -0
  77. package/dist/hooks/use-is-hydrated.d.ts +6 -0
  78. package/dist/hooks/use-is-hydrated.js +20 -0
  79. package/dist/hooks/use-minute-clock.d.ts +23 -0
  80. package/dist/hooks/use-minute-clock.js +147 -0
  81. package/dist/hooks/use-month-transition-direction.d.ts +21 -0
  82. package/dist/hooks/use-month-transition-direction.js +110 -0
  83. package/dist/hooks/use-rich-link-editor.d.ts +55 -0
  84. package/dist/hooks/use-rich-link-editor.js +515 -0
  85. package/dist/hooks/use-viewer-time-zone.d.ts +6 -0
  86. package/dist/hooks/use-viewer-time-zone.js +20 -0
  87. package/dist/index.d.ts +44 -0
  88. package/dist/index.js +43 -0
  89. package/dist/lib/browser-clipboard.d.ts +13 -0
  90. package/dist/lib/browser-clipboard.js +48 -0
  91. package/dist/lib/browser-navigation.d.ts +21 -0
  92. package/dist/lib/browser-navigation.js +42 -0
  93. package/dist/lib/column-filter-value.d.ts +12 -0
  94. package/dist/lib/column-filter-value.js +52 -0
  95. package/dist/lib/file-acceptance.d.ts +43 -0
  96. package/dist/lib/file-acceptance.js +107 -0
  97. package/dist/lib/format-file-size.d.ts +16 -0
  98. package/dist/lib/format-file-size.js +34 -0
  99. package/dist/lib/fuzzy-search.d.ts +17 -0
  100. package/dist/lib/fuzzy-search.js +183 -0
  101. package/dist/lib/horizontal-swipe.d.ts +23 -0
  102. package/dist/lib/horizontal-swipe.js +29 -0
  103. package/dist/lib/in-app-browser.d.ts +35 -0
  104. package/dist/lib/in-app-browser.js +80 -0
  105. package/dist/lib/month-grid.d.ts +42 -0
  106. package/dist/lib/month-grid.js +74 -0
  107. package/dist/lib/name-initials.d.ts +7 -0
  108. package/dist/lib/name-initials.js +11 -0
  109. package/dist/lib/rich-text/link-markdown-constants.d.ts +147 -0
  110. package/dist/lib/rich-text/link-markdown-constants.js +458 -0
  111. package/dist/lib/rich-text/link-markdown-types.d.ts +53 -0
  112. package/dist/lib/rich-text/link-markdown-types.js +1 -0
  113. package/dist/lib/rich-text/link-markdown.d.ts +193 -0
  114. package/dist/lib/rich-text/link-markdown.js +592 -0
  115. package/dist/lib/rich-text/rich-markdown.d.ts +41 -0
  116. package/dist/lib/rich-text/rich-markdown.js +105 -0
  117. package/dist/lib/rich-text/rich-text-editor-dom.d.ts +26 -0
  118. package/dist/lib/rich-text/rich-text-editor-dom.js +79 -0
  119. package/dist/motion/glide-indicator.d.ts +37 -3
  120. package/dist/motion/glide-indicator.js +37 -3
  121. package/dist/motion/motion-slot.js +47 -18
  122. package/dist/motion/surface-keyframes.js +18 -6
  123. package/dist/motion/tokens.d.ts +41 -2
  124. package/dist/motion/tokens.js +40 -1
  125. package/dist/providers/beez-ui-provider.js +49 -17
  126. package/dist/styles.css +1 -1
  127. package/package.json +212 -2
@@ -0,0 +1,306 @@
1
+ "use client";
2
+ import { c as _c } from "react/compiler-runtime";
3
+ /**
4
+ * Full-page handoff for in-app browsers: a primary action opens the page in the default browser
5
+ * through a deep link, and a countdown falls back to an in-app URL when the deep link does not take.
6
+ */
7
+ import { useEffect, useRef, useState } from "react";
8
+ import { cn } from "../lib/utils.js";
9
+ import { navigateToUrl } from "../lib/browser-navigation.js";
10
+ import { AnimatedCount } from "./animated-count.js";
11
+ import { Button } from "./button.js";
12
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
+ const DEFAULT_COUNTDOWN_SECONDS = 5;
14
+ const COUNTDOWN_INTERVAL_MS = 1e3;
15
+ /** After tapping the deep link, the page must still be visible this long to count as a failure. */
16
+ const DEEP_LINK_FALLBACK_DELAY_MS = 2e3;
17
+ const VISIBLE_DOCUMENT_STATE = "visible";
18
+ /** Staggered entrance; `backwards` releases the properties so press and disabled styles keep working. */
19
+ const ENTER_CLASS_NAME = "animate-in fade-in slide-in-from-bottom-1.5 fill-mode-backwards duration-300";
20
+ const EXTERNAL_BROWSER_HANDOFF_DEFAULT_COPY = {
21
+ title: "Abrí este sitio en tu navegador",
22
+ description: "Para continuar, abrí este sitio en tu navegador habitual.",
23
+ countdownDescription: "Cuando el contador llegue a 0, vas a continuar acá mismo.",
24
+ primaryAction: "Continuar en tu navegador",
25
+ fallbackLink: "O continuá acá"
26
+ };
27
+ /**
28
+ * Counts down and then follows `fallbackUrl`, unless the page was hidden because the external
29
+ * browser opened. Repeated taps on the primary action restart one fallback window instead of
30
+ * stacking redirects.
31
+ * @param props - Deep link, fallback, countdown and copy.
32
+ * @returns The handoff section.
33
+ */
34
+ export function ExternalBrowserHandoff(t0) {
35
+ const $ = _c(48);
36
+ const { externalBrowserUrl, fallbackUrl, countdownSeconds: t1, copy, onFallback: t2, className } = t0;
37
+ const countdownSeconds = t1 === undefined ? DEFAULT_COUNTDOWN_SECONDS : t1;
38
+ const onFallback = t2 === undefined ? navigateToUrl : t2;
39
+ let t3;
40
+ if ($[0] !== copy) {
41
+ t3 = {
42
+ ...EXTERNAL_BROWSER_HANDOFF_DEFAULT_COPY,
43
+ ...copy
44
+ };
45
+ $[0] = copy;
46
+ $[1] = t3;
47
+ } else {
48
+ t3 = $[1];
49
+ }
50
+ const resolvedCopy = t3;
51
+ const automaticFallbackTimeoutIdRef = useRef(null);
52
+ const primaryActionFallbackTimeoutIdRef = useRef(null);
53
+ const onFallbackRef = useRef(onFallback);
54
+ const [remainingSeconds, setRemainingSeconds] = useState(countdownSeconds);
55
+ let t4;
56
+ let t5;
57
+ if ($[2] !== onFallback) {
58
+ t4 = () => {
59
+ onFallbackRef.current = onFallback;
60
+ };
61
+ t5 = [onFallback];
62
+ $[2] = onFallback;
63
+ $[3] = t4;
64
+ $[4] = t5;
65
+ } else {
66
+ t4 = $[3];
67
+ t5 = $[4];
68
+ }
69
+ useEffect(t4, t5);
70
+ let t6;
71
+ let t7;
72
+ if ($[5] !== countdownSeconds || $[6] !== fallbackUrl) {
73
+ t6 = () => {
74
+ const followFallbackIfVisible = () => {
75
+ if (document.visibilityState === VISIBLE_DOCUMENT_STATE) {
76
+ onFallbackRef.current(fallbackUrl);
77
+ }
78
+ };
79
+ const countdownIntervalId = window.setInterval(() => {
80
+ setRemainingSeconds(_temp);
81
+ }, COUNTDOWN_INTERVAL_MS);
82
+ automaticFallbackTimeoutIdRef.current = window.setTimeout(() => {
83
+ setRemainingSeconds(0);
84
+ followFallbackIfVisible();
85
+ }, countdownSeconds * COUNTDOWN_INTERVAL_MS);
86
+ return () => {
87
+ window.clearInterval(countdownIntervalId);
88
+ window.clearTimeout(automaticFallbackTimeoutIdRef.current ?? undefined);
89
+ automaticFallbackTimeoutIdRef.current = null;
90
+ window.clearTimeout(primaryActionFallbackTimeoutIdRef.current ?? undefined);
91
+ primaryActionFallbackTimeoutIdRef.current = null;
92
+ };
93
+ };
94
+ t7 = [countdownSeconds, fallbackUrl];
95
+ $[5] = countdownSeconds;
96
+ $[6] = fallbackUrl;
97
+ $[7] = t6;
98
+ $[8] = t7;
99
+ } else {
100
+ t6 = $[7];
101
+ t7 = $[8];
102
+ }
103
+ useEffect(t6, t7);
104
+ let t8;
105
+ if ($[9] !== fallbackUrl) {
106
+ t8 = () => {
107
+ window.clearTimeout(automaticFallbackTimeoutIdRef.current ?? undefined);
108
+ automaticFallbackTimeoutIdRef.current = null;
109
+ window.clearTimeout(primaryActionFallbackTimeoutIdRef.current ?? undefined);
110
+ primaryActionFallbackTimeoutIdRef.current = window.setTimeout(() => {
111
+ primaryActionFallbackTimeoutIdRef.current = null;
112
+ if (document.visibilityState === VISIBLE_DOCUMENT_STATE) {
113
+ onFallbackRef.current(fallbackUrl);
114
+ }
115
+ }, DEEP_LINK_FALLBACK_DELAY_MS);
116
+ };
117
+ $[9] = fallbackUrl;
118
+ $[10] = t8;
119
+ } else {
120
+ t8 = $[10];
121
+ }
122
+ const handlePrimaryAction = t8;
123
+ let t9;
124
+ if ($[11] !== className) {
125
+ t9 = cn("grid w-full place-items-center px-5 py-6", className);
126
+ $[11] = className;
127
+ $[12] = t9;
128
+ } else {
129
+ t9 = $[12];
130
+ }
131
+ let t10;
132
+ if ($[13] !== resolvedCopy.eyebrow) {
133
+ t10 = resolvedCopy.eyebrow ? /* @__PURE__ */ _jsx("p", {
134
+ className: cn("m-0 text-[0.78rem] font-bold tracking-[0.05em] text-muted-foreground uppercase", ENTER_CLASS_NAME),
135
+ children: resolvedCopy.eyebrow
136
+ }) : null;
137
+ $[13] = resolvedCopy.eyebrow;
138
+ $[14] = t10;
139
+ } else {
140
+ t10 = $[14];
141
+ }
142
+ let t11;
143
+ if ($[15] === Symbol.for("react.memo_cache_sentinel")) {
144
+ t11 = cn("m-0 text-[clamp(1.75rem,5vw,2.5rem)] leading-[1.15] font-bold text-balance text-foreground", ENTER_CLASS_NAME, "delay-35");
145
+ $[15] = t11;
146
+ } else {
147
+ t11 = $[15];
148
+ }
149
+ let t12;
150
+ if ($[16] !== resolvedCopy.title) {
151
+ t12 = /* @__PURE__ */ _jsx("h1", {
152
+ className: t11,
153
+ children: resolvedCopy.title
154
+ });
155
+ $[16] = resolvedCopy.title;
156
+ $[17] = t12;
157
+ } else {
158
+ t12 = $[17];
159
+ }
160
+ let t13;
161
+ if ($[18] === Symbol.for("react.memo_cache_sentinel")) {
162
+ t13 = cn("mx-auto my-0 max-w-md text-base leading-relaxed text-pretty text-muted-foreground", ENTER_CLASS_NAME, "delay-70");
163
+ $[18] = t13;
164
+ } else {
165
+ t13 = $[18];
166
+ }
167
+ let t14;
168
+ if ($[19] !== resolvedCopy.description) {
169
+ t14 = /* @__PURE__ */ _jsx("p", {
170
+ className: t13,
171
+ children: resolvedCopy.description
172
+ });
173
+ $[19] = resolvedCopy.description;
174
+ $[20] = t14;
175
+ } else {
176
+ t14 = $[20];
177
+ }
178
+ let t15;
179
+ if ($[21] === Symbol.for("react.memo_cache_sentinel")) {
180
+ t15 = cn("mt-3 mb-2 grid max-w-md justify-items-center gap-2.5", ENTER_CLASS_NAME, "delay-105");
181
+ $[21] = t15;
182
+ } else {
183
+ t15 = $[21];
184
+ }
185
+ let t16;
186
+ if ($[22] !== remainingSeconds) {
187
+ t16 = /* @__PURE__ */ _jsx("span", {
188
+ className: "inline-flex size-18 items-center justify-center rounded-full bg-foreground text-4xl leading-none font-bold text-background tabular-nums shadow-[0_0_0_0.375rem_color-mix(in_srgb,var(--foreground)_8%,transparent)]",
189
+ children: /* @__PURE__ */ _jsx(AnimatedCount, { value: remainingSeconds })
190
+ });
191
+ $[22] = remainingSeconds;
192
+ $[23] = t16;
193
+ } else {
194
+ t16 = $[23];
195
+ }
196
+ let t17;
197
+ if ($[24] !== resolvedCopy.countdownDescription) {
198
+ t17 = /* @__PURE__ */ _jsx("p", {
199
+ className: "mx-auto my-0 text-[0.95rem] leading-normal text-pretty text-foreground",
200
+ children: resolvedCopy.countdownDescription
201
+ });
202
+ $[24] = resolvedCopy.countdownDescription;
203
+ $[25] = t17;
204
+ } else {
205
+ t17 = $[25];
206
+ }
207
+ let t18;
208
+ if ($[26] !== t16 || $[27] !== t17) {
209
+ t18 = /* @__PURE__ */ _jsxs("div", {
210
+ role: "timer",
211
+ className: t15,
212
+ children: [t16, t17]
213
+ });
214
+ $[26] = t16;
215
+ $[27] = t17;
216
+ $[28] = t18;
217
+ } else {
218
+ t18 = $[28];
219
+ }
220
+ let t19;
221
+ if ($[29] === Symbol.for("react.memo_cache_sentinel")) {
222
+ t19 = cn("mt-2 w-full", ENTER_CLASS_NAME, "delay-140");
223
+ $[29] = t19;
224
+ } else {
225
+ t19 = $[29];
226
+ }
227
+ let t20;
228
+ if ($[30] !== externalBrowserUrl || $[31] !== handlePrimaryAction || $[32] !== resolvedCopy.primaryAction) {
229
+ t20 = /* @__PURE__ */ _jsx(Button, {
230
+ asChild: true,
231
+ size: "lg",
232
+ className: t19,
233
+ children: /* @__PURE__ */ _jsx("a", {
234
+ href: externalBrowserUrl,
235
+ onClick: handlePrimaryAction,
236
+ children: resolvedCopy.primaryAction
237
+ })
238
+ });
239
+ $[30] = externalBrowserUrl;
240
+ $[31] = handlePrimaryAction;
241
+ $[32] = resolvedCopy.primaryAction;
242
+ $[33] = t20;
243
+ } else {
244
+ t20 = $[33];
245
+ }
246
+ let t21;
247
+ if ($[34] === Symbol.for("react.memo_cache_sentinel")) {
248
+ t21 = cn("inline-flex min-h-11 items-center rounded-[calc(var(--radius)-2px)] px-3 py-2 text-[0.9rem] text-muted-foreground underline decoration-current/40 underline-offset-[0.2rem] transition-[color,text-decoration-color] hover:text-foreground hover:decoration-current focus-visible:text-foreground focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring", ENTER_CLASS_NAME, "delay-175");
249
+ $[34] = t21;
250
+ } else {
251
+ t21 = $[34];
252
+ }
253
+ let t22;
254
+ if ($[35] !== fallbackUrl || $[36] !== resolvedCopy.fallbackLink) {
255
+ t22 = /* @__PURE__ */ _jsx("a", {
256
+ className: t21,
257
+ href: fallbackUrl,
258
+ children: resolvedCopy.fallbackLink
259
+ });
260
+ $[35] = fallbackUrl;
261
+ $[36] = resolvedCopy.fallbackLink;
262
+ $[37] = t22;
263
+ } else {
264
+ t22 = $[37];
265
+ }
266
+ let t23;
267
+ if ($[38] !== t10 || $[39] !== t12 || $[40] !== t14 || $[41] !== t18 || $[42] !== t20 || $[43] !== t22) {
268
+ t23 = /* @__PURE__ */ _jsxs("div", {
269
+ className: "grid w-full max-w-lg justify-items-center gap-3.5 text-center",
270
+ children: [
271
+ t10,
272
+ t12,
273
+ t14,
274
+ t18,
275
+ t20,
276
+ t22
277
+ ]
278
+ });
279
+ $[38] = t10;
280
+ $[39] = t12;
281
+ $[40] = t14;
282
+ $[41] = t18;
283
+ $[42] = t20;
284
+ $[43] = t22;
285
+ $[44] = t23;
286
+ } else {
287
+ t23 = $[44];
288
+ }
289
+ let t24;
290
+ if ($[45] !== t23 || $[46] !== t9) {
291
+ t24 = /* @__PURE__ */ _jsx("section", {
292
+ "data-slot": "external-browser-handoff",
293
+ className: t9,
294
+ children: t23
295
+ });
296
+ $[45] = t23;
297
+ $[46] = t9;
298
+ $[47] = t24;
299
+ } else {
300
+ t24 = $[47];
301
+ }
302
+ return t24;
303
+ }
304
+ function _temp(currentRemainingSeconds) {
305
+ return Math.max(currentRemainingSeconds - 1, 0);
306
+ }
@@ -0,0 +1,78 @@
1
+ /**
2
+ * File upload building blocks: a drop zone that validates picked or dropped files, and a list of
3
+ * files with upload progress, failure and retry. Uploading itself stays with the application.
4
+ */
5
+ import { type ComponentProps } from "react";
6
+ export interface FileUploadDropZoneLabels {
7
+ uploadAction: string;
8
+ /** Shown next to the action on wide screens. */
9
+ dragAndDrop: string;
10
+ /** Accessible name of the hidden file input. */
11
+ input: string;
12
+ }
13
+ export interface FileUploadDropZoneProps {
14
+ /** Explains which files are allowed; turns destructive after a rejected file. */
15
+ hint?: string;
16
+ isDisabled?: boolean;
17
+ /** Same syntax as `<input accept>`, such as `"image/*,.pdf"`. */
18
+ accept?: string;
19
+ allowsMultiple?: boolean;
20
+ /** Maximum file size in bytes. */
21
+ maxSize?: number;
22
+ onDropFiles?: (files: File[]) => void;
23
+ onDropUnacceptedFiles?: (files: File[]) => void;
24
+ onSizeLimitExceed?: (files: File[]) => void;
25
+ inputId?: string;
26
+ labels?: Partial<FileUploadDropZoneLabels>;
27
+ className?: string;
28
+ }
29
+ /**
30
+ * Renders the drop zone. The action button and a click anywhere on the zone open the native file
31
+ * picker; the same file can be picked again after a failure.
32
+ * @param props - Constraints, callbacks and optional copy.
33
+ * @returns The drop zone.
34
+ */
35
+ export declare function FileUploadDropZone({ hint, isDisabled, accept, allowsMultiple, maxSize, onDropFiles, onDropUnacceptedFiles, onSizeLimitExceed, inputId, labels, className, }: FileUploadDropZoneProps): import("react").JSX.Element;
36
+ export interface FileUploadItemLabels {
37
+ complete: string;
38
+ uploading: string;
39
+ failed: string;
40
+ retry: string;
41
+ /** Accessible name of the delete button. */
42
+ delete: string;
43
+ /** Accessible name of the progress bar. */
44
+ progress: string;
45
+ }
46
+ export interface FileUploadItemProps {
47
+ name: string;
48
+ /** Size in bytes. */
49
+ size: number;
50
+ /** Upload progress from 0 to 100. */
51
+ progress: number;
52
+ failed?: boolean;
53
+ onDelete?: () => void;
54
+ isDeleteDisabled?: boolean;
55
+ onRetry?: () => void;
56
+ locale?: string;
57
+ labels?: Partial<FileUploadItemLabels>;
58
+ className?: string;
59
+ }
60
+ /**
61
+ * Renders one file with its size, status, progress bar, delete action and, after a failure, a
62
+ * retry action. Place it inside `FileUploadList` so additions and removals animate.
63
+ * @param props - File metadata, progress, callbacks and optional copy.
64
+ * @returns The list item.
65
+ */
66
+ export declare function FileUploadItem({ name, size, progress, failed, onDelete, isDeleteDisabled, onRetry, locale, labels, className, }: FileUploadItemProps): import("react").JSX.Element;
67
+ /**
68
+ * Lays out a drop zone and its file list.
69
+ * @param props - Native `div` attributes.
70
+ * @returns The container.
71
+ */
72
+ export declare function FileUpload({ className, ...props }: ComponentProps<"div">): import("react").JSX.Element;
73
+ /**
74
+ * Lists `FileUploadItem`s; only files added after the first render animate in.
75
+ * @param props - Native `ul` attributes and the items.
76
+ * @returns The list.
77
+ */
78
+ export declare function FileUploadList({ className, children, ...props }: ComponentProps<"ul">): import("react").JSX.Element;