@blaze-dev/ui 0.4.0 → 0.5.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/dist/feedback/app-error-boundary.d.ts +21 -0
- package/dist/feedback/app-error-boundary.d.ts.map +1 -0
- package/dist/feedback/app-error-boundary.js +80 -0
- package/dist/feedback/app-error-boundary.js.map +1 -0
- package/dist/feedback/async-state.d.ts +18 -0
- package/dist/feedback/async-state.d.ts.map +1 -0
- package/dist/feedback/async-state.js +24 -0
- package/dist/feedback/async-state.js.map +1 -0
- package/dist/feedback/confirm-modal.d.ts +14 -0
- package/dist/feedback/confirm-modal.d.ts.map +1 -0
- package/dist/feedback/confirm-modal.js +19 -0
- package/dist/feedback/confirm-modal.js.map +1 -0
- package/dist/feedback/index.d.ts +3 -0
- package/dist/feedback/index.d.ts.map +1 -1
- package/dist/feedback/index.js +3 -0
- package/dist/feedback/index.js.map +1 -1
- package/dist/hooks/index.d.ts +8 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +8 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/use-confirm.d.ts +36 -0
- package/dist/hooks/use-confirm.d.ts.map +1 -0
- package/dist/hooks/use-confirm.js +49 -0
- package/dist/hooks/use-confirm.js.map +1 -0
- package/dist/hooks/use-debounced-search.d.ts +10 -0
- package/dist/hooks/use-debounced-search.d.ts.map +1 -0
- package/dist/hooks/use-debounced-search.js +18 -0
- package/dist/hooks/use-debounced-search.js.map +1 -0
- package/dist/hooks/use-infinite-scroll.d.ts +12 -0
- package/dist/hooks/use-infinite-scroll.d.ts.map +1 -0
- package/dist/hooks/use-infinite-scroll.js +22 -0
- package/dist/hooks/use-infinite-scroll.js.map +1 -0
- package/dist/hooks/use-modal-state.d.ts +20 -0
- package/dist/hooks/use-modal-state.d.ts.map +1 -0
- package/dist/hooks/use-modal-state.js +22 -0
- package/dist/hooks/use-modal-state.js.map +1 -0
- package/dist/hooks/use-mutation-toast.d.ts +25 -0
- package/dist/hooks/use-mutation-toast.d.ts.map +1 -0
- package/dist/hooks/use-mutation-toast.js +48 -0
- package/dist/hooks/use-mutation-toast.js.map +1 -0
- package/dist/hooks/use-page-title.d.ts +5 -0
- package/dist/hooks/use-page-title.d.ts.map +1 -0
- package/dist/hooks/use-page-title.js +10 -0
- package/dist/hooks/use-page-title.js.map +1 -0
- package/dist/hooks/use-persisted-state.d.ts +7 -0
- package/dist/hooks/use-persisted-state.d.ts.map +1 -0
- package/dist/hooks/use-persisted-state.js +34 -0
- package/dist/hooks/use-persisted-state.js.map +1 -0
- package/dist/hooks/use-theme.d.ts +8 -0
- package/dist/hooks/use-theme.d.ts.map +1 -0
- package/dist/hooks/use-theme.js +26 -0
- package/dist/hooks/use-theme.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/dist/tabs.d.ts +15 -0
- package/dist/tabs.d.ts.map +1 -0
- package/dist/tabs.js +8 -0
- package/dist/tabs.js.map +1 -0
- package/dist/utils/date-utils.d.ts +31 -0
- package/dist/utils/date-utils.d.ts.map +1 -0
- package/dist/utils/date-utils.js +78 -0
- package/dist/utils/date-utils.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +19 -2
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Component, type ReactNode } from 'react';
|
|
2
|
+
interface Props {
|
|
3
|
+
children: ReactNode;
|
|
4
|
+
}
|
|
5
|
+
interface State {
|
|
6
|
+
hasError: boolean;
|
|
7
|
+
error: Error | null;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Full-page error boundary with retry and navigation.
|
|
11
|
+
* Uses inline styles intentionally — error boundaries must not depend on CSS
|
|
12
|
+
* since the CSS may be the thing that's broken.
|
|
13
|
+
*/
|
|
14
|
+
export declare class AppErrorBoundary extends Component<Props, State> {
|
|
15
|
+
constructor(props: Props);
|
|
16
|
+
static getDerivedStateFromError(error: Error): State;
|
|
17
|
+
handleReset: () => void;
|
|
18
|
+
render(): string | number | bigint | boolean | Iterable<ReactNode> | Promise<string | number | bigint | boolean | import("react").ReactPortal | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | import("react/jsx-runtime").JSX.Element | null | undefined;
|
|
19
|
+
}
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=app-error-boundary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-error-boundary.d.ts","sourceRoot":"","sources":["../../src/feedback/app-error-boundary.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAEjD,UAAU,KAAK;IACb,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED,UAAU,KAAK;IACb,QAAQ,EAAE,OAAO,CAAA;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CACpB;AAED;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC;gBAC/C,KAAK,EAAE,KAAK;IAKxB,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK;IAIpD,WAAW,aAEV;IAED,MAAM;CAoHP"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Component } from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* Full-page error boundary with retry and navigation.
|
|
5
|
+
* Uses inline styles intentionally — error boundaries must not depend on CSS
|
|
6
|
+
* since the CSS may be the thing that's broken.
|
|
7
|
+
*/
|
|
8
|
+
export class AppErrorBoundary extends Component {
|
|
9
|
+
constructor(props) {
|
|
10
|
+
super(props);
|
|
11
|
+
this.state = { hasError: false, error: null };
|
|
12
|
+
}
|
|
13
|
+
static getDerivedStateFromError(error) {
|
|
14
|
+
return { hasError: true, error };
|
|
15
|
+
}
|
|
16
|
+
handleReset = () => {
|
|
17
|
+
this.setState({ hasError: false, error: null });
|
|
18
|
+
};
|
|
19
|
+
render() {
|
|
20
|
+
if (!this.state.hasError) {
|
|
21
|
+
return this.props.children;
|
|
22
|
+
}
|
|
23
|
+
const { error } = this.state;
|
|
24
|
+
return (_jsx("div", { style: {
|
|
25
|
+
minHeight: '100vh',
|
|
26
|
+
display: 'flex',
|
|
27
|
+
alignItems: 'center',
|
|
28
|
+
justifyContent: 'center',
|
|
29
|
+
padding: '24px',
|
|
30
|
+
fontFamily: 'system-ui, -apple-system, sans-serif',
|
|
31
|
+
background: '#1d232a',
|
|
32
|
+
color: '#a6adba',
|
|
33
|
+
}, children: _jsxs("div", { style: {
|
|
34
|
+
maxWidth: '480px',
|
|
35
|
+
width: '100%',
|
|
36
|
+
background: '#2a323c',
|
|
37
|
+
borderRadius: '16px',
|
|
38
|
+
padding: '32px',
|
|
39
|
+
textAlign: 'center',
|
|
40
|
+
}, children: [_jsx("h1", { style: { fontSize: '20px', fontWeight: 700, color: '#fff', margin: '0 0 8px' }, children: "Something went wrong" }), _jsx("p", { style: { fontSize: '14px', margin: '0 0 24px', opacity: 0.6 }, children: "The application encountered an unexpected error." }), _jsxs("div", { style: { display: 'flex', gap: '8px', justifyContent: 'center' }, children: [_jsx("button", { type: 'button', onClick: this.handleReset, style: {
|
|
41
|
+
padding: '8px 20px',
|
|
42
|
+
borderRadius: '8px',
|
|
43
|
+
border: 'none',
|
|
44
|
+
background: '#661ae6',
|
|
45
|
+
color: '#fff',
|
|
46
|
+
fontWeight: 600,
|
|
47
|
+
fontSize: '14px',
|
|
48
|
+
cursor: 'pointer',
|
|
49
|
+
}, children: "Try Again" }), _jsx("button", { type: 'button', onClick: () => { window.location.href = '/'; }, style: {
|
|
50
|
+
padding: '8px 20px',
|
|
51
|
+
borderRadius: '8px',
|
|
52
|
+
border: '1px solid rgba(255,255,255,0.1)',
|
|
53
|
+
background: 'transparent',
|
|
54
|
+
color: '#a6adba',
|
|
55
|
+
fontWeight: 600,
|
|
56
|
+
fontSize: '14px',
|
|
57
|
+
cursor: 'pointer',
|
|
58
|
+
}, children: "Go Home" })] }), _jsxs("details", { style: { marginTop: '24px', textAlign: 'left' }, children: [_jsx("summary", { style: { cursor: 'pointer', fontSize: '12px', opacity: 0.4, textAlign: 'center' }, children: "Show error details" }), _jsxs("div", { style: {
|
|
59
|
+
marginTop: '8px',
|
|
60
|
+
background: '#1d232a',
|
|
61
|
+
borderRadius: '8px',
|
|
62
|
+
padding: '12px',
|
|
63
|
+
overflow: 'auto',
|
|
64
|
+
}, children: [_jsx("p", { style: {
|
|
65
|
+
fontSize: '12px',
|
|
66
|
+
fontFamily: 'monospace',
|
|
67
|
+
color: '#ef4444',
|
|
68
|
+
margin: '0 0 8px',
|
|
69
|
+
wordBreak: 'break-all',
|
|
70
|
+
}, children: error?.message }), error?.stack && (_jsx("pre", { style: {
|
|
71
|
+
fontSize: '10px',
|
|
72
|
+
fontFamily: 'monospace',
|
|
73
|
+
opacity: 0.5,
|
|
74
|
+
margin: 0,
|
|
75
|
+
whiteSpace: 'pre-wrap',
|
|
76
|
+
wordBreak: 'break-all',
|
|
77
|
+
}, children: error.stack }))] })] })] }) }));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=app-error-boundary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-error-boundary.js","sourceRoot":"","sources":["../../src/feedback/app-error-boundary.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export interface AsyncStateProps {
|
|
3
|
+
isLoading: boolean;
|
|
4
|
+
error?: Error | string | {
|
|
5
|
+
message?: string;
|
|
6
|
+
} | null;
|
|
7
|
+
onRetry?: () => void;
|
|
8
|
+
loadingText?: string;
|
|
9
|
+
children: ReactNode;
|
|
10
|
+
/**
|
|
11
|
+
* When true, keeps showing the previous children while loading new data
|
|
12
|
+
* instead of replacing content with a spinner. Only shows the spinner
|
|
13
|
+
* on the very first load when no content has been rendered yet.
|
|
14
|
+
*/
|
|
15
|
+
keepContentOnRefetch?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare function AsyncState({ isLoading, error, onRetry, loadingText, children, keepContentOnRefetch, }: AsyncStateProps): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
//# sourceMappingURL=async-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-state.d.ts","sourceRoot":"","sources":["../../src/feedback/async-state.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAU,MAAM,OAAO,CAAA;AAI9C,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IACpD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,SAAS,CAAA;IACnB;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B;AAED,wBAAgB,UAAU,CAAC,EACzB,SAAS,EACT,KAAK,EACL,OAAO,EACP,WAAW,EACX,QAAQ,EACR,oBAA4B,GAC7B,EAAE,eAAe,2CA8BjB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useRef } from 'react';
|
|
3
|
+
import { ErrorBox } from './error-box.js';
|
|
4
|
+
import { LoadingSpinner } from './loading-spinner.js';
|
|
5
|
+
export function AsyncState({ isLoading, error, onRetry, loadingText, children, keepContentOnRefetch = false, }) {
|
|
6
|
+
const previousChildrenRef = useRef(null);
|
|
7
|
+
if (!isLoading && !error) {
|
|
8
|
+
previousChildrenRef.current = children;
|
|
9
|
+
}
|
|
10
|
+
if (error) {
|
|
11
|
+
previousChildrenRef.current = null;
|
|
12
|
+
}
|
|
13
|
+
if (isLoading) {
|
|
14
|
+
if (keepContentOnRefetch && previousChildrenRef.current != null) {
|
|
15
|
+
return (_jsxs("div", { className: 'relative', children: [_jsx("div", { className: 'opacity-60 pointer-events-none', children: previousChildrenRef.current }), _jsx("div", { className: 'absolute inset-x-0 top-8 flex justify-center', children: _jsx(LoadingSpinner, { size: 'sm', text: loadingText }) })] }));
|
|
16
|
+
}
|
|
17
|
+
return _jsx(LoadingSpinner, { text: loadingText });
|
|
18
|
+
}
|
|
19
|
+
if (error) {
|
|
20
|
+
return _jsx(ErrorBox, { error: error, onRetry: onRetry });
|
|
21
|
+
}
|
|
22
|
+
return _jsx(_Fragment, { children: children });
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=async-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-state.js","sourceRoot":"","sources":["../../src/feedback/async-state.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAkB,MAAM,EAAE,MAAM,OAAO,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAgBrD,MAAM,UAAU,UAAU,CAAC,EACzB,SAAS,EACT,KAAK,EACL,OAAO,EACP,WAAW,EACX,QAAQ,EACR,oBAAoB,GAAG,KAAK,GACZ;IAChB,MAAM,mBAAmB,GAAG,MAAM,CAAY,IAAI,CAAC,CAAA;IAEnD,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC;QACzB,mBAAmB,CAAC,OAAO,GAAG,QAAQ,CAAA;IACxC,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,mBAAmB,CAAC,OAAO,GAAG,IAAI,CAAA;IACpC,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,oBAAoB,IAAI,mBAAmB,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;YAChE,OAAO,CACL,eAAK,SAAS,EAAC,UAAU,aACvB,cAAK,SAAS,EAAC,gCAAgC,YAAE,mBAAmB,CAAC,OAAO,GAAO,EACnF,cAAK,SAAS,EAAC,8CAA8C,YAC3D,KAAC,cAAc,IAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAE,WAAW,GAAI,GAC3C,IACF,CACP,CAAA;QACH,CAAC;QACD,OAAO,KAAC,cAAc,IAAC,IAAI,EAAE,WAAW,GAAI,CAAA;IAC9C,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,KAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,GAAI,CAAA;IACrD,CAAC;IAED,OAAO,4BAAG,QAAQ,GAAI,CAAA;AACxB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export interface ConfirmModalProps {
|
|
3
|
+
isOpen: boolean;
|
|
4
|
+
onClose: () => void;
|
|
5
|
+
onConfirm: () => void | Promise<void>;
|
|
6
|
+
title?: string;
|
|
7
|
+
message: ReactNode;
|
|
8
|
+
confirmLabel?: string;
|
|
9
|
+
cancelLabel?: string;
|
|
10
|
+
variant?: 'danger' | 'warning' | 'default';
|
|
11
|
+
isLoading?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function ConfirmModal({ isOpen, onClose, onConfirm, title, message, confirmLabel, cancelLabel, variant, isLoading: externalLoading, }: ConfirmModalProps): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
//# sourceMappingURL=confirm-modal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirm-modal.d.ts","sourceRoot":"","sources":["../../src/feedback/confirm-modal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAA;AAGhD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,SAAS,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,SAAS,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAA;IAC1C,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,OAAO,EACP,SAAS,EACT,KAAiB,EACjB,OAAO,EACP,YAAwB,EACxB,WAAsB,EACtB,OAAmB,EACnB,SAAS,EAAE,eAAe,GAC3B,EAAE,iBAAiB,2CAmCnB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { Modal } from '../modal.js';
|
|
4
|
+
export function ConfirmModal({ isOpen, onClose, onConfirm, title = 'Confirm', message, confirmLabel = 'Confirm', cancelLabel = 'Cancel', variant = 'default', isLoading: externalLoading, }) {
|
|
5
|
+
const [internalLoading, setInternalLoading] = useState(false);
|
|
6
|
+
const isLoading = externalLoading ?? internalLoading;
|
|
7
|
+
const handleConfirm = async () => {
|
|
8
|
+
setInternalLoading(true);
|
|
9
|
+
try {
|
|
10
|
+
await onConfirm();
|
|
11
|
+
}
|
|
12
|
+
finally {
|
|
13
|
+
setInternalLoading(false);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
const btnClass = variant === 'danger' ? 'btn-error' : variant === 'warning' ? 'btn-warning' : 'btn-primary';
|
|
17
|
+
return (_jsxs(Modal, { isOpen: isOpen, onClose: onClose, title: title, children: [_jsx("div", { className: 'py-2', children: typeof message === 'string' ? _jsx("p", { children: message }) : message }), _jsxs("div", { className: 'modal-action', children: [_jsx("button", { type: 'button', className: 'btn btn-ghost btn-sm', onClick: onClose, disabled: isLoading, children: cancelLabel }), _jsxs("button", { type: 'button', className: `btn ${btnClass} btn-sm`, onClick: handleConfirm, disabled: isLoading, children: [isLoading && _jsx("span", { className: 'loading loading-spinner loading-xs' }), confirmLabel] })] })] }));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=confirm-modal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirm-modal.js","sourceRoot":"","sources":["../../src/feedback/confirm-modal.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAkB,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAcnC,MAAM,UAAU,YAAY,CAAC,EAC3B,MAAM,EACN,OAAO,EACP,SAAS,EACT,KAAK,GAAG,SAAS,EACjB,OAAO,EACP,YAAY,GAAG,SAAS,EACxB,WAAW,GAAG,QAAQ,EACtB,OAAO,GAAG,SAAS,EACnB,SAAS,EAAE,eAAe,GACR;IAClB,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC7D,MAAM,SAAS,GAAG,eAAe,IAAI,eAAe,CAAA;IAEpD,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE;QAC/B,kBAAkB,CAAC,IAAI,CAAC,CAAA;QACxB,IAAI,CAAC;YACH,MAAM,SAAS,EAAE,CAAA;QACnB,CAAC;gBAAS,CAAC;YACT,kBAAkB,CAAC,KAAK,CAAC,CAAA;QAC3B,CAAC;IACH,CAAC,CAAA;IAED,MAAM,QAAQ,GACZ,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAA;IAE5F,OAAO,CACL,MAAC,KAAK,IAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,aACnD,cAAK,SAAS,EAAC,MAAM,YAAE,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,sBAAI,OAAO,GAAK,CAAC,CAAC,CAAC,OAAO,GAAO,EACtF,eAAK,SAAS,EAAC,cAAc,aAC3B,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,sBAAsB,EAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,YACzF,WAAW,GACL,EACT,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,OAAO,QAAQ,SAAS,EACnC,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,SAAS,aAElB,SAAS,IAAI,eAAM,SAAS,EAAC,oCAAoC,GAAG,EACpE,YAAY,IACN,IACL,IACA,CACT,CAAA;AACH,CAAC"}
|
package/dist/feedback/index.d.ts
CHANGED
|
@@ -3,4 +3,7 @@ export { ErrorBox } from './error-box.js';
|
|
|
3
3
|
export { EmptyState } from './empty-state.js';
|
|
4
4
|
export { InfoAlert } from './info-alert.js';
|
|
5
5
|
export { ToastProvider, useToast, type Toast, type ToastType } from './toast-provider.js';
|
|
6
|
+
export { AsyncState, type AsyncStateProps } from './async-state.js';
|
|
7
|
+
export { ConfirmModal, type ConfirmModalProps } from './confirm-modal.js';
|
|
8
|
+
export { AppErrorBoundary } from './app-error-boundary.js';
|
|
6
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/feedback/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,KAAK,EAAE,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/feedback/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,KAAK,EAAE,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAA;AACzF,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA"}
|
package/dist/feedback/index.js
CHANGED
|
@@ -3,4 +3,7 @@ export { ErrorBox } from './error-box.js';
|
|
|
3
3
|
export { EmptyState } from './empty-state.js';
|
|
4
4
|
export { InfoAlert } from './info-alert.js';
|
|
5
5
|
export { ToastProvider, useToast } from './toast-provider.js';
|
|
6
|
+
export { AsyncState } from './async-state.js';
|
|
7
|
+
export { ConfirmModal } from './confirm-modal.js';
|
|
8
|
+
export { AppErrorBoundary } from './app-error-boundary.js';
|
|
6
9
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/feedback/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAA8B,MAAM,qBAAqB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/feedback/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAA8B,MAAM,qBAAqB,CAAA;AACzF,OAAO,EAAE,UAAU,EAAwB,MAAM,kBAAkB,CAAA;AACnE,OAAO,EAAE,YAAY,EAA0B,MAAM,oBAAoB,CAAA;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA"}
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -1,2 +1,10 @@
|
|
|
1
1
|
export { useCopyToClipboard } from './use-copy-to-clipboard.js';
|
|
2
|
+
export { useMutationToast, type MutationToastOptions } from './use-mutation-toast.js';
|
|
3
|
+
export { useModalState, useItemModal } from './use-modal-state.js';
|
|
4
|
+
export { useDebouncedSearch } from './use-debounced-search.js';
|
|
5
|
+
export { usePersistedState } from './use-persisted-state.js';
|
|
6
|
+
export { usePageTitle } from './use-page-title.js';
|
|
7
|
+
export { useTheme } from './use-theme.js';
|
|
8
|
+
export { useConfirm, type ConfirmOptions, type ConfirmModalState } from './use-confirm.js';
|
|
9
|
+
export { useInfiniteScroll } from './use-infinite-scroll.js';
|
|
2
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,gBAAgB,EAAE,KAAK,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AACrF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAC1F,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA"}
|
package/dist/hooks/index.js
CHANGED
|
@@ -1,2 +1,10 @@
|
|
|
1
1
|
export { useCopyToClipboard } from './use-copy-to-clipboard.js';
|
|
2
|
+
export { useMutationToast } from './use-mutation-toast.js';
|
|
3
|
+
export { useModalState, useItemModal } from './use-modal-state.js';
|
|
4
|
+
export { useDebouncedSearch } from './use-debounced-search.js';
|
|
5
|
+
export { usePersistedState } from './use-persisted-state.js';
|
|
6
|
+
export { usePageTitle } from './use-page-title.js';
|
|
7
|
+
export { useTheme } from './use-theme.js';
|
|
8
|
+
export { useConfirm } from './use-confirm.js';
|
|
9
|
+
export { useInfiniteScroll } from './use-infinite-scroll.js';
|
|
2
10
|
//# sourceMappingURL=index.js.map
|
package/dist/hooks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,gBAAgB,EAA6B,MAAM,yBAAyB,CAAA;AACrF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,UAAU,EAA+C,MAAM,kBAAkB,CAAA;AAC1F,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export interface ConfirmOptions {
|
|
2
|
+
title?: string;
|
|
3
|
+
message: string;
|
|
4
|
+
confirmLabel?: string;
|
|
5
|
+
variant?: 'danger' | 'warning' | 'default';
|
|
6
|
+
}
|
|
7
|
+
export interface ConfirmModalState {
|
|
8
|
+
isOpen: boolean;
|
|
9
|
+
title?: string;
|
|
10
|
+
message: string;
|
|
11
|
+
confirmLabel?: string;
|
|
12
|
+
variant?: 'danger' | 'warning' | 'default';
|
|
13
|
+
onClose: () => void;
|
|
14
|
+
onConfirm: () => void;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Promise-based confirmation dialog hook.
|
|
18
|
+
* Returns `confirm(options)` and `confirmProps` to spread onto `<ConfirmModal>`.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```tsx
|
|
22
|
+
* const { confirm, confirmProps } = useConfirm()
|
|
23
|
+
*
|
|
24
|
+
* const handleDelete = async () => {
|
|
25
|
+
* const ok = await confirm({ message: 'Delete this item?', variant: 'danger' })
|
|
26
|
+
* if (ok) deleteMutation.mutate(id)
|
|
27
|
+
* }
|
|
28
|
+
*
|
|
29
|
+
* return <ConfirmModal {...confirmProps} />
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare function useConfirm(): {
|
|
33
|
+
readonly confirm: (options: ConfirmOptions) => Promise<boolean>;
|
|
34
|
+
readonly confirmProps: ConfirmModalState;
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=use-confirm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-confirm.d.ts","sourceRoot":"","sources":["../../src/hooks/use-confirm.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAA;CAC3C;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAA;IAC1C,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,SAAS,EAAE,MAAM,IAAI,CAAA;CACtB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,UAAU;gCASc,cAAc,KAAG,OAAO,CAAC,OAAO,CAAC;;EA8BxE"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { useCallback, useState } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Promise-based confirmation dialog hook.
|
|
4
|
+
* Returns `confirm(options)` and `confirmProps` to spread onto `<ConfirmModal>`.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```tsx
|
|
8
|
+
* const { confirm, confirmProps } = useConfirm()
|
|
9
|
+
*
|
|
10
|
+
* const handleDelete = async () => {
|
|
11
|
+
* const ok = await confirm({ message: 'Delete this item?', variant: 'danger' })
|
|
12
|
+
* if (ok) deleteMutation.mutate(id)
|
|
13
|
+
* }
|
|
14
|
+
*
|
|
15
|
+
* return <ConfirmModal {...confirmProps} />
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export function useConfirm() {
|
|
19
|
+
const [state, setState] = useState(null);
|
|
20
|
+
const confirm = useCallback((options) => {
|
|
21
|
+
return new Promise((resolve) => {
|
|
22
|
+
setState({ ...options, resolve });
|
|
23
|
+
});
|
|
24
|
+
}, []);
|
|
25
|
+
const confirmProps = state
|
|
26
|
+
? {
|
|
27
|
+
isOpen: true,
|
|
28
|
+
message: state.message,
|
|
29
|
+
title: state.title,
|
|
30
|
+
confirmLabel: state.confirmLabel,
|
|
31
|
+
variant: state.variant,
|
|
32
|
+
onClose: () => {
|
|
33
|
+
state.resolve(false);
|
|
34
|
+
setState(null);
|
|
35
|
+
},
|
|
36
|
+
onConfirm: () => {
|
|
37
|
+
state.resolve(true);
|
|
38
|
+
setState(null);
|
|
39
|
+
},
|
|
40
|
+
}
|
|
41
|
+
: {
|
|
42
|
+
isOpen: false,
|
|
43
|
+
message: '',
|
|
44
|
+
onClose: () => { },
|
|
45
|
+
onConfirm: () => { },
|
|
46
|
+
};
|
|
47
|
+
return { confirm, confirmProps };
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=use-confirm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-confirm.js","sourceRoot":"","sources":["../../src/hooks/use-confirm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAmB7C;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAMxB,IAAI,CAAC,CAAA;IAEf,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,OAAuB,EAAoB,EAAE;QACxE,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;YACtC,QAAQ,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA;QACnC,CAAC,CAAC,CAAA;IACJ,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,YAAY,GAAsB,KAAK;QAC3C,CAAC,CAAC;YACE,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;gBACpB,QAAQ,CAAC,IAAI,CAAC,CAAA;YAChB,CAAC;YACD,SAAS,EAAE,GAAG,EAAE;gBACd,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;gBACnB,QAAQ,CAAC,IAAI,CAAC,CAAA;YAChB,CAAC;SACF;QACH,CAAC,CAAC;YACE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;YACjB,SAAS,EAAE,GAAG,EAAE,GAAE,CAAC;SACpB,CAAA;IAEL,OAAO,EAAE,OAAO,EAAE,YAAY,EAAW,CAAA;AAC3C,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns a search input state and a debounced version.
|
|
3
|
+
* The `debouncedSearch` value updates after the delay elapses.
|
|
4
|
+
*/
|
|
5
|
+
export declare function useDebouncedSearch(delay?: number): {
|
|
6
|
+
readonly searchInput: string;
|
|
7
|
+
readonly setSearchInput: import("react").Dispatch<import("react").SetStateAction<string>>;
|
|
8
|
+
readonly debouncedSearch: string;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=use-debounced-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-debounced-search.d.ts","sourceRoot":"","sources":["../../src/hooks/use-debounced-search.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,SAAsB;;;;EAY7D"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
|
+
const DEFAULT_DEBOUNCE_MS = 300;
|
|
3
|
+
/**
|
|
4
|
+
* Returns a search input state and a debounced version.
|
|
5
|
+
* The `debouncedSearch` value updates after the delay elapses.
|
|
6
|
+
*/
|
|
7
|
+
export function useDebouncedSearch(delay = DEFAULT_DEBOUNCE_MS) {
|
|
8
|
+
const [searchInput, setSearchInput] = useState('');
|
|
9
|
+
const [debouncedSearch, setDebouncedSearch] = useState('');
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
const handle = window.setTimeout(() => {
|
|
12
|
+
setDebouncedSearch(searchInput.trim());
|
|
13
|
+
}, delay);
|
|
14
|
+
return () => window.clearTimeout(handle);
|
|
15
|
+
}, [searchInput, delay]);
|
|
16
|
+
return { searchInput, setSearchInput, debouncedSearch };
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=use-debounced-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-debounced-search.js","sourceRoot":"","sources":["../../src/hooks/use-debounced-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAE3C,MAAM,mBAAmB,GAAG,GAAG,CAAA;AAE/B;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAK,GAAG,mBAAmB;IAC5D,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAClD,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAE1D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;YACpC,kBAAkB,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAA;QACxC,CAAC,EAAE,KAAK,CAAC,CAAA;QACT,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;IAC1C,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAA;IAExB,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAW,CAAA;AAClE,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-trigger `fetchNextPage` when a sentinel element enters the viewport.
|
|
3
|
+
* Attach `loadMoreRef` to a div at the bottom of your list.
|
|
4
|
+
*/
|
|
5
|
+
export declare function useInfiniteScroll(opts: {
|
|
6
|
+
hasNextPage: boolean | undefined;
|
|
7
|
+
isFetchingNextPage: boolean;
|
|
8
|
+
fetchNextPage: () => void;
|
|
9
|
+
}): {
|
|
10
|
+
loadMoreRef: import("react").RefObject<HTMLDivElement | null>;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=use-infinite-scroll.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-infinite-scroll.d.ts","sourceRoot":"","sources":["../../src/hooks/use-infinite-scroll.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,WAAW,EAAE,OAAO,GAAG,SAAS,CAAA;IAChC,kBAAkB,EAAE,OAAO,CAAA;IAC3B,aAAa,EAAE,MAAM,IAAI,CAAA;CAC1B;;EAkBA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { useEffect, useRef } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Auto-trigger `fetchNextPage` when a sentinel element enters the viewport.
|
|
4
|
+
* Attach `loadMoreRef` to a div at the bottom of your list.
|
|
5
|
+
*/
|
|
6
|
+
export function useInfiniteScroll(opts) {
|
|
7
|
+
const loadMoreRef = useRef(null);
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
const el = loadMoreRef.current;
|
|
10
|
+
if (!el)
|
|
11
|
+
return;
|
|
12
|
+
const observer = new IntersectionObserver(([entry]) => {
|
|
13
|
+
if (entry.isIntersecting && opts.hasNextPage && !opts.isFetchingNextPage) {
|
|
14
|
+
opts.fetchNextPage();
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
observer.observe(el);
|
|
18
|
+
return () => observer.disconnect();
|
|
19
|
+
}, [opts.hasNextPage, opts.isFetchingNextPage, opts.fetchNextPage]);
|
|
20
|
+
return { loadMoreRef };
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=use-infinite-scroll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-infinite-scroll.js","sourceRoot":"","sources":["../../src/hooks/use-infinite-scroll.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAEzC;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAIjC;IACC,MAAM,WAAW,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAA;IAEvD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,WAAW,CAAC,OAAO,CAAA;QAC9B,IAAI,CAAC,EAAE;YAAE,OAAM;QAEf,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE;YACpD,IAAI,KAAK,CAAC,cAAc,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACzE,IAAI,CAAC,aAAa,EAAE,CAAA;YACtB,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACpB,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAA;IACpC,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAA;IAEnE,OAAO,EAAE,WAAW,EAAE,CAAA;AACxB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple boolean modal state (open/close).
|
|
3
|
+
*/
|
|
4
|
+
export declare function useModalState(): {
|
|
5
|
+
readonly isOpen: boolean;
|
|
6
|
+
readonly open: () => void;
|
|
7
|
+
readonly close: () => void;
|
|
8
|
+
readonly setIsOpen: import("react").Dispatch<import("react").SetStateAction<boolean>>;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Modal state with an associated item (e.g. editing an entity).
|
|
12
|
+
* Opening sets both isOpen=true and the item; closing clears both.
|
|
13
|
+
*/
|
|
14
|
+
export declare function useItemModal<T>(): {
|
|
15
|
+
readonly isOpen: boolean;
|
|
16
|
+
readonly item: T | null;
|
|
17
|
+
readonly open: (value: T) => void;
|
|
18
|
+
readonly close: () => void;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=use-modal-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-modal-state.d.ts","sourceRoot":"","sources":["../../src/hooks/use-modal-state.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,aAAa;;;;;EAK5B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC;;;2BAGK,CAAC;;EAGnC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { useCallback, useState } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Simple boolean modal state (open/close).
|
|
4
|
+
*/
|
|
5
|
+
export function useModalState() {
|
|
6
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
7
|
+
const open = useCallback(() => setIsOpen(true), []);
|
|
8
|
+
const close = useCallback(() => setIsOpen(false), []);
|
|
9
|
+
return { isOpen, open, close, setIsOpen };
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Modal state with an associated item (e.g. editing an entity).
|
|
13
|
+
* Opening sets both isOpen=true and the item; closing clears both.
|
|
14
|
+
*/
|
|
15
|
+
export function useItemModal() {
|
|
16
|
+
const [item, setItem] = useState(null);
|
|
17
|
+
const isOpen = item !== null;
|
|
18
|
+
const open = useCallback((value) => setItem(value), []);
|
|
19
|
+
const close = useCallback(() => setItem(null), []);
|
|
20
|
+
return { isOpen, item, open, close };
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=use-modal-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-modal-state.js","sourceRoot":"","sources":["../../src/hooks/use-modal-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAE7C;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IACnD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAA;IACrD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAW,CAAA;AACpD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAW,IAAI,CAAC,CAAA;IAChD,MAAM,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IAC5B,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,KAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAA;IAC1D,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IAClD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAW,CAAA;AAC/C,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
interface MutateOptions<TData, TError, TVariables> {
|
|
2
|
+
onSuccess?: (data: TData, variables: TVariables, context: unknown) => void | Promise<void>;
|
|
3
|
+
onError?: (error: TError, variables: TVariables, context: unknown) => void | Promise<void>;
|
|
4
|
+
}
|
|
5
|
+
interface MutationLike<TData, TError, TVariables> {
|
|
6
|
+
mutate: (variables: TVariables, options?: MutateOptions<TData, TError, TVariables>) => void;
|
|
7
|
+
mutateAsync: (variables: TVariables, options?: MutateOptions<TData, TError, TVariables>) => Promise<TData>;
|
|
8
|
+
}
|
|
9
|
+
export interface MutationToastOptions<TData = unknown, TError = Error, TVariables = unknown> {
|
|
10
|
+
successMessage?: string | ((data: TData, variables: TVariables) => string);
|
|
11
|
+
errorMessage?: string | ((error: TError) => string);
|
|
12
|
+
invalidateQueries?: () => void | Promise<void>;
|
|
13
|
+
onSuccess?: (data: TData, variables: TVariables) => void | Promise<void>;
|
|
14
|
+
onError?: (error: TError, variables: TVariables) => void | Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Wrap a tRPC (or any compatible) mutation to automatically show toast
|
|
18
|
+
* notifications on success/error and optionally invalidate queries.
|
|
19
|
+
*/
|
|
20
|
+
export declare function useMutationToast<TData = unknown, TError = Error, TVariables = void, TMutation extends MutationLike<TData, TError, TVariables> = MutationLike<TData, TError, TVariables>>(mutation: TMutation, options?: MutationToastOptions<TData, TError, TVariables>): Omit<TMutation, 'mutate' | 'mutateAsync'> & {
|
|
21
|
+
mutate: (variables: TVariables) => void;
|
|
22
|
+
mutateAsync: (variables: TVariables) => Promise<TData>;
|
|
23
|
+
};
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=use-mutation-toast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-mutation-toast.d.ts","sourceRoot":"","sources":["../../src/hooks/use-mutation-toast.ts"],"names":[],"mappings":"AAEA,UAAU,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU;IAC/C,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1F,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3F;AAED,UAAU,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU;IAC9C,MAAM,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,KAAK,IAAI,CAAA;IAC3F,WAAW,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA;CAC3G;AAED,MAAM,WAAW,oBAAoB,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,UAAU,GAAG,OAAO;IACzF,cAAc,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,KAAK,MAAM,CAAC,CAAA;IAC1E,YAAY,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,CAAA;IACnD,iBAAiB,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9C,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACxE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACzE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,GAAG,OAAO,EACf,MAAM,GAAG,KAAK,EACd,UAAU,GAAG,IAAI,EACjB,SAAS,SAAS,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,GAAG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAEnG,QAAQ,EAAE,SAAS,EACnB,OAAO,GAAE,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAM,GAC5D,IAAI,CAAC,SAAS,EAAE,QAAQ,GAAG,aAAa,CAAC,GAAG;IAC7C,MAAM,EAAE,CAAC,SAAS,EAAE,UAAU,KAAK,IAAI,CAAA;IACvC,WAAW,EAAE,CAAC,SAAS,EAAE,UAAU,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA;CACvD,CAgDA"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { useToast } from '../feedback/toast-provider.js';
|
|
2
|
+
/**
|
|
3
|
+
* Wrap a tRPC (or any compatible) mutation to automatically show toast
|
|
4
|
+
* notifications on success/error and optionally invalidate queries.
|
|
5
|
+
*/
|
|
6
|
+
export function useMutationToast(mutation, options = {}) {
|
|
7
|
+
const { addToast } = useToast();
|
|
8
|
+
const { successMessage, errorMessage, invalidateQueries, onSuccess, onError } = options;
|
|
9
|
+
const handleSuccess = async (data, variables) => {
|
|
10
|
+
if (invalidateQueries) {
|
|
11
|
+
try {
|
|
12
|
+
await invalidateQueries();
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
addToast('Operation succeeded, but display may be out of date. Please refresh.', 'warning');
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
if (successMessage) {
|
|
19
|
+
const message = typeof successMessage === 'function' ? successMessage(data, variables) : successMessage;
|
|
20
|
+
addToast(message, 'success');
|
|
21
|
+
}
|
|
22
|
+
await onSuccess?.(data, variables);
|
|
23
|
+
};
|
|
24
|
+
const handleError = async (error, variables) => {
|
|
25
|
+
const message = errorMessage
|
|
26
|
+
? typeof errorMessage === 'function'
|
|
27
|
+
? errorMessage(error)
|
|
28
|
+
: errorMessage
|
|
29
|
+
: `Error: ${error.message}`;
|
|
30
|
+
addToast(message, 'error');
|
|
31
|
+
await onError?.(error, variables);
|
|
32
|
+
};
|
|
33
|
+
const mutate = (variables) => {
|
|
34
|
+
mutation.mutate(variables, {
|
|
35
|
+
onSuccess: (data, vars) => { handleSuccess(data, vars); },
|
|
36
|
+
onError: (error, vars) => { handleError(error, vars); },
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
const mutateAsync = async (variables) => {
|
|
40
|
+
return mutation.mutateAsync(variables, {
|
|
41
|
+
onSuccess: (data, vars) => { handleSuccess(data, vars); },
|
|
42
|
+
onError: (error, vars) => { handleError(error, vars); },
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
const { mutate: _m, mutateAsync: _ma, ...rest } = mutation;
|
|
46
|
+
return { ...rest, mutate, mutateAsync };
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=use-mutation-toast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-mutation-toast.js","sourceRoot":"","sources":["../../src/hooks/use-mutation-toast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAA;AAoBxD;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAM9B,QAAmB,EACnB,UAA2D,EAAE;IAK7D,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAA;IAC/B,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,iBAAiB,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;IAEvF,MAAM,aAAa,GAAG,KAAK,EAAE,IAAW,EAAE,SAAqB,EAAE,EAAE;QACjE,IAAI,iBAAiB,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,iBAAiB,EAAE,CAAA;YAC3B,CAAC;YAAC,MAAM,CAAC;gBACP,QAAQ,CAAC,sEAAsE,EAAE,SAAS,CAAC,CAAA;YAC7F,CAAC;QACH,CAAC;QAED,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,OAAO,GAAG,OAAO,cAAc,KAAK,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,cAAc,CAAA;YACvG,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;QAC9B,CAAC;QAED,MAAM,SAAS,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IACpC,CAAC,CAAA;IAED,MAAM,WAAW,GAAG,KAAK,EAAE,KAAa,EAAE,SAAqB,EAAE,EAAE;QACjE,MAAM,OAAO,GAAG,YAAY;YAC1B,CAAC,CAAC,OAAO,YAAY,KAAK,UAAU;gBAClC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC;gBACrB,CAAC,CAAC,YAAY;YAChB,CAAC,CAAC,UAAW,KAAe,CAAC,OAAO,EAAE,CAAA;QAExC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAC1B,MAAM,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;IACnC,CAAC,CAAA;IAED,MAAM,MAAM,GAAG,CAAC,SAAqB,EAAE,EAAE;QACvC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE;YACzB,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA,CAAC,CAAC;YACxD,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA,CAAC,CAAC;SACvD,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,MAAM,WAAW,GAAG,KAAK,EAAE,SAAqB,EAAE,EAAE;QAClD,OAAO,QAAQ,CAAC,WAAW,CAAC,SAAS,EAAE;YACrC,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA,CAAC,CAAC;YACxD,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA,CAAC,CAAC;SACvD,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAA;IAC1D,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAA;AACzC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-page-title.d.ts","sourceRoot":"","sources":["../../src/hooks/use-page-title.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAQ,QAI1D"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Set `document.title` to "{title} - {appName}" or just {appName} if title is empty.
|
|
4
|
+
*/
|
|
5
|
+
export function usePageTitle(title, appName = 'App') {
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
document.title = title ? `${title} - ${appName}` : appName;
|
|
8
|
+
}, [title, appName]);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=use-page-title.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-page-title.js","sourceRoot":"","sources":["../../src/hooks/use-page-title.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEjC;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,OAAO,GAAG,KAAK;IACzD,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAA;IAC5D,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAA;AACtB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A drop-in replacement for useState that persists the value in localStorage.
|
|
3
|
+
* Uses JSON serialization. Falls back to defaultValue if localStorage is
|
|
4
|
+
* unavailable or the stored value can't be parsed.
|
|
5
|
+
*/
|
|
6
|
+
export declare function usePersistedState<T>(key: string, defaultValue: T): readonly [T, (next: T | ((prev: T) => T)) => void];
|
|
7
|
+
//# sourceMappingURL=use-persisted-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-persisted-state.d.ts","sourceRoot":"","sources":["../../src/hooks/use-persisted-state.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,uBActD,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,WAe9B"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { useCallback, useState } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* A drop-in replacement for useState that persists the value in localStorage.
|
|
4
|
+
* Uses JSON serialization. Falls back to defaultValue if localStorage is
|
|
5
|
+
* unavailable or the stored value can't be parsed.
|
|
6
|
+
*/
|
|
7
|
+
export function usePersistedState(key, defaultValue) {
|
|
8
|
+
const [value, setValue] = useState(() => {
|
|
9
|
+
try {
|
|
10
|
+
const stored = localStorage.getItem(key);
|
|
11
|
+
if (stored !== null) {
|
|
12
|
+
return JSON.parse(stored);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// ignore parse errors, use default
|
|
17
|
+
}
|
|
18
|
+
return defaultValue;
|
|
19
|
+
});
|
|
20
|
+
const setPersisted = useCallback((next) => {
|
|
21
|
+
setValue((prev) => {
|
|
22
|
+
const resolved = typeof next === 'function' ? next(prev) : next;
|
|
23
|
+
try {
|
|
24
|
+
localStorage.setItem(key, JSON.stringify(resolved));
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// ignore quota errors
|
|
28
|
+
}
|
|
29
|
+
return resolved;
|
|
30
|
+
});
|
|
31
|
+
}, [key]);
|
|
32
|
+
return [value, setPersisted];
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=use-persisted-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-persisted-state.js","sourceRoot":"","sources":["../../src/hooks/use-persisted-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAE7C;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAI,GAAW,EAAE,YAAe;IAC/D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAI,GAAG,EAAE;QACzC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YACxC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAM,CAAA;YAChC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;QACrC,CAAC;QACD,OAAO,YAAY,CAAA;IACrB,CAAC,CAAC,CAAA;IAEF,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,IAA0B,EAAE,EAAE;QAC7B,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE;YAChB,MAAM,QAAQ,GAAG,OAAO,IAAI,KAAK,UAAU,CAAC,CAAC,CAAE,IAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;YACnF,IAAI,CAAC;gBACH,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAA;YACrD,CAAC;YAAC,MAAM,CAAC;gBACP,sBAAsB;YACxB,CAAC;YACD,OAAO,QAAQ,CAAA;QACjB,CAAC,CAAC,CAAA;IACJ,CAAC,EACD,CAAC,GAAG,CAAC,CACN,CAAA;IAED,OAAO,CAAC,KAAK,EAAE,YAAY,CAAU,CAAA;AACvC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-theme.d.ts","sourceRoot":"","sources":["../../src/hooks/use-theme.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,QAAQ,CAAC,YAAY,SAAS;;kCAU/B,MAAM;EAapB"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { useCallback, useState } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Manage DaisyUI theme via localStorage and `data-theme` attribute.
|
|
4
|
+
*/
|
|
5
|
+
export function useTheme(defaultTheme = 'dark') {
|
|
6
|
+
const [theme, setThemeState] = useState(() => {
|
|
7
|
+
try {
|
|
8
|
+
return localStorage.getItem('theme') ?? defaultTheme;
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return defaultTheme;
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
const setTheme = useCallback((newTheme) => {
|
|
15
|
+
setThemeState(newTheme);
|
|
16
|
+
try {
|
|
17
|
+
localStorage.setItem('theme', newTheme);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// ignore
|
|
21
|
+
}
|
|
22
|
+
document.documentElement.setAttribute('data-theme', newTheme);
|
|
23
|
+
}, []);
|
|
24
|
+
return { theme, setTheme };
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=use-theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-theme.js","sourceRoot":"","sources":["../../src/hooks/use-theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAE7C;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,YAAY,GAAG,MAAM;IAC5C,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE;QAC3C,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,YAAY,CAAA;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,YAAY,CAAA;QACrB,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,QAAQ,GAAG,WAAW,CAC1B,CAAC,QAAgB,EAAE,EAAE;QACnB,aAAa,CAAC,QAAQ,CAAC,CAAA;QACvB,IAAI,CAAC;YACH,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAA;IAC/D,CAAC,EACD,EAAE,CACH,CAAA;IAED,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAW,CAAA;AACrC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,11 +3,15 @@ export { PageHeader } from './page-header.js';
|
|
|
3
3
|
export { Breadcrumbs } from './breadcrumbs.js';
|
|
4
4
|
export { DangerZone } from './danger-zone.js';
|
|
5
5
|
export { ContextMenu } from './context-menu.js';
|
|
6
|
+
export { Tabs, type TabItem, type TabsProps } from './tabs.js';
|
|
6
7
|
export { LoadingSpinner } from './feedback/loading-spinner.js';
|
|
7
8
|
export { ErrorBox } from './feedback/error-box.js';
|
|
8
9
|
export { EmptyState } from './feedback/empty-state.js';
|
|
9
10
|
export { InfoAlert } from './feedback/info-alert.js';
|
|
10
11
|
export { ToastProvider, useToast, type Toast, type ToastType } from './feedback/toast-provider.js';
|
|
12
|
+
export { AsyncState, type AsyncStateProps } from './feedback/async-state.js';
|
|
13
|
+
export { ConfirmModal, type ConfirmModalProps } from './feedback/confirm-modal.js';
|
|
14
|
+
export { AppErrorBoundary } from './feedback/app-error-boundary.js';
|
|
11
15
|
export { StatCard } from './data/stat-card.js';
|
|
12
16
|
export { DataTable } from './data/data-table.js';
|
|
13
17
|
export { InfoRow } from './data/info-row.js';
|
|
@@ -16,6 +20,14 @@ export { ActionButton } from './action-button.js';
|
|
|
16
20
|
export { CopyButton } from './copy-button.js';
|
|
17
21
|
export { StatusBadge } from './status-badge.js';
|
|
18
22
|
export { useCopyToClipboard } from './hooks/use-copy-to-clipboard.js';
|
|
23
|
+
export { useMutationToast, type MutationToastOptions } from './hooks/use-mutation-toast.js';
|
|
24
|
+
export { useModalState, useItemModal } from './hooks/use-modal-state.js';
|
|
25
|
+
export { useDebouncedSearch } from './hooks/use-debounced-search.js';
|
|
26
|
+
export { usePersistedState } from './hooks/use-persisted-state.js';
|
|
27
|
+
export { usePageTitle } from './hooks/use-page-title.js';
|
|
28
|
+
export { useTheme } from './hooks/use-theme.js';
|
|
29
|
+
export { useConfirm, type ConfirmOptions, type ConfirmModalState } from './hooks/use-confirm.js';
|
|
30
|
+
export { useInfiniteScroll } from './hooks/use-infinite-scroll.js';
|
|
19
31
|
export { FormField } from './forms/form-field.js';
|
|
20
32
|
export { FormSelect } from './forms/form-select.js';
|
|
21
33
|
export { FormTextarea } from './forms/form-textarea.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,IAAI,EAAE,KAAK,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAA;AAG9D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,KAAK,EAAE,KAAK,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAClG,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAC5E,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AAGnE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAGhD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAG/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAA;AACrE,OAAO,EAAE,gBAAgB,EAAE,KAAK,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AAC3F,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAChG,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAGlE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -4,12 +4,16 @@ export { PageHeader } from './page-header.js';
|
|
|
4
4
|
export { Breadcrumbs } from './breadcrumbs.js';
|
|
5
5
|
export { DangerZone } from './danger-zone.js';
|
|
6
6
|
export { ContextMenu } from './context-menu.js';
|
|
7
|
+
export { Tabs } from './tabs.js';
|
|
7
8
|
// Feedback
|
|
8
9
|
export { LoadingSpinner } from './feedback/loading-spinner.js';
|
|
9
10
|
export { ErrorBox } from './feedback/error-box.js';
|
|
10
11
|
export { EmptyState } from './feedback/empty-state.js';
|
|
11
12
|
export { InfoAlert } from './feedback/info-alert.js';
|
|
12
13
|
export { ToastProvider, useToast } from './feedback/toast-provider.js';
|
|
14
|
+
export { AsyncState } from './feedback/async-state.js';
|
|
15
|
+
export { ConfirmModal } from './feedback/confirm-modal.js';
|
|
16
|
+
export { AppErrorBoundary } from './feedback/app-error-boundary.js';
|
|
13
17
|
// Data
|
|
14
18
|
export { StatCard } from './data/stat-card.js';
|
|
15
19
|
export { DataTable } from './data/data-table.js';
|
|
@@ -21,6 +25,14 @@ export { CopyButton } from './copy-button.js';
|
|
|
21
25
|
export { StatusBadge } from './status-badge.js';
|
|
22
26
|
// Hooks
|
|
23
27
|
export { useCopyToClipboard } from './hooks/use-copy-to-clipboard.js';
|
|
28
|
+
export { useMutationToast } from './hooks/use-mutation-toast.js';
|
|
29
|
+
export { useModalState, useItemModal } from './hooks/use-modal-state.js';
|
|
30
|
+
export { useDebouncedSearch } from './hooks/use-debounced-search.js';
|
|
31
|
+
export { usePersistedState } from './hooks/use-persisted-state.js';
|
|
32
|
+
export { usePageTitle } from './hooks/use-page-title.js';
|
|
33
|
+
export { useTheme } from './hooks/use-theme.js';
|
|
34
|
+
export { useConfirm } from './hooks/use-confirm.js';
|
|
35
|
+
export { useInfiniteScroll } from './hooks/use-infinite-scroll.js';
|
|
24
36
|
// Forms
|
|
25
37
|
export { FormField } from './forms/form-field.js';
|
|
26
38
|
export { FormSelect } from './forms/form-select.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,SAAS;AACT,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,SAAS;AACT,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,IAAI,EAAgC,MAAM,WAAW,CAAA;AAE9D,WAAW;AACX,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAA8B,MAAM,8BAA8B,CAAA;AAClG,OAAO,EAAE,UAAU,EAAwB,MAAM,2BAA2B,CAAA;AAC5E,OAAO,EAAE,YAAY,EAA0B,MAAM,6BAA6B,CAAA;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AAEnE,OAAO;AACP,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAEhD,UAAU;AACV,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,QAAQ;AACR,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAA;AACrE,OAAO,EAAE,gBAAgB,EAA6B,MAAM,+BAA+B,CAAA;AAC3F,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAA+C,MAAM,wBAAwB,CAAA;AAChG,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAElE,QAAQ;AACR,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA"}
|
package/dist/tabs.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export interface TabItem {
|
|
3
|
+
id: string;
|
|
4
|
+
label: ReactNode;
|
|
5
|
+
content: ReactNode;
|
|
6
|
+
}
|
|
7
|
+
export interface TabsProps {
|
|
8
|
+
tabs: TabItem[];
|
|
9
|
+
defaultTab?: string;
|
|
10
|
+
variant?: 'bordered' | 'lifted' | 'boxed';
|
|
11
|
+
size?: 'xs' | 'sm' | 'md' | 'lg';
|
|
12
|
+
className?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function Tabs({ tabs, defaultTab, variant, size, className }: TabsProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
//# sourceMappingURL=tabs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../src/tabs.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAA;AAEhD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,SAAS,CAAA;IAChB,OAAO,EAAE,SAAS,CAAA;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,OAAO,EAAE,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAA;IACzC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;IAChC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAoB,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,SAAS,2CAuB1F"}
|
package/dist/tabs.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
export function Tabs({ tabs, defaultTab, variant = 'bordered', size, className }) {
|
|
4
|
+
const [activeTab, setActiveTab] = useState(defaultTab ?? tabs[0]?.id ?? '');
|
|
5
|
+
const sizeClass = size ? `tabs-${size}` : '';
|
|
6
|
+
return (_jsxs("div", { className: className, children: [_jsx("div", { role: 'tablist', className: `tabs tabs-${variant} ${sizeClass}`, children: tabs.map((tab) => (_jsx("button", { type: 'button', role: 'tab', className: `tab ${activeTab === tab.id ? 'tab-active' : ''}`, onClick: () => setActiveTab(tab.id), children: tab.label }, tab.id))) }), tabs.find((t) => t.id === activeTab)?.content] }));
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=tabs.js.map
|
package/dist/tabs.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs.js","sourceRoot":"","sources":["../src/tabs.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAkB,QAAQ,EAAE,MAAM,OAAO,CAAA;AAgBhD,MAAM,UAAU,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,GAAG,UAAU,EAAE,IAAI,EAAE,SAAS,EAAa;IACzF,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IAE3E,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAE5C,OAAO,CACL,eAAK,SAAS,EAAE,SAAS,aACvB,cAAK,IAAI,EAAC,SAAS,EAAC,SAAS,EAAE,aAAa,OAAO,IAAI,SAAS,EAAE,YAC/D,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACjB,iBAEE,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,KAAK,EACV,SAAS,EAAE,OAAO,SAAS,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,EAC5D,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,YAElC,GAAG,CAAC,KAAK,IANL,GAAG,CAAC,EAAE,CAOJ,CACV,CAAC,GACE,EACL,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,OAAO,IAC1C,CACP,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** "Jan 5, 2025" */
|
|
2
|
+
export declare function formatDateShort(date: string | Date): string;
|
|
3
|
+
/** "January 5, 2025" */
|
|
4
|
+
export declare function formatDateLong(date: string | Date): string;
|
|
5
|
+
/** "Jan 5, 2025, 14:30" */
|
|
6
|
+
export declare function formatDateTime(date: string | Date): string;
|
|
7
|
+
/** "14:30" */
|
|
8
|
+
export declare function formatTime(date: string | Date): string;
|
|
9
|
+
/** "2 hours ago" */
|
|
10
|
+
export declare function formatRelativeTime(date: string | Date): string;
|
|
11
|
+
/** "2 hours" */
|
|
12
|
+
export declare function formatTimeBetween(dateLeft: string | Date, dateRight: string | Date): string;
|
|
13
|
+
/** "2025-01-05" */
|
|
14
|
+
export declare function formatDateForInput(date: string | Date): string;
|
|
15
|
+
/** "2025-01-05T14:30" */
|
|
16
|
+
export declare function formatDateTimeForInput(date: string | Date): string;
|
|
17
|
+
/** "Jan 5, 2025, 14:30:45" */
|
|
18
|
+
export declare function formatFullTimestamp(date: string | Date): string;
|
|
19
|
+
/** "01/05/25 14:30" */
|
|
20
|
+
export declare function formatCompactTimestamp(date: string | Date): string;
|
|
21
|
+
/** "Jan 5" */
|
|
22
|
+
export declare function formatMonthDay(date: string | Date): string;
|
|
23
|
+
/** "Jan 5 - Jan 12, 2025" (collapses year when same) */
|
|
24
|
+
export declare function formatDateRange(start: string | Date, end: string | Date): string;
|
|
25
|
+
/** "Friday, January 3, 2025" */
|
|
26
|
+
export declare function formatWeekdayLong(date: string | Date): string;
|
|
27
|
+
/** "14:30:05" */
|
|
28
|
+
export declare function formatTimeWithSeconds(date: string | Date): string;
|
|
29
|
+
/** 1.5 -> "1h 30m", 0.5 -> "30m", 6 -> "6h" */
|
|
30
|
+
export declare function formatDuration(hours: number): string;
|
|
31
|
+
//# sourceMappingURL=date-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-utils.d.ts","sourceRoot":"","sources":["../../src/utils/date-utils.ts"],"names":[],"mappings":"AAMA,oBAAoB;AACpB,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE3D;AAED,wBAAwB;AACxB,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE1D;AAED,2BAA2B;AAC3B,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE1D;AAED,cAAc;AACd,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAEtD;AAED,oBAAoB;AACpB,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE9D;AAED,gBAAgB;AAChB,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE3F;AAED,mBAAmB;AACnB,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE9D;AAED,yBAAyB;AACzB,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAElE;AAED,8BAA8B;AAC9B,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE/D;AAED,uBAAuB;AACvB,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAElE;AAED,cAAc;AACd,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE1D;AAED,wDAAwD;AACxD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAMhF;AAED,gCAAgC;AAChC,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE7D;AAED,iBAAiB;AACjB,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAEjE;AAED,+CAA+C;AAC/C,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOpD"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { format, formatDistance, formatDistanceToNow, parseISO } from 'date-fns';
|
|
2
|
+
function toDate(date) {
|
|
3
|
+
return typeof date === 'string' ? parseISO(date) : date;
|
|
4
|
+
}
|
|
5
|
+
/** "Jan 5, 2025" */
|
|
6
|
+
export function formatDateShort(date) {
|
|
7
|
+
return format(toDate(date), 'MMM d, yyyy');
|
|
8
|
+
}
|
|
9
|
+
/** "January 5, 2025" */
|
|
10
|
+
export function formatDateLong(date) {
|
|
11
|
+
return format(toDate(date), 'MMMM d, yyyy');
|
|
12
|
+
}
|
|
13
|
+
/** "Jan 5, 2025, 14:30" */
|
|
14
|
+
export function formatDateTime(date) {
|
|
15
|
+
return format(toDate(date), 'MMM d, yyyy, HH:mm');
|
|
16
|
+
}
|
|
17
|
+
/** "14:30" */
|
|
18
|
+
export function formatTime(date) {
|
|
19
|
+
return format(toDate(date), 'HH:mm');
|
|
20
|
+
}
|
|
21
|
+
/** "2 hours ago" */
|
|
22
|
+
export function formatRelativeTime(date) {
|
|
23
|
+
return formatDistanceToNow(toDate(date), { addSuffix: true });
|
|
24
|
+
}
|
|
25
|
+
/** "2 hours" */
|
|
26
|
+
export function formatTimeBetween(dateLeft, dateRight) {
|
|
27
|
+
return formatDistance(toDate(dateLeft), toDate(dateRight));
|
|
28
|
+
}
|
|
29
|
+
/** "2025-01-05" */
|
|
30
|
+
export function formatDateForInput(date) {
|
|
31
|
+
return format(toDate(date), 'yyyy-MM-dd');
|
|
32
|
+
}
|
|
33
|
+
/** "2025-01-05T14:30" */
|
|
34
|
+
export function formatDateTimeForInput(date) {
|
|
35
|
+
return format(toDate(date), "yyyy-MM-dd'T'HH:mm");
|
|
36
|
+
}
|
|
37
|
+
/** "Jan 5, 2025, 14:30:45" */
|
|
38
|
+
export function formatFullTimestamp(date) {
|
|
39
|
+
return format(toDate(date), 'MMM d, yyyy, HH:mm:ss');
|
|
40
|
+
}
|
|
41
|
+
/** "01/05/25 14:30" */
|
|
42
|
+
export function formatCompactTimestamp(date) {
|
|
43
|
+
return format(toDate(date), 'MM/dd/yy HH:mm');
|
|
44
|
+
}
|
|
45
|
+
/** "Jan 5" */
|
|
46
|
+
export function formatMonthDay(date) {
|
|
47
|
+
return format(toDate(date), 'MMM d');
|
|
48
|
+
}
|
|
49
|
+
/** "Jan 5 - Jan 12, 2025" (collapses year when same) */
|
|
50
|
+
export function formatDateRange(start, end) {
|
|
51
|
+
const s = toDate(start);
|
|
52
|
+
const e = toDate(end);
|
|
53
|
+
if (s.getTime() === e.getTime())
|
|
54
|
+
return format(e, 'MMM d, yyyy');
|
|
55
|
+
if (s.getFullYear() === e.getFullYear())
|
|
56
|
+
return `${format(s, 'MMM d')} - ${format(e, 'MMM d, yyyy')}`;
|
|
57
|
+
return `${format(s, 'MMM d, yyyy')} - ${format(e, 'MMM d, yyyy')}`;
|
|
58
|
+
}
|
|
59
|
+
/** "Friday, January 3, 2025" */
|
|
60
|
+
export function formatWeekdayLong(date) {
|
|
61
|
+
return format(toDate(date), 'EEEE, MMMM d, yyyy');
|
|
62
|
+
}
|
|
63
|
+
/** "14:30:05" */
|
|
64
|
+
export function formatTimeWithSeconds(date) {
|
|
65
|
+
return format(toDate(date), 'HH:mm:ss');
|
|
66
|
+
}
|
|
67
|
+
/** 1.5 -> "1h 30m", 0.5 -> "30m", 6 -> "6h" */
|
|
68
|
+
export function formatDuration(hours) {
|
|
69
|
+
const totalMinutes = Math.round(hours * 60);
|
|
70
|
+
const h = Math.floor(totalMinutes / 60);
|
|
71
|
+
const m = totalMinutes % 60;
|
|
72
|
+
if (h === 0)
|
|
73
|
+
return `${m}m`;
|
|
74
|
+
if (m === 0)
|
|
75
|
+
return `${h}h`;
|
|
76
|
+
return `${h}h ${m}m`;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=date-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-utils.js","sourceRoot":"","sources":["../../src/utils/date-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { formatDateShort, formatDateLong, formatDateTime, formatTime, formatRelativeTime, formatTimeBetween, formatDateForInput, formatDateTimeForInput, formatFullTimestamp, formatCompactTimestamp, formatMonthDay, formatDateRange, formatWeekdayLong, formatTimeWithSeconds, formatDuration, } from './date-utils.js';
|
|
2
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,cAAc,EACd,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,sBAAsB,EACtB,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,GACf,MAAM,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { formatDateShort, formatDateLong, formatDateTime, formatTime, formatRelativeTime, formatTimeBetween, formatDateForInput, formatDateTimeForInput, formatFullTimestamp, formatCompactTimestamp, formatMonthDay, formatDateRange, formatWeekdayLong, formatTimeWithSeconds, formatDuration, } from './date-utils.js';
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,cAAc,EACd,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,sBAAsB,EACtB,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,GACf,MAAM,iBAAiB,CAAA"}
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"type": "git",
|
|
5
5
|
"url": "https://github.com/blaze-it/ui"
|
|
6
6
|
},
|
|
7
|
-
"version": "0.
|
|
7
|
+
"version": "0.5.0",
|
|
8
8
|
"private": false,
|
|
9
9
|
"description": "Shared React + DaisyUI component library for Blaze projects",
|
|
10
10
|
"type": "module",
|
|
@@ -28,6 +28,10 @@
|
|
|
28
28
|
"./hooks": {
|
|
29
29
|
"types": "./dist/hooks/index.d.ts",
|
|
30
30
|
"default": "./dist/hooks/index.js"
|
|
31
|
+
},
|
|
32
|
+
"./utils": {
|
|
33
|
+
"types": "./dist/utils/index.d.ts",
|
|
34
|
+
"default": "./dist/utils/index.js"
|
|
31
35
|
}
|
|
32
36
|
},
|
|
33
37
|
"types": "./dist/index.d.ts",
|
|
@@ -38,11 +42,24 @@
|
|
|
38
42
|
"react": ">=18.0.0",
|
|
39
43
|
"react-dom": ">=18.0.0",
|
|
40
44
|
"@tanstack/react-table": ">=8.0.0",
|
|
41
|
-
"react-hook-form": ">=7.0.0"
|
|
45
|
+
"react-hook-form": ">=7.0.0",
|
|
46
|
+
"date-fns": ">=3.0.0"
|
|
47
|
+
},
|
|
48
|
+
"peerDependenciesMeta": {
|
|
49
|
+
"@tanstack/react-table": {
|
|
50
|
+
"optional": true
|
|
51
|
+
},
|
|
52
|
+
"react-hook-form": {
|
|
53
|
+
"optional": true
|
|
54
|
+
},
|
|
55
|
+
"date-fns": {
|
|
56
|
+
"optional": true
|
|
57
|
+
}
|
|
42
58
|
},
|
|
43
59
|
"devDependencies": {
|
|
44
60
|
"@tanstack/react-table": "^8.21.0",
|
|
45
61
|
"@types/react": "^19.0.0",
|
|
62
|
+
"date-fns": "^4.0.0",
|
|
46
63
|
"react": "^19.0.0",
|
|
47
64
|
"react-dom": "^19.0.0",
|
|
48
65
|
"react-hook-form": "^7.54.0",
|