@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 +1 -0
- package/dist/index.cjs +294 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +193 -3
- package/dist/index.d.ts +193 -3
- package/dist/index.js +283 -13
- package/dist/index.js.map +1 -1
- package/dist/preset.css +282 -20
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -3,7 +3,7 @@ import { forwardRef, Children, isValidElement, cloneElement, createContext, useR
|
|
|
3
3
|
import { clsx } from 'clsx';
|
|
4
4
|
import { twMerge } from 'tailwind-merge';
|
|
5
5
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
6
|
-
import { Loader2, Check, Minus, Calendar, X, ChevronLeft, ChevronRight, ChevronDown, Search, ChevronUp, ArrowLeft, Menu, FileQuestion, ChevronsUpDown, Inbox, RefreshCw, SearchX } from 'lucide-react';
|
|
6
|
+
import { Loader2, Check, Minus, Calendar, X, ChevronLeft, ChevronRight, Upload, File as File$1, ChevronDown, Search, ChevronUp, ArrowLeft, Menu, FileQuestion, ChevronsUpDown, Inbox, RefreshCw, SearchX, Trash2, Pencil, Eye } from 'lucide-react';
|
|
7
7
|
import { DirectionProvider } from '@radix-ui/react-direction';
|
|
8
8
|
import { Link, useLocation, useResolvedPath, useNavigate } from 'react-router-dom';
|
|
9
9
|
import * as RadixPopover from '@radix-ui/react-popover';
|
|
@@ -108,7 +108,7 @@ var buttonSizeClass = {
|
|
|
108
108
|
icon: "h-9 w-9 shrink-0 rounded-md p-0",
|
|
109
109
|
"icon-sm": "h-8 w-8 shrink-0 rounded-md p-0"
|
|
110
110
|
};
|
|
111
|
-
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";
|
|
111
|
+
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";
|
|
112
112
|
var Button = forwardRef(function Button2({
|
|
113
113
|
variant = "primary",
|
|
114
114
|
size = "md",
|
|
@@ -271,7 +271,9 @@ function DashboardContent({ className, children, ...props }) {
|
|
|
271
271
|
"main",
|
|
272
272
|
{
|
|
273
273
|
className: cn(
|
|
274
|
-
|
|
274
|
+
// `min-w-0` keeps wide children (Table, code blocks) scrolling within
|
|
275
|
+
// this column instead of widening the page past 100%.
|
|
276
|
+
"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",
|
|
275
277
|
className
|
|
276
278
|
),
|
|
277
279
|
...props,
|
|
@@ -337,7 +339,10 @@ function DashboardMain({ className, children, ...props }) {
|
|
|
337
339
|
"div",
|
|
338
340
|
{
|
|
339
341
|
className: cn(
|
|
340
|
-
|
|
342
|
+
// `min-w-0` lets this flex column shrink below its content's intrinsic
|
|
343
|
+
// width so wide children (e.g. a Table) scroll internally instead of
|
|
344
|
+
// stretching the whole layout past 100%.
|
|
345
|
+
"flex min-h-screen min-w-0 flex-1 flex-col transition-[margin] duration-200 ease-out",
|
|
341
346
|
// On desktop, push the main column past the fixed sidebar using logical margin.
|
|
342
347
|
collapsed ? "lg:ms-[var(--sidebar-width-collapsed)]" : "lg:ms-[var(--sidebar-width)]",
|
|
343
348
|
className
|
|
@@ -1697,19 +1702,231 @@ function mergeRefs(...refs) {
|
|
|
1697
1702
|
};
|
|
1698
1703
|
}
|
|
1699
1704
|
|
|
1705
|
+
// src/components/file-upload/fileUploadVariants.ts
|
|
1706
|
+
var fileUploadBaseClass = "flex w-full min-w-0 flex-col gap-2";
|
|
1707
|
+
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";
|
|
1708
|
+
var fileUploadIconClass = "size-8 text-muted-foreground";
|
|
1709
|
+
var fileUploadPromptClass = "text-sm text-foreground";
|
|
1710
|
+
var fileUploadHintClass = "text-xs text-muted-foreground";
|
|
1711
|
+
var fileUploadFileRowClass = "flex items-center justify-between gap-2 rounded-md border border-border bg-card px-3 py-2";
|
|
1712
|
+
var fileUploadFileNameClass = "truncate text-sm font-medium text-foreground";
|
|
1713
|
+
var fileUploadFileSizeClass = "text-xs text-muted-foreground";
|
|
1714
|
+
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";
|
|
1715
|
+
var DEFAULT_MAX_SIZE_MB = 5;
|
|
1716
|
+
var DEFAULT_LABELS_LTR2 = {
|
|
1717
|
+
prompt: "Drag & drop a file or click to browse",
|
|
1718
|
+
remove: "Remove"
|
|
1719
|
+
};
|
|
1720
|
+
var DEFAULT_LABELS_RTL2 = {
|
|
1721
|
+
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",
|
|
1722
|
+
remove: "\u0625\u0632\u0627\u0644\u0629"
|
|
1723
|
+
};
|
|
1724
|
+
function normalizeFiles(value) {
|
|
1725
|
+
if (Array.isArray(value)) return value.filter((f) => f instanceof File);
|
|
1726
|
+
return value instanceof File ? [value] : [];
|
|
1727
|
+
}
|
|
1728
|
+
function fileKey(file) {
|
|
1729
|
+
return `${file.name}:${file.size}:${file.lastModified}`;
|
|
1730
|
+
}
|
|
1731
|
+
function formatBytes(bytes) {
|
|
1732
|
+
if (bytes < 1024) return `${bytes} B`;
|
|
1733
|
+
const kb = bytes / 1024;
|
|
1734
|
+
if (kb < 1024) return `${kb.toFixed(1)} KB`;
|
|
1735
|
+
return `${(kb / 1024).toFixed(1)} MB`;
|
|
1736
|
+
}
|
|
1737
|
+
function matchesAccept(file, accept) {
|
|
1738
|
+
if (!accept) return true;
|
|
1739
|
+
const tokens = accept.split(",").map((t) => t.trim().toLowerCase()).filter(Boolean);
|
|
1740
|
+
if (tokens.length === 0 || tokens.includes("*") || tokens.includes("*/*")) return true;
|
|
1741
|
+
const name = file.name.toLowerCase();
|
|
1742
|
+
const type = file.type.toLowerCase();
|
|
1743
|
+
return tokens.some((token) => {
|
|
1744
|
+
if (token.startsWith(".")) return name.endsWith(token);
|
|
1745
|
+
if (token.endsWith("/*")) return type.startsWith(token.slice(0, -1));
|
|
1746
|
+
return type === token;
|
|
1747
|
+
});
|
|
1748
|
+
}
|
|
1749
|
+
var FileUploadImpl = forwardRef(
|
|
1750
|
+
function FileUpload(props, ref) {
|
|
1751
|
+
const {
|
|
1752
|
+
multiple = false,
|
|
1753
|
+
accept,
|
|
1754
|
+
maxSize = DEFAULT_MAX_SIZE_MB,
|
|
1755
|
+
disabled = false,
|
|
1756
|
+
required,
|
|
1757
|
+
name,
|
|
1758
|
+
id,
|
|
1759
|
+
onError,
|
|
1760
|
+
onBlur,
|
|
1761
|
+
labels: labelsProp,
|
|
1762
|
+
className,
|
|
1763
|
+
value,
|
|
1764
|
+
defaultValue,
|
|
1765
|
+
onValueChange,
|
|
1766
|
+
onChange,
|
|
1767
|
+
"aria-invalid": ariaInvalid,
|
|
1768
|
+
"aria-describedby": ariaDescribedBy,
|
|
1769
|
+
"aria-label": ariaLabel
|
|
1770
|
+
} = props;
|
|
1771
|
+
const dir = useDirection();
|
|
1772
|
+
const generatedId = useId();
|
|
1773
|
+
const inputId = id ?? generatedId;
|
|
1774
|
+
const [dragActive, setDragActive] = useState(false);
|
|
1775
|
+
const baseLabels = dir === "rtl" ? DEFAULT_LABELS_RTL2 : DEFAULT_LABELS_LTR2;
|
|
1776
|
+
const prompt = labelsProp?.prompt ?? baseLabels.prompt;
|
|
1777
|
+
const removeLabel = labelsProp?.remove ?? baseLabels.remove;
|
|
1778
|
+
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`);
|
|
1779
|
+
const isControlled = value !== void 0;
|
|
1780
|
+
const [internal, setInternal] = useState(() => normalizeFiles(defaultValue));
|
|
1781
|
+
const files = isControlled ? normalizeFiles(value) : internal;
|
|
1782
|
+
const invalid = ariaInvalid === true || ariaInvalid === "true";
|
|
1783
|
+
const emit = (next) => {
|
|
1784
|
+
if (!isControlled) setInternal(next);
|
|
1785
|
+
onValueChange?.(multiple ? next : next[0] ?? null);
|
|
1786
|
+
onChange?.(multiple ? next : next[0] ?? null);
|
|
1787
|
+
};
|
|
1788
|
+
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`;
|
|
1789
|
+
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`;
|
|
1790
|
+
const addFiles = (incoming) => {
|
|
1791
|
+
if (disabled) return;
|
|
1792
|
+
const accepted = [];
|
|
1793
|
+
for (const file of Array.from(incoming)) {
|
|
1794
|
+
if (!matchesAccept(file, accept)) {
|
|
1795
|
+
onError?.({ code: "file-type-rejected", message: wrongTypeMessage(file), file });
|
|
1796
|
+
continue;
|
|
1797
|
+
}
|
|
1798
|
+
if (maxSize && file.size > maxSize * 1024 * 1024) {
|
|
1799
|
+
onError?.({ code: "file-too-large", message: tooLargeMessage(file), file });
|
|
1800
|
+
continue;
|
|
1801
|
+
}
|
|
1802
|
+
accepted.push(file);
|
|
1803
|
+
}
|
|
1804
|
+
if (accepted.length === 0) return;
|
|
1805
|
+
if (!multiple) {
|
|
1806
|
+
const [first] = accepted;
|
|
1807
|
+
if (first) emit([first]);
|
|
1808
|
+
return;
|
|
1809
|
+
}
|
|
1810
|
+
const byKey = new Map(files.map((f) => [fileKey(f), f]));
|
|
1811
|
+
for (const f of accepted) byKey.set(fileKey(f), f);
|
|
1812
|
+
emit([...byKey.values()]);
|
|
1813
|
+
};
|
|
1814
|
+
const handleInputChange = (event) => {
|
|
1815
|
+
if (event.target.files) addFiles(event.target.files);
|
|
1816
|
+
event.target.value = "";
|
|
1817
|
+
};
|
|
1818
|
+
const handleDrag = (event) => {
|
|
1819
|
+
event.preventDefault();
|
|
1820
|
+
event.stopPropagation();
|
|
1821
|
+
if (disabled) return;
|
|
1822
|
+
if (event.type === "dragenter" || event.type === "dragover") setDragActive(true);
|
|
1823
|
+
else if (event.type === "dragleave") setDragActive(false);
|
|
1824
|
+
};
|
|
1825
|
+
const handleDrop = (event) => {
|
|
1826
|
+
event.preventDefault();
|
|
1827
|
+
event.stopPropagation();
|
|
1828
|
+
setDragActive(false);
|
|
1829
|
+
if (!disabled && event.dataTransfer.files) addFiles(event.dataTransfer.files);
|
|
1830
|
+
};
|
|
1831
|
+
const remove = (file) => emit(files.filter((f) => fileKey(f) !== fileKey(file)));
|
|
1832
|
+
const showDropzone = multiple || files.length === 0;
|
|
1833
|
+
return (
|
|
1834
|
+
// biome-ignore lint/a11y/noStaticElementInteractions: drag-and-drop is a wrapper affordance; keyboard/click access is the inner <label> + focusable <input>.
|
|
1835
|
+
/* @__PURE__ */ jsxs(
|
|
1836
|
+
"div",
|
|
1837
|
+
{
|
|
1838
|
+
ref,
|
|
1839
|
+
"data-slot": "file-upload",
|
|
1840
|
+
className: cn(fileUploadBaseClass, className),
|
|
1841
|
+
onDragEnter: handleDrag,
|
|
1842
|
+
onDragOver: handleDrag,
|
|
1843
|
+
onDragLeave: handleDrag,
|
|
1844
|
+
onDrop: handleDrop,
|
|
1845
|
+
children: [
|
|
1846
|
+
/* @__PURE__ */ jsx(
|
|
1847
|
+
"input",
|
|
1848
|
+
{
|
|
1849
|
+
id: inputId,
|
|
1850
|
+
type: "file",
|
|
1851
|
+
accept,
|
|
1852
|
+
multiple,
|
|
1853
|
+
name,
|
|
1854
|
+
required,
|
|
1855
|
+
disabled,
|
|
1856
|
+
onChange: handleInputChange,
|
|
1857
|
+
onBlur,
|
|
1858
|
+
"aria-invalid": ariaInvalid,
|
|
1859
|
+
"aria-describedby": ariaDescribedBy,
|
|
1860
|
+
"aria-label": ariaLabel,
|
|
1861
|
+
className: "peer sr-only"
|
|
1862
|
+
}
|
|
1863
|
+
),
|
|
1864
|
+
showDropzone ? /* @__PURE__ */ jsxs(
|
|
1865
|
+
"label",
|
|
1866
|
+
{
|
|
1867
|
+
htmlFor: inputId,
|
|
1868
|
+
"data-slot": "file-upload-dropzone",
|
|
1869
|
+
"data-drag-active": dragActive ? "true" : void 0,
|
|
1870
|
+
"data-invalid": invalid ? "true" : void 0,
|
|
1871
|
+
"data-disabled": disabled ? "true" : void 0,
|
|
1872
|
+
className: fileUploadDropzoneClass,
|
|
1873
|
+
children: [
|
|
1874
|
+
/* @__PURE__ */ jsx(Upload, { "aria-hidden": "true", className: fileUploadIconClass }),
|
|
1875
|
+
/* @__PURE__ */ jsx("span", { className: fileUploadPromptClass, children: prompt }),
|
|
1876
|
+
/* @__PURE__ */ jsx("span", { className: fileUploadHintClass, children: hint })
|
|
1877
|
+
]
|
|
1878
|
+
}
|
|
1879
|
+
) : null,
|
|
1880
|
+
files.length > 0 ? /* @__PURE__ */ jsx("ul", { className: "flex flex-col gap-2", children: files.map((file) => /* @__PURE__ */ jsxs(
|
|
1881
|
+
"li",
|
|
1882
|
+
{
|
|
1883
|
+
"data-slot": "file-upload-file",
|
|
1884
|
+
className: fileUploadFileRowClass,
|
|
1885
|
+
children: [
|
|
1886
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [
|
|
1887
|
+
/* @__PURE__ */ jsx(File$1, { "aria-hidden": "true", className: "size-5 shrink-0 text-muted-foreground" }),
|
|
1888
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
1889
|
+
/* @__PURE__ */ jsx("p", { className: fileUploadFileNameClass, children: file.name }),
|
|
1890
|
+
/* @__PURE__ */ jsx("p", { className: fileUploadFileSizeClass, children: formatBytes(file.size) })
|
|
1891
|
+
] })
|
|
1892
|
+
] }),
|
|
1893
|
+
/* @__PURE__ */ jsx(
|
|
1894
|
+
"button",
|
|
1895
|
+
{
|
|
1896
|
+
type: "button",
|
|
1897
|
+
disabled,
|
|
1898
|
+
"aria-label": `${removeLabel}: ${file.name}`,
|
|
1899
|
+
"data-slot": "file-upload-remove",
|
|
1900
|
+
className: fileUploadRemoveClass,
|
|
1901
|
+
onClick: () => remove(file),
|
|
1902
|
+
children: /* @__PURE__ */ jsx(X, { "aria-hidden": "true", className: "size-4" })
|
|
1903
|
+
}
|
|
1904
|
+
)
|
|
1905
|
+
]
|
|
1906
|
+
},
|
|
1907
|
+
fileKey(file)
|
|
1908
|
+
)) }) : null
|
|
1909
|
+
]
|
|
1910
|
+
}
|
|
1911
|
+
)
|
|
1912
|
+
);
|
|
1913
|
+
}
|
|
1914
|
+
);
|
|
1915
|
+
var FileUpload2 = FileUploadImpl;
|
|
1916
|
+
|
|
1700
1917
|
// src/components/form-page/formPageVariants.ts
|
|
1701
1918
|
var formPageBaseClass = "flex w-full flex-col gap-6";
|
|
1702
1919
|
var formPageBodyClass = "flex-1";
|
|
1703
1920
|
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";
|
|
1704
1921
|
var formPageSkeletonRowClass = "h-10 w-full animate-pulse rounded-md bg-muted";
|
|
1705
1922
|
var DEFAULT_SKELETON_ROW_COUNT2 = 6;
|
|
1706
|
-
var
|
|
1923
|
+
var DEFAULT_LABELS_LTR3 = {
|
|
1707
1924
|
back: "Back",
|
|
1708
1925
|
cancel: "Cancel",
|
|
1709
1926
|
save: "Save",
|
|
1710
1927
|
saving: "Saving\u2026"
|
|
1711
1928
|
};
|
|
1712
|
-
var
|
|
1929
|
+
var DEFAULT_LABELS_RTL3 = {
|
|
1713
1930
|
back: "\u0631\u062C\u0648\u0639",
|
|
1714
1931
|
cancel: "\u0625\u0644\u063A\u0627\u0621",
|
|
1715
1932
|
save: "\u062D\u0641\u0638",
|
|
@@ -1736,7 +1953,7 @@ function FormPage({
|
|
|
1736
1953
|
const dir = useDirection();
|
|
1737
1954
|
const formContext = useFormContext();
|
|
1738
1955
|
const submitting = isSubmitting ?? formContext?.formState?.isSubmitting ?? false;
|
|
1739
|
-
const defaults = dir === "rtl" ?
|
|
1956
|
+
const defaults = dir === "rtl" ? DEFAULT_LABELS_RTL3 : DEFAULT_LABELS_LTR3;
|
|
1740
1957
|
const labels = { ...defaults, ...labelsProp };
|
|
1741
1958
|
const goBack = () => navigate(-1);
|
|
1742
1959
|
return /* @__PURE__ */ jsxs("div", { "data-slot": "form-page", className: cn(formPageBaseClass, className), children: [
|
|
@@ -2154,7 +2371,7 @@ function Table(props) {
|
|
|
2154
2371
|
const sizeClasses = tableSizeClass[size];
|
|
2155
2372
|
const showToolbar = enableRowSelection && bulkActions !== void 0 && selected.size > 0;
|
|
2156
2373
|
const skeletonCount = loadingRowCount ?? pageSize;
|
|
2157
|
-
return /* @__PURE__ */ jsxs("div", { className: cn("flex w-full flex-col gap-3", className), children: [
|
|
2374
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("flex w-full min-w-0 flex-col gap-3", className), children: [
|
|
2158
2375
|
showToolbar && /* @__PURE__ */ jsx(
|
|
2159
2376
|
Toolbar,
|
|
2160
2377
|
{
|
|
@@ -2187,7 +2404,9 @@ function Table(props) {
|
|
|
2187
2404
|
"thead",
|
|
2188
2405
|
{
|
|
2189
2406
|
className: cn(
|
|
2190
|
-
|
|
2407
|
+
// Opaque (not bg-muted/40) so a sticky header fully hides the rows
|
|
2408
|
+
// scrolling underneath it.
|
|
2409
|
+
"bg-muted text-muted-foreground",
|
|
2191
2410
|
maxHeight !== void 0 && "sticky top-0 z-10"
|
|
2192
2411
|
),
|
|
2193
2412
|
children: /* @__PURE__ */ jsxs("tr", { children: [
|
|
@@ -2389,11 +2608,11 @@ var multiSelectSearchRowClass = "border-b border-border p-1";
|
|
|
2389
2608
|
var multiSelectListClass = "max-h-60 overflow-y-auto overflow-x-hidden p-1";
|
|
2390
2609
|
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";
|
|
2391
2610
|
var multiSelectEmptyClass = "px-2 py-6 text-center text-sm text-muted-foreground";
|
|
2392
|
-
var
|
|
2611
|
+
var DEFAULT_LABELS_LTR4 = {
|
|
2393
2612
|
search: "Search\u2026",
|
|
2394
2613
|
empty: "No results"
|
|
2395
2614
|
};
|
|
2396
|
-
var
|
|
2615
|
+
var DEFAULT_LABELS_RTL4 = {
|
|
2397
2616
|
search: "\u0628\u062D\u062B\u2026",
|
|
2398
2617
|
empty: "\u0644\u0627 \u0646\u062A\u0627\u0626\u062C"
|
|
2399
2618
|
};
|
|
@@ -2424,7 +2643,7 @@ var MultiSelect = forwardRef(function MultiSelect2({
|
|
|
2424
2643
|
"aria-label": ariaLabel
|
|
2425
2644
|
}, ref) {
|
|
2426
2645
|
const dir = useDirection();
|
|
2427
|
-
const labels = { ...dir === "rtl" ?
|
|
2646
|
+
const labels = { ...dir === "rtl" ? DEFAULT_LABELS_RTL4 : DEFAULT_LABELS_LTR4, ...labelsProp };
|
|
2428
2647
|
const generatedId = useId();
|
|
2429
2648
|
const triggerId = id ?? generatedId;
|
|
2430
2649
|
const isControlled = value !== void 0;
|
|
@@ -3026,6 +3245,57 @@ var RadioGroupItem = forwardRef(function RadioGroupItem2({ className, radioSize
|
|
|
3026
3245
|
);
|
|
3027
3246
|
});
|
|
3028
3247
|
|
|
3248
|
+
// src/components/row-actions/rowActionsVariants.ts
|
|
3249
|
+
var rowActionsBaseClass = "inline-flex items-center gap-1";
|
|
3250
|
+
var rowActionsDestructiveClass = "text-destructive hover:bg-destructive/10 hover:text-destructive focus-visible:ring-destructive/40";
|
|
3251
|
+
var PRESETS = {
|
|
3252
|
+
view: { icon: /* @__PURE__ */ jsx(Eye, {}), label: "View", destructive: false },
|
|
3253
|
+
edit: { icon: /* @__PURE__ */ jsx(Pencil, {}), label: "Edit", destructive: false },
|
|
3254
|
+
delete: { icon: /* @__PURE__ */ jsx(Trash2, {}), label: "Delete", destructive: true }
|
|
3255
|
+
};
|
|
3256
|
+
function isPreset(action) {
|
|
3257
|
+
return "kind" in action;
|
|
3258
|
+
}
|
|
3259
|
+
function resolveAction(action) {
|
|
3260
|
+
if (isPreset(action)) {
|
|
3261
|
+
const preset = PRESETS[action.kind];
|
|
3262
|
+
return {
|
|
3263
|
+
icon: preset.icon,
|
|
3264
|
+
label: action.label ?? preset.label,
|
|
3265
|
+
destructive: preset.destructive,
|
|
3266
|
+
onClick: action.onClick,
|
|
3267
|
+
disabled: action.disabled ?? false
|
|
3268
|
+
};
|
|
3269
|
+
}
|
|
3270
|
+
return {
|
|
3271
|
+
icon: action.icon,
|
|
3272
|
+
label: action.label,
|
|
3273
|
+
destructive: action.variant === "destructive",
|
|
3274
|
+
onClick: action.onClick,
|
|
3275
|
+
disabled: action.disabled ?? false
|
|
3276
|
+
};
|
|
3277
|
+
}
|
|
3278
|
+
function RowActions({ actions, size = "icon-sm", className }) {
|
|
3279
|
+
if (actions.length === 0) return null;
|
|
3280
|
+
return /* @__PURE__ */ jsx("div", { className: cn(rowActionsBaseClass, className), children: actions.map((action, index) => {
|
|
3281
|
+
const resolved = resolveAction(action);
|
|
3282
|
+
return /* @__PURE__ */ jsx(
|
|
3283
|
+
Button,
|
|
3284
|
+
{
|
|
3285
|
+
type: "button",
|
|
3286
|
+
variant: "ghost",
|
|
3287
|
+
size,
|
|
3288
|
+
"aria-label": resolved.label,
|
|
3289
|
+
disabled: resolved.disabled,
|
|
3290
|
+
onClick: resolved.onClick,
|
|
3291
|
+
className: resolved.destructive ? rowActionsDestructiveClass : void 0,
|
|
3292
|
+
children: resolved.icon
|
|
3293
|
+
},
|
|
3294
|
+
index
|
|
3295
|
+
);
|
|
3296
|
+
}) });
|
|
3297
|
+
}
|
|
3298
|
+
|
|
3029
3299
|
// src/components/switch/switchVariants.ts
|
|
3030
3300
|
var switchTrackClass = {
|
|
3031
3301
|
sm: "h-4 w-7",
|
|
@@ -3262,6 +3532,6 @@ function Tooltip({
|
|
|
3262
3532
|
);
|
|
3263
3533
|
}
|
|
3264
3534
|
|
|
3265
|
-
export { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AppShell, Avatar, Badge, Button, Checkbox, ConfirmDialogProvider, DashboardContent, DashboardHeader, DashboardLayout, DashboardMain, DatePicker, DetailPage, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuTrigger, EmptyState, Field, FormPage, HeaderActions, HeaderCollapseTrigger, HeaderMobileTrigger, HeaderSearch, HeaderTitle, Input, LanguageSwitcher, ListPage, MultiSelect, PageHeader, RadioGroup, RadioGroupItem, Select, Sidebar, SidebarFooter, SidebarGroup, SidebarHeader, SidebarNav, SidebarNavGroup, SidebarNavItem, Switch, Table, Textarea, Toaster, Tooltip, TooltipProvider, badgeBaseClass, badgeDotSizeClass, badgeSizeClass, badgeVariantClass, buttonBaseClass, buttonSizeClass, buttonVariantClass, cn, datePickerCalendarClass, datePickerCaptionClass, datePickerContentClass, datePickerDayBaseClass, datePickerDayWrapperClass, datePickerDisabledClass, datePickerMonthClass, datePickerMonthGridClass, datePickerMonthsClass, datePickerNavButtonClass, datePickerNavClass, datePickerOutsideClass, datePickerPlaceholderClass, datePickerSelectedClass, datePickerTodayClass, datePickerTriggerBaseClass, datePickerTriggerSizeClass, datePickerTriggerVariantClass, datePickerValueClass, datePickerWeekClass, datePickerWeekdayClass, datePickerWeekdaysClass, detailPageBaseClass, detailPageBodyClass, detailPageEmptyClass, detailPageSkeletonRowClass, dialogCloseButtonClass, dialogContentClass, dialogDescriptionClass, dialogFooterClass, dialogHeaderClass, dialogOverlayClass, dialogTitleClass, dropdownMenuContentClass, dropdownMenuItemBaseClass, dropdownMenuItemInsetClass, dropdownMenuItemVariantClass, dropdownMenuLabelClass, dropdownMenuSeparatorClass, dropdownMenuShortcutClass, emptyStateActionsSpacingClass, emptyStateBaseClass, emptyStateContainerSizeClass, emptyStateDescriptionSizeClass, emptyStateIconWrapperBaseClass, emptyStateIconWrapperSizeClass, emptyStateTitleSizeClass, formPageActionsBarClass, formPageBaseClass, formPageBodyClass, formPageSkeletonRowClass, inputBaseClass, inputSizeClass, inputVariantClass, multiSelectChipClass, multiSelectChipRemoveClass, multiSelectContentClass, multiSelectEmptyClass, multiSelectListClass, multiSelectOptionClass, multiSelectSearchRowClass, multiSelectTriggerSizeClass, multiSelectValueRowClass, pageHeaderActionsClass, pageHeaderBackClass, pageHeaderBackIconClass, pageHeaderBaseClass, pageHeaderBorderedClass, pageHeaderBreadcrumbsClass, pageHeaderDescriptionClass, pageHeaderTitleBlockClass, pageHeaderTitleClass, pageHeaderTitleRowClass, radioGroupBaseClass, radioGroupOrientationClass, radioIndicatorBaseClass, radioIndicatorDotClass, radioIndicatorSizeClass, radioItemBaseClass, radioItemSizeClass, radioLabelSizeClass, radioOptionRowClass, selectBaseClass, selectSizeClass, selectVariantClass, switchThumbBaseClass, switchThumbClass, switchTrackBaseClass, switchTrackClass, alignClass as tableAlignClass, tableBaseClass, selectedRowClass as tableSelectedRowClass, tableSizeClass, sortIconClass as tableSortIconClass, textareaBaseClass, textareaResizeClass, textareaSizeClass, textareaVariantClass, toastClassNames, tooltipArrowClass, tooltipContentClass, useConfirm, useDashboardLayout, useDirection };
|
|
3535
|
+
export { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AppShell, Avatar, Badge, Button, Checkbox, ConfirmDialogProvider, DashboardContent, DashboardHeader, DashboardLayout, DashboardMain, DatePicker, DetailPage, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuTrigger, EmptyState, Field, FileUpload2 as FileUpload, FormPage, HeaderActions, HeaderCollapseTrigger, HeaderMobileTrigger, HeaderSearch, HeaderTitle, Input, LanguageSwitcher, ListPage, MultiSelect, PageHeader, RadioGroup, RadioGroupItem, RowActions, Select, Sidebar, SidebarFooter, SidebarGroup, SidebarHeader, SidebarNav, SidebarNavGroup, SidebarNavItem, Switch, Table, Textarea, Toaster, Tooltip, TooltipProvider, badgeBaseClass, badgeDotSizeClass, badgeSizeClass, badgeVariantClass, buttonBaseClass, buttonSizeClass, buttonVariantClass, cn, datePickerCalendarClass, datePickerCaptionClass, datePickerContentClass, datePickerDayBaseClass, datePickerDayWrapperClass, datePickerDisabledClass, datePickerMonthClass, datePickerMonthGridClass, datePickerMonthsClass, datePickerNavButtonClass, datePickerNavClass, datePickerOutsideClass, datePickerPlaceholderClass, datePickerSelectedClass, datePickerTodayClass, datePickerTriggerBaseClass, datePickerTriggerSizeClass, datePickerTriggerVariantClass, datePickerValueClass, datePickerWeekClass, datePickerWeekdayClass, datePickerWeekdaysClass, detailPageBaseClass, detailPageBodyClass, detailPageEmptyClass, detailPageSkeletonRowClass, dialogCloseButtonClass, dialogContentClass, dialogDescriptionClass, dialogFooterClass, dialogHeaderClass, dialogOverlayClass, dialogTitleClass, dropdownMenuContentClass, dropdownMenuItemBaseClass, dropdownMenuItemInsetClass, dropdownMenuItemVariantClass, dropdownMenuLabelClass, dropdownMenuSeparatorClass, dropdownMenuShortcutClass, emptyStateActionsSpacingClass, emptyStateBaseClass, emptyStateContainerSizeClass, emptyStateDescriptionSizeClass, emptyStateIconWrapperBaseClass, emptyStateIconWrapperSizeClass, emptyStateTitleSizeClass, fileUploadBaseClass, fileUploadDropzoneClass, fileUploadFileNameClass, fileUploadFileRowClass, fileUploadFileSizeClass, fileUploadHintClass, fileUploadIconClass, fileUploadPromptClass, fileUploadRemoveClass, formPageActionsBarClass, formPageBaseClass, formPageBodyClass, formPageSkeletonRowClass, inputBaseClass, inputSizeClass, inputVariantClass, multiSelectChipClass, multiSelectChipRemoveClass, multiSelectContentClass, multiSelectEmptyClass, multiSelectListClass, multiSelectOptionClass, multiSelectSearchRowClass, multiSelectTriggerSizeClass, multiSelectValueRowClass, pageHeaderActionsClass, pageHeaderBackClass, pageHeaderBackIconClass, pageHeaderBaseClass, pageHeaderBorderedClass, pageHeaderBreadcrumbsClass, pageHeaderDescriptionClass, pageHeaderTitleBlockClass, pageHeaderTitleClass, pageHeaderTitleRowClass, radioGroupBaseClass, radioGroupOrientationClass, radioIndicatorBaseClass, radioIndicatorDotClass, radioIndicatorSizeClass, radioItemBaseClass, radioItemSizeClass, radioLabelSizeClass, radioOptionRowClass, rowActionsBaseClass, rowActionsDestructiveClass, selectBaseClass, selectSizeClass, selectVariantClass, switchThumbBaseClass, switchThumbClass, switchTrackBaseClass, switchTrackClass, alignClass as tableAlignClass, tableBaseClass, selectedRowClass as tableSelectedRowClass, tableSizeClass, sortIconClass as tableSortIconClass, textareaBaseClass, textareaResizeClass, textareaSizeClass, textareaVariantClass, toastClassNames, tooltipArrowClass, tooltipContentClass, useConfirm, useDashboardLayout, useDirection };
|
|
3266
3536
|
//# sourceMappingURL=index.js.map
|
|
3267
3537
|
//# sourceMappingURL=index.js.map
|