@prenta/admin 1.16.0 → 1.17.1
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/CHANGELOG.md +18 -0
- package/dist/__tests__/components/faq-proposal-preview.render.test.d.ts +2 -0
- package/dist/__tests__/components/faq-proposal-preview.render.test.d.ts.map +1 -0
- package/dist/__tests__/components/faq-proposal-preview.render.test.js +97 -0
- package/dist/__tests__/components/faq-proposal-preview.render.test.js.map +1 -0
- package/dist/__tests__/components/seo-issue-fix-panel.render.test.js +37 -11
- package/dist/__tests__/components/seo-issue-fix-panel.render.test.js.map +1 -1
- package/dist/__tests__/lib/seo-service-errors.test.js +5 -6
- package/dist/__tests__/lib/seo-service-errors.test.js.map +1 -1
- package/dist/__tests__/lib/seo-service-proposals.test.js +24 -0
- package/dist/__tests__/lib/seo-service-proposals.test.js.map +1 -1
- package/dist/__tests__/views/seo-proposals-tab.render.test.js +277 -0
- package/dist/__tests__/views/seo-proposals-tab.render.test.js.map +1 -1
- package/dist/components/seo/FaqProposalPreview.d.ts +39 -0
- package/dist/components/seo/FaqProposalPreview.d.ts.map +1 -0
- package/dist/components/seo/FaqProposalPreview.js +62 -0
- package/dist/components/seo/FaqProposalPreview.js.map +1 -0
- package/dist/components/seo/SeoIssueFixPanel.d.ts.map +1 -1
- package/dist/components/seo/SeoIssueFixPanel.js +7 -2
- package/dist/components/seo/SeoIssueFixPanel.js.map +1 -1
- package/dist/lib/seo-service.d.ts +61 -7
- package/dist/lib/seo-service.d.ts.map +1 -1
- package/dist/lib/seo-service.js +9 -13
- package/dist/lib/seo-service.js.map +1 -1
- package/dist/prenta-admin.css +1 -1
- package/dist/views/seo/ProposalsTab.d.ts.map +1 -1
- package/dist/views/seo/ProposalsTab.js +160 -7
- package/dist/views/seo/ProposalsTab.js.map +1 -1
- package/dist/views/settings/SeoAutopilotCard.d.ts.map +1 -1
- package/dist/views/settings/SeoAutopilotCard.js +6 -0
- package/dist/views/settings/SeoAutopilotCard.js.map +1 -1
- package/package.json +5 -5
- package/src/__tests__/components/faq-proposal-preview.render.test.tsx +137 -0
- package/src/__tests__/components/seo-issue-fix-panel.render.test.tsx +42 -11
- package/src/__tests__/lib/seo-service-errors.test.ts +5 -9
- package/src/__tests__/lib/seo-service-proposals.test.ts +30 -0
- package/src/__tests__/views/seo-proposals-tab.render.test.tsx +358 -0
- package/src/components/seo/FaqProposalPreview.tsx +134 -0
- package/src/components/seo/SeoIssueFixPanel.tsx +7 -2
- package/src/lib/seo-service.ts +57 -15
- package/src/views/seo/ProposalsTab.tsx +279 -13
- package/src/views/settings/SeoAutopilotCard.tsx +6 -0
- package/dist/components/ContentOverviewChart.d.ts +0 -8
- package/dist/components/ContentOverviewChart.d.ts.map +0 -1
- package/dist/components/ContentOverviewChart.js +0 -20
- package/dist/components/ContentOverviewChart.js.map +0 -1
- package/dist/components/SEOPerformance.d.ts +0 -5
- package/dist/components/SEOPerformance.d.ts.map +0 -1
- package/dist/components/SEOPerformance.js +0 -29
- package/dist/components/SEOPerformance.js.map +0 -1
- package/dist/components/ui/Avatar.d.ts +0 -9
- package/dist/components/ui/Avatar.d.ts.map +0 -1
- package/dist/components/ui/Avatar.js +0 -21
- package/dist/components/ui/Avatar.js.map +0 -1
- package/dist/components/ui/CommandPalette.d.ts +0 -14
- package/dist/components/ui/CommandPalette.d.ts.map +0 -1
- package/dist/components/ui/CommandPalette.js +0 -58
- package/dist/components/ui/CommandPalette.js.map +0 -1
- package/dist/components/ui/DataTable.d.ts +0 -30
- package/dist/components/ui/DataTable.d.ts.map +0 -1
- package/dist/components/ui/DataTable.js +0 -44
- package/dist/components/ui/DataTable.js.map +0 -1
- package/dist/components/ui/Pagination.d.ts +0 -9
- package/dist/components/ui/Pagination.d.ts.map +0 -1
- package/dist/components/ui/Pagination.js +0 -26
- package/dist/components/ui/Pagination.js.map +0 -1
- package/dist/components/ui/Select.d.ts +0 -16
- package/dist/components/ui/Select.d.ts.map +0 -1
- package/dist/components/ui/Select.js +0 -24
- package/dist/components/ui/Select.js.map +0 -1
- package/dist/components/ui/Toast.d.ts +0 -18
- package/dist/components/ui/Toast.d.ts.map +0 -1
- package/dist/components/ui/Toast.js +0 -29
- package/dist/components/ui/Toast.js.map +0 -1
- package/dist/components/ui/index.d.ts +0 -46
- package/dist/components/ui/index.d.ts.map +0 -1
- package/dist/components/ui/index.js +0 -24
- package/dist/components/ui/index.js.map +0 -1
- package/dist/hooks/useContentLock.d.ts +0 -12
- package/dist/hooks/useContentLock.d.ts.map +0 -1
- package/dist/hooks/useContentLock.js +0 -38
- package/dist/hooks/useContentLock.js.map +0 -1
- package/dist/hooks/useDebounce.d.ts +0 -2
- package/dist/hooks/useDebounce.d.ts.map +0 -1
- package/dist/hooks/useDebounce.js +0 -11
- package/dist/hooks/useDebounce.js.map +0 -1
- package/src/components/ContentOverviewChart.tsx +0 -75
- package/src/components/SEOPerformance.tsx +0 -163
- package/src/components/ui/Avatar.tsx +0 -42
- package/src/components/ui/CommandPalette.tsx +0 -133
- package/src/components/ui/DataTable.tsx +0 -204
- package/src/components/ui/Pagination.tsx +0 -94
- package/src/components/ui/Select.tsx +0 -53
- package/src/components/ui/Toast.tsx +0 -72
- package/src/components/ui/index.ts +0 -61
- package/src/hooks/useContentLock.ts +0 -55
- package/src/hooks/useDebounce.ts +0 -14
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Avatar.js","sourceRoot":"","sources":["../../../src/components/ui/Avatar.tsx"],"names":[],"mappings":";AAQA,MAAM,WAAW,GAA+B;IAC9C,EAAE,EAAE,qBAAqB;IACzB,EAAE,EAAE,iBAAiB;IACrB,EAAE,EAAE,mBAAmB;CACxB,CAAA;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,IAAI;SACR,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;SAC7B,IAAI,CAAC,EAAE,CAAC;SACR,WAAW,EAAE;SACb,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,GAAG,IAAI,EAAe;IACjE,IAAI,GAAG,EAAE,CAAC;QACR,OAAO,CACL,cACE,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,IAAI,EACT,SAAS,EAAE,mDAAmD,WAAW,CAAC,IAAI,CAAC,EAAE,GACjF,CACH,CAAA;IACH,CAAC;IAED,OAAO,CACL,eACE,SAAS,EAAE,kIAAkI,WAAW,CAAC,IAAI,CAAC,EAAE,YAE/J,WAAW,CAAC,IAAI,CAAC,IAAI,GAAG,GACpB,CACR,CAAA;AACH,CAAC"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
interface CommandItem {
|
|
2
|
-
id: string;
|
|
3
|
-
label: string;
|
|
4
|
-
group: string;
|
|
5
|
-
onSelect: () => void;
|
|
6
|
-
}
|
|
7
|
-
export interface CommandPaletteProps {
|
|
8
|
-
open: boolean;
|
|
9
|
-
onClose: () => void;
|
|
10
|
-
items: CommandItem[];
|
|
11
|
-
}
|
|
12
|
-
export declare function CommandPalette({ open, onClose, items }: CommandPaletteProps): import("react/jsx-runtime").JSX.Element | null;
|
|
13
|
-
export {};
|
|
14
|
-
//# sourceMappingURL=CommandPalette.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CommandPalette.d.ts","sourceRoot":"","sources":["../../../src/components/ui/CommandPalette.tsx"],"names":[],"mappings":"AAIA,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,IAAI,CAAA;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,KAAK,EAAE,WAAW,EAAE,CAAA;CACrB;AAED,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,mBAAmB,kDAmH3E"}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { useState, useEffect, useRef } from 'react';
|
|
4
|
-
export function CommandPalette({ open, onClose, items }) {
|
|
5
|
-
const [query, setQuery] = useState('');
|
|
6
|
-
const [activeIndex, setActiveIndex] = useState(0);
|
|
7
|
-
const inputRef = useRef(null);
|
|
8
|
-
const filtered = items.filter((item) => item.label.toLowerCase().includes(query.toLowerCase()));
|
|
9
|
-
const groups = Array.from(new Set(filtered.map((i) => i.group)));
|
|
10
|
-
useEffect(() => {
|
|
11
|
-
if (open) {
|
|
12
|
-
setQuery('');
|
|
13
|
-
setActiveIndex(0);
|
|
14
|
-
requestAnimationFrame(() => inputRef.current?.focus());
|
|
15
|
-
}
|
|
16
|
-
}, [open]);
|
|
17
|
-
useEffect(() => {
|
|
18
|
-
if (!open)
|
|
19
|
-
return;
|
|
20
|
-
function handleKey(e) {
|
|
21
|
-
if (e.key === 'Escape') {
|
|
22
|
-
onClose();
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
if (e.key === 'ArrowDown') {
|
|
26
|
-
e.preventDefault();
|
|
27
|
-
setActiveIndex((i) => Math.min(i + 1, filtered.length - 1));
|
|
28
|
-
}
|
|
29
|
-
if (e.key === 'ArrowUp') {
|
|
30
|
-
e.preventDefault();
|
|
31
|
-
setActiveIndex((i) => Math.max(i - 1, 0));
|
|
32
|
-
}
|
|
33
|
-
if (e.key === 'Enter' && filtered[activeIndex]) {
|
|
34
|
-
filtered[activeIndex].onSelect();
|
|
35
|
-
onClose();
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
document.addEventListener('keydown', handleKey);
|
|
39
|
-
return () => document.removeEventListener('keydown', handleKey);
|
|
40
|
-
}, [open, onClose, filtered, activeIndex]);
|
|
41
|
-
if (!open)
|
|
42
|
-
return null;
|
|
43
|
-
let flatIndex = -1;
|
|
44
|
-
return (_jsxs("div", { className: "fixed inset-0 z-[70] flex items-start justify-center pt-[20vh]", children: [_jsx("div", { className: "fixed inset-0 bg-black/50", onClick: onClose, role: "presentation" }), _jsxs("div", { className: "relative z-10 w-full max-w-lg overflow-hidden rounded-lg border border-[var(--border)] bg-[var(--popover)] shadow-2xl", children: [_jsxs("div", { className: "flex items-center border-b border-[var(--border)] px-4", children: [_jsx("svg", { className: "mr-2 h-4 w-4 text-[var(--muted-foreground)]", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" }) }), _jsx("input", { ref: inputRef, type: "text", value: query, onChange: (e) => {
|
|
45
|
-
setQuery(e.target.value);
|
|
46
|
-
setActiveIndex(0);
|
|
47
|
-
}, placeholder: "Type a command or search...", className: "flex-1 bg-transparent py-3 text-sm outline-none" })] }), _jsxs("div", { className: "max-h-72 overflow-y-auto py-2", children: [groups.map((group) => (_jsxs("div", { children: [_jsx("div", { className: "px-4 py-1.5 text-xs font-medium text-[var(--muted-foreground)]", children: group }), filtered
|
|
48
|
-
.filter((i) => i.group === group)
|
|
49
|
-
.map((item) => {
|
|
50
|
-
flatIndex++;
|
|
51
|
-
const idx = flatIndex;
|
|
52
|
-
return (_jsx("button", { onClick: () => {
|
|
53
|
-
item.onSelect();
|
|
54
|
-
onClose();
|
|
55
|
-
}, className: `flex w-full px-4 py-2 text-sm ${idx === activeIndex ? 'bg-[var(--accent)]' : ''}`, children: item.label }, item.id));
|
|
56
|
-
})] }, group))), filtered.length === 0 && (_jsx("p", { className: "px-4 py-6 text-center text-sm text-[var(--muted-foreground)]", children: "No results found." }))] })] })] }));
|
|
57
|
-
}
|
|
58
|
-
//# sourceMappingURL=CommandPalette.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CommandPalette.js","sourceRoot":"","sources":["../../../src/components/ui/CommandPalette.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
interface Column {
|
|
2
|
-
key: string;
|
|
3
|
-
label: string;
|
|
4
|
-
sortable?: boolean;
|
|
5
|
-
}
|
|
6
|
-
interface Row {
|
|
7
|
-
id: string;
|
|
8
|
-
[key: string]: any;
|
|
9
|
-
}
|
|
10
|
-
export interface RowAction {
|
|
11
|
-
key: string;
|
|
12
|
-
label: string;
|
|
13
|
-
icon?: React.ReactNode;
|
|
14
|
-
destructive?: boolean;
|
|
15
|
-
onClick: (row: Row) => void;
|
|
16
|
-
}
|
|
17
|
-
export interface DataTableProps {
|
|
18
|
-
columns: Column[];
|
|
19
|
-
rows: Row[];
|
|
20
|
-
selectedIds: string[];
|
|
21
|
-
onSelectionChange: (ids: string[]) => void;
|
|
22
|
-
sortField?: string;
|
|
23
|
-
sortDir?: 'asc' | 'desc';
|
|
24
|
-
onSort?: (field: string) => void;
|
|
25
|
-
rowActions?: RowAction[];
|
|
26
|
-
onRowClick?: (row: Row) => void;
|
|
27
|
-
}
|
|
28
|
-
export declare function DataTable({ columns, rows, selectedIds, onSelectionChange, sortField, sortDir, onSort, rowActions, onRowClick, }: DataTableProps): import("react/jsx-runtime").JSX.Element;
|
|
29
|
-
export {};
|
|
30
|
-
//# sourceMappingURL=DataTable.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../src/components/ui/DataTable.tsx"],"names":[],"mappings":"AAIA,UAAU,MAAM;IACd,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,UAAU,GAAG;IACX,EAAE,EAAE,MAAM,CAAA;IACV,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAA;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,IAAI,EAAE,GAAG,EAAE,CAAA;IACX,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,iBAAiB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;IACxB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,UAAU,CAAC,EAAE,SAAS,EAAE,CAAA;IACxB,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAA;CAChC;AAED,wBAAgB,SAAS,CAAC,EACxB,OAAO,EACP,IAAI,EACJ,WAAW,EACX,iBAAiB,EACjB,SAAS,EACT,OAAO,EACP,MAAM,EACN,UAAU,EACV,UAAU,GACX,EAAE,cAAc,2CA0FhB"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { useState, useRef, useEffect } from 'react';
|
|
4
|
-
export function DataTable({ columns, rows, selectedIds, onSelectionChange, sortField, sortDir, onSort, rowActions, onRowClick, }) {
|
|
5
|
-
const allSelected = rows.length > 0 && selectedIds.length === rows.length;
|
|
6
|
-
function toggleAll() {
|
|
7
|
-
onSelectionChange(allSelected ? [] : rows.map((r) => r.id));
|
|
8
|
-
}
|
|
9
|
-
function toggleRow(id) {
|
|
10
|
-
onSelectionChange(selectedIds.includes(id) ? selectedIds.filter((s) => s !== id) : [...selectedIds, id]);
|
|
11
|
-
}
|
|
12
|
-
return (_jsx("div", { className: "overflow-x-auto rounded-lg border border-[var(--border)]", children: _jsxs("table", { className: "w-full text-left text-sm", children: [_jsx("thead", { className: "bg-muted border-b border-[var(--border)]", children: _jsxs("tr", { children: [_jsx("th", { className: "w-10 px-4 py-3", children: _jsx("input", { type: "checkbox", checked: allSelected, onChange: toggleAll, className: "rounded border-[var(--border)]" }) }), columns.map((col) => (_jsx("th", { className: "px-4 py-3 font-medium", "aria-sort": col.sortable && onSort
|
|
13
|
-
? sortField === col.key
|
|
14
|
-
? sortDir === 'asc'
|
|
15
|
-
? 'ascending'
|
|
16
|
-
: 'descending'
|
|
17
|
-
: 'none'
|
|
18
|
-
: undefined, children: col.sortable && onSort ? (_jsxs("button", { onClick: () => onSort(col.key), className: "inline-flex items-center gap-1 hover:text-[var(--foreground)]", children: [col.label, sortField === col.key && (_jsx("span", { className: "text-xs", children: sortDir === 'asc' ? '↑' : '↓' }))] })) : (col.label) }, col.key))), rowActions && rowActions.length > 0 && _jsx("th", { className: "w-20 px-4 py-3" })] }) }), _jsx("tbody", { className: "divide-y divide-[var(--border)]", children: rows.map((row) => (_jsxs("tr", { className: `hover:bg-[var(--accent)] ${selectedIds.includes(row.id) ? 'bg-[var(--accent)]' : ''}`, onClick: () => onRowClick?.(row), style: onRowClick ? { cursor: 'pointer' } : undefined, children: [_jsx("td", { className: "px-4 py-3", onClick: (e) => e.stopPropagation(), children: _jsx("input", { type: "checkbox", checked: selectedIds.includes(row.id), onChange: () => toggleRow(row.id), className: "rounded border-[var(--border)]" }) }), columns.map((col) => (_jsx("td", { className: "px-4 py-3", children: row[col.key] }, col.key))), rowActions && rowActions.length > 0 && (_jsx("td", { className: "px-4 py-3", onClick: (e) => e.stopPropagation(), children: _jsx(RowActionsMenu, { actions: rowActions, row: row }) }))] }, row.id))) })] }) }));
|
|
19
|
-
}
|
|
20
|
-
function RowActionsMenu({ actions, row }) {
|
|
21
|
-
const [open, setOpen] = useState(false);
|
|
22
|
-
const ref = useRef(null);
|
|
23
|
-
useEffect(() => {
|
|
24
|
-
if (!open)
|
|
25
|
-
return;
|
|
26
|
-
function handleClickOutside(e) {
|
|
27
|
-
if (ref.current && !ref.current.contains(e.target)) {
|
|
28
|
-
setOpen(false);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
document.addEventListener('mousedown', handleClickOutside);
|
|
32
|
-
return () => document.removeEventListener('mousedown', handleClickOutside);
|
|
33
|
-
}, [open]);
|
|
34
|
-
return (_jsxs("div", { className: "relative flex items-center justify-end gap-1", ref: ref, children: [actions
|
|
35
|
-
.filter((a) => a.icon)
|
|
36
|
-
.map((action) => (_jsx("button", { onClick: () => action.onClick(row), className: "hover:bg-muted rounded p-1 text-[var(--muted-foreground)] hover:text-[var(--foreground)]", "aria-label": action.label, title: action.label, children: action.icon }, action.key))), _jsx("button", { onClick: () => setOpen((o) => !o), className: "hover:bg-muted rounded p-1", "aria-label": "More actions", children: _jsx(MoreVerticalIcon, {}) }), open && (_jsx("div", { className: "absolute top-full right-0 z-50 mt-1 w-40 rounded-md border border-[var(--border)] bg-[var(--popover)] py-1 shadow-lg", children: actions.map((action) => (_jsxs("button", { className: `flex w-full items-center gap-2 px-3 py-1.5 text-sm hover:bg-[var(--accent)] ${action.destructive ? 'text-[var(--destructive)]' : ''}`, onClick: () => {
|
|
37
|
-
action.onClick(row);
|
|
38
|
-
setOpen(false);
|
|
39
|
-
}, children: [action.icon && _jsx("span", { className: "h-4 w-4", children: action.icon }), action.label] }, action.key))) }))] }));
|
|
40
|
-
}
|
|
41
|
-
function MoreVerticalIcon() {
|
|
42
|
-
return (_jsx("svg", { className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 5v.01M12 12v.01M12 19v.01" }) }));
|
|
43
|
-
}
|
|
44
|
-
//# sourceMappingURL=DataTable.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DataTable.js","sourceRoot":"","sources":["../../../src/components/ui/DataTable.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAiCnD,MAAM,UAAU,SAAS,CAAC,EACxB,OAAO,EACP,IAAI,EACJ,WAAW,EACX,iBAAiB,EACjB,SAAS,EACT,OAAO,EACP,MAAM,EACN,UAAU,EACV,UAAU,GACK;IACf,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAA;IAEzE,SAAS,SAAS;QAChB,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC7D,CAAC;IAED,SAAS,SAAS,CAAC,EAAU;QAC3B,iBAAiB,CACf,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,EAAE,EAAE,CAAC,CACtF,CAAA;IACH,CAAC;IAED,OAAO,CACL,cAAK,SAAS,EAAC,0DAA0D,YACvE,iBAAO,SAAS,EAAC,0BAA0B,aACzC,gBAAO,SAAS,EAAC,0CAA0C,YACzD,yBACE,aAAI,SAAS,EAAC,gBAAgB,YAC5B,gBACE,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,SAAS,EACnB,SAAS,EAAC,gCAAgC,GAC1C,GACC,EACJ,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACpB,aAEE,SAAS,EAAC,uBAAuB,eAE/B,GAAG,CAAC,QAAQ,IAAI,MAAM;oCACpB,CAAC,CAAC,SAAS,KAAK,GAAG,CAAC,GAAG;wCACrB,CAAC,CAAC,OAAO,KAAK,KAAK;4CACjB,CAAC,CAAC,WAAW;4CACb,CAAC,CAAC,YAAY;wCAChB,CAAC,CAAC,MAAM;oCACV,CAAC,CAAC,SAAS,YAGd,GAAG,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC,CACxB,kBACE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAC9B,SAAS,EAAC,+DAA+D,aAExE,GAAG,CAAC,KAAK,EACT,SAAS,KAAK,GAAG,CAAC,GAAG,IAAI,CACxB,eAAM,SAAS,EAAC,SAAS,YAAE,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAQ,CACjE,IACM,CACV,CAAC,CAAC,CAAC,CACF,GAAG,CAAC,KAAK,CACV,IAxBI,GAAG,CAAC,GAAG,CAyBT,CACN,CAAC,EACD,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,aAAI,SAAS,EAAC,gBAAgB,GAAG,IACtE,GACC,EACR,gBAAO,SAAS,EAAC,iCAAiC,YAC/C,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACjB,cAEE,SAAS,EAAE,4BAA4B,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,EAAE,EACjG,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,EAChC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,aAErD,aAAI,SAAS,EAAC,WAAW,EAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,YAC3D,gBACE,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EACrC,QAAQ,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EACjC,SAAS,EAAC,gCAAgC,GAC1C,GACC,EACJ,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACpB,aAAkB,SAAS,EAAC,WAAW,YACpC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IADN,GAAG,CAAC,GAAG,CAEX,CACN,CAAC,EACD,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CACtC,aAAI,SAAS,EAAC,WAAW,EAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,YAC3D,KAAC,cAAc,IAAC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,GAAI,GAC9C,CACN,KAtBI,GAAG,CAAC,EAAE,CAuBR,CACN,CAAC,GACI,IACF,GACJ,CACP,CAAA;AACH,CAAC;AAED,SAAS,cAAc,CAAC,EAAE,OAAO,EAAE,GAAG,EAAsC;IAC1E,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACvC,MAAM,GAAG,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAA;IAExC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI;YAAE,OAAM;QACjB,SAAS,kBAAkB,CAAC,CAAa;YACvC,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAc,CAAC,EAAE,CAAC;gBAC3D,OAAO,CAAC,KAAK,CAAC,CAAA;YAChB,CAAC;QACH,CAAC;QACD,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAA;QAC1D,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAA;IAC5E,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IAEV,OAAO,CACL,eAAK,SAAS,EAAC,8CAA8C,EAAC,GAAG,EAAE,GAAG,aACnE,OAAO;iBACL,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;iBACrB,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CACf,iBAEE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAClC,SAAS,EAAC,0FAA0F,gBACxF,MAAM,CAAC,KAAK,EACxB,KAAK,EAAE,MAAM,CAAC,KAAK,YAElB,MAAM,CAAC,IAAI,IANP,MAAM,CAAC,GAAG,CAOR,CACV,CAAC,EACJ,iBACE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EACjC,SAAS,EAAC,4BAA4B,gBAC3B,cAAc,YAEzB,KAAC,gBAAgB,KAAG,GACb,EACR,IAAI,IAAI,CACP,cAAK,SAAS,EAAC,sHAAsH,YAClI,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CACvB,kBAEE,SAAS,EAAE,+EACT,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,EACrD,EAAE,EACF,OAAO,EAAE,GAAG,EAAE;wBACZ,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;wBACnB,OAAO,CAAC,KAAK,CAAC,CAAA;oBAChB,CAAC,aAEA,MAAM,CAAC,IAAI,IAAI,eAAM,SAAS,EAAC,SAAS,YAAE,MAAM,CAAC,IAAI,GAAQ,EAC7D,MAAM,CAAC,KAAK,KAVR,MAAM,CAAC,GAAG,CAWR,CACV,CAAC,GACE,CACP,IACG,CACP,CAAA;AACH,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO,CACL,cAAK,SAAS,EAAC,SAAS,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAE,CAAC,YAC3F,eAAM,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,CAAC,EAAC,+BAA+B,GAAG,GACnF,CACP,CAAA;AACH,CAAC"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export interface PaginationProps {
|
|
2
|
-
page: number;
|
|
3
|
-
perPage: number;
|
|
4
|
-
total: number;
|
|
5
|
-
onPageChange: (page: number) => void;
|
|
6
|
-
onPerPageChange: (perPage: number) => void;
|
|
7
|
-
}
|
|
8
|
-
export declare function Pagination({ page, perPage, total, onPageChange, onPerPageChange, }: PaginationProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
-
//# sourceMappingURL=Pagination.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Pagination.d.ts","sourceRoot":"","sources":["../../../src/components/ui/Pagination.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAC3C;AAED,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,OAAO,EACP,KAAK,EACL,YAAY,EACZ,eAAe,GAChB,EAAE,eAAe,2CA6EjB"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
-
export function Pagination({ page, perPage, total, onPageChange, onPerPageChange, }) {
|
|
4
|
-
const totalPages = Math.max(1, Math.ceil(total / perPage));
|
|
5
|
-
const start = (page - 1) * perPage + 1;
|
|
6
|
-
const end = Math.min(page * perPage, total);
|
|
7
|
-
function pageNumbers() {
|
|
8
|
-
const pages = [];
|
|
9
|
-
for (let i = 1; i <= totalPages; i++) {
|
|
10
|
-
if (i === 1 || i === totalPages || Math.abs(i - page) <= 1) {
|
|
11
|
-
pages.push(i);
|
|
12
|
-
}
|
|
13
|
-
else if (pages[pages.length - 1] !== 'ellipsis') {
|
|
14
|
-
pages.push('ellipsis');
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
return pages;
|
|
18
|
-
}
|
|
19
|
-
return (_jsxs("div", { className: "flex items-center justify-between text-sm", children: [_jsxs("span", { className: "text-[var(--muted-foreground)]", children: [start, "\u2013", end, " of ", total, " results"] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("select", { value: perPage, onChange: (e) => {
|
|
20
|
-
onPerPageChange(Number(e.target.value));
|
|
21
|
-
onPageChange(1);
|
|
22
|
-
}, className: "rounded-md border border-[var(--border)] bg-[var(--input-background)] px-2 py-1 text-sm", children: [10, 25, 50, 100].map((n) => (_jsxs("option", { value: n, children: [n, " / page"] }, n))) }), _jsxs("nav", { className: "flex items-center gap-1", children: [_jsx("button", { onClick: () => onPageChange(page - 1), disabled: page <= 1, className: "rounded-md px-2 py-1 hover:bg-[var(--accent)] disabled:opacity-50", children: "Prev" }), pageNumbers().map((p, i) => p === 'ellipsis' ? (_jsx("span", { className: "px-1 text-[var(--muted-foreground)]", children: "\u2026" }, `e${i}`)) : (_jsx("button", { onClick: () => onPageChange(p), className: `min-w-[2rem] rounded-md px-2 py-1 ${p === page
|
|
23
|
-
? 'bg-[var(--primary)] text-[var(--primary-foreground)]'
|
|
24
|
-
: 'hover:bg-[var(--accent)]'}`, children: p }, p))), _jsx("button", { onClick: () => onPageChange(page + 1), disabled: page >= totalPages, className: "rounded-md px-2 py-1 hover:bg-[var(--accent)] disabled:opacity-50", children: "Next" })] })] })] }));
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=Pagination.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Pagination.js","sourceRoot":"","sources":["../../../src/components/ui/Pagination.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAUZ,MAAM,UAAU,UAAU,CAAC,EACzB,IAAI,EACJ,OAAO,EACP,KAAK,EACL,YAAY,EACZ,eAAe,GACC;IAChB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,CAAA;IAC1D,MAAM,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAA;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,OAAO,EAAE,KAAK,CAAC,CAAA;IAE3C,SAAS,WAAW;QAClB,MAAM,KAAK,GAA4B,EAAE,CAAA;QACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,UAAU,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3D,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACf,CAAC;iBAAM,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC;gBAClD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YACxB,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,2CAA2C,aACxD,gBAAM,SAAS,EAAC,gCAAgC,aAC7C,KAAK,YAAG,GAAG,UAAM,KAAK,gBAClB,EAEP,eAAK,SAAS,EAAC,yBAAyB,aACtC,iBACE,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;4BACd,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;4BACvC,YAAY,CAAC,CAAC,CAAC,CAAA;wBACjB,CAAC,EACD,SAAS,EAAC,yFAAyF,YAElG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAC5B,kBAAgB,KAAK,EAAE,CAAC,aACrB,CAAC,gBADS,CAAC,CAEL,CACV,CAAC,GACK,EAET,eAAK,SAAS,EAAC,yBAAyB,aACtC,iBACE,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC,EACrC,QAAQ,EAAE,IAAI,IAAI,CAAC,EACnB,SAAS,EAAC,mEAAmE,qBAGtE,EACR,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC1B,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CACjB,eAAoB,SAAS,EAAC,qCAAqC,wBAAxD,IAAI,CAAC,EAAE,CAEX,CACR,CAAC,CAAC,CAAC,CACF,iBAEE,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,EAC9B,SAAS,EAAE,qCACT,CAAC,KAAK,IAAI;oCACR,CAAC,CAAC,sDAAsD;oCACxD,CAAC,CAAC,0BACN,EAAE,YAED,CAAC,IARG,CAAC,CASC,CACV,CACF,EACD,iBACE,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC,EACrC,QAAQ,EAAE,IAAI,IAAI,UAAU,EAC5B,SAAS,EAAC,mEAAmE,qBAGtE,IACL,IACF,IACF,CACP,CAAA;AACH,CAAC"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { type SelectHTMLAttributes, type ReactNode } from 'react';
|
|
2
|
-
import { type VariantProps } from '../../lib/cv.js';
|
|
3
|
-
declare const select: (props?: ({
|
|
4
|
-
size?: "sm" | "md" | "lg" | undefined;
|
|
5
|
-
state?: "default" | "invalid" | "valid" | undefined;
|
|
6
|
-
} & {
|
|
7
|
-
class?: string | false | null | undefined;
|
|
8
|
-
className?: string | false | null | undefined;
|
|
9
|
-
}) | undefined) => string;
|
|
10
|
-
export type SelectVariants = VariantProps<typeof select>;
|
|
11
|
-
export interface SelectProps extends Omit<SelectHTMLAttributes<HTMLSelectElement>, 'size'>, SelectVariants {
|
|
12
|
-
children?: ReactNode;
|
|
13
|
-
}
|
|
14
|
-
export declare const Select: import("react").ForwardRefExoticComponent<SelectProps & import("react").RefAttributes<HTMLSelectElement>>;
|
|
15
|
-
export { select as selectVariants };
|
|
16
|
-
//# sourceMappingURL=Select.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Select.d.ts","sourceRoot":"","sources":["../../../src/components/ui/Select.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,oBAAoB,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAC7E,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAGvD,QAAA,MAAM,MAAM;;;;;;yBAcV,CAAA;AAEF,MAAM,MAAM,cAAc,GAAG,YAAY,CAAC,OAAO,MAAM,CAAC,CAAA;AAExD,MAAM,WAAW,WACf,SAAQ,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC,EAAE,cAAc;IAC7E,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAED,eAAO,MAAM,MAAM,2GAuBjB,CAAA;AAEF,OAAO,EAAE,MAAM,IAAI,cAAc,EAAE,CAAA"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { forwardRef } from 'react';
|
|
3
|
-
import { cv } from '../../lib/cv.js';
|
|
4
|
-
import { formControlBase, formControlState } from './form-control.js';
|
|
5
|
-
const select = cv(`${formControlBase} appearance-none pr-8`, {
|
|
6
|
-
variants: {
|
|
7
|
-
size: {
|
|
8
|
-
sm: 'py-1.5 pr-7 pl-3 text-[length:var(--fs-sub)]',
|
|
9
|
-
md: '',
|
|
10
|
-
lg: 'py-2.5 pr-9 pl-3',
|
|
11
|
-
},
|
|
12
|
-
state: {
|
|
13
|
-
default: formControlState.default,
|
|
14
|
-
invalid: formControlState.invalid,
|
|
15
|
-
valid: formControlState.valid,
|
|
16
|
-
},
|
|
17
|
-
},
|
|
18
|
-
defaultVariants: { size: 'md', state: 'default' },
|
|
19
|
-
});
|
|
20
|
-
export const Select = forwardRef(function Select({ size, state, className, children, ...rest }, ref) {
|
|
21
|
-
return (_jsxs("div", { className: "relative", children: [_jsx("select", { ref: ref, className: select({ size, state, class: className }), ...rest, children: children }), _jsx("svg", { "aria-hidden": true, className: "pointer-events-none absolute top-1/2 right-2 h-4 w-4 -translate-y-1/2 text-[var(--muted)]", viewBox: "0 0 20 20", fill: "currentColor", children: _jsx("path", { fillRule: "evenodd", d: "M5.23 7.21a.75.75 0 011.06.02L10 11.06l3.71-3.83a.75.75 0 111.08 1.04l-4.25 4.39a.75.75 0 01-1.08 0L5.21 8.27a.75.75 0 01.02-1.06z", clipRule: "evenodd" }) })] }));
|
|
22
|
-
});
|
|
23
|
-
export { select as selectVariants };
|
|
24
|
-
//# sourceMappingURL=Select.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Select.js","sourceRoot":"","sources":["../../../src/components/ui/Select.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAA6C,MAAM,OAAO,CAAA;AAC7E,OAAO,EAAE,EAAE,EAAqB,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAErE,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,eAAe,uBAAuB,EAAE;IAC3D,QAAQ,EAAE;QACR,IAAI,EAAE;YACJ,EAAE,EAAE,8CAA8C;YAClD,EAAE,EAAE,EAAE;YACN,EAAE,EAAE,kBAAkB;SACvB;QACD,KAAK,EAAE;YACL,OAAO,EAAE,gBAAgB,CAAC,OAAO;YACjC,OAAO,EAAE,gBAAgB,CAAC,OAAO;YACjC,KAAK,EAAE,gBAAgB,CAAC,KAAK;SAC9B;KACF;IACD,eAAe,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;CAClD,CAAC,CAAA;AASF,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAiC,SAAS,MAAM,CAC9E,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAC7C,GAAG;IAEH,OAAO,CACL,eAAK,SAAS,EAAC,UAAU,aACvB,iBAAQ,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,KAAM,IAAI,YAC7E,QAAQ,GACF,EACT,mCAEE,SAAS,EAAC,2FAA2F,EACrG,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,cAAc,YAEnB,eACE,QAAQ,EAAC,SAAS,EAClB,CAAC,EAAC,oIAAoI,EACtI,QAAQ,EAAC,SAAS,GAClB,GACE,IACF,CACP,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,OAAO,EAAE,MAAM,IAAI,cAAc,EAAE,CAAA"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
type ToastType = 'success' | 'error' | 'warning' | 'info';
|
|
2
|
-
interface Toast {
|
|
3
|
-
id: string;
|
|
4
|
-
type: ToastType;
|
|
5
|
-
message: string;
|
|
6
|
-
}
|
|
7
|
-
export declare function useToast(): {
|
|
8
|
-
toasts: Toast[];
|
|
9
|
-
addToast: (type: ToastType, message: string) => void;
|
|
10
|
-
dismissToast: (id: string) => void;
|
|
11
|
-
};
|
|
12
|
-
export interface ToastContainerProps {
|
|
13
|
-
toasts: Toast[];
|
|
14
|
-
onDismiss: (id: string) => void;
|
|
15
|
-
}
|
|
16
|
-
export declare function ToastContainer({ toasts, onDismiss }: ToastContainerProps): import("react/jsx-runtime").JSX.Element | null;
|
|
17
|
-
export {};
|
|
18
|
-
//# sourceMappingURL=Toast.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Toast.d.ts","sourceRoot":"","sources":["../../../src/components/ui/Toast.tsx"],"names":[],"mappings":"AAIA,KAAK,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAA;AAEzD,UAAU,KAAK;IACb,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,SAAS,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;CAChB;AASD,wBAAgB,QAAQ;;qBAGc,SAAS,WAAW,MAAM;uBAQxB,MAAM;EAK7C;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;CAChC;AAED,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,mBAAmB,kDA6BxE"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { useState, useCallback } from 'react';
|
|
4
|
-
const typeClasses = {
|
|
5
|
-
success: 'border-success bg-success/10 text-success',
|
|
6
|
-
error: 'border-destructive bg-destructive/10 text-destructive',
|
|
7
|
-
warning: 'border-warning bg-warning/10 text-warning',
|
|
8
|
-
info: 'border-info bg-info/10 text-info',
|
|
9
|
-
};
|
|
10
|
-
export function useToast() {
|
|
11
|
-
const [toasts, setToasts] = useState([]);
|
|
12
|
-
const addToast = useCallback((type, message) => {
|
|
13
|
-
const id = crypto.randomUUID();
|
|
14
|
-
setToasts((prev) => [...prev, { id, type, message }]);
|
|
15
|
-
setTimeout(() => {
|
|
16
|
-
setToasts((prev) => prev.filter((t) => t.id !== id));
|
|
17
|
-
}, 5000);
|
|
18
|
-
}, []);
|
|
19
|
-
const dismissToast = useCallback((id) => {
|
|
20
|
-
setToasts((prev) => prev.filter((t) => t.id !== id));
|
|
21
|
-
}, []);
|
|
22
|
-
return { toasts, addToast, dismissToast };
|
|
23
|
-
}
|
|
24
|
-
export function ToastContainer({ toasts, onDismiss }) {
|
|
25
|
-
if (toasts.length === 0)
|
|
26
|
-
return null;
|
|
27
|
-
return (_jsx("div", { className: "fixed right-4 bottom-4 z-[100] flex flex-col gap-2", children: toasts.map((toast) => (_jsxs("div", { className: `flex items-center gap-3 rounded-md border-l-4 px-4 py-3 shadow-lg ${typeClasses[toast.type]}`, children: [_jsx("p", { className: "flex-1 text-sm", children: toast.message }), _jsx("button", { onClick: () => onDismiss(toast.id), className: "shrink-0 opacity-60 hover:opacity-100", children: _jsx("svg", { className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 18L18 6M6 6l12 12" }) }) })] }, toast.id))) }));
|
|
28
|
-
}
|
|
29
|
-
//# sourceMappingURL=Toast.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Toast.js","sourceRoot":"","sources":["../../../src/components/ui/Toast.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAU7C,MAAM,WAAW,GAA8B;IAC7C,OAAO,EAAE,2CAA2C;IACpD,KAAK,EAAE,uDAAuD;IAC9D,OAAO,EAAE,2CAA2C;IACpD,IAAI,EAAE,kCAAkC;CACzC,CAAA;AAED,MAAM,UAAU,QAAQ;IACtB,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAU,EAAE,CAAC,CAAA;IAEjD,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,IAAe,EAAE,OAAe,EAAE,EAAE;QAChE,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,CAAA;QAC9B,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;QACrD,UAAU,CAAC,GAAG,EAAE;YACd,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;QACtD,CAAC,EAAE,IAAI,CAAC,CAAA;IACV,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,EAAU,EAAE,EAAE;QAC9C,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;IACtD,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAA;AAC3C,CAAC;AAOD,MAAM,UAAU,cAAc,CAAC,EAAE,MAAM,EAAE,SAAS,EAAuB;IACvE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAEpC,OAAO,CACL,cAAK,SAAS,EAAC,oDAAoD,YAChE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACrB,eAEE,SAAS,EAAE,qEAAqE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,aAEzG,YAAG,SAAS,EAAC,gBAAgB,YAAE,KAAK,CAAC,OAAO,GAAK,EACjD,iBACE,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,EAClC,SAAS,EAAC,uCAAuC,YAEjD,cACE,SAAS,EAAC,SAAS,EACnB,IAAI,EAAC,MAAM,EACX,OAAO,EAAC,WAAW,EACnB,MAAM,EAAC,cAAc,EACrB,WAAW,EAAE,CAAC,YAEd,eAAM,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,CAAC,EAAC,sBAAsB,GAAG,GAC1E,GACC,KAjBJ,KAAK,CAAC,EAAE,CAkBT,CACP,CAAC,GACE,CACP,CAAA;AACH,CAAC"}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
export { Button, buttonVariants } from './Button.js';
|
|
2
|
-
export type { ButtonProps, ButtonVariants } from './Button.js';
|
|
3
|
-
export { Badge, badgeVariants, STATUS_TONE, STATUS_LABEL } from './Badge.js';
|
|
4
|
-
export type { BadgeProps, BadgeVariants, DocumentStatus } from './Badge.js';
|
|
5
|
-
export { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter, cardVariants, } from './Card.js';
|
|
6
|
-
export type { CardProps, CardVariants } from './Card.js';
|
|
7
|
-
export { Input, inputVariants } from './Input.js';
|
|
8
|
-
export type { InputProps, InputVariants } from './Input.js';
|
|
9
|
-
export { Select, selectVariants } from './Select.js';
|
|
10
|
-
export type { SelectProps, SelectVariants } from './Select.js';
|
|
11
|
-
export { Avatar } from './Avatar.js';
|
|
12
|
-
export type { AvatarProps } from './Avatar.js';
|
|
13
|
-
export { EmptyState } from './EmptyState.js';
|
|
14
|
-
export type { EmptyStateProps } from './EmptyState.js';
|
|
15
|
-
export { Skeleton } from './Skeleton.js';
|
|
16
|
-
export type { SkeletonProps } from './Skeleton.js';
|
|
17
|
-
export { useToast, ToastContainer } from './Toast.js';
|
|
18
|
-
export type { ToastContainerProps } from './Toast.js';
|
|
19
|
-
export { Modal } from './Modal.js';
|
|
20
|
-
export type { ModalProps } from './Modal.js';
|
|
21
|
-
export { ConfirmDialog } from './ConfirmDialog.js';
|
|
22
|
-
export type { ConfirmDialogProps } from './ConfirmDialog.js';
|
|
23
|
-
export { ReauthDialog } from './ReauthDialog.js';
|
|
24
|
-
export type { ReauthDialogProps } from './ReauthDialog.js';
|
|
25
|
-
export { DataTable } from './DataTable.js';
|
|
26
|
-
export type { DataTableProps } from './DataTable.js';
|
|
27
|
-
export { Pagination } from './Pagination.js';
|
|
28
|
-
export type { PaginationProps } from './Pagination.js';
|
|
29
|
-
export { SearchInput } from './SearchInput.js';
|
|
30
|
-
export type { SearchInputProps } from './SearchInput.js';
|
|
31
|
-
export { Toggle, toggleTrackVariants, toggleThumbVariants } from './Toggle.js';
|
|
32
|
-
export type { ToggleProps, ToggleVariants } from './Toggle.js';
|
|
33
|
-
export { StatusBadge, statusBadgeVariants } from './StatusBadge.js';
|
|
34
|
-
export type { StatusBadgeProps, StatusBadgeVariants, StatusBadgeTone } from './StatusBadge.js';
|
|
35
|
-
export { FilterPill } from './FilterPill.js';
|
|
36
|
-
export type { FilterPillProps } from './FilterPill.js';
|
|
37
|
-
export { StatPill } from './StatPill.js';
|
|
38
|
-
export type { StatPillProps } from './StatPill.js';
|
|
39
|
-
export { RowActions, RowActionButton } from './RowActions.js';
|
|
40
|
-
export type { RowActionButtonProps } from './RowActions.js';
|
|
41
|
-
export { SplitPaneLayout, SplitPaneList, InspectorPane, InspectorPaneHeader, InspectorPaneBody, InspectorPaneSection, InspectorPaneFooter, } from './InspectorPane.js';
|
|
42
|
-
export type { InspectorPaneProps } from './InspectorPane.js';
|
|
43
|
-
export { formControlBase, formControlState } from './form-control.js';
|
|
44
|
-
export { CommandPalette } from './CommandPalette.js';
|
|
45
|
-
export type { CommandPaletteProps } from './CommandPalette.js';
|
|
46
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ui/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
export { Button, buttonVariants } from './Button.js';
|
|
2
|
-
export { Badge, badgeVariants, STATUS_TONE, STATUS_LABEL } from './Badge.js';
|
|
3
|
-
export { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter, cardVariants, } from './Card.js';
|
|
4
|
-
export { Input, inputVariants } from './Input.js';
|
|
5
|
-
export { Select, selectVariants } from './Select.js';
|
|
6
|
-
export { Avatar } from './Avatar.js';
|
|
7
|
-
export { EmptyState } from './EmptyState.js';
|
|
8
|
-
export { Skeleton } from './Skeleton.js';
|
|
9
|
-
export { useToast, ToastContainer } from './Toast.js';
|
|
10
|
-
export { Modal } from './Modal.js';
|
|
11
|
-
export { ConfirmDialog } from './ConfirmDialog.js';
|
|
12
|
-
export { ReauthDialog } from './ReauthDialog.js';
|
|
13
|
-
export { DataTable } from './DataTable.js';
|
|
14
|
-
export { Pagination } from './Pagination.js';
|
|
15
|
-
export { SearchInput } from './SearchInput.js';
|
|
16
|
-
export { Toggle, toggleTrackVariants, toggleThumbVariants } from './Toggle.js';
|
|
17
|
-
export { StatusBadge, statusBadgeVariants } from './StatusBadge.js';
|
|
18
|
-
export { FilterPill } from './FilterPill.js';
|
|
19
|
-
export { StatPill } from './StatPill.js';
|
|
20
|
-
export { RowActions, RowActionButton } from './RowActions.js';
|
|
21
|
-
export { SplitPaneLayout, SplitPaneList, InspectorPane, InspectorPaneHeader, InspectorPaneBody, InspectorPaneSection, InspectorPaneFooter, } from './InspectorPane.js';
|
|
22
|
-
export { formControlBase, formControlState } from './form-control.js';
|
|
23
|
-
export { CommandPalette } from './CommandPalette.js';
|
|
24
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEpD,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE5E,OAAO,EACL,IAAI,EACJ,UAAU,EACV,SAAS,EACT,eAAe,EACf,WAAW,EACX,UAAU,EACV,YAAY,GACb,MAAM,WAAW,CAAA;AAElB,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAEjD,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEpD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAErD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAE9E,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAEnE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAE7D,OAAO,EACL,eAAe,EACf,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
interface ContentLock {
|
|
2
|
-
lockedBy: string | null;
|
|
3
|
-
lockedAt: Date | null;
|
|
4
|
-
isLocked: boolean;
|
|
5
|
-
isLockedByMe: boolean;
|
|
6
|
-
}
|
|
7
|
-
export declare function useContentLock(documentId: string | undefined, userId: string): ContentLock & {
|
|
8
|
-
acquireLock: () => Promise<boolean>;
|
|
9
|
-
releaseLock: () => Promise<void>;
|
|
10
|
-
};
|
|
11
|
-
export {};
|
|
12
|
-
//# sourceMappingURL=useContentLock.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useContentLock.d.ts","sourceRoot":"","sources":["../../src/hooks/useContentLock.ts"],"names":[],"mappings":"AAIA,UAAU,WAAW;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAA;IACrB,QAAQ,EAAE,OAAO,CAAA;IACjB,YAAY,EAAE,OAAO,CAAA;CACtB;AAED,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,MAAM,EAAE,MAAM,GACb,WAAW,GAAG;IACf,WAAW,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;IACnC,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CACjC,CAqCA"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { useState, useEffect, useCallback } from 'react';
|
|
3
|
-
export function useContentLock(documentId, userId) {
|
|
4
|
-
const [lock, setLock] = useState({
|
|
5
|
-
lockedBy: null,
|
|
6
|
-
lockedAt: null,
|
|
7
|
-
isLocked: false,
|
|
8
|
-
isLockedByMe: false,
|
|
9
|
-
});
|
|
10
|
-
const acquireLock = useCallback(async () => {
|
|
11
|
-
if (!documentId)
|
|
12
|
-
return false;
|
|
13
|
-
setLock({
|
|
14
|
-
lockedBy: userId,
|
|
15
|
-
lockedAt: new Date(),
|
|
16
|
-
isLocked: true,
|
|
17
|
-
isLockedByMe: true,
|
|
18
|
-
});
|
|
19
|
-
return true;
|
|
20
|
-
}, [documentId, userId]);
|
|
21
|
-
const releaseLock = useCallback(async () => {
|
|
22
|
-
setLock({
|
|
23
|
-
lockedBy: null,
|
|
24
|
-
lockedAt: null,
|
|
25
|
-
isLocked: false,
|
|
26
|
-
isLockedByMe: false,
|
|
27
|
-
});
|
|
28
|
-
}, []);
|
|
29
|
-
useEffect(() => {
|
|
30
|
-
return () => {
|
|
31
|
-
if (lock.isLockedByMe) {
|
|
32
|
-
releaseLock();
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
}, [lock.isLockedByMe, releaseLock]);
|
|
36
|
-
return { ...lock, acquireLock, releaseLock };
|
|
37
|
-
}
|
|
38
|
-
//# sourceMappingURL=useContentLock.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useContentLock.js","sourceRoot":"","sources":["../../src/hooks/useContentLock.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AASxD,MAAM,UAAU,cAAc,CAC5B,UAA8B,EAC9B,MAAc;IAKd,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAc;QAC5C,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,KAAK;QACf,YAAY,EAAE,KAAK;KACpB,CAAC,CAAA;IAEF,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACzC,IAAI,CAAC,UAAU;YAAE,OAAO,KAAK,CAAA;QAC7B,OAAO,CAAC;YACN,QAAQ,EAAE,MAAM;YAChB,QAAQ,EAAE,IAAI,IAAI,EAAE;YACpB,QAAQ,EAAE,IAAI;YACd,YAAY,EAAE,IAAI;SACnB,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAA;IAExB,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACzC,OAAO,CAAC;YACN,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,KAAK;SACpB,CAAC,CAAA;IACJ,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE;YACV,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtB,WAAW,EAAE,CAAA;YACf,CAAC;QACH,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAA;IAEpC,OAAO,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,CAAA;AAC9C,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useDebounce.d.ts","sourceRoot":"","sources":["../../src/hooks/useDebounce.ts"],"names":[],"mappings":"AAIA,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,CAS3D"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { useState, useEffect } from 'react';
|
|
3
|
-
export function useDebounce(value, delayMs) {
|
|
4
|
-
const [debouncedValue, setDebouncedValue] = useState(value);
|
|
5
|
-
useEffect(() => {
|
|
6
|
-
const timer = setTimeout(() => setDebouncedValue(value), delayMs);
|
|
7
|
-
return () => clearTimeout(timer);
|
|
8
|
-
}, [value, delayMs]);
|
|
9
|
-
return debouncedValue;
|
|
10
|
-
}
|
|
11
|
-
//# sourceMappingURL=useDebounce.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useDebounce.js","sourceRoot":"","sources":["../../src/hooks/useDebounce.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAE3C,MAAM,UAAU,WAAW,CAAI,KAAQ,EAAE,OAAe;IACtD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAE3D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAA;QACjE,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;IAClC,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAA;IAEpB,OAAO,cAAc,CAAA;AACvB,CAAC"}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
'use client'
|
|
2
|
-
|
|
3
|
-
import { PieChart, Pie, Cell, ResponsiveContainer } from 'recharts'
|
|
4
|
-
|
|
5
|
-
interface ContentOverviewChartProps {
|
|
6
|
-
published: number
|
|
7
|
-
drafts: number
|
|
8
|
-
scheduled: number
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
const COLORS = ['#22c55e', '#f59e0b', '#a855f7']
|
|
12
|
-
|
|
13
|
-
export function ContentOverviewChart({ published, drafts, scheduled }: ContentOverviewChartProps) {
|
|
14
|
-
const total = published + drafts + scheduled
|
|
15
|
-
const data = [
|
|
16
|
-
{ name: 'Published', value: published },
|
|
17
|
-
{ name: 'Drafts', value: drafts },
|
|
18
|
-
{ name: 'Scheduled', value: scheduled },
|
|
19
|
-
]
|
|
20
|
-
|
|
21
|
-
if (total === 0) {
|
|
22
|
-
return (
|
|
23
|
-
<div className="text-muted-foreground flex h-full items-center justify-center text-sm">
|
|
24
|
-
No content yet
|
|
25
|
-
</div>
|
|
26
|
-
)
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
return (
|
|
30
|
-
<div className="flex items-center gap-6">
|
|
31
|
-
<div className="h-36 w-36 shrink-0">
|
|
32
|
-
<ResponsiveContainer width="100%" height="100%">
|
|
33
|
-
<PieChart>
|
|
34
|
-
<Pie
|
|
35
|
-
data={data}
|
|
36
|
-
cx="50%"
|
|
37
|
-
cy="50%"
|
|
38
|
-
innerRadius={38}
|
|
39
|
-
outerRadius={65}
|
|
40
|
-
dataKey="value"
|
|
41
|
-
strokeWidth={2}
|
|
42
|
-
stroke="#fff"
|
|
43
|
-
>
|
|
44
|
-
{data.map((_, idx) => (
|
|
45
|
-
<Cell key={idx} fill={COLORS[idx]} />
|
|
46
|
-
))}
|
|
47
|
-
</Pie>
|
|
48
|
-
</PieChart>
|
|
49
|
-
</ResponsiveContainer>
|
|
50
|
-
</div>
|
|
51
|
-
<div className="space-y-3">
|
|
52
|
-
{data.map((entry, idx) => {
|
|
53
|
-
const pct = total > 0 ? Math.round((entry.value / total) * 100) : 0
|
|
54
|
-
return (
|
|
55
|
-
<div key={entry.name} className="flex items-center gap-3">
|
|
56
|
-
<span
|
|
57
|
-
className="h-2.5 w-2.5 shrink-0 rounded-full"
|
|
58
|
-
style={{ backgroundColor: COLORS[idx] }}
|
|
59
|
-
/>
|
|
60
|
-
<div className="min-w-0">
|
|
61
|
-
<span className="text-foreground text-sm">{entry.name}</span>
|
|
62
|
-
<div className="flex items-baseline gap-2">
|
|
63
|
-
<span className="text-foreground text-lg font-medium">
|
|
64
|
-
{entry.value.toLocaleString()}
|
|
65
|
-
</span>
|
|
66
|
-
<span className="text-muted-foreground text-xs">{pct}%</span>
|
|
67
|
-
</div>
|
|
68
|
-
</div>
|
|
69
|
-
</div>
|
|
70
|
-
)
|
|
71
|
-
})}
|
|
72
|
-
</div>
|
|
73
|
-
</div>
|
|
74
|
-
)
|
|
75
|
-
}
|