@astralform/ui 0.0.0-stage → 0.3.7-next.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/DESIGN.md +243 -0
- package/LICENSE +21 -0
- package/README.md +128 -2
- package/dist/components/Alert.d.ts +7 -0
- package/dist/components/Alert.js +40 -0
- package/dist/components/Alert.js.map +1 -0
- package/dist/components/AvatarEditor.d.ts +13 -0
- package/dist/components/AvatarEditor.js +44 -0
- package/dist/components/AvatarEditor.js.map +1 -0
- package/dist/components/Badge.d.ts +16 -0
- package/dist/components/Badge.js +38 -0
- package/dist/components/Badge.js.map +1 -0
- package/dist/components/Button.d.ts +8 -0
- package/dist/components/Button.js +21 -0
- package/dist/components/Button.js.map +1 -0
- package/dist/components/Card.d.ts +10 -0
- package/dist/components/Card.js +22 -0
- package/dist/components/Card.js.map +1 -0
- package/dist/components/CompactResourceRow.d.ts +34 -0
- package/dist/components/CompactResourceRow.js +11 -0
- package/dist/components/CompactResourceRow.js.map +1 -0
- package/dist/components/ConfirmDialog.d.ts +12 -0
- package/dist/components/ConfirmDialog.js +7 -0
- package/dist/components/ConfirmDialog.js.map +1 -0
- package/dist/components/CookieConsent.d.ts +1 -0
- package/dist/components/CookieConsent.js +42 -0
- package/dist/components/CookieConsent.js.map +1 -0
- package/dist/components/DataTable.d.ts +53 -0
- package/dist/components/DataTable.js +79 -0
- package/dist/components/DataTable.js.map +1 -0
- package/dist/components/DevTools.d.ts +6 -0
- package/dist/components/DevTools.js +59 -0
- package/dist/components/DevTools.js.map +1 -0
- package/dist/components/EmptyState.d.ts +11 -0
- package/dist/components/EmptyState.js +6 -0
- package/dist/components/EmptyState.js.map +1 -0
- package/dist/components/ImageCropModal.d.ts +18 -0
- package/dist/components/ImageCropModal.js +67 -0
- package/dist/components/ImageCropModal.js.map +1 -0
- package/dist/components/InlineBanner.d.ts +20 -0
- package/dist/components/InlineBanner.js +53 -0
- package/dist/components/InlineBanner.js.map +1 -0
- package/dist/components/Input.d.ts +8 -0
- package/dist/components/Input.js +10 -0
- package/dist/components/Input.js.map +1 -0
- package/dist/components/InventoryCard.d.ts +20 -0
- package/dist/components/InventoryCard.js +22 -0
- package/dist/components/InventoryCard.js.map +1 -0
- package/dist/components/LoadingSpinner.d.ts +26 -0
- package/dist/components/LoadingSpinner.js +32 -0
- package/dist/components/LoadingSpinner.js.map +1 -0
- package/dist/components/Modal.d.ts +10 -0
- package/dist/components/Modal.js +38 -0
- package/dist/components/Modal.js.map +1 -0
- package/dist/components/PageHeader.d.ts +11 -0
- package/dist/components/PageHeader.js +5 -0
- package/dist/components/PageHeader.js.map +1 -0
- package/dist/components/PreviewModal.d.ts +24 -0
- package/dist/components/PreviewModal.js +69 -0
- package/dist/components/PreviewModal.js.map +1 -0
- package/dist/components/ProgressBar.d.ts +8 -0
- package/dist/components/ProgressBar.js +12 -0
- package/dist/components/ProgressBar.js.map +1 -0
- package/dist/components/ProviderIcon.d.ts +7 -0
- package/dist/components/ProviderIcon.js +34 -0
- package/dist/components/ProviderIcon.js.map +1 -0
- package/dist/components/ResizeHandle.d.ts +56 -0
- package/dist/components/ResizeHandle.js +166 -0
- package/dist/components/ResizeHandle.js.map +1 -0
- package/dist/components/SegmentedProgressBar.d.ts +9 -0
- package/dist/components/SegmentedProgressBar.js +23 -0
- package/dist/components/SegmentedProgressBar.js.map +1 -0
- package/dist/components/Select.d.ts +13 -0
- package/dist/components/Select.js +14 -0
- package/dist/components/Select.js.map +1 -0
- package/dist/components/SpotlightButton.d.ts +10 -0
- package/dist/components/SpotlightButton.js +51 -0
- package/dist/components/SpotlightButton.js.map +1 -0
- package/dist/components/StatCard.d.ts +9 -0
- package/dist/components/StatCard.js +8 -0
- package/dist/components/StatCard.js.map +1 -0
- package/dist/components/StatusBadge.d.ts +4 -0
- package/dist/components/StatusBadge.js +10 -0
- package/dist/components/StatusBadge.js.map +1 -0
- package/dist/components/TabNav.d.ts +39 -0
- package/dist/components/TabNav.js +25 -0
- package/dist/components/TabNav.js.map +1 -0
- package/dist/components/TableShell.d.ts +21 -0
- package/dist/components/TableShell.js +19 -0
- package/dist/components/TableShell.js.map +1 -0
- package/dist/components/Textarea.d.ts +7 -0
- package/dist/components/Textarea.js +10 -0
- package/dist/components/Textarea.js.map +1 -0
- package/dist/components/Toggle.d.ts +16 -0
- package/dist/components/Toggle.js +25 -0
- package/dist/components/Toggle.js.map +1 -0
- package/dist/components/Toolbar.d.ts +34 -0
- package/dist/components/Toolbar.js +30 -0
- package/dist/components/Toolbar.js.map +1 -0
- package/dist/components/TypeToConfirmModal.d.ts +15 -0
- package/dist/components/TypeToConfirmModal.js +14 -0
- package/dist/components/TypeToConfirmModal.js.map +1 -0
- package/dist/components/UnsavedChangesModal.d.ts +7 -0
- package/dist/components/UnsavedChangesModal.js +7 -0
- package/dist/components/UnsavedChangesModal.js.map +1 -0
- package/dist/components/UsageCard.d.ts +11 -0
- package/dist/components/UsageCard.js +9 -0
- package/dist/components/UsageCard.js.map +1 -0
- package/dist/components/avatar.d.ts +79 -0
- package/dist/components/avatar.js +88 -0
- package/dist/components/avatar.js.map +1 -0
- package/dist/components/badge-config.d.ts +16 -0
- package/dist/components/badge-config.js +48 -0
- package/dist/components/badge-config.js.map +1 -0
- package/dist/components/glowing-effect.d.ts +14 -0
- package/dist/components/glowing-effect.js +108 -0
- package/dist/components/glowing-effect.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/cookies.d.ts +36 -0
- package/dist/lib/cookies.js +78 -0
- package/dist/lib/cookies.js.map +1 -0
- package/dist/lib/environment.d.ts +24 -0
- package/dist/lib/environment.js +52 -0
- package/dist/lib/environment.js.map +1 -0
- package/dist/lib/utils.d.ts +4 -0
- package/dist/lib/utils.js +8 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/types.d.ts +12 -0
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -0
- package/package.json +89 -4
- package/src/styles/base.css +779 -0
- package/src/styles/fonts.css +25 -0
- package/src/styles/theme-default.css +164 -0
- package/src/styles/theme-default.generated.css +79 -0
- package/src/styles/tokens/_foundations.css +28 -0
- package/src/styles/tokens/_semantics.css +72 -0
- package/themes/chat.DESIGN.md +197 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface SegmentedProgressBarProps {
|
|
2
|
+
value: number;
|
|
3
|
+
max: number;
|
|
4
|
+
segments?: number;
|
|
5
|
+
size?: "sm" | "md" | "lg";
|
|
6
|
+
className?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function SegmentedProgressBar({ value, max, segments, size, className, }: SegmentedProgressBarProps): import("react").JSX.Element;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../lib/utils";
|
|
3
|
+
const SIZE_CLASSES = {
|
|
4
|
+
sm: "h-2 gap-0.5",
|
|
5
|
+
md: "h-3 gap-1",
|
|
6
|
+
lg: "h-4 gap-1",
|
|
7
|
+
};
|
|
8
|
+
const SEGMENT_SIZES = {
|
|
9
|
+
sm: "rounded-sm",
|
|
10
|
+
md: "rounded",
|
|
11
|
+
lg: "rounded-md",
|
|
12
|
+
};
|
|
13
|
+
export function SegmentedProgressBar({ value, max, segments = 20, size = "md", className, }) {
|
|
14
|
+
const percentage = max > 0 ? Math.min((value / max) * 100, 100) : 0;
|
|
15
|
+
const filledSegments = Math.round((percentage / 100) * segments);
|
|
16
|
+
const colorClass = percentage >= 90
|
|
17
|
+
? "bg-danger"
|
|
18
|
+
: percentage >= 70
|
|
19
|
+
? "bg-warning"
|
|
20
|
+
: "bg-text-secondary";
|
|
21
|
+
return (_jsx("div", { className: cn("w-full", className), children: _jsx("div", { className: cn("flex", SIZE_CLASSES[size]), children: Array.from({ length: segments }).map((_, index) => (_jsx("div", { className: cn("flex-1 transition-all duration-300", SEGMENT_SIZES[size], index < filledSegments ? colorClass : "bg-surface-tertiary") }, index))) }) }));
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=SegmentedProgressBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SegmentedProgressBar.js","sourceRoot":"","sources":["../../src/components/SegmentedProgressBar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,MAAM,YAAY,GAAG;IACnB,EAAE,EAAE,aAAa;IACjB,EAAE,EAAE,WAAW;IACf,EAAE,EAAE,WAAW;CACP,CAAC;AAEX,MAAM,aAAa,GAAG;IACpB,EAAE,EAAE,YAAY;IAChB,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,YAAY;CACR,CAAC;AAUX,MAAM,UAAU,oBAAoB,CAAC,EACnC,KAAK,EACL,GAAG,EACH,QAAQ,GAAG,EAAE,EACb,IAAI,GAAG,IAAI,EACX,SAAS,GACiB;IAC1B,MAAM,UAAU,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;IAEjE,MAAM,UAAU,GACd,UAAU,IAAI,EAAE;QACd,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,UAAU,IAAI,EAAE;YAChB,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,mBAAmB,CAAC;IAE5B,OAAO,CACL,cAAK,SAAS,EAAE,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,YACrC,cAAK,SAAS,EAAE,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,YAC3C,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAClD,cAEE,SAAS,EAAE,EAAE,CACX,oCAAoC,EACpC,aAAa,CAAC,IAAI,CAAC,EACnB,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,qBAAqB,CAC5D,IALI,KAAK,CAMV,CACH,CAAC,GACE,GACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SelectHTMLAttributes, ReactNode } from "react";
|
|
2
|
+
interface SelectProps extends SelectHTMLAttributes<HTMLSelectElement> {
|
|
3
|
+
label?: ReactNode;
|
|
4
|
+
error?: string;
|
|
5
|
+
options: readonly {
|
|
6
|
+
value: string;
|
|
7
|
+
label: string;
|
|
8
|
+
}[];
|
|
9
|
+
/** Remove the full-width wrapper for inline/toolbar usage */
|
|
10
|
+
inline?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare const Select: import("react").ForwardRefExoticComponent<SelectProps & import("react").RefAttributes<HTMLSelectElement>>;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef } from "react";
|
|
3
|
+
import { cn } from "../lib/utils";
|
|
4
|
+
const selectClasses = (error, className) => cn("block appearance-none rounded-input border pl-3 pr-9 py-2 text-sm text-text-primary bg-surface-secondary shadow-[var(--shadow-input)]", "bg-[url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22%23a1a1aa%22%3E%3Cpath%20fill-rule%3D%22evenodd%22%20d%3D%22M5.23%207.21a.75.75%200%20011.06.02L10%2011.168l3.71-3.938a.75.75%200%20111.08%201.04l-4.25%204.5a.75.75%200%2001-1.08%200l-4.25-4.5a.75.75%200%2001.02-1.06z%22%20clip-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E')] bg-[length:1.25rem_1.25rem] bg-[position:right_0.5rem_center] bg-no-repeat", "focus:outline-none focus:ring-2 focus:ring-white/30 focus:border-border-focus", "disabled:opacity-50 disabled:cursor-not-allowed", error
|
|
5
|
+
? "border-danger-muted focus:ring-danger-muted focus:border-danger-muted"
|
|
6
|
+
: "border-border-secondary", className);
|
|
7
|
+
export const Select = forwardRef(({ className, label, error, id, options, inline, ...props }, ref) => {
|
|
8
|
+
const selectEl = (_jsx("select", { ref: ref, id: id, className: selectClasses(error, cn(inline ? "w-auto" : "w-full", className)), ...props, children: options.map((option) => (_jsx("option", { value: option.value, className: "bg-surface-secondary text-text-primary", children: option.label }, option.value))) }));
|
|
9
|
+
if (inline)
|
|
10
|
+
return selectEl;
|
|
11
|
+
return (_jsxs("div", { className: "w-full", children: [label && (_jsx("label", { htmlFor: id, className: "block type-label mb-1", children: label })), selectEl, error && _jsx("p", { className: "mt-1 text-sm text-status-error", children: error })] }));
|
|
12
|
+
});
|
|
13
|
+
Select.displayName = "Select";
|
|
14
|
+
//# sourceMappingURL=Select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Select.js","sourceRoot":"","sources":["../../src/components/Select.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAEnC,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAUlC,MAAM,aAAa,GAAG,CAAC,KAAc,EAAE,SAAkB,EAAE,EAAE,CAC3D,EAAE,CACA,uIAAuI,EACvI,8eAA8e,EAC9e,+EAA+E,EAC/E,iDAAiD,EACjD,KAAK;IACH,CAAC,CAAC,uEAAuE;IACzE,CAAC,CAAC,yBAAyB,EAC7B,SAAS,CACV,CAAC;AAEJ,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAC9B,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE;IAClE,MAAM,QAAQ,GAAG,CACf,iBACE,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,EAAE,EACN,SAAS,EAAE,aAAa,CACtB,KAAK,EACL,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAC5C,KACG,KAAK,YAER,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CACvB,iBAEE,KAAK,EAAE,MAAM,CAAC,KAAK,EACnB,SAAS,EAAC,wCAAwC,YAEjD,MAAM,CAAC,KAAK,IAJR,MAAM,CAAC,KAAK,CAKV,CACV,CAAC,GACK,CACV,CAAC;IAEF,IAAI,MAAM;QAAE,OAAO,QAAQ,CAAC;IAE5B,OAAO,CACL,eAAK,SAAS,EAAC,QAAQ,aACpB,KAAK,IAAI,CACR,gBAAO,OAAO,EAAE,EAAE,EAAE,SAAS,EAAC,uBAAuB,YAClD,KAAK,GACA,CACT,EACA,QAAQ,EACR,KAAK,IAAI,YAAG,SAAS,EAAC,gCAAgC,YAAE,KAAK,GAAK,IAC/D,CACP,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
interface SpotlightButtonProps {
|
|
3
|
+
children: ReactNode;
|
|
4
|
+
onClick?: () => void;
|
|
5
|
+
className?: string;
|
|
6
|
+
variant?: "default" | "primary";
|
|
7
|
+
glow?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function SpotlightButton({ children, onClick, className, variant, glow, }: SpotlightButtonProps): import("react").JSX.Element;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useRef, useState } from "react";
|
|
3
|
+
export function SpotlightButton({ children, onClick, className = "", variant = "primary", glow = true, }) {
|
|
4
|
+
const divRef = useRef(null);
|
|
5
|
+
const [isFocused, setIsFocused] = useState(false);
|
|
6
|
+
const [position, setPosition] = useState({ x: 0, y: 0 });
|
|
7
|
+
const [opacity, setOpacity] = useState(0);
|
|
8
|
+
const handleMouseMove = (e) => {
|
|
9
|
+
if (!divRef.current || isFocused)
|
|
10
|
+
return;
|
|
11
|
+
const div = divRef.current;
|
|
12
|
+
const rect = div.getBoundingClientRect();
|
|
13
|
+
setPosition({ x: e.clientX - rect.left, y: e.clientY - rect.top });
|
|
14
|
+
};
|
|
15
|
+
const handleFocus = () => {
|
|
16
|
+
setIsFocused(true);
|
|
17
|
+
setOpacity(1);
|
|
18
|
+
};
|
|
19
|
+
const handleBlur = () => {
|
|
20
|
+
setIsFocused(false);
|
|
21
|
+
setOpacity(0);
|
|
22
|
+
};
|
|
23
|
+
const handleMouseEnter = () => {
|
|
24
|
+
setOpacity(1);
|
|
25
|
+
};
|
|
26
|
+
const handleMouseLeave = () => {
|
|
27
|
+
setOpacity(0);
|
|
28
|
+
};
|
|
29
|
+
const spotlightColor = variant === "primary"
|
|
30
|
+
? `radial-gradient(120px circle at ${position.x}px ${position.y}px, rgba(0,0,0,0.1), transparent 40%)`
|
|
31
|
+
: `radial-gradient(120px circle at ${position.x}px ${position.y}px, rgba(255,255,255,0.15), transparent 40%)`;
|
|
32
|
+
if (variant === "primary" && glow) {
|
|
33
|
+
return (_jsxs("div", { className: "relative rounded-xl p-[3px] group", children: [_jsx("div", { className: "absolute inset-0 rounded-xl opacity-100 animate-chroma-spin", style: {
|
|
34
|
+
background: `conic-gradient(from var(--chroma-angle, 0deg), #dd7bbb, #d79f1e, #5a922c, #4c7894, #dd7bbb)`,
|
|
35
|
+
padding: "3px",
|
|
36
|
+
} }), _jsx("div", { className: "absolute inset-[3px] rounded-[10px] bg-white" }), _jsxs("button", { ref: divRef, onClick: onClick, onMouseMove: handleMouseMove, onFocus: handleFocus, onBlur: handleBlur, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, className: `relative inline-flex items-center justify-center overflow-hidden rounded-[10px] font-semibold transition-all duration-[var(--duration-hover)] focus:outline-none bg-white text-text-inverse hover:bg-zinc-50 h-10 px-5 ${className}`, children: [_jsx("div", { className: "pointer-events-none absolute -inset-px opacity-0 transition duration-[var(--duration-enter)] rounded-xl", style: {
|
|
37
|
+
opacity,
|
|
38
|
+
background: spotlightColor,
|
|
39
|
+
} }), _jsx("span", { className: "relative z-20", children: children })] })] }));
|
|
40
|
+
}
|
|
41
|
+
const baseStyles = "relative inline-flex items-center justify-center overflow-hidden rounded-xl font-semibold transition-all duration-[var(--duration-hover)] focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-surface-base";
|
|
42
|
+
const variantStyles = {
|
|
43
|
+
default: "border border-border-secondary bg-gradient-to-b from-zinc-800 to-surface-secondary text-text-primary shadow-lg hover:border-zinc-600 hover:shadow-zinc-900/50 focus:ring-white/20",
|
|
44
|
+
primary: "bg-white text-text-inverse shadow-[0_0_20px_rgba(255,255,255,0.3)] hover:shadow-[0_0_30px_rgba(255,255,255,0.5)] hover:bg-zinc-100 focus:ring-white",
|
|
45
|
+
};
|
|
46
|
+
return (_jsxs("button", { ref: divRef, onClick: onClick, onMouseMove: handleMouseMove, onFocus: handleFocus, onBlur: handleBlur, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, className: `${baseStyles} ${variantStyles[variant]} h-10 px-5 ${className}`, children: [_jsx("div", { className: "pointer-events-none absolute -inset-px opacity-0 transition duration-[var(--duration-enter)] rounded-xl", style: {
|
|
47
|
+
opacity,
|
|
48
|
+
background: spotlightColor,
|
|
49
|
+
} }), _jsx("span", { className: "relative z-20", children: children })] }));
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=SpotlightButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpotlightButton.js","sourceRoot":"","sources":["../../src/components/SpotlightButton.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Icon } from "@phosphor-icons/react";
|
|
2
|
+
interface StatCardProps {
|
|
3
|
+
name: string;
|
|
4
|
+
value: string | number;
|
|
5
|
+
icon: Icon;
|
|
6
|
+
href?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function StatCard({ name, value, icon: IconComp, href }: StatCardProps): import("react").JSX.Element;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Link } from "react-router-dom";
|
|
3
|
+
import { Card } from "./Card";
|
|
4
|
+
export function StatCard({ name, value, icon: IconComp, href }) {
|
|
5
|
+
const content = (_jsxs("div", { className: "flex items-center gap-4", children: [_jsx("div", { className: "rounded-lg bg-surface-secondary border border-border-primary p-3", children: _jsx(IconComp, { size: 24, className: "text-text-secondary", "aria-hidden": "true" }) }), _jsxs("div", { children: [_jsx("p", { className: "text-sm font-medium text-text-tertiary", children: name }), _jsx("p", { className: "text-2xl font-semibold text-text-primary", children: value })] })] }));
|
|
6
|
+
return (_jsxs(Card, { className: "relative overflow-hidden", children: [content, href && (_jsx(Link, { to: href, className: "absolute inset-0", "aria-label": `View ${name}` }))] }));
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=StatCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatCard.js","sourceRoot":"","sources":["../../src/components/StatCard.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAS9B,MAAM,UAAU,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAiB;IAC3E,MAAM,OAAO,GAAG,CACd,eAAK,SAAS,EAAC,yBAAyB,aACtC,cAAK,SAAS,EAAC,kEAAkE,YAC/E,KAAC,QAAQ,IACP,IAAI,EAAE,EAAE,EACR,SAAS,EAAC,qBAAqB,iBACnB,MAAM,GAClB,GACE,EACN,0BACE,YAAG,SAAS,EAAC,wCAAwC,YAAE,IAAI,GAAK,EAChE,YAAG,SAAS,EAAC,0CAA0C,YAAE,KAAK,GAAK,IAC/D,IACF,CACP,CAAC;IAEF,OAAO,CACL,MAAC,IAAI,IAAC,SAAS,EAAC,0BAA0B,aACvC,OAAO,EACP,IAAI,IAAI,CACP,KAAC,IAAI,IACH,EAAE,EAAE,IAAI,EACR,SAAS,EAAC,kBAAkB,gBAChB,QAAQ,IAAI,EAAE,GAC1B,CACH,IACI,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { WarningIcon } from "@phosphor-icons/react";
|
|
3
|
+
import { InventoryStatus } from "../types";
|
|
4
|
+
import { Badge } from "./Badge";
|
|
5
|
+
export function StatusBadge({ status }) {
|
|
6
|
+
if (status === InventoryStatus.Ready)
|
|
7
|
+
return null;
|
|
8
|
+
return (_jsx(Badge, { variant: "warning", size: "sm", icon: WarningIcon, children: "Setup Required" }));
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=StatusBadge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusBadge.js","sourceRoot":"","sources":["../../src/components/StatusBadge.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,MAAM,UAAU,WAAW,CAAC,EAAE,MAAM,EAA+B;IACjE,IAAI,MAAM,KAAK,eAAe,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAClD,OAAO,CACL,KAAC,KAAK,IAAC,OAAO,EAAC,SAAS,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAE,WAAW,+BAE5C,CACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { ComponentType } from "react";
|
|
2
|
+
interface TabDef {
|
|
3
|
+
/** Display label */
|
|
4
|
+
name: string;
|
|
5
|
+
/** Route segment (routed) or value key (controlled) */
|
|
6
|
+
value: string;
|
|
7
|
+
/** Optional absolute href — overrides basePath + value for routed tabs */
|
|
8
|
+
href?: string;
|
|
9
|
+
/** Optional icon component (Phosphor icons, custom SVG components, etc.) */
|
|
10
|
+
icon?: ComponentType<{
|
|
11
|
+
size?: number;
|
|
12
|
+
className?: string;
|
|
13
|
+
}>;
|
|
14
|
+
/** Optional count badge */
|
|
15
|
+
count?: number;
|
|
16
|
+
/** Hide this tab from the nav (still valid for routing) */
|
|
17
|
+
hidden?: boolean;
|
|
18
|
+
}
|
|
19
|
+
interface RoutedProps {
|
|
20
|
+
variant: "routed";
|
|
21
|
+
tabs: TabDef[];
|
|
22
|
+
/** Base path for NavLink — each tab links to `${basePath}/${tab.value}` */
|
|
23
|
+
basePath: string;
|
|
24
|
+
/** Whether NavLink should use `end` matching (default false) */
|
|
25
|
+
end?: boolean;
|
|
26
|
+
activeTab?: never;
|
|
27
|
+
onTabChange?: never;
|
|
28
|
+
}
|
|
29
|
+
interface ControlledProps {
|
|
30
|
+
variant: "controlled";
|
|
31
|
+
tabs: TabDef[];
|
|
32
|
+
activeTab: string;
|
|
33
|
+
onTabChange: (value: string) => void;
|
|
34
|
+
basePath?: never;
|
|
35
|
+
end?: never;
|
|
36
|
+
}
|
|
37
|
+
type TabNavProps = RoutedProps | ControlledProps;
|
|
38
|
+
export declare function TabNav(props: TabNavProps): import("react").JSX.Element;
|
|
39
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { NavLink } from "react-router-dom";
|
|
3
|
+
import { cn } from "../lib/utils";
|
|
4
|
+
const inactiveClass = "border-transparent text-text-muted hover:text-text-secondary hover:border-border-secondary";
|
|
5
|
+
const activeClass = "border-accent text-accent";
|
|
6
|
+
const baseClass = "flex items-center gap-2 border-b-2 px-1 py-3 text-sm font-medium transition-colors whitespace-nowrap cursor-pointer -mb-px";
|
|
7
|
+
function CountBadge({ count }) {
|
|
8
|
+
if (count <= 0)
|
|
9
|
+
return null;
|
|
10
|
+
return (_jsx("span", { className: "ml-1 px-1.5 py-0.5 text-xs rounded-full bg-surface-tertiary text-text-secondary", children: count }));
|
|
11
|
+
}
|
|
12
|
+
export function TabNav(props) {
|
|
13
|
+
const { variant, tabs } = props;
|
|
14
|
+
return (_jsx("div", { className: "border-b border-border-primary", children: _jsx("nav", { className: "-mb-px flex gap-x-6", "aria-label": "Tabs", children: tabs
|
|
15
|
+
.filter((t) => !t.hidden)
|
|
16
|
+
.map((tab) => {
|
|
17
|
+
const Icon = tab.icon;
|
|
18
|
+
if (variant === "routed") {
|
|
19
|
+
return (_jsxs(NavLink, { to: tab.href ?? `${props.basePath}/${tab.value}`, end: props.end, className: ({ isActive }) => cn(baseClass, isActive ? activeClass : inactiveClass), children: [Icon && _jsx(Icon, { size: 16 }), tab.name, tab.count !== undefined && _jsx(CountBadge, { count: tab.count })] }, tab.value));
|
|
20
|
+
}
|
|
21
|
+
const isActive = props.activeTab === tab.value;
|
|
22
|
+
return (_jsxs("button", { type: "button", onClick: () => props.onTabChange(tab.value), className: cn(baseClass, isActive ? activeClass : inactiveClass), children: [Icon && _jsx(Icon, { size: 16 }), tab.name, tab.count !== undefined && _jsx(CountBadge, { count: tab.count })] }, tab.value));
|
|
23
|
+
}) }) }));
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=TabNav.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabNav.js","sourceRoot":"","sources":["../../src/components/TabNav.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAuClC,MAAM,aAAa,GACjB,4FAA4F,CAAC;AAC/F,MAAM,WAAW,GAAG,2BAA2B,CAAC;AAChD,MAAM,SAAS,GACb,4HAA4H,CAAC;AAE/H,SAAS,UAAU,CAAC,EAAE,KAAK,EAAqB;IAC9C,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5B,OAAO,CACL,eAAM,SAAS,EAAC,iFAAiF,YAC9F,KAAK,GACD,CACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAkB;IACvC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IAEhC,OAAO,CACL,cAAK,SAAS,EAAC,gCAAgC,YAC7C,cAAK,SAAS,EAAC,qBAAqB,gBAAY,MAAM,YACnD,IAAI;iBACF,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;iBACxB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;gBACX,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;gBAEtB,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;oBACzB,OAAO,CACL,MAAC,OAAO,IAEN,EAAE,EAAE,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,QAAQ,IAAI,GAAG,CAAC,KAAK,EAAE,EAChD,GAAG,EAAE,KAAK,CAAC,GAAG,EACd,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAC1B,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,aAGtD,IAAI,IAAI,KAAC,IAAI,IAAC,IAAI,EAAE,EAAE,GAAI,EAC1B,GAAG,CAAC,IAAI,EACR,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,KAAC,UAAU,IAAC,KAAK,EAAE,GAAG,CAAC,KAAK,GAAI,KATvD,GAAG,CAAC,KAAK,CAUN,CACX,CAAC;gBACJ,CAAC;gBAED,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,KAAK,GAAG,CAAC,KAAK,CAAC;gBAC/C,OAAO,CACL,kBAEE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAC3C,SAAS,EAAE,EAAE,CACX,SAAS,EACT,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CACvC,aAEA,IAAI,IAAI,KAAC,IAAI,IAAC,IAAI,EAAE,EAAE,GAAI,EAC1B,GAAG,CAAC,IAAI,EACR,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,KAAC,UAAU,IAAC,KAAK,EAAE,GAAG,CAAC,KAAK,GAAI,KAVvD,GAAG,CAAC,KAAK,CAWP,CACV,CAAC;YACJ,CAAC,CAAC,GACA,GACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
interface TableShellProps {
|
|
3
|
+
children: ReactNode;
|
|
4
|
+
toolbar?: ReactNode;
|
|
5
|
+
footer?: ReactNode;
|
|
6
|
+
className?: string;
|
|
7
|
+
tableWrapClassName?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function TableShell({ children, toolbar, footer, className, tableWrapClassName, }: TableShellProps): import("react").JSX.Element;
|
|
10
|
+
interface TablePaginationProps {
|
|
11
|
+
page: number;
|
|
12
|
+
pageSize: number;
|
|
13
|
+
total: number;
|
|
14
|
+
onPageChange: (page: number) => void;
|
|
15
|
+
onPageSizeChange: (pageSize: number) => void;
|
|
16
|
+
pageSizeOptions?: number[];
|
|
17
|
+
info?: ReactNode;
|
|
18
|
+
disabled?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare function TablePagination({ page, pageSize, total, onPageChange, onPageSizeChange, pageSizeOptions, info, disabled, }: TablePaginationProps): import("react").JSX.Element;
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { CaretLeftIcon, CaretRightIcon } from "@phosphor-icons/react";
|
|
3
|
+
import { cn } from "../lib/utils";
|
|
4
|
+
import { Button } from "./Button";
|
|
5
|
+
import { Select } from "./Select";
|
|
6
|
+
export function TableShell({ children, toolbar, footer, className, tableWrapClassName, }) {
|
|
7
|
+
return (_jsxs("div", { className: cn("overflow-hidden rounded-lg border border-border-primary bg-surface-primary", className), children: [toolbar ? (_jsx("div", { className: "border-b border-border-primary bg-surface-primary px-4 py-3", children: toolbar })) : null, _jsx("div", { className: cn("overflow-x-auto", tableWrapClassName), children: children }), footer ? (_jsx("div", { className: "border-t border-border-primary bg-surface-primary px-4 py-3", children: footer })) : null] }));
|
|
8
|
+
}
|
|
9
|
+
export function TablePagination({ page, pageSize, total, onPageChange, onPageSizeChange, pageSizeOptions = [25, 50, 100], info, disabled = false, }) {
|
|
10
|
+
const totalPages = Math.max(1, Math.ceil(total / pageSize));
|
|
11
|
+
const currentPage = Math.min(Math.max(page, 0), totalPages - 1);
|
|
12
|
+
const canPrev = currentPage > 0 && !disabled;
|
|
13
|
+
const canNext = currentPage < totalPages - 1 && !disabled;
|
|
14
|
+
return (_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3", children: [_jsxs("div", { className: "flex items-center gap-3 text-sm text-text-muted", children: [_jsx(Select, { value: pageSize, onChange: (e) => onPageSizeChange(Number(e.target.value)), disabled: disabled, options: pageSizeOptions.map((size) => ({
|
|
15
|
+
value: String(size),
|
|
16
|
+
label: `${size} Items`,
|
|
17
|
+
})), inline: true, "aria-label": "Items per page" }), _jsx("span", { children: info ?? `${total} total item(s)` })] }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsxs("span", { className: "text-sm text-text-muted", children: ["Page ", currentPage + 1, " of ", totalPages] }), _jsxs("div", { className: "flex items-center gap-1", children: [_jsx(Button, { variant: "secondary", size: "sm", disabled: !canPrev, onClick: () => onPageChange(0), title: "First page", className: "px-2", children: _jsxs("span", { className: "flex items-center", children: [_jsx(CaretLeftIcon, { size: 12 }), _jsx(CaretLeftIcon, { size: 12, className: "-ml-1" })] }) }), _jsx(Button, { variant: "secondary", size: "sm", disabled: !canPrev, onClick: () => onPageChange(currentPage - 1), title: "Previous page", className: "px-2", children: _jsx(CaretLeftIcon, { size: 12 }) }), _jsx(Button, { variant: "secondary", size: "sm", disabled: !canNext, onClick: () => onPageChange(currentPage + 1), title: "Next page", className: "px-2", children: _jsx(CaretRightIcon, { size: 12 }) }), _jsx(Button, { variant: "secondary", size: "sm", disabled: !canNext, onClick: () => onPageChange(totalPages - 1), title: "Last page", className: "px-2", children: _jsxs("span", { className: "flex items-center", children: [_jsx(CaretRightIcon, { size: 12 }), _jsx(CaretRightIcon, { size: 12, className: "-ml-1" })] }) })] })] })] }));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=TableShell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TableShell.js","sourceRoot":"","sources":["../../src/components/TableShell.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { TextareaHTMLAttributes, ReactNode } from "react";
|
|
2
|
+
interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {
|
|
3
|
+
label?: ReactNode;
|
|
4
|
+
error?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare const Textarea: import("react").ForwardRefExoticComponent<TextareaProps & import("react").RefAttributes<HTMLTextAreaElement>>;
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef } from "react";
|
|
3
|
+
import { cn } from "../lib/utils";
|
|
4
|
+
export const Textarea = forwardRef(({ className, label, error, id, ...props }, ref) => {
|
|
5
|
+
return (_jsxs("div", { className: "w-full", children: [label && (_jsx("label", { htmlFor: id, className: "block type-label mb-1", children: label })), _jsx("textarea", { ref: ref, id: id, className: cn("block w-full rounded-input border px-3 py-2 text-text-primary bg-surface-secondary shadow-[var(--shadow-input)]", "placeholder:text-text-muted", "focus:outline-none focus:ring-2 focus:ring-white/30 focus:border-border-focus", error
|
|
6
|
+
? "border-danger-muted focus:ring-danger-muted/30 focus:border-danger-muted"
|
|
7
|
+
: "border-border-secondary", className), ...props }), error && _jsx("p", { className: "mt-1 text-sm text-status-error", children: error })] }));
|
|
8
|
+
});
|
|
9
|
+
Textarea.displayName = "Textarea";
|
|
10
|
+
//# sourceMappingURL=Textarea.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Textarea.js","sourceRoot":"","sources":["../../src/components/Textarea.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAEnC,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAOlC,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAChC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE;IACjD,OAAO,CACL,eAAK,SAAS,EAAC,QAAQ,aACpB,KAAK,IAAI,CACR,gBAAO,OAAO,EAAE,EAAE,EAAE,SAAS,EAAC,uBAAuB,YAClD,KAAK,GACA,CACT,EACD,mBACE,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,EAAE,EACN,SAAS,EAAE,EAAE,CACX,iHAAiH,EACjH,6BAA6B,EAC7B,+EAA+E,EAC/E,KAAK;oBACH,CAAC,CAAC,0EAA0E;oBAC5E,CAAC,CAAC,yBAAyB,EAC7B,SAAS,CACV,KACG,KAAK,GACT,EACD,KAAK,IAAI,YAAG,SAAS,EAAC,gCAAgC,YAAE,KAAK,GAAK,IAC/D,CACP,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,QAAQ,CAAC,WAAW,GAAG,UAAU,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
interface ToggleProps {
|
|
2
|
+
/** Whether the toggle is on */
|
|
3
|
+
checked: boolean;
|
|
4
|
+
/** Called when the toggle is flipped */
|
|
5
|
+
onChange: (checked: boolean) => void;
|
|
6
|
+
/** Disables the toggle and shows loading state */
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
/** Active color */
|
|
9
|
+
color?: "accent" | "warning";
|
|
10
|
+
/** Toggle size — default (h-6 w-11) or sm (h-5 w-9) */
|
|
11
|
+
size?: "default" | "sm";
|
|
12
|
+
/** Accessible label (sr-only) — required for a11y */
|
|
13
|
+
label: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function Toggle({ checked, onChange, disabled, color, size, label, }: ToggleProps): import("react").JSX.Element;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Switch } from "@headlessui/react";
|
|
3
|
+
import { cn } from "../lib/utils";
|
|
4
|
+
const colorStyles = {
|
|
5
|
+
accent: { active: "bg-accent-bold", ring: "focus:ring-accent-muted" },
|
|
6
|
+
warning: { active: "bg-warning-bold", ring: "focus:ring-warning-muted" },
|
|
7
|
+
};
|
|
8
|
+
const sizeStyles = {
|
|
9
|
+
default: {
|
|
10
|
+
track: "h-6 w-11",
|
|
11
|
+
thumb: "h-5 w-5",
|
|
12
|
+
translate: "translate-x-5",
|
|
13
|
+
},
|
|
14
|
+
sm: {
|
|
15
|
+
track: "h-5 w-9",
|
|
16
|
+
thumb: "h-4 w-4",
|
|
17
|
+
translate: "translate-x-4",
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
export function Toggle({ checked, onChange, disabled, color = "accent", size = "default", label, }) {
|
|
21
|
+
const colors = colorStyles[color];
|
|
22
|
+
const sizes = sizeStyles[size];
|
|
23
|
+
return (_jsxs(Switch, { checked: checked, onChange: onChange, disabled: disabled, className: cn(checked ? colors.active : "bg-surface-inset", disabled && "opacity-50 cursor-wait", "relative inline-flex flex-shrink-0 cursor-pointer rounded-full", "border-2 border-transparent transition-colors duration-[var(--duration-hover)] ease-in-out", `focus:outline-none focus:ring-2 ${colors.ring} focus:ring-offset-2 focus:ring-offset-surface-secondary`, sizes.track), children: [label && _jsx("span", { className: "sr-only", children: label }), _jsx("span", { className: cn(checked ? sizes.translate : "translate-x-0", "pointer-events-none relative inline-block transform rounded-full", "bg-white shadow ring-0 transition duration-[var(--duration-hover)] ease-in-out", sizes.thumb) })] }));
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=Toggle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toggle.js","sourceRoot":"","sources":["../../src/components/Toggle.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAiBlC,MAAM,WAAW,GAAG;IAClB,MAAM,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,yBAAyB,EAAE;IACrE,OAAO,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,0BAA0B,EAAE;CACzE,CAAC;AAEF,MAAM,UAAU,GAAG;IACjB,OAAO,EAAE;QACP,KAAK,EAAE,UAAU;QACjB,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,eAAe;KAC3B;IACD,EAAE,EAAE;QACF,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,eAAe;KAC3B;CACF,CAAC;AAEF,MAAM,UAAU,MAAM,CAAC,EACrB,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,KAAK,GAAG,QAAQ,EAChB,IAAI,GAAG,SAAS,EAChB,KAAK,GACO;IACZ,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAE/B,OAAO,CACL,MAAC,MAAM,IACL,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,EAAE,CACX,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB,EAC5C,QAAQ,IAAI,wBAAwB,EACpC,gEAAgE,EAChE,4FAA4F,EAC5F,mCAAmC,MAAM,CAAC,IAAI,0DAA0D,EACxG,KAAK,CAAC,KAAK,CACZ,aAEA,KAAK,IAAI,eAAM,SAAS,EAAC,SAAS,YAAE,KAAK,GAAQ,EAClD,eACE,SAAS,EAAE,EAAE,CACX,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,EAC3C,kEAAkE,EAClE,gFAAgF,EAChF,KAAK,CAAC,KAAK,CACZ,GACD,IACK,CACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ComponentType, InputHTMLAttributes, ReactNode, SelectHTMLAttributes } from "react";
|
|
2
|
+
import type { ButtonHTMLAttributes } from "react";
|
|
3
|
+
interface ToolbarProps {
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
className?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function Toolbar({ children, className }: ToolbarProps): import("react").JSX.Element;
|
|
8
|
+
interface ToolbarSearchProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "type"> {
|
|
9
|
+
/** Min width of the search field (default 200px) */
|
|
10
|
+
minWidth?: number;
|
|
11
|
+
/** Whether the search should expand to fill available space (default true) */
|
|
12
|
+
grow?: boolean;
|
|
13
|
+
/** Max width constraint */
|
|
14
|
+
maxWidth?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare const ToolbarSearch: import("react").ForwardRefExoticComponent<ToolbarSearchProps & import("react").RefAttributes<HTMLInputElement>>;
|
|
17
|
+
interface ToolbarSelectProps extends Omit<SelectHTMLAttributes<HTMLSelectElement>, "children"> {
|
|
18
|
+
options: readonly {
|
|
19
|
+
value: string;
|
|
20
|
+
label: string;
|
|
21
|
+
}[];
|
|
22
|
+
}
|
|
23
|
+
export declare const ToolbarSelect: import("react").ForwardRefExoticComponent<ToolbarSelectProps & import("react").RefAttributes<HTMLSelectElement>>;
|
|
24
|
+
interface ToolbarButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
25
|
+
variant?: "primary" | "secondary" | "danger" | "ghost";
|
|
26
|
+
icon?: ComponentType<{
|
|
27
|
+
size?: number;
|
|
28
|
+
className?: string;
|
|
29
|
+
}>;
|
|
30
|
+
iconClassName?: string;
|
|
31
|
+
isLoading?: boolean;
|
|
32
|
+
}
|
|
33
|
+
export declare const ToolbarButton: import("react").ForwardRefExoticComponent<ToolbarButtonProps & import("react").RefAttributes<HTMLButtonElement>>;
|
|
34
|
+
export {};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef } from "react";
|
|
3
|
+
import { MagnifyingGlassIcon } from "@phosphor-icons/react";
|
|
4
|
+
import { cn } from "../lib/utils";
|
|
5
|
+
import { Button } from "./Button";
|
|
6
|
+
import { Input } from "./Input";
|
|
7
|
+
import { Select } from "./Select";
|
|
8
|
+
export function Toolbar({ children, className }) {
|
|
9
|
+
return (_jsx("div", { className: cn("flex flex-wrap items-stretch gap-2", className), children: children }));
|
|
10
|
+
}
|
|
11
|
+
const maxWidthClasses = {
|
|
12
|
+
xs: "max-w-xs",
|
|
13
|
+
sm: "max-w-sm",
|
|
14
|
+
md: "max-w-md",
|
|
15
|
+
lg: "max-w-lg",
|
|
16
|
+
xl: "max-w-xl",
|
|
17
|
+
};
|
|
18
|
+
export const ToolbarSearch = forwardRef(({ className, minWidth = 200, grow = true, maxWidth = "sm", ...props }, ref) => {
|
|
19
|
+
return (_jsxs("div", { className: cn("relative", grow && "flex-1"), style: { minWidth: `${minWidth}px` }, children: [_jsx(MagnifyingGlassIcon, { size: 14, className: "pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-text-disabled" }), _jsx(Input, { ref: ref, type: "text", className: cn("pl-9", maxWidth && maxWidthClasses[maxWidth], className), ...props })] }));
|
|
20
|
+
});
|
|
21
|
+
ToolbarSearch.displayName = "ToolbarSearch";
|
|
22
|
+
export const ToolbarSelect = forwardRef((props, ref) => {
|
|
23
|
+
return _jsx(Select, { ref: ref, inline: true, ...props });
|
|
24
|
+
});
|
|
25
|
+
ToolbarSelect.displayName = "ToolbarSelect";
|
|
26
|
+
export const ToolbarButton = forwardRef(({ icon: Icon, iconClassName, children, className, ...props }, ref) => {
|
|
27
|
+
return (_jsxs(Button, { ref: ref, className: cn("gap-1.5", className), ...props, children: [Icon && _jsx(Icon, { size: 14, className: iconClassName }), children] }));
|
|
28
|
+
});
|
|
29
|
+
ToolbarButton.displayName = "ToolbarButton";
|
|
30
|
+
//# sourceMappingURL=Toolbar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toolbar.js","sourceRoot":"","sources":["../../src/components/Toolbar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAOnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAUlC,MAAM,UAAU,OAAO,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAgB;IAC3D,OAAO,CACL,cAAK,SAAS,EAAE,EAAE,CAAC,oCAAoC,EAAE,SAAS,CAAC,YAChE,QAAQ,GACL,CACP,CAAC;AACJ,CAAC;AAgBD,MAAM,eAAe,GAA2B;IAC9C,EAAE,EAAE,UAAU;IACd,EAAE,EAAE,UAAU;IACd,EAAE,EAAE,UAAU;IACd,EAAE,EAAE,UAAU;IACd,EAAE,EAAE,UAAU;CACf,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CACrC,CACE,EAAE,SAAS,EAAE,QAAQ,GAAG,GAAG,EAAE,IAAI,GAAG,IAAI,EAAE,QAAQ,GAAG,IAAI,EAAE,GAAG,KAAK,EAAE,EACrE,GAAG,EACH,EAAE;IACF,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CAAC,UAAU,EAAE,IAAI,IAAI,QAAQ,CAAC,EAC3C,KAAK,EAAE,EAAE,QAAQ,EAAE,GAAG,QAAQ,IAAI,EAAE,aAEpC,KAAC,mBAAmB,IAClB,IAAI,EAAE,EAAE,EACR,SAAS,EAAC,iFAAiF,GAC3F,EACF,KAAC,KAAK,IACJ,GAAG,EAAE,GAAG,EACR,IAAI,EAAC,MAAM,EACX,SAAS,EAAE,EAAE,CACX,MAAM,EACN,QAAQ,IAAI,eAAe,CAAC,QAAQ,CAAC,EACrC,SAAS,CACV,KACG,KAAK,GACT,IACE,CACP,CAAC;AACJ,CAAC,CACF,CAAC;AACF,aAAa,CAAC,WAAW,GAAG,eAAe,CAAC;AAW5C,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CACrC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IACb,OAAO,KAAC,MAAM,IAAC,GAAG,EAAE,GAAG,EAAE,MAAM,WAAK,KAAK,GAAI,CAAC;AAChD,CAAC,CACF,CAAC;AACF,aAAa,CAAC,WAAW,GAAG,eAAe,CAAC;AAW5C,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CACrC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE;IACpE,OAAO,CACL,MAAC,MAAM,IAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,KAAM,KAAK,aAC7D,IAAI,IAAI,KAAC,IAAI,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,aAAa,GAAI,EACpD,QAAQ,IACF,CACV,CAAC;AACJ,CAAC,CACF,CAAC;AACF,aAAa,CAAC,WAAW,GAAG,eAAe,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
interface TypeToConfirmModalProps {
|
|
3
|
+
isOpen: boolean;
|
|
4
|
+
onClose: () => void;
|
|
5
|
+
onConfirm: () => void;
|
|
6
|
+
/** The text the user must type to enable the confirm button */
|
|
7
|
+
confirmText: string;
|
|
8
|
+
title: string;
|
|
9
|
+
/** Body content above the input */
|
|
10
|
+
description: ReactNode;
|
|
11
|
+
confirmLabel?: string;
|
|
12
|
+
isLoading?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function TypeToConfirmModal({ isOpen, onClose, onConfirm, confirmText, title, description, confirmLabel, isLoading, }: TypeToConfirmModalProps): import("react").JSX.Element;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { Modal } from "./Modal";
|
|
4
|
+
import { Input } from "./Input";
|
|
5
|
+
import { Button } from "./Button";
|
|
6
|
+
export function TypeToConfirmModal({ isOpen, onClose, onConfirm, confirmText, title, description, confirmLabel = "Delete", isLoading, }) {
|
|
7
|
+
const [value, setValue] = useState("");
|
|
8
|
+
const handleClose = () => {
|
|
9
|
+
setValue("");
|
|
10
|
+
onClose();
|
|
11
|
+
};
|
|
12
|
+
return (_jsx(Modal, { isOpen: isOpen, onClose: handleClose, title: title, children: _jsxs("div", { className: "space-y-4", children: [typeof description === "string" ? (_jsx("p", { className: "text-sm text-text-tertiary", children: description })) : (description), _jsx(Input, { label: _jsxs(_Fragment, { children: ["Type ", _jsx("strong", { className: "text-danger-muted", children: confirmText }), " ", "to confirm"] }), value: value, onChange: (e) => setValue(e.target.value), placeholder: `Enter ${confirmText} to confirm` }), _jsxs("div", { className: "flex justify-end gap-3", children: [_jsx(Button, { variant: "secondary", onClick: handleClose, children: "Cancel" }), _jsx(Button, { variant: "danger", onClick: onConfirm, disabled: value !== confirmText || isLoading, isLoading: isLoading, children: confirmLabel })] })] }) }));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=TypeToConfirmModal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TypeToConfirmModal.js","sourceRoot":"","sources":["../../src/components/TypeToConfirmModal.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAelC,MAAM,UAAU,kBAAkB,CAAC,EACjC,MAAM,EACN,OAAO,EACP,SAAS,EACT,WAAW,EACX,KAAK,EACL,WAAW,EACX,YAAY,GAAG,QAAQ,EACvB,SAAS,GACe;IACxB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEvC,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,QAAQ,CAAC,EAAE,CAAC,CAAC;QACb,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,OAAO,CACL,KAAC,KAAK,IAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,YACvD,eAAK,SAAS,EAAC,WAAW,aACvB,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,CACjC,YAAG,SAAS,EAAC,4BAA4B,YAAE,WAAW,GAAK,CAC5D,CAAC,CAAC,CAAC,CACF,WAAW,CACZ,EACD,KAAC,KAAK,IACJ,KAAK,EACH,uCACO,iBAAQ,SAAS,EAAC,mBAAmB,YAAE,WAAW,GAAU,EAAC,GAAG,kBAEpE,EAEL,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,WAAW,EAAE,SAAS,WAAW,aAAa,GAC9C,EACF,eAAK,SAAS,EAAC,wBAAwB,aACrC,KAAC,MAAM,IAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAE,WAAW,uBAEvC,EACT,KAAC,MAAM,IACL,OAAO,EAAC,QAAQ,EAChB,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,KAAK,KAAK,WAAW,IAAI,SAAS,EAC5C,SAAS,EAAE,SAAS,YAEnB,YAAY,GACN,IACL,IACF,GACA,CACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Modal } from "./Modal";
|
|
3
|
+
import { Button } from "./Button";
|
|
4
|
+
export function UnsavedChangesModal({ isOpen, onDiscard, onCancel, }) {
|
|
5
|
+
return (_jsx(Modal, { isOpen: isOpen, onClose: onCancel, title: "Unsaved Changes", size: "sm", children: _jsxs("div", { className: "space-y-4", children: [_jsx("p", { className: "text-sm text-text-tertiary", children: "You have unsaved changes that will be lost if you leave this page." }), _jsxs("div", { className: "flex justify-end gap-3", children: [_jsx(Button, { variant: "secondary", onClick: onCancel, children: "Stay" }), _jsx(Button, { variant: "danger", onClick: onDiscard, children: "Discard" })] })] }) }));
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=UnsavedChangesModal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UnsavedChangesModal.js","sourceRoot":"","sources":["../../src/components/UnsavedChangesModal.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAQlC,MAAM,UAAU,mBAAmB,CAAC,EAClC,MAAM,EACN,SAAS,EACT,QAAQ,GACiB;IACzB,OAAO,CACL,KAAC,KAAK,IAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAC,iBAAiB,EAAC,IAAI,EAAC,IAAI,YACzE,eAAK,SAAS,EAAC,WAAW,aACxB,YAAG,SAAS,EAAC,4BAA4B,mFAErC,EACJ,eAAK,SAAS,EAAC,wBAAwB,aACrC,KAAC,MAAM,IAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAE,QAAQ,qBAEpC,EACT,KAAC,MAAM,IAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAE,SAAS,wBAElC,IACL,IACF,GACA,CACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface UsageCardProps {
|
|
2
|
+
title: string;
|
|
3
|
+
percentage: number;
|
|
4
|
+
subtitle?: string;
|
|
5
|
+
resetIn?: string;
|
|
6
|
+
infoTooltip?: string;
|
|
7
|
+
segments?: number;
|
|
8
|
+
className?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function UsageCard({ title, percentage, subtitle, resetIn, infoTooltip, segments, className, }: UsageCardProps): import("react").JSX.Element;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { InfoIcon } from "@phosphor-icons/react";
|
|
3
|
+
import { SegmentedProgressBar } from "./SegmentedProgressBar";
|
|
4
|
+
import { Card } from "./Card";
|
|
5
|
+
import { cn } from "../lib/utils";
|
|
6
|
+
export function UsageCard({ title, percentage, subtitle, resetIn, infoTooltip, segments = 20, className, }) {
|
|
7
|
+
return (_jsx(Card, { className: cn("p-5", className), children: _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-sm font-medium text-text-secondary", children: title }), infoTooltip && (_jsxs("div", { className: "group relative", "aria-label": infoTooltip, children: [_jsx(InfoIcon, { size: 14, className: "text-text-muted cursor-help hover:text-text-secondary transition-colors", "aria-hidden": "true" }), _jsxs("div", { role: "tooltip", className: "absolute top-full left-1/2 -translate-x-1/2 mt-2 px-3 py-2 bg-surface-secondary border border-border-primary rounded-lg text-xs text-text-secondary opacity-0 invisible group-hover:opacity-100 group-hover:visible transition-all max-w-64 z-10 shadow-lg", children: [infoTooltip, _jsx("div", { className: "absolute bottom-full left-1/2 -translate-x-1/2 -mb-1 border-4 border-transparent border-b-surface-secondary" })] })] }))] }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("span", { className: "text-4xl font-semibold text-text-primary tracking-tight", children: [Math.round(percentage), "%"] }), _jsxs("div", { className: "text-right", children: [subtitle && (_jsx("span", { className: "block text-sm text-text-secondary", children: subtitle })), resetIn && (_jsxs("span", { className: "block text-sm text-text-muted", children: ["Resets in ", resetIn] }))] })] }), _jsx(SegmentedProgressBar, { value: percentage, max: 100, segments: segments, size: "sm" })] }) }));
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=UsageCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UsageCard.js","sourceRoot":"","sources":["../../src/components/UsageCard.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAYlC,MAAM,UAAU,SAAS,CAAC,EACxB,KAAK,EACL,UAAU,EACV,QAAQ,EACR,OAAO,EACP,WAAW,EACX,QAAQ,GAAG,EAAE,EACb,SAAS,GACM;IACf,OAAO,CACL,KAAC,IAAI,IAAC,SAAS,EAAE,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,YACnC,eAAK,SAAS,EAAC,WAAW,aACxB,eAAK,SAAS,EAAC,yBAAyB,aACtC,eAAM,SAAS,EAAC,yCAAyC,YACtD,KAAK,GACD,EACN,WAAW,IAAI,CACd,eAAK,SAAS,EAAC,gBAAgB,gBAAa,WAAW,aACrD,KAAC,QAAQ,IACP,IAAI,EAAE,EAAE,EACR,SAAS,EAAC,yEAAyE,iBACvE,MAAM,GAClB,EACF,eACE,IAAI,EAAC,SAAS,EACd,SAAS,EAAC,4PAA4P,aAErQ,WAAW,EACZ,cAAK,SAAS,EAAC,6GAA6G,GAAG,IAC3H,IACF,CACP,IACG,EAEN,eAAK,SAAS,EAAC,mCAAmC,aAChD,gBAAM,SAAS,EAAC,yDAAyD,aACtE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAClB,EACP,eAAK,SAAS,EAAC,YAAY,aACxB,QAAQ,IAAI,CACX,eAAM,SAAS,EAAC,mCAAmC,YAChD,QAAQ,GACJ,CACR,EACA,OAAO,IAAI,CACV,gBAAM,SAAS,EAAC,+BAA+B,2BAClC,OAAO,IACb,CACR,IACG,IACF,EAEN,KAAC,oBAAoB,IACnB,KAAK,EAAE,UAAU,EACjB,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAC,IAAI,GACT,IACE,GACD,CACR,CAAC;AACJ,CAAC"}
|