@dimaan/ui 0.0.22 → 0.0.24

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 CHANGED
@@ -4,6 +4,7 @@ Shared React UI component library for Diman company projects.
4
4
 
5
5
  Built with **React 19**, **TypeScript**, **Tailwind CSS v4**, and a CSS-first design token system. Distributed as dual ESM/CJS with full type definitions, intended for Vite-based dashboard apps.
6
6
 
7
+
7
8
  ## Documentation
8
9
 
9
10
  - **[USAGE.md](USAGE.md)** — full consumer guide: install, Tailwind setup, framework-specific examples (Next.js / Vite / Remix), theming, and pitfalls.
package/dist/index.cjs CHANGED
@@ -136,7 +136,7 @@ var buttonSizeClass = {
136
136
  icon: "h-9 w-9 shrink-0 rounded-md p-0",
137
137
  "icon-sm": "h-8 w-8 shrink-0 rounded-md p-0"
138
138
  };
139
- var buttonBaseClass = "group/button relative inline-flex items-center justify-center font-medium select-none whitespace-nowrap outline-none transition-[background-color,color,box-shadow,opacity] focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0";
139
+ var buttonBaseClass = "group/button relative inline-flex items-center justify-center font-medium select-none whitespace-nowrap outline-none transition-[background-color,color,box-shadow,opacity,transform] active:scale-[0.98] focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 motion-reduce:transition-none motion-reduce:active:scale-100 [&_svg]:pointer-events-none [&_svg]:shrink-0";
140
140
  var Button = react.forwardRef(function Button2({
141
141
  variant = "primary",
142
142
  size = "md",
@@ -299,7 +299,9 @@ function DashboardContent({ className, children, ...props }) {
299
299
  "main",
300
300
  {
301
301
  className: cn(
302
- "flex min-h-[calc(100vh-var(--header-height))] flex-1 flex-col gap-6 p-4 sm:p-6 lg:p-8",
302
+ // `min-w-0` keeps wide children (Table, code blocks) scrolling within
303
+ // this column instead of widening the page past 100%.
304
+ "flex min-h-[calc(100vh-var(--header-height))] min-w-0 flex-1 flex-col gap-6 p-4 sm:p-6 lg:p-8",
303
305
  className
304
306
  ),
305
307
  ...props,
@@ -365,7 +367,10 @@ function DashboardMain({ className, children, ...props }) {
365
367
  "div",
366
368
  {
367
369
  className: cn(
368
- "flex min-h-screen flex-1 flex-col transition-[margin] duration-200 ease-out",
370
+ // `min-w-0` lets this flex column shrink below its content's intrinsic
371
+ // width so wide children (e.g. a Table) scroll internally instead of
372
+ // stretching the whole layout past 100%.
373
+ "flex min-h-screen min-w-0 flex-1 flex-col transition-[margin] duration-200 ease-out",
369
374
  // On desktop, push the main column past the fixed sidebar using logical margin.
370
375
  collapsed ? "lg:ms-[var(--sidebar-width-collapsed)]" : "lg:ms-[var(--sidebar-width)]",
371
376
  className
@@ -1725,19 +1730,231 @@ function mergeRefs(...refs) {
1725
1730
  };
1726
1731
  }
1727
1732
 
1733
+ // src/components/file-upload/fileUploadVariants.ts
1734
+ var fileUploadBaseClass = "flex w-full min-w-0 flex-col gap-2";
1735
+ var fileUploadDropzoneClass = "flex cursor-pointer flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed border-input bg-muted/40 px-6 py-8 text-center transition-colors hover:border-ring peer-focus-visible:border-ring peer-focus-visible:ring-2 peer-focus-visible:ring-ring/40 data-[drag-active=true]:border-ring data-[drag-active=true]:bg-accent data-[invalid=true]:border-destructive data-[disabled=true]:cursor-not-allowed data-[disabled=true]:opacity-50 data-[disabled=true]:hover:border-input";
1736
+ var fileUploadIconClass = "size-8 text-muted-foreground";
1737
+ var fileUploadPromptClass = "text-sm text-foreground";
1738
+ var fileUploadHintClass = "text-xs text-muted-foreground";
1739
+ var fileUploadFileRowClass = "flex items-center justify-between gap-2 rounded-md border border-border bg-card px-3 py-2";
1740
+ var fileUploadFileNameClass = "truncate text-sm font-medium text-foreground";
1741
+ var fileUploadFileSizeClass = "text-xs text-muted-foreground";
1742
+ var fileUploadRemoveClass = "inline-flex size-7 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-destructive/10 hover:text-destructive focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40 disabled:pointer-events-none disabled:opacity-50";
1743
+ var DEFAULT_MAX_SIZE_MB = 5;
1744
+ var DEFAULT_LABELS_LTR2 = {
1745
+ prompt: "Drag & drop a file or click to browse",
1746
+ remove: "Remove"
1747
+ };
1748
+ var DEFAULT_LABELS_RTL2 = {
1749
+ prompt: "\u0627\u0633\u062D\u0628 \u0648\u0623\u0641\u0644\u062A \u0645\u0644\u0641\u064B\u0627 \u0623\u0648 \u0627\u0636\u063A\u0637 \u0644\u0644\u0627\u062E\u062A\u064A\u0627\u0631",
1750
+ remove: "\u0625\u0632\u0627\u0644\u0629"
1751
+ };
1752
+ function normalizeFiles(value) {
1753
+ if (Array.isArray(value)) return value.filter((f) => f instanceof File);
1754
+ return value instanceof File ? [value] : [];
1755
+ }
1756
+ function fileKey(file) {
1757
+ return `${file.name}:${file.size}:${file.lastModified}`;
1758
+ }
1759
+ function formatBytes(bytes) {
1760
+ if (bytes < 1024) return `${bytes} B`;
1761
+ const kb = bytes / 1024;
1762
+ if (kb < 1024) return `${kb.toFixed(1)} KB`;
1763
+ return `${(kb / 1024).toFixed(1)} MB`;
1764
+ }
1765
+ function matchesAccept(file, accept) {
1766
+ if (!accept) return true;
1767
+ const tokens = accept.split(",").map((t) => t.trim().toLowerCase()).filter(Boolean);
1768
+ if (tokens.length === 0 || tokens.includes("*") || tokens.includes("*/*")) return true;
1769
+ const name = file.name.toLowerCase();
1770
+ const type = file.type.toLowerCase();
1771
+ return tokens.some((token) => {
1772
+ if (token.startsWith(".")) return name.endsWith(token);
1773
+ if (token.endsWith("/*")) return type.startsWith(token.slice(0, -1));
1774
+ return type === token;
1775
+ });
1776
+ }
1777
+ var FileUploadImpl = react.forwardRef(
1778
+ function FileUpload(props, ref) {
1779
+ const {
1780
+ multiple = false,
1781
+ accept,
1782
+ maxSize = DEFAULT_MAX_SIZE_MB,
1783
+ disabled = false,
1784
+ required,
1785
+ name,
1786
+ id,
1787
+ onError,
1788
+ onBlur,
1789
+ labels: labelsProp,
1790
+ className,
1791
+ value,
1792
+ defaultValue,
1793
+ onValueChange,
1794
+ onChange,
1795
+ "aria-invalid": ariaInvalid,
1796
+ "aria-describedby": ariaDescribedBy,
1797
+ "aria-label": ariaLabel
1798
+ } = props;
1799
+ const dir = useDirection();
1800
+ const generatedId = react.useId();
1801
+ const inputId = id ?? generatedId;
1802
+ const [dragActive, setDragActive] = react.useState(false);
1803
+ const baseLabels = dir === "rtl" ? DEFAULT_LABELS_RTL2 : DEFAULT_LABELS_LTR2;
1804
+ const prompt = labelsProp?.prompt ?? baseLabels.prompt;
1805
+ const removeLabel = labelsProp?.remove ?? baseLabels.remove;
1806
+ const hint = labelsProp?.hint ?? (dir === "rtl" ? `\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 ${maxSize} \u0645\u064A\u062C\u0627\u0628\u0627\u064A\u062A` : `Max ${maxSize} MB`);
1807
+ const isControlled = value !== void 0;
1808
+ const [internal, setInternal] = react.useState(() => normalizeFiles(defaultValue));
1809
+ const files = isControlled ? normalizeFiles(value) : internal;
1810
+ const invalid = ariaInvalid === true || ariaInvalid === "true";
1811
+ const emit = (next) => {
1812
+ if (!isControlled) setInternal(next);
1813
+ onValueChange?.(multiple ? next : next[0] ?? null);
1814
+ onChange?.(multiple ? next : next[0] ?? null);
1815
+ };
1816
+ const tooLargeMessage = (file) => dir === "rtl" ? `${file.name} \u0623\u0643\u0628\u0631 \u0645\u0646 ${maxSize} \u0645\u064A\u062C\u0627\u0628\u0627\u064A\u062A` : `${file.name} is larger than ${maxSize} MB`;
1817
+ const wrongTypeMessage = (file) => dir === "rtl" ? `${file.name} \u0644\u064A\u0633 \u0646\u0648\u0639 \u0645\u0644\u0641 \u0645\u0642\u0628\u0648\u0644` : `${file.name} is not an accepted file type`;
1818
+ const addFiles = (incoming) => {
1819
+ if (disabled) return;
1820
+ const accepted = [];
1821
+ for (const file of Array.from(incoming)) {
1822
+ if (!matchesAccept(file, accept)) {
1823
+ onError?.({ code: "file-type-rejected", message: wrongTypeMessage(file), file });
1824
+ continue;
1825
+ }
1826
+ if (maxSize && file.size > maxSize * 1024 * 1024) {
1827
+ onError?.({ code: "file-too-large", message: tooLargeMessage(file), file });
1828
+ continue;
1829
+ }
1830
+ accepted.push(file);
1831
+ }
1832
+ if (accepted.length === 0) return;
1833
+ if (!multiple) {
1834
+ const [first] = accepted;
1835
+ if (first) emit([first]);
1836
+ return;
1837
+ }
1838
+ const byKey = new Map(files.map((f) => [fileKey(f), f]));
1839
+ for (const f of accepted) byKey.set(fileKey(f), f);
1840
+ emit([...byKey.values()]);
1841
+ };
1842
+ const handleInputChange = (event) => {
1843
+ if (event.target.files) addFiles(event.target.files);
1844
+ event.target.value = "";
1845
+ };
1846
+ const handleDrag = (event) => {
1847
+ event.preventDefault();
1848
+ event.stopPropagation();
1849
+ if (disabled) return;
1850
+ if (event.type === "dragenter" || event.type === "dragover") setDragActive(true);
1851
+ else if (event.type === "dragleave") setDragActive(false);
1852
+ };
1853
+ const handleDrop = (event) => {
1854
+ event.preventDefault();
1855
+ event.stopPropagation();
1856
+ setDragActive(false);
1857
+ if (!disabled && event.dataTransfer.files) addFiles(event.dataTransfer.files);
1858
+ };
1859
+ const remove = (file) => emit(files.filter((f) => fileKey(f) !== fileKey(file)));
1860
+ const showDropzone = multiple || files.length === 0;
1861
+ return (
1862
+ // biome-ignore lint/a11y/noStaticElementInteractions: drag-and-drop is a wrapper affordance; keyboard/click access is the inner <label> + focusable <input>.
1863
+ /* @__PURE__ */ jsxRuntime.jsxs(
1864
+ "div",
1865
+ {
1866
+ ref,
1867
+ "data-slot": "file-upload",
1868
+ className: cn(fileUploadBaseClass, className),
1869
+ onDragEnter: handleDrag,
1870
+ onDragOver: handleDrag,
1871
+ onDragLeave: handleDrag,
1872
+ onDrop: handleDrop,
1873
+ children: [
1874
+ /* @__PURE__ */ jsxRuntime.jsx(
1875
+ "input",
1876
+ {
1877
+ id: inputId,
1878
+ type: "file",
1879
+ accept,
1880
+ multiple,
1881
+ name,
1882
+ required,
1883
+ disabled,
1884
+ onChange: handleInputChange,
1885
+ onBlur,
1886
+ "aria-invalid": ariaInvalid,
1887
+ "aria-describedby": ariaDescribedBy,
1888
+ "aria-label": ariaLabel,
1889
+ className: "peer sr-only"
1890
+ }
1891
+ ),
1892
+ showDropzone ? /* @__PURE__ */ jsxRuntime.jsxs(
1893
+ "label",
1894
+ {
1895
+ htmlFor: inputId,
1896
+ "data-slot": "file-upload-dropzone",
1897
+ "data-drag-active": dragActive ? "true" : void 0,
1898
+ "data-invalid": invalid ? "true" : void 0,
1899
+ "data-disabled": disabled ? "true" : void 0,
1900
+ className: fileUploadDropzoneClass,
1901
+ children: [
1902
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Upload, { "aria-hidden": "true", className: fileUploadIconClass }),
1903
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: fileUploadPromptClass, children: prompt }),
1904
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: fileUploadHintClass, children: hint })
1905
+ ]
1906
+ }
1907
+ ) : null,
1908
+ files.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-col gap-2", children: files.map((file) => /* @__PURE__ */ jsxRuntime.jsxs(
1909
+ "li",
1910
+ {
1911
+ "data-slot": "file-upload-file",
1912
+ className: fileUploadFileRowClass,
1913
+ children: [
1914
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [
1915
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.File, { "aria-hidden": "true", className: "size-5 shrink-0 text-muted-foreground" }),
1916
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0", children: [
1917
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: fileUploadFileNameClass, children: file.name }),
1918
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: fileUploadFileSizeClass, children: formatBytes(file.size) })
1919
+ ] })
1920
+ ] }),
1921
+ /* @__PURE__ */ jsxRuntime.jsx(
1922
+ "button",
1923
+ {
1924
+ type: "button",
1925
+ disabled,
1926
+ "aria-label": `${removeLabel}: ${file.name}`,
1927
+ "data-slot": "file-upload-remove",
1928
+ className: fileUploadRemoveClass,
1929
+ onClick: () => remove(file),
1930
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { "aria-hidden": "true", className: "size-4" })
1931
+ }
1932
+ )
1933
+ ]
1934
+ },
1935
+ fileKey(file)
1936
+ )) }) : null
1937
+ ]
1938
+ }
1939
+ )
1940
+ );
1941
+ }
1942
+ );
1943
+ var FileUpload2 = FileUploadImpl;
1944
+
1728
1945
  // src/components/form-page/formPageVariants.ts
1729
1946
  var formPageBaseClass = "flex w-full flex-col gap-6";
1730
1947
  var formPageBodyClass = "flex-1";
1731
1948
  var formPageActionsBarClass = "sticky bottom-0 -mx-6 -mb-6 mt-6 flex items-center justify-end gap-2 border-t border-border bg-background/95 px-6 py-3 backdrop-blur supports-[backdrop-filter]:bg-background/80";
1732
1949
  var formPageSkeletonRowClass = "h-10 w-full animate-pulse rounded-md bg-muted";
1733
1950
  var DEFAULT_SKELETON_ROW_COUNT2 = 6;
1734
- var DEFAULT_LABELS_LTR2 = {
1951
+ var DEFAULT_LABELS_LTR3 = {
1735
1952
  back: "Back",
1736
1953
  cancel: "Cancel",
1737
1954
  save: "Save",
1738
1955
  saving: "Saving\u2026"
1739
1956
  };
1740
- var DEFAULT_LABELS_RTL2 = {
1957
+ var DEFAULT_LABELS_RTL3 = {
1741
1958
  back: "\u0631\u062C\u0648\u0639",
1742
1959
  cancel: "\u0625\u0644\u063A\u0627\u0621",
1743
1960
  save: "\u062D\u0641\u0638",
@@ -1764,7 +1981,7 @@ function FormPage({
1764
1981
  const dir = useDirection();
1765
1982
  const formContext = reactHookForm.useFormContext();
1766
1983
  const submitting = isSubmitting ?? formContext?.formState?.isSubmitting ?? false;
1767
- const defaults = dir === "rtl" ? DEFAULT_LABELS_RTL2 : DEFAULT_LABELS_LTR2;
1984
+ const defaults = dir === "rtl" ? DEFAULT_LABELS_RTL3 : DEFAULT_LABELS_LTR3;
1768
1985
  const labels = { ...defaults, ...labelsProp };
1769
1986
  const goBack = () => navigate(-1);
1770
1987
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-slot": "form-page", className: cn(formPageBaseClass, className), children: [
@@ -2182,7 +2399,7 @@ function Table(props) {
2182
2399
  const sizeClasses = tableSizeClass[size];
2183
2400
  const showToolbar = enableRowSelection && bulkActions !== void 0 && selected.size > 0;
2184
2401
  const skeletonCount = loadingRowCount ?? pageSize;
2185
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex w-full flex-col gap-3", className), children: [
2402
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex w-full min-w-0 flex-col gap-3", className), children: [
2186
2403
  showToolbar && /* @__PURE__ */ jsxRuntime.jsx(
2187
2404
  Toolbar,
2188
2405
  {
@@ -2215,7 +2432,9 @@ function Table(props) {
2215
2432
  "thead",
2216
2433
  {
2217
2434
  className: cn(
2218
- "bg-muted/40 text-muted-foreground",
2435
+ // Opaque (not bg-muted/40) so a sticky header fully hides the rows
2436
+ // scrolling underneath it.
2437
+ "bg-muted text-muted-foreground",
2219
2438
  maxHeight !== void 0 && "sticky top-0 z-10"
2220
2439
  ),
2221
2440
  children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
@@ -2417,11 +2636,11 @@ var multiSelectSearchRowClass = "border-b border-border p-1";
2417
2636
  var multiSelectListClass = "max-h-60 overflow-y-auto overflow-x-hidden p-1";
2418
2637
  var multiSelectOptionClass = "flex w-full cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none hover:bg-accent hover:text-accent-foreground has-[:focus-visible]:bg-accent has-[:disabled]:pointer-events-none has-[:disabled]:opacity-50";
2419
2638
  var multiSelectEmptyClass = "px-2 py-6 text-center text-sm text-muted-foreground";
2420
- var DEFAULT_LABELS_LTR3 = {
2639
+ var DEFAULT_LABELS_LTR4 = {
2421
2640
  search: "Search\u2026",
2422
2641
  empty: "No results"
2423
2642
  };
2424
- var DEFAULT_LABELS_RTL3 = {
2643
+ var DEFAULT_LABELS_RTL4 = {
2425
2644
  search: "\u0628\u062D\u062B\u2026",
2426
2645
  empty: "\u0644\u0627 \u0646\u062A\u0627\u0626\u062C"
2427
2646
  };
@@ -2452,7 +2671,7 @@ var MultiSelect = react.forwardRef(function MultiSelect2({
2452
2671
  "aria-label": ariaLabel
2453
2672
  }, ref) {
2454
2673
  const dir = useDirection();
2455
- const labels = { ...dir === "rtl" ? DEFAULT_LABELS_RTL3 : DEFAULT_LABELS_LTR3, ...labelsProp };
2674
+ const labels = { ...dir === "rtl" ? DEFAULT_LABELS_RTL4 : DEFAULT_LABELS_LTR4, ...labelsProp };
2456
2675
  const generatedId = react.useId();
2457
2676
  const triggerId = id ?? generatedId;
2458
2677
  const isControlled = value !== void 0;
@@ -3054,6 +3273,57 @@ var RadioGroupItem = react.forwardRef(function RadioGroupItem2({ className, radi
3054
3273
  );
3055
3274
  });
3056
3275
 
3276
+ // src/components/row-actions/rowActionsVariants.ts
3277
+ var rowActionsBaseClass = "inline-flex items-center gap-1";
3278
+ var rowActionsDestructiveClass = "text-destructive hover:bg-destructive/10 hover:text-destructive focus-visible:ring-destructive/40";
3279
+ var PRESETS = {
3280
+ view: { icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Eye, {}), label: "View", destructive: false },
3281
+ edit: { icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Pencil, {}), label: "Edit", destructive: false },
3282
+ delete: { icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Trash2, {}), label: "Delete", destructive: true }
3283
+ };
3284
+ function isPreset(action) {
3285
+ return "kind" in action;
3286
+ }
3287
+ function resolveAction(action) {
3288
+ if (isPreset(action)) {
3289
+ const preset = PRESETS[action.kind];
3290
+ return {
3291
+ icon: preset.icon,
3292
+ label: action.label ?? preset.label,
3293
+ destructive: preset.destructive,
3294
+ onClick: action.onClick,
3295
+ disabled: action.disabled ?? false
3296
+ };
3297
+ }
3298
+ return {
3299
+ icon: action.icon,
3300
+ label: action.label,
3301
+ destructive: action.variant === "destructive",
3302
+ onClick: action.onClick,
3303
+ disabled: action.disabled ?? false
3304
+ };
3305
+ }
3306
+ function RowActions({ actions, size = "icon-sm", className }) {
3307
+ if (actions.length === 0) return null;
3308
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(rowActionsBaseClass, className), children: actions.map((action, index) => {
3309
+ const resolved = resolveAction(action);
3310
+ return /* @__PURE__ */ jsxRuntime.jsx(
3311
+ Button,
3312
+ {
3313
+ type: "button",
3314
+ variant: "ghost",
3315
+ size,
3316
+ "aria-label": resolved.label,
3317
+ disabled: resolved.disabled,
3318
+ onClick: resolved.onClick,
3319
+ className: resolved.destructive ? rowActionsDestructiveClass : void 0,
3320
+ children: resolved.icon
3321
+ },
3322
+ index
3323
+ );
3324
+ }) });
3325
+ }
3326
+
3057
3327
  // src/components/switch/switchVariants.ts
3058
3328
  var switchTrackClass = {
3059
3329
  sm: "h-4 w-7",
@@ -3338,6 +3608,7 @@ exports.DropdownMenuShortcut = DropdownMenuShortcut;
3338
3608
  exports.DropdownMenuTrigger = DropdownMenuTrigger;
3339
3609
  exports.EmptyState = EmptyState;
3340
3610
  exports.Field = Field;
3611
+ exports.FileUpload = FileUpload2;
3341
3612
  exports.FormPage = FormPage;
3342
3613
  exports.HeaderActions = HeaderActions;
3343
3614
  exports.HeaderCollapseTrigger = HeaderCollapseTrigger;
@@ -3351,6 +3622,7 @@ exports.MultiSelect = MultiSelect;
3351
3622
  exports.PageHeader = PageHeader;
3352
3623
  exports.RadioGroup = RadioGroup;
3353
3624
  exports.RadioGroupItem = RadioGroupItem;
3625
+ exports.RowActions = RowActions;
3354
3626
  exports.Select = Select;
3355
3627
  exports.Sidebar = Sidebar;
3356
3628
  exports.SidebarFooter = SidebarFooter;
@@ -3420,6 +3692,15 @@ exports.emptyStateDescriptionSizeClass = emptyStateDescriptionSizeClass;
3420
3692
  exports.emptyStateIconWrapperBaseClass = emptyStateIconWrapperBaseClass;
3421
3693
  exports.emptyStateIconWrapperSizeClass = emptyStateIconWrapperSizeClass;
3422
3694
  exports.emptyStateTitleSizeClass = emptyStateTitleSizeClass;
3695
+ exports.fileUploadBaseClass = fileUploadBaseClass;
3696
+ exports.fileUploadDropzoneClass = fileUploadDropzoneClass;
3697
+ exports.fileUploadFileNameClass = fileUploadFileNameClass;
3698
+ exports.fileUploadFileRowClass = fileUploadFileRowClass;
3699
+ exports.fileUploadFileSizeClass = fileUploadFileSizeClass;
3700
+ exports.fileUploadHintClass = fileUploadHintClass;
3701
+ exports.fileUploadIconClass = fileUploadIconClass;
3702
+ exports.fileUploadPromptClass = fileUploadPromptClass;
3703
+ exports.fileUploadRemoveClass = fileUploadRemoveClass;
3423
3704
  exports.formPageActionsBarClass = formPageActionsBarClass;
3424
3705
  exports.formPageBaseClass = formPageBaseClass;
3425
3706
  exports.formPageBodyClass = formPageBodyClass;
@@ -3455,6 +3736,8 @@ exports.radioItemBaseClass = radioItemBaseClass;
3455
3736
  exports.radioItemSizeClass = radioItemSizeClass;
3456
3737
  exports.radioLabelSizeClass = radioLabelSizeClass;
3457
3738
  exports.radioOptionRowClass = radioOptionRowClass;
3739
+ exports.rowActionsBaseClass = rowActionsBaseClass;
3740
+ exports.rowActionsDestructiveClass = rowActionsDestructiveClass;
3458
3741
  exports.selectBaseClass = selectBaseClass;
3459
3742
  exports.selectSizeClass = selectSizeClass;
3460
3743
  exports.selectVariantClass = selectVariantClass;