Co-authored-by: Thanh Quy - wolf <524H0124@student.tdtu.edu.vn> Co-authored-by: Thanh Quy- wolf <524H0124@student.tdtu.edu.vn> Reviewed-on: #42 Co-authored-by: TaNguyenThanhQuy <tanguyenthanhquy@noreply.localhost> Co-committed-by: TaNguyenThanhQuy <tanguyenthanhquy@noreply.localhost>
This commit was merged in pull request #42.
This commit is contained in:
@@ -1,103 +1,10 @@
|
|||||||
# Coffee Shop Frontend - TODO
|
# TODO - Add image upload field for manager add/update menu item
|
||||||
|
|
||||||
## Completed Features & Implementations
|
- [x] Update GraphQL queries/mutations in `lib/manager-context.tsx` to include `imageUrl`
|
||||||
|
- [x] Update `components/organisms/manager/ProductModal.tsx`
|
||||||
### A. Dead Code Removed
|
- [x] Add file input for image selection
|
||||||
|
- [x] Add upload button to call `POST /api/file`
|
||||||
- [x] lib/constants.ts - Removed unused NAV_LINKS export
|
- [x] Store returned URL string into `form.imageUrl`
|
||||||
- [x] lib/types.ts - Removed unused NavLink interface
|
- [x] Show upload/loading/error states and image preview
|
||||||
- [x] components/Navbar.tsx - Removed trivial handleClick wrapper; inlined
|
- [x] Update `components/organisms/manager/ProductsTab.tsx` to show image thumbnail in table
|
||||||
onCategoryChange call
|
- [x] Mark TODO progress after each step completed
|
||||||
- [x] components/Navbar.tsx - Removed unused Link import
|
|
||||||
|
|
||||||
### B. Bugs / Inaccuracies Fixed
|
|
||||||
|
|
||||||
- [x] layouts/header.tsx - Fixed JSDoc: 3-column -> 2-column layout (no center
|
|
||||||
section exists)
|
|
||||||
- [x] app/page.tsx - Added available !== false filter to product list
|
|
||||||
- [x] app/page.tsx - Fixed setState-in-effect lint error: moved initial sidebar
|
|
||||||
state to lazy useState initializer
|
|
||||||
- [x] next.config.ts - Added explanatory JSDoc comment
|
|
||||||
|
|
||||||
### C. Documentation Updated
|
|
||||||
|
|
||||||
- [x] README.md - Fixed file structure tree, removed SCSS, fixed dark mode note,
|
|
||||||
updated tech table
|
|
||||||
- [x] components/COMPONENTS.md - Fixed CartProduct styling (was outdated
|
|
||||||
w-64/text-red-500/bg-blue-600); added Navbar, Header, Footer sections
|
|
||||||
|
|
||||||
### D. New Documentation Created
|
|
||||||
|
|
||||||
- [x] WORKFLOW.md - Architecture, data flow, design token system, how-to guides,
|
|
||||||
dev workflow
|
|
||||||
|
|
||||||
### E. Mini-test Results
|
|
||||||
|
|
||||||
- [x] npm run lint - PASSED (0 errors, 0 warnings)
|
|
||||||
- [x] npm run build - PASSED (Compiled successfully, TypeScript clean, static
|
|
||||||
pages generated)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Pending Features (Future Work)
|
|
||||||
|
|
||||||
### Cart & Ordering
|
|
||||||
|
|
||||||
- [ ] Implement cart checkout flow (app/(main)/cart or modal)
|
|
||||||
- [ ] Cart sidebar/modal with item list and total
|
|
||||||
- [ ] Order submission API integration
|
|
||||||
- [ ] Payment page implementation (app/(main)/payment)
|
|
||||||
- [ ] Order history/tracking page
|
|
||||||
- [ ] Toast notifications for cart actions
|
|
||||||
|
|
||||||
### Authentication & User Management
|
|
||||||
|
|
||||||
- [ ] Real backend authentication (replace MOCK_AUTH_DB)
|
|
||||||
- [ ] Real OTP delivery service (SMS integration)
|
|
||||||
- [ ] User profile page with edit capability
|
|
||||||
- [ ] Password reset/recovery flow
|
|
||||||
- [ ] Session management and token refresh
|
|
||||||
|
|
||||||
### Manager Features
|
|
||||||
|
|
||||||
- [ ] Manager dashboard page (app/(manager)/page.tsx)
|
|
||||||
- [ ] Product management (add/edit/delete)
|
|
||||||
- [ ] Category management
|
|
||||||
- [ ] Order management & tracking
|
|
||||||
- [ ] Sales analytics/dashboard
|
|
||||||
- [ ] Inventory management
|
|
||||||
|
|
||||||
### Backend Integration
|
|
||||||
|
|
||||||
- [ ] Replace MOCK_PRODUCTS with API calls (GET /api/products)
|
|
||||||
- [ ] Replace MOCK_SHOPS with API calls (GET /api/shops)
|
|
||||||
- [ ] Replace MOCK_USERS with real authentication (POST /api/auth/login)
|
|
||||||
- [ ] Real product images (replace placeholder.jpg)
|
|
||||||
- [ ] Image upload for products
|
|
||||||
|
|
||||||
### UX Improvements
|
|
||||||
|
|
||||||
- [ ] Dark mode toggle (CSS variables prepared, toggle UI needed)
|
|
||||||
- [ ] Loading skeletons for product grid
|
|
||||||
- [ ] Product detail modal/page with full description
|
|
||||||
- [ ] Wishlist/favorites feature
|
|
||||||
- [ ] Sort products (price, rating, etc.)
|
|
||||||
- [ ] Filter by price range
|
|
||||||
- [ ] Quantity selector in product card
|
|
||||||
- [ ] Related products suggestions
|
|
||||||
|
|
||||||
### Performance & SEO
|
|
||||||
|
|
||||||
- [ ] Dynamic route generation for products (app/(main)/product/[id]/page.tsx)
|
|
||||||
- [ ] Dynamic route generation for shops (app/(feed)/shop/[id]/page.tsx)
|
|
||||||
- [ ] Meta tags and Open Graph for SEO
|
|
||||||
- [ ] Image optimization and lazy loading
|
|
||||||
- [ ] Code splitting and dynamic imports
|
|
||||||
|
|
||||||
### Accessibility & Testing
|
|
||||||
|
|
||||||
- [ ] Keyboard navigation testing
|
|
||||||
- [ ] ARIA labels audit
|
|
||||||
- [ ] Unit tests for contexts
|
|
||||||
- [ ] E2E tests for user flows
|
|
||||||
- [ ] Accessibility audit (WCAG 2.1 AA)
|
|
||||||
|
|||||||
@@ -25,7 +25,11 @@ export default function PaymentPage() {
|
|||||||
const { products } = useManager();
|
const { products } = useManager();
|
||||||
|
|
||||||
const findProduct = (id: string): MenuItemEntity =>
|
const findProduct = (id: string): MenuItemEntity =>
|
||||||
products.find((i) => i.id == id)!;
|
products.find((i) => i.id == id) ?? ({
|
||||||
|
name: "Unknown product",
|
||||||
|
description: "",
|
||||||
|
price: 0,
|
||||||
|
} as MenuItemEntity);
|
||||||
|
|
||||||
const [isReviewOpen, setIsReviewOpen] = useState(false);
|
const [isReviewOpen, setIsReviewOpen] = useState(false);
|
||||||
const isCustomer = user?.role === "customer";
|
const isCustomer = user?.role === "customer";
|
||||||
@@ -83,7 +87,7 @@ export default function PaymentPage() {
|
|||||||
return (
|
return (
|
||||||
<tr
|
<tr
|
||||||
key={id}
|
key={id}
|
||||||
className="border-t border-(--color-border-light)"
|
className={`border-t border-(--color-border-light) ${quantity == 0 ? "hidden" : ""}`}
|
||||||
>
|
>
|
||||||
<td className="text-foreground px-4 py-3 font-medium">
|
<td className="text-foreground px-4 py-3 font-medium">
|
||||||
{name}
|
{name}
|
||||||
|
|||||||
@@ -14,13 +14,60 @@ export default function ProductModal({
|
|||||||
const [form, setForm] = useState<MenuItemEntity>({
|
const [form, setForm] = useState<MenuItemEntity>({
|
||||||
name: product?.name ?? "",
|
name: product?.name ?? "",
|
||||||
price: product?.price ?? 0,
|
price: product?.price ?? 0,
|
||||||
imageUrl: product?.imageUrl ?? "/imgs/products/placeholder.jpg",
|
imageUrl: product?.imageUrl ?? "",
|
||||||
description: product?.description ?? "",
|
description: product?.description ?? "",
|
||||||
available: product?.available ?? true,
|
available: product?.available ?? true,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const [uploading, setUploading] = useState(false);
|
||||||
|
const [uploadError, setUploadError] = useState<string | null>(null);
|
||||||
|
|
||||||
|
const inputCls =
|
||||||
|
"text-foreground w-full rounded-xl border border-(--color-border) bg-white px-3 py-2 text-sm transition outline-none focus:border-(--color-primary) focus:ring-2 focus:ring-(--color-primary)/20";
|
||||||
|
|
||||||
|
const uploadImage = async (file: File) => {
|
||||||
|
setUploading(true);
|
||||||
|
setUploadError(null);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const body = new FormData();
|
||||||
|
body.append("file", file);
|
||||||
|
|
||||||
|
const res = await fetch("/api/file", {
|
||||||
|
method: "POST",
|
||||||
|
body,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!res.ok) {
|
||||||
|
throw new Error("Upload ảnh thất bại.");
|
||||||
|
}
|
||||||
|
|
||||||
|
const raw = await res.text();
|
||||||
|
|
||||||
|
let filename = "";
|
||||||
|
try {
|
||||||
|
const parsed = JSON.parse(raw.trim());
|
||||||
|
filename = parsed.filename || "";
|
||||||
|
} catch {
|
||||||
|
const match = raw.match(/"filename"\s*:\s*"([^"]+)"/i);
|
||||||
|
filename = match?.[1] || "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!filename) {
|
||||||
|
throw new Error("Không nhận được filename ảnh từ server.");
|
||||||
|
}
|
||||||
|
|
||||||
|
setForm((prev) => ({ ...prev, imageUrl: filename }));
|
||||||
|
} catch (error: any) {
|
||||||
|
setUploadError(error?.message || "Không thể upload ảnh.");
|
||||||
|
} finally {
|
||||||
|
setUploading(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const handleSubmit = (e: React.FormEvent) => {
|
const handleSubmit = (e: React.FormEvent) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
if (isEdit && product) {
|
if (isEdit && product) {
|
||||||
onSave({ ...form, id: product.id });
|
onSave({ ...form, id: product.id });
|
||||||
} else {
|
} else {
|
||||||
@@ -28,14 +75,21 @@ export default function ProductModal({
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const inputCls =
|
const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
"text-foreground w-full rounded-xl border border-(--color-border) bg-white px-3 py-2 text-sm transition outline-none focus:border-(--color-primary) focus:ring-2 focus:ring-(--color-primary)/20";
|
const file = e.target.files?.[0];
|
||||||
|
if (!file) return;
|
||||||
|
await uploadImage(file);
|
||||||
|
};
|
||||||
|
|
||||||
|
const toDisplayUrl = (filename: string) =>
|
||||||
|
filename && !filename.startsWith("/") && !filename.startsWith("http")
|
||||||
|
? `/api/file/${filename}`
|
||||||
|
: filename;
|
||||||
|
|
||||||
|
const previewUrl = toDisplayUrl(form.imageUrl);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/40 p-4 backdrop-blur-sm">
|
||||||
className="fixed inset-0 z-50 flex items-center justify-center bg-black/40 p-4 backdrop-blur-sm"
|
|
||||||
onClick={(e) => e.target === e.currentTarget && onClose()}
|
|
||||||
>
|
|
||||||
<div className="w-full max-w-lg rounded-2xl bg-white shadow-2xl">
|
<div className="w-full max-w-lg rounded-2xl bg-white shadow-2xl">
|
||||||
<div className="flex items-center justify-between border-b border-(--color-border-light) px-6 py-4">
|
<div className="flex items-center justify-between border-b border-(--color-border-light) px-6 py-4">
|
||||||
<h2 className="text-foreground text-lg font-bold">
|
<h2 className="text-foreground text-lg font-bold">
|
||||||
@@ -83,6 +137,46 @@ export default function ProductModal({
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label className="mb-1 block text-sm font-medium text-(--color-text-secondary)">
|
||||||
|
Ảnh món
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<div className="space-y-2">
|
||||||
|
<input
|
||||||
|
type="file"
|
||||||
|
accept="image/*"
|
||||||
|
onChange={handleFileChange}
|
||||||
|
disabled={uploading}
|
||||||
|
className="text-foreground w-full rounded-xl border border-(--color-border) bg-white px-3 py-2 text-sm disabled:opacity-60"
|
||||||
|
/>
|
||||||
|
|
||||||
|
{uploading && (
|
||||||
|
<p className="text-sm text-(--color-text-muted)">
|
||||||
|
<i className="fa-solid fa-spinner mr-1 animate-spin"></i>
|
||||||
|
Đang upload ảnh...
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{previewUrl && (
|
||||||
|
<div className="mt-2">
|
||||||
|
<img
|
||||||
|
src={previewUrl}
|
||||||
|
alt="Preview ảnh món"
|
||||||
|
className="h-24 w-24 rounded-lg border border-(--color-border-light) object-cover"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{uploadError && (
|
||||||
|
<p className="mt-1 text-sm text-red-500">
|
||||||
|
<i className="fa-solid fa-circle-exclamation mr-1"></i>
|
||||||
|
{uploadError}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<label className="mb-1 block text-sm font-medium text-(--color-text-secondary)">
|
<label className="mb-1 block text-sm font-medium text-(--color-text-secondary)">
|
||||||
Mô tả
|
Mô tả
|
||||||
@@ -131,7 +225,8 @@ export default function ProductModal({
|
|||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="submit"
|
type="submit"
|
||||||
className="flex-1 cursor-pointer rounded-xl border-none bg-(--color-primary) px-4 py-2.5 text-sm font-semibold text-white transition hover:bg-(--color-primary-dark) active:scale-95"
|
disabled={uploading}
|
||||||
|
className="flex-1 cursor-pointer rounded-xl border-none bg-(--color-primary) px-4 py-2.5 text-sm font-semibold text-white transition hover:bg-(--color-primary-dark) active:scale-95 disabled:opacity-60"
|
||||||
>
|
>
|
||||||
{isEdit ? "Lưu thay đổi" : "Thêm món"}
|
{isEdit ? "Lưu thay đổi" : "Thêm món"}
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -12,6 +12,12 @@ function formatPrice(price: number) {
|
|||||||
return price.toLocaleString("vi-VN") + "đ";
|
return price.toLocaleString("vi-VN") + "đ";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function toDisplayUrl(filename: string) {
|
||||||
|
if (!filename) return "/imgs/products/placeholder.jpg";
|
||||||
|
if (filename.startsWith("/") || filename.startsWith("http")) return filename;
|
||||||
|
return `/api/file/${filename}`;
|
||||||
|
}
|
||||||
|
|
||||||
export default function ProductsTab() {
|
export default function ProductsTab() {
|
||||||
const {
|
const {
|
||||||
products,
|
products,
|
||||||
@@ -102,6 +108,9 @@ export default function ProductsTab() {
|
|||||||
<table className="min-w-full divide-y divide-(--color-border-light) text-sm">
|
<table className="min-w-full divide-y divide-(--color-border-light) text-sm">
|
||||||
<thead className="bg-background">
|
<thead className="bg-background">
|
||||||
<tr>
|
<tr>
|
||||||
|
<th className="px-4 py-3 text-left font-semibold text-(--color-text-secondary)">
|
||||||
|
Ảnh
|
||||||
|
</th>
|
||||||
<th className="px-4 py-3 text-left font-semibold text-(--color-text-secondary)">
|
<th className="px-4 py-3 text-left font-semibold text-(--color-text-secondary)">
|
||||||
Tên món
|
Tên món
|
||||||
</th>
|
</th>
|
||||||
@@ -133,6 +142,13 @@ export default function ProductsTab() {
|
|||||||
key={p.id}
|
key={p.id}
|
||||||
className="hover:bg-background transition-colors"
|
className="hover:bg-background transition-colors"
|
||||||
>
|
>
|
||||||
|
<td className="px-4 py-3">
|
||||||
|
<img
|
||||||
|
src={toDisplayUrl(p.imageUrl)}
|
||||||
|
alt={p.name}
|
||||||
|
className="h-10 w-10 rounded-lg border border-(--color-border-light) object-cover"
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
<td className="px-4 py-3">
|
<td className="px-4 py-3">
|
||||||
<div>
|
<div>
|
||||||
<p className="text-foreground font-medium">{p.name}</p>
|
<p className="text-foreground font-medium">{p.name}</p>
|
||||||
|
|||||||
@@ -123,10 +123,12 @@ export function CartProvider({ children }: { children: React.ReactNode }) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (error) createCartFunc();
|
if (error) {
|
||||||
else {
|
createCartFunc();
|
||||||
|
} else if (!cartId) {
|
||||||
const localCartId = localStorage.getItem(CART_ID);
|
const localCartId = localStorage.getItem(CART_ID);
|
||||||
if (localCartId) setCartId(localCartId);
|
if (localCartId) setCartId(localCartId);
|
||||||
|
else createCartFunc();
|
||||||
}
|
}
|
||||||
}, [eateryData, createCart, data, loading, error]);
|
}, [eateryData, createCart, data, loading, error]);
|
||||||
|
|
||||||
@@ -148,14 +150,16 @@ export function CartProvider({ children }: { children: React.ReactNode }) {
|
|||||||
if (result) setCart(result.addItem);
|
if (result) setCart(result.addItem);
|
||||||
};
|
};
|
||||||
|
|
||||||
const setQuantity = async (id: string, quantity: number) => {
|
const setQuantity = async (id: string, newQuantity: number) => {
|
||||||
if (!cartId) return;
|
if (!cartId) return;
|
||||||
|
|
||||||
|
const currentItem = cart.items.find((i) => i.productId == id);
|
||||||
|
|
||||||
const { data: result } = await addMenuItem({
|
const { data: result } = await addMenuItem({
|
||||||
variables: {
|
variables: {
|
||||||
cartId,
|
cartId,
|
||||||
menuItemId: id,
|
menuItemId: id,
|
||||||
quantity,
|
quantity: newQuantity - currentItem!.quantity,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
+21
-1
@@ -51,6 +51,7 @@ const GET_EATERY_MENU = gql`
|
|||||||
menuItems {
|
menuItems {
|
||||||
id
|
id
|
||||||
name
|
name
|
||||||
|
imageUrl
|
||||||
available
|
available
|
||||||
description
|
description
|
||||||
price
|
price
|
||||||
@@ -64,6 +65,7 @@ const ADD_MENU_ITEM = gql`
|
|||||||
addMenuItem(menuItem: $menuItem) {
|
addMenuItem(menuItem: $menuItem) {
|
||||||
id
|
id
|
||||||
name
|
name
|
||||||
|
imageUrl
|
||||||
available
|
available
|
||||||
description
|
description
|
||||||
price
|
price
|
||||||
@@ -76,6 +78,7 @@ const UPDATE_MENU_ITEM = gql`
|
|||||||
updateMenuItem(menuItem: $menuItem) {
|
updateMenuItem(menuItem: $menuItem) {
|
||||||
id
|
id
|
||||||
name
|
name
|
||||||
|
imageUrl
|
||||||
available
|
available
|
||||||
description
|
description
|
||||||
price
|
price
|
||||||
@@ -129,7 +132,24 @@ export function ManagerProvider({ children }: { children: ReactNode }) {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
if (data) setProducts((prev) => [...prev, data.addMenuItem]);
|
if (!data) return;
|
||||||
|
|
||||||
|
// addMenuItem backend does not persist imageUrl (constructor only maps name+price).
|
||||||
|
// If the caller provided an imageUrl, patch it immediately via updateMenuItem
|
||||||
|
// which uses MapStruct and correctly saves all fields.
|
||||||
|
if (product.imageUrl && data.addMenuItem?.id) {
|
||||||
|
const { data: updated } = await mutateUpdateMenuItem({
|
||||||
|
variables: {
|
||||||
|
menuItem: { id: data.addMenuItem.id, imageUrl: product.imageUrl },
|
||||||
|
},
|
||||||
|
});
|
||||||
|
if (updated) {
|
||||||
|
setProducts((prev) => [...prev, updated.updateMenuItem]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setProducts((prev) => [...prev, data.addMenuItem]);
|
||||||
};
|
};
|
||||||
|
|
||||||
const updateProduct = async (product: MenuItemEntity) => {
|
const updateProduct = async (product: MenuItemEntity) => {
|
||||||
|
|||||||
+1
-1
@@ -20,7 +20,7 @@ const nextConfig: NextConfig = {
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
async rewrites() {
|
async rewrites() {
|
||||||
const gatewayUrl = "http://host.docker.internal:32080";
|
const gatewayUrl = "http://localhost:32080";
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
source: "/api/:path*",
|
source: "/api/:path*",
|
||||||
|
|||||||
Generated
+236
-104
@@ -8,15 +8,16 @@
|
|||||||
"name": "temp",
|
"name": "temp",
|
||||||
"version": "1.2.8",
|
"version": "1.2.8",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@tailwindcss/postcss": "^4.2.2",
|
"@apollo/client": "^4.1.9",
|
||||||
"@types/node": "^20.19.37",
|
"@tailwindcss/postcss": "^4.2.4",
|
||||||
|
"@types/node": "^20.19.39",
|
||||||
"@types/react": "^19.2.14",
|
"@types/react": "^19.2.14",
|
||||||
|
"graphql": "^16.14.0",
|
||||||
"next": "16.1.7",
|
"next": "16.1.7",
|
||||||
"nextjs": "^0.0.3",
|
|
||||||
"react": "19.2.3",
|
"react": "19.2.3",
|
||||||
"react-dom": "19.2.3",
|
"react-dom": "19.2.3",
|
||||||
"tailwind": "^4.0.0",
|
"tailwind": "^4.0.0",
|
||||||
"tailwindcss": "^4.2.2",
|
"tailwindcss": "^4.2.4",
|
||||||
"typescript": "^5.9.3"
|
"typescript": "^5.9.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@@ -27,10 +28,10 @@
|
|||||||
"@types/react-dom": "^19.2.3",
|
"@types/react-dom": "^19.2.3",
|
||||||
"eslint": "^9.39.4",
|
"eslint": "^9.39.4",
|
||||||
"eslint-config-next": "16.1.7",
|
"eslint-config-next": "16.1.7",
|
||||||
"prettier": "^3.8.1",
|
"prettier": "^3.8.3",
|
||||||
"prettier-plugin-embed": "^0.5.1",
|
"prettier-plugin-embed": "^0.5.1",
|
||||||
"prettier-plugin-groovy": "^0.2.1",
|
"prettier-plugin-groovy": "^0.2.1",
|
||||||
"prettier-plugin-tailwindcss": "^0.7.2",
|
"prettier-plugin-tailwindcss": "^0.7.4",
|
||||||
"semantic-release": "^25.0.3"
|
"semantic-release": "^25.0.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -95,6 +96,43 @@
|
|||||||
"url": "https://github.com/sponsors/sindresorhus"
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@apollo/client": {
|
||||||
|
"version": "4.1.9",
|
||||||
|
"resolved": "https://registry.npmjs.org/@apollo/client/-/client-4.1.9.tgz",
|
||||||
|
"integrity": "sha512-qfpkQD51tdU/7iAR6aLb4w9o/L7I475DluWHRb61U/3Q0AH29nNOxOBHjBbWDdf16ncPOoQuxne1sEs2NjqBFw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@graphql-typed-document-node/core": "^3.1.1",
|
||||||
|
"@wry/caches": "^1.0.0",
|
||||||
|
"@wry/equality": "^0.5.6",
|
||||||
|
"@wry/trie": "^0.5.0",
|
||||||
|
"graphql-tag": "^2.12.6",
|
||||||
|
"optimism": "^0.18.0",
|
||||||
|
"tslib": "^2.3.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"graphql": "^16.0.0",
|
||||||
|
"graphql-ws": "^5.5.5 || ^6.0.3",
|
||||||
|
"react": "^17.0.0 || ^18.0.0 || >=19.0.0-rc",
|
||||||
|
"react-dom": "^17.0.0 || ^18.0.0 || >=19.0.0-rc",
|
||||||
|
"rxjs": "^7.3.0",
|
||||||
|
"subscriptions-transport-ws": "^0.9.0 || ^0.11.0"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"graphql-ws": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"react": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"react-dom": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"subscriptions-transport-ws": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@babel/code-frame": {
|
"node_modules/@babel/code-frame": {
|
||||||
"version": "7.29.0",
|
"version": "7.29.0",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
|
||||||
@@ -598,6 +636,15 @@
|
|||||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@graphql-typed-document-node/core": {
|
||||||
|
"version": "3.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz",
|
||||||
|
"integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==",
|
||||||
|
"license": "MIT",
|
||||||
|
"peerDependencies": {
|
||||||
|
"graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@humanfs/core": {
|
"node_modules/@humanfs/core": {
|
||||||
"version": "0.19.1",
|
"version": "0.19.1",
|
||||||
"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
|
"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
|
||||||
@@ -2119,47 +2166,47 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/node": {
|
"node_modules/@tailwindcss/node": {
|
||||||
"version": "4.2.2",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.0.tgz",
|
||||||
"integrity": "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==",
|
"integrity": "sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@jridgewell/remapping": "^2.3.5",
|
"@jridgewell/remapping": "^2.3.5",
|
||||||
"enhanced-resolve": "^5.19.0",
|
"enhanced-resolve": "^5.21.0",
|
||||||
"jiti": "^2.6.1",
|
"jiti": "^2.6.1",
|
||||||
"lightningcss": "1.32.0",
|
"lightningcss": "1.32.0",
|
||||||
"magic-string": "^0.30.21",
|
"magic-string": "^0.30.21",
|
||||||
"source-map-js": "^1.2.1",
|
"source-map-js": "^1.2.1",
|
||||||
"tailwindcss": "4.2.2"
|
"tailwindcss": "4.3.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/oxide": {
|
"node_modules/@tailwindcss/oxide": {
|
||||||
"version": "4.2.2",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.0.tgz",
|
||||||
"integrity": "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==",
|
"integrity": "sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 20"
|
"node": ">= 20"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"@tailwindcss/oxide-android-arm64": "4.2.2",
|
"@tailwindcss/oxide-android-arm64": "4.3.0",
|
||||||
"@tailwindcss/oxide-darwin-arm64": "4.2.2",
|
"@tailwindcss/oxide-darwin-arm64": "4.3.0",
|
||||||
"@tailwindcss/oxide-darwin-x64": "4.2.2",
|
"@tailwindcss/oxide-darwin-x64": "4.3.0",
|
||||||
"@tailwindcss/oxide-freebsd-x64": "4.2.2",
|
"@tailwindcss/oxide-freebsd-x64": "4.3.0",
|
||||||
"@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2",
|
"@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.0",
|
||||||
"@tailwindcss/oxide-linux-arm64-gnu": "4.2.2",
|
"@tailwindcss/oxide-linux-arm64-gnu": "4.3.0",
|
||||||
"@tailwindcss/oxide-linux-arm64-musl": "4.2.2",
|
"@tailwindcss/oxide-linux-arm64-musl": "4.3.0",
|
||||||
"@tailwindcss/oxide-linux-x64-gnu": "4.2.2",
|
"@tailwindcss/oxide-linux-x64-gnu": "4.3.0",
|
||||||
"@tailwindcss/oxide-linux-x64-musl": "4.2.2",
|
"@tailwindcss/oxide-linux-x64-musl": "4.3.0",
|
||||||
"@tailwindcss/oxide-wasm32-wasi": "4.2.2",
|
"@tailwindcss/oxide-wasm32-wasi": "4.3.0",
|
||||||
"@tailwindcss/oxide-win32-arm64-msvc": "4.2.2",
|
"@tailwindcss/oxide-win32-arm64-msvc": "4.3.0",
|
||||||
"@tailwindcss/oxide-win32-x64-msvc": "4.2.2"
|
"@tailwindcss/oxide-win32-x64-msvc": "4.3.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/oxide-android-arm64": {
|
"node_modules/@tailwindcss/oxide-android-arm64": {
|
||||||
"version": "4.2.2",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.0.tgz",
|
||||||
"integrity": "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==",
|
"integrity": "sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -2173,9 +2220,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/oxide-darwin-arm64": {
|
"node_modules/@tailwindcss/oxide-darwin-arm64": {
|
||||||
"version": "4.2.2",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.0.tgz",
|
||||||
"integrity": "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==",
|
"integrity": "sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -2189,9 +2236,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/oxide-darwin-x64": {
|
"node_modules/@tailwindcss/oxide-darwin-x64": {
|
||||||
"version": "4.2.2",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.0.tgz",
|
||||||
"integrity": "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==",
|
"integrity": "sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@@ -2205,9 +2252,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/oxide-freebsd-x64": {
|
"node_modules/@tailwindcss/oxide-freebsd-x64": {
|
||||||
"version": "4.2.2",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.0.tgz",
|
||||||
"integrity": "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==",
|
"integrity": "sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@@ -2221,9 +2268,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
|
"node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
|
||||||
"version": "4.2.2",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.0.tgz",
|
||||||
"integrity": "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==",
|
"integrity": "sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm"
|
"arm"
|
||||||
],
|
],
|
||||||
@@ -2237,9 +2284,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
|
"node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
|
||||||
"version": "4.2.2",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.0.tgz",
|
||||||
"integrity": "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==",
|
"integrity": "sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -2253,9 +2300,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/oxide-linux-arm64-musl": {
|
"node_modules/@tailwindcss/oxide-linux-arm64-musl": {
|
||||||
"version": "4.2.2",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.0.tgz",
|
||||||
"integrity": "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==",
|
"integrity": "sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -2269,9 +2316,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/oxide-linux-x64-gnu": {
|
"node_modules/@tailwindcss/oxide-linux-x64-gnu": {
|
||||||
"version": "4.2.2",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.0.tgz",
|
||||||
"integrity": "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==",
|
"integrity": "sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@@ -2285,9 +2332,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/oxide-linux-x64-musl": {
|
"node_modules/@tailwindcss/oxide-linux-x64-musl": {
|
||||||
"version": "4.2.2",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.0.tgz",
|
||||||
"integrity": "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==",
|
"integrity": "sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@@ -2301,9 +2348,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/oxide-wasm32-wasi": {
|
"node_modules/@tailwindcss/oxide-wasm32-wasi": {
|
||||||
"version": "4.2.2",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.0.tgz",
|
||||||
"integrity": "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==",
|
"integrity": "sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==",
|
||||||
"bundleDependencies": [
|
"bundleDependencies": [
|
||||||
"@napi-rs/wasm-runtime",
|
"@napi-rs/wasm-runtime",
|
||||||
"@emnapi/core",
|
"@emnapi/core",
|
||||||
@@ -2318,10 +2365,10 @@
|
|||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@emnapi/core": "^1.8.1",
|
"@emnapi/core": "^1.10.0",
|
||||||
"@emnapi/runtime": "^1.8.1",
|
"@emnapi/runtime": "^1.10.0",
|
||||||
"@emnapi/wasi-threads": "^1.1.0",
|
"@emnapi/wasi-threads": "^1.2.1",
|
||||||
"@napi-rs/wasm-runtime": "^1.1.1",
|
"@napi-rs/wasm-runtime": "^1.1.4",
|
||||||
"@tybys/wasm-util": "^0.10.1",
|
"@tybys/wasm-util": "^0.10.1",
|
||||||
"tslib": "^2.8.1"
|
"tslib": "^2.8.1"
|
||||||
},
|
},
|
||||||
@@ -2330,9 +2377,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
|
"node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
|
||||||
"version": "4.2.2",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.0.tgz",
|
||||||
"integrity": "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==",
|
"integrity": "sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -2346,9 +2393,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/oxide-win32-x64-msvc": {
|
"node_modules/@tailwindcss/oxide-win32-x64-msvc": {
|
||||||
"version": "4.2.2",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.0.tgz",
|
||||||
"integrity": "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==",
|
"integrity": "sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@@ -2362,16 +2409,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@tailwindcss/postcss": {
|
"node_modules/@tailwindcss/postcss": {
|
||||||
"version": "4.2.2",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.0.tgz",
|
||||||
"integrity": "sha512-n4goKQbW8RVXIbNKRB/45LzyUqN451deQK0nzIeauVEqjlI49slUlgKYJM2QyUzap/PcpnS7kzSUmPb1sCRvYQ==",
|
"integrity": "sha512-Jm05Tjx+9yCLGv5qw1c+84Psds8MnyrEQYCB+FFk2lgGiUjlRqdxke4mVTuYrj2xnVZqKim2Apr5ySuQRYAw/w==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@alloc/quick-lru": "^5.2.0",
|
"@alloc/quick-lru": "^5.2.0",
|
||||||
"@tailwindcss/node": "4.2.2",
|
"@tailwindcss/node": "4.3.0",
|
||||||
"@tailwindcss/oxide": "4.2.2",
|
"@tailwindcss/oxide": "4.3.0",
|
||||||
"postcss": "^8.5.6",
|
"postcss": "^8.5.10",
|
||||||
"tailwindcss": "4.2.2"
|
"tailwindcss": "4.3.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@trivago/prettier-plugin-sort-imports": {
|
"node_modules/@trivago/prettier-plugin-sort-imports": {
|
||||||
@@ -2495,9 +2542,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@types/node": {
|
"node_modules/@types/node": {
|
||||||
"version": "20.19.37",
|
"version": "20.19.41",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.37.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.41.tgz",
|
||||||
"integrity": "sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==",
|
"integrity": "sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"undici-types": "~6.21.0"
|
"undici-types": "~6.21.0"
|
||||||
@@ -3090,6 +3137,54 @@
|
|||||||
"win32"
|
"win32"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"node_modules/@wry/caches": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@wry/caches/-/caches-1.0.1.tgz",
|
||||||
|
"integrity": "sha512-bXuaUNLVVkD20wcGBWRyo7j9N3TxePEWFZj2Y+r9OoUzfqmavM84+mFykRicNsBqatba5JLay1t48wxaXaWnlA==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"tslib": "^2.3.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@wry/context": {
|
||||||
|
"version": "0.7.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@wry/context/-/context-0.7.4.tgz",
|
||||||
|
"integrity": "sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"tslib": "^2.3.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@wry/equality": {
|
||||||
|
"version": "0.5.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.5.7.tgz",
|
||||||
|
"integrity": "sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"tslib": "^2.3.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@wry/trie": {
|
||||||
|
"version": "0.5.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.5.0.tgz",
|
||||||
|
"integrity": "sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"tslib": "^2.3.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/accepts": {
|
"node_modules/accepts": {
|
||||||
"version": "1.3.8",
|
"version": "1.3.8",
|
||||||
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
|
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
|
||||||
@@ -4864,13 +4959,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/enhanced-resolve": {
|
"node_modules/enhanced-resolve": {
|
||||||
"version": "5.20.1",
|
"version": "5.21.3",
|
||||||
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz",
|
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.3.tgz",
|
||||||
"integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==",
|
"integrity": "sha512-QyL119InA+XXEkNLNTPCXPugSvOfhwv0JOlGNzvxs0hZaiHLNvXSpudUWsOlsXGWJh8G6ckCScEkVHfX3kw/2Q==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"graceful-fs": "^4.2.4",
|
"graceful-fs": "^4.2.4",
|
||||||
"tapable": "^2.3.0"
|
"tapable": "^2.3.3"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=10.13.0"
|
"node": ">=10.13.0"
|
||||||
@@ -6715,6 +6810,30 @@
|
|||||||
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
|
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
|
||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
|
"node_modules/graphql": {
|
||||||
|
"version": "16.14.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/graphql/-/graphql-16.14.0.tgz",
|
||||||
|
"integrity": "sha512-BBvQ/406p+4CZbTpCbVPSxfzrZrbnuWSP1ELYgyS6B+hNeKzgrdB4JczCa5VZUBQrDa9hUngm0KnexY6pJRN5Q==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/graphql-tag": {
|
||||||
|
"version": "2.12.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz",
|
||||||
|
"integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"tslib": "^2.1.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/handlebars": {
|
"node_modules/handlebars": {
|
||||||
"version": "4.7.9",
|
"version": "4.7.9",
|
||||||
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz",
|
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz",
|
||||||
@@ -8825,15 +8944,6 @@
|
|||||||
"node": "^10 || ^12 || >=14"
|
"node": "^10 || ^12 || >=14"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/nextjs": {
|
|
||||||
"version": "0.0.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/nextjs/-/nextjs-0.0.3.tgz",
|
|
||||||
"integrity": "sha512-mYbDUo4/sRAZ8TqK63PCpYnFiLg7BICG/ot9+guOrUKd4/Fo71ZmEQ41IZbH6nqbQvG7SXTBuofJXAIWfNho0w==",
|
|
||||||
"license": "MIT",
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.8.21"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/nocache": {
|
"node_modules/nocache": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/nocache/-/nocache-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/nocache/-/nocache-2.0.0.tgz",
|
||||||
@@ -11083,6 +11193,18 @@
|
|||||||
"url": "https://github.com/sponsors/sindresorhus"
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/optimism": {
|
||||||
|
"version": "0.18.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/optimism/-/optimism-0.18.1.tgz",
|
||||||
|
"integrity": "sha512-mLXNwWPa9dgFyDqkNi54sjDyNJ9/fTI6WGBLgnXku1vdKY/jovHfZT5r+aiVeFFLOz+foPNOm5YJ4mqgld2GBQ==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@wry/caches": "^1.0.0",
|
||||||
|
"@wry/context": "^0.7.0",
|
||||||
|
"@wry/trie": "^0.5.0",
|
||||||
|
"tslib": "^2.3.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/optionator": {
|
"node_modules/optionator": {
|
||||||
"version": "0.9.4",
|
"version": "0.9.4",
|
||||||
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
|
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
|
||||||
@@ -11573,9 +11695,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/postcss": {
|
"node_modules/postcss": {
|
||||||
"version": "8.5.8",
|
"version": "8.5.14",
|
||||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz",
|
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz",
|
||||||
"integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==",
|
"integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==",
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
"type": "opencollective",
|
"type": "opencollective",
|
||||||
@@ -11611,9 +11733,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/prettier": {
|
"node_modules/prettier": {
|
||||||
"version": "3.8.1",
|
"version": "3.8.3",
|
||||||
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz",
|
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz",
|
||||||
"integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==",
|
"integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"bin": {
|
"bin": {
|
||||||
@@ -11671,9 +11793,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/prettier-plugin-tailwindcss": {
|
"node_modules/prettier-plugin-tailwindcss": {
|
||||||
"version": "0.7.2",
|
"version": "0.7.4",
|
||||||
"resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.7.2.tgz",
|
"resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.7.4.tgz",
|
||||||
"integrity": "sha512-LkphyK3Fw+q2HdMOoiEHWf93fNtYJwfamoKPl7UwtjFQdei/iIBoX11G6j706FzN3ymX9mPVi97qIY8328vdnA==",
|
"integrity": "sha512-UKii4RjY05SNt/WQi6/NcOn/LsT0/ILLXsxygjbRg5/YZelsSu5jTqorYHPDGq4nZy5q5hpCu+XdGZ1xaJEQgw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -12228,6 +12350,16 @@
|
|||||||
"queue-microtask": "^1.2.2"
|
"queue-microtask": "^1.2.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/rxjs": {
|
||||||
|
"version": "7.8.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
|
||||||
|
"integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"peer": true,
|
||||||
|
"dependencies": {
|
||||||
|
"tslib": "^2.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/safe-array-concat": {
|
"node_modules/safe-array-concat": {
|
||||||
"version": "1.1.3",
|
"version": "1.1.3",
|
||||||
"resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
|
||||||
@@ -13383,15 +13515,15 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/tailwindcss": {
|
"node_modules/tailwindcss": {
|
||||||
"version": "4.2.2",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz",
|
||||||
"integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==",
|
"integrity": "sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/tapable": {
|
"node_modules/tapable": {
|
||||||
"version": "2.3.0",
|
"version": "2.3.3",
|
||||||
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz",
|
||||||
"integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==",
|
"integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6"
|
"node": ">=6"
|
||||||
|
|||||||
Reference in New Issue
Block a user