From 25f29bda7b897cdfa770d165e16d925624247bf5 Mon Sep 17 00:00:00 2001 From: Universe Date: Sun, 8 Feb 2026 01:31:11 +0900 Subject: [PATCH 1/8] Refactor DataTablePagination component to enhance pagination functionality - Removed unused pagination icons and integrated a new pagination structure using the `Pagination` component. - Implemented a `getVisiblePageRange` function to dynamically calculate visible page numbers and ellipses based on the current page index and total page count. - Updated the layout for improved responsiveness and user experience, including better spacing and alignment of pagination controls. --- .../data-table/data-table-pagination.tsx | 152 +++++++++++------- 1 file changed, 97 insertions(+), 55 deletions(-) diff --git a/editor/components/data-table/data-table-pagination.tsx b/editor/components/data-table/data-table-pagination.tsx index f91d425018..1a0995d925 100644 --- a/editor/components/data-table/data-table-pagination.tsx +++ b/editor/components/data-table/data-table-pagination.tsx @@ -1,12 +1,13 @@ import { Table } from "@tanstack/react-table"; -import { - ChevronLeft, - ChevronRight, - ChevronsLeft, - ChevronsRight, -} from "lucide-react"; +import { ChevronLeft, ChevronRight } from "lucide-react"; import { Button } from "@/components/ui/button"; +import { + Pagination, + PaginationContent, + PaginationEllipsis, + PaginationItem, +} from "@/components/ui/pagination"; import { Select, SelectContent, @@ -19,18 +20,50 @@ interface DataTablePaginationProps { table: Table; } +function getVisiblePageRange( + pageIndex: number, + pageCount: number, + siblingCount = 1 +): (number | "ellipsis-left" | "ellipsis-right")[] { + // When empty (0 rows), still show page 1 + if (pageCount <= 0) return [0]; + const totalVisible = siblingCount * 2 + 3; // e.g. 1 ... 4 5 6 ... 10 + if (pageCount <= totalVisible) { + return Array.from({ length: pageCount }, (_, i) => i); + } + const left = Math.max(0, pageIndex - siblingCount); + const right = Math.min(pageCount - 1, pageIndex + siblingCount); + const showLeftEllipsis = left > 1; + const showRightEllipsis = right < pageCount - 2; + const pages: (number | "ellipsis-left" | "ellipsis-right")[] = []; + if (showLeftEllipsis) { + pages.push(0, "ellipsis-left"); + } + for (let i = left; i <= right; i++) { + pages.push(i); + } + if (showRightEllipsis) { + pages.push("ellipsis-right", pageCount - 1); + } + return pages; +} + export function DataTablePagination({ table, }: DataTablePaginationProps) { + const pageIndex = table.getState().pagination.pageIndex; + const pageCount = table.getPageCount(); + const visiblePages = getVisiblePageRange(pageIndex, pageCount); + return ( -
-
- {table.getFilteredSelectedRowModel().rows.length} of{" "} - {table.getFilteredRowModel().rows.length} row(s) selected. -
-
+
+
+

+ {table.getFilteredSelectedRowModel().rows.length} of{" "} + {table.getFilteredRowModel().rows.length} row(s) selected. +

-

Rows per page

+

Rows per page

-
- Page {table.getState().pagination.pageIndex + 1} of{" "} - {table.getPageCount()} -
-
- - - - -
+ + + + + + {visiblePages.map((page, i) => + page === "ellipsis-left" || page === "ellipsis-right" ? ( + + + + ) : ( + + + + ) + )} + + + + +
); } From 17333c1c48887799e5cd21bb79c025572a0e6631 Mon Sep 17 00:00:00 2001 From: Universe Date: Sun, 8 Feb 2026 01:33:03 +0900 Subject: [PATCH 2/8] chore --- .../[org]/[proj]/(console)/(resources)/customers/page.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/editor/app/(workbench)/[org]/[proj]/(console)/(resources)/customers/page.tsx b/editor/app/(workbench)/[org]/[proj]/(console)/(resources)/customers/page.tsx index 5c8b7c6e44..08c494c05c 100644 --- a/editor/app/(workbench)/[org]/[proj]/(console)/(resources)/customers/page.tsx +++ b/editor/app/(workbench)/[org]/[proj]/(console)/(resources)/customers/page.tsx @@ -353,6 +353,7 @@ function NewButton({ onNewData }: { onNewData?: () => void }) { toast.error("Failed to create customer"); return false; } + onNewData?.(); return true; }} /> From f59a82066b528ed21cabe9f85fb019e411ba4e25 Mon Sep 17 00:00:00 2001 From: Universe Date: Sun, 8 Feb 2026 01:46:49 +0900 Subject: [PATCH 3/8] Add campaign deletion functionality and UI integration - Implemented a new DELETE route for campaigns, allowing for the removal of campaigns and associated data through the API. - Enhanced the campaign settings UI with a "Danger Zone" tab, featuring a delete confirmation dialog for irreversible actions. - Integrated project context and error handling for the delete operation, ensuring proper user feedback and navigation post-deletion. - Added tests to validate the campaign deletion process and ensure compliance with RLS policies. --- .../west/campaigns/[campaign_id]/route.ts | 69 +++++ .../[campaign]/_components/settings.tsx | 72 +++++ ...a_west_referral_campaign_rls_test_test.sql | 262 ++++++++++++++++++ 3 files changed, 403 insertions(+) create mode 100644 editor/app/(api)/private/west/campaigns/[campaign_id]/route.ts create mode 100644 supabase/tests/grida_west_referral_campaign_rls_test_test.sql diff --git a/editor/app/(api)/private/west/campaigns/[campaign_id]/route.ts b/editor/app/(api)/private/west/campaigns/[campaign_id]/route.ts new file mode 100644 index 0000000000..d51fd8a4ee --- /dev/null +++ b/editor/app/(api)/private/west/campaigns/[campaign_id]/route.ts @@ -0,0 +1,69 @@ +import { + createWestReferralClient, + service_role, +} from "@/lib/supabase/server"; +import { headers } from "next/headers"; +import { NextRequest, NextResponse } from "next/server"; + +type Context = { + params: Promise<{ campaign_id: string }>; +}; + +export async function DELETE(req: NextRequest, context: Context) { + const { campaign_id } = await context.params; + const headerList = await headers(); + + const project_id = Number( + headerList.get("x-grida-editor-user-current-project-id") + ); + + if (!project_id || Number.isNaN(project_id)) { + return NextResponse.json( + { error: "Missing or invalid project id" }, + { status: 400 } + ); + } + + // Verify the campaign exists and belongs to the project. + // This client uses the caller's session (cookie-based, publishable key), + // so RLS is enforced — only org members can see the campaign row. + const client = await createWestReferralClient(); + + const { data: campaign, error: fetchErr } = await client + .from("campaign") + .select("id, project_id") + .eq("id", campaign_id) + .eq("project_id", project_id) + .single(); + + if (fetchErr || !campaign) { + return NextResponse.json( + { error: "Campaign not found" }, + { status: 404 } + ); + } + + // Delete the parent document — this cascades to the campaign row + // and all related tables. The campaign table has a trigger + // (trg_prevent_orphan_document_subtype) that blocks direct deletion + // of the subtype; the document row must be deleted instead. + // + // We use service_role because the document table lives in the public + // schema and the caller's session may lack direct DELETE grant. + // The RLS-protected SELECT above is the authorization gate. + const { error: docErr } = await service_role.workspace + .from("document") + .delete() + .eq("id", campaign_id) + .eq("project_id", project_id); + + if (docErr) { + console.error("Failed to delete campaign", docErr); + return NextResponse.json( + { error: "Failed to delete campaign" }, + { status: 500 } + ); + } + + return NextResponse.json({ data: { id: campaign_id } }, { status: 200 }); +} diff --git a/editor/app/(workbench)/[org]/[proj]/(console)/(campaign)/campaigns/[campaign]/_components/settings.tsx b/editor/app/(workbench)/[org]/[proj]/(console)/(campaign)/campaigns/[campaign]/_components/settings.tsx index baf03dad76..5c38093f88 100644 --- a/editor/app/(workbench)/[org]/[proj]/(console)/(campaign)/campaigns/[campaign]/_components/settings.tsx +++ b/editor/app/(workbench)/[org]/[proj]/(console)/(campaign)/campaigns/[campaign]/_components/settings.tsx @@ -72,6 +72,9 @@ import { Platform } from "@/lib/platform"; import { Spinner } from "@/components/ui/spinner"; import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { useUnsavedChangesWarning } from "@/hooks/use-unsaved-changes-warning"; +import { DeleteConfirmationAlertDialog } from "@/components/dialogs/delete-confirmation-dialog"; +import { useProject } from "@/scaffolds/workspace"; +import { useRouter } from "next/navigation"; import type { Database } from "@app/database"; // Timezone options @@ -215,6 +218,9 @@ function Body({ }) { const [isSubmitting, setIsSubmitting] = useState(false); const [activeTab, setActiveTab] = useState("general"); + const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); + const project = useProject(); + const router = useRouter(); const form = useForm({ resolver: zodResolver(formSchema) as any, @@ -262,6 +268,12 @@ function Body({ Events Security Advanced + + Danger Zone + @@ -614,6 +626,66 @@ function Body({
)} + + {activeTab === "danger" && ( +
+

+ Danger Zone +

+

+ Irreversible actions for this campaign. +

+
+
+
+

Delete Campaign

+

+ Permanently delete this campaign and all associated + data, including participants, rewards, challenges, and + events. This action cannot be undone. +

+
+ +
+
+ { + const res = await fetch( + `/private/west/campaigns/${campaign_id}`, + { + method: "DELETE", + headers: { + "x-grida-editor-user-current-project-id": + project.id.toString(), + }, + } + ); + if (!res.ok) { + const body = await res.json().catch(() => ({})); + toast.error(body.error ?? "Failed to delete campaign"); + return false; + } + toast.success("Campaign deleted"); + router.push( + `/${project.organization_name}/${project.name}/campaigns` + ); + return true; + }} + /> +
+ )} diff --git a/supabase/tests/grida_west_referral_campaign_rls_test_test.sql b/supabase/tests/grida_west_referral_campaign_rls_test_test.sql new file mode 100644 index 0000000000..01e6f1dc66 --- /dev/null +++ b/supabase/tests/grida_west_referral_campaign_rls_test_test.sql @@ -0,0 +1,262 @@ +BEGIN; +SELECT plan(10); + +-- --------------------------------------------------------------------------- +-- Setup: create throwaway projects and campaign fixtures under seeded orgs. +-- --------------------------------------------------------------------------- +DO $$ +DECLARE + local_org_id bigint; + acme_org_id bigint; + local_project_id bigint; + acme_project_id bigint; + local_project_name text := + 'wrl-' || substr(replace(gen_random_uuid()::text, '-', ''), 1, 8); + acme_project_name text := + 'wra-' || substr(replace(gen_random_uuid()::text, '-', ''), 1, 8); + local_campaign_id uuid; + acme_campaign_id uuid; + rogue_doc_for_acme uuid; + rogue_doc_for_local uuid; +BEGIN + -- Resolve seeded orgs + SELECT id INTO local_org_id FROM public.organization WHERE name = 'local' LIMIT 1; + IF local_org_id IS NULL THEN + RAISE EXCEPTION 'seed org "local" not found'; + END IF; + + SELECT id INTO acme_org_id FROM public.organization WHERE name = 'acme' LIMIT 1; + IF acme_org_id IS NULL THEN + RAISE EXCEPTION 'seed org "acme" not found'; + END IF; + + -- Create projects (service_role bypasses RLS) + SET LOCAL ROLE service_role; + + INSERT INTO public.project (organization_id, name) + VALUES (local_org_id, local_project_name) + RETURNING id INTO local_project_id; + + INSERT INTO public.project (organization_id, name) + VALUES (acme_org_id, acme_project_name) + RETURNING id INTO acme_project_id; + + -- Create base documents (campaign id = document id) + local_campaign_id := gen_random_uuid(); + acme_campaign_id := gen_random_uuid(); + + INSERT INTO public.document (id, doctype, project_id, title) + VALUES (local_campaign_id, 'v0_campaign_referral', local_project_id, 'Local Campaign'); + + INSERT INTO public.document (id, doctype, project_id, title) + VALUES (acme_campaign_id, 'v0_campaign_referral', acme_project_id, 'Acme Campaign'); + + -- Create campaigns + INSERT INTO grida_west_referral.campaign (id, project_id, title) + VALUES (local_campaign_id, local_project_id, 'Local Campaign'); + + INSERT INTO grida_west_referral.campaign (id, project_id, title) + VALUES (acme_campaign_id, acme_project_id, 'Acme Campaign'); + + -- Pre-create documents for the rogue INSERT tests. + -- This ensures a FK-valid id exists, so the only thing blocking the + -- cross-tenant INSERT is the RLS WITH CHECK policy (not the FK). + rogue_doc_for_acme := gen_random_uuid(); + rogue_doc_for_local := gen_random_uuid(); + + INSERT INTO public.document (id, doctype, project_id, title) + VALUES (rogue_doc_for_acme, 'v0_campaign_referral', acme_project_id, 'Rogue Acme'); + + INSERT INTO public.document (id, doctype, project_id, title) + VALUES (rogue_doc_for_local, 'v0_campaign_referral', local_project_id, 'Rogue Local'); + + RESET ROLE; + + -- Stash IDs for assertions + PERFORM set_config('test.project_id_local', local_project_id::text, false); + PERFORM set_config('test.project_id_acme', acme_project_id::text, false); + PERFORM set_config('test.campaign_id_local', local_campaign_id::text, false); + PERFORM set_config('test.campaign_id_acme', acme_campaign_id::text, false); + PERFORM set_config('test.rogue_doc_for_acme', rogue_doc_for_acme::text, false); + PERFORM set_config('test.rogue_doc_for_local', rogue_doc_for_local::text, false); +END $$; + +-- Helper: set auth context as authenticated user. +CREATE OR REPLACE FUNCTION test_set_auth(user_email text) +RETURNS void +LANGUAGE plpgsql +AS $$ +DECLARE + user_id uuid; +BEGIN + SELECT id INTO user_id FROM auth.users WHERE email = user_email; + IF user_id IS NULL THEN + RAISE EXCEPTION 'seed user not found: %', user_email; + END IF; + PERFORM set_config('request.jwt.claim.sub', user_id::text, true); + SET LOCAL ROLE authenticated; +END; +$$; + +-- Helper: reset auth context. +CREATE OR REPLACE FUNCTION test_reset_auth() +RETURNS void +LANGUAGE sql +AS $$ + SELECT set_config('request.jwt.claim.sub', '', true); + RESET ROLE; +$$; + +-- ===================================================================== +-- READ ISOLATION +-- ===================================================================== + +-- 1) Insider can read their own campaign +SELECT test_set_auth('insider@grida.co'); +SELECT ok( + EXISTS ( + SELECT 1 FROM grida_west_referral.campaign + WHERE id = current_setting('test.campaign_id_local')::uuid + ), + 'Insider can read own campaign' +); +SELECT test_reset_auth(); + +-- 2) Insider cannot read acme campaign (cross-tenant) +SELECT test_set_auth('insider@grida.co'); +SELECT ok( + NOT EXISTS ( + SELECT 1 FROM grida_west_referral.campaign + WHERE id = current_setting('test.campaign_id_acme')::uuid + ), + 'Insider cannot read acme campaign (cross-tenant)' +); +SELECT test_reset_auth(); + +-- 3) Alice can read her own campaign +SELECT test_set_auth('alice@acme.com'); +SELECT ok( + EXISTS ( + SELECT 1 FROM grida_west_referral.campaign + WHERE id = current_setting('test.campaign_id_acme')::uuid + ), + 'Alice can read own campaign' +); +SELECT test_reset_auth(); + +-- 4) Alice cannot read local campaign (cross-tenant) +SELECT test_set_auth('alice@acme.com'); +SELECT ok( + NOT EXISTS ( + SELECT 1 FROM grida_west_referral.campaign + WHERE id = current_setting('test.campaign_id_local')::uuid + ), + 'Alice cannot read local campaign (cross-tenant)' +); +SELECT test_reset_auth(); + +-- 5) Random user (no membership) cannot read any campaign +SELECT test_set_auth('random@example.com'); +SELECT ok( + NOT EXISTS ( + SELECT 1 FROM grida_west_referral.campaign + WHERE id = current_setting('test.campaign_id_local')::uuid + ), + 'Random user cannot read local campaign' +); +SELECT test_reset_auth(); + +-- 6) Random user (no membership) cannot read acme campaign +SELECT test_set_auth('random@example.com'); +SELECT ok( + NOT EXISTS ( + SELECT 1 FROM grida_west_referral.campaign + WHERE id = current_setting('test.campaign_id_acme')::uuid + ), + 'Random user cannot read acme campaign' +); +SELECT test_reset_auth(); + +-- ===================================================================== +-- WRITE ISOLATION (INSERT) +-- Uses pre-created document ids so the FK is satisfied. +-- The ONLY reason the insert should fail is the RLS WITH CHECK policy. +-- We check for error code 42501 (insufficient_privilege / RLS violation). +-- ===================================================================== + +-- 7) Insider cannot insert a campaign into acme project +SELECT test_set_auth('insider@grida.co'); +SELECT throws_ok( + format( + $$INSERT INTO grida_west_referral.campaign (id, project_id, title) VALUES (%L, %s, 'Rogue')$$, + current_setting('test.rogue_doc_for_acme')::uuid, + current_setting('test.project_id_acme')::bigint + ), + '42501', + NULL, + 'Insider cannot insert campaign into acme project (RLS)' +); +SELECT test_reset_auth(); + +-- 8) Alice cannot insert a campaign into local project +SELECT test_set_auth('alice@acme.com'); +SELECT throws_ok( + format( + $$INSERT INTO grida_west_referral.campaign (id, project_id, title) VALUES (%L, %s, 'Rogue')$$, + current_setting('test.rogue_doc_for_local')::uuid, + current_setting('test.project_id_local')::bigint + ), + '42501', + NULL, + 'Alice cannot insert campaign into local project (RLS)' +); +SELECT test_reset_auth(); + +-- ===================================================================== +-- UPDATE ISOLATION +-- The attacker attempts the UPDATE, then we switch to service_role +-- to verify the row title is unchanged. This avoids the false-positive +-- where the verification SELECT itself returns nothing due to RLS. +-- ===================================================================== + +-- 9) Insider cannot update acme campaign +SELECT test_set_auth('insider@grida.co'); +DO $$ +BEGIN + UPDATE grida_west_referral.campaign + SET title = 'Hacked' + WHERE id = current_setting('test.campaign_id_acme')::uuid; +END $$; +SELECT test_reset_auth(); + +-- Verify as service_role (bypasses RLS) that the row is unchanged +SET LOCAL ROLE service_role; +SELECT is( + (SELECT title FROM grida_west_referral.campaign + WHERE id = current_setting('test.campaign_id_acme')::uuid), + 'Acme Campaign', + 'Insider cannot update acme campaign (cross-tenant)' +); +RESET ROLE; + +-- 10) Alice cannot update local campaign +SELECT test_set_auth('alice@acme.com'); +DO $$ BEGIN + UPDATE grida_west_referral.campaign + SET title = 'Hacked' + WHERE id = current_setting('test.campaign_id_local')::uuid; +END $$; +SELECT test_reset_auth(); + +-- Verify as service_role (bypasses RLS) that the row is unchanged +SET LOCAL ROLE service_role; +SELECT is( + (SELECT title FROM grida_west_referral.campaign + WHERE id = current_setting('test.campaign_id_local')::uuid), + 'Local Campaign', + 'Alice cannot update local campaign (cross-tenant)' +); +RESET ROLE; + +SELECT * FROM finish(); +ROLLBACK; From e6cc435a31d87ba99f98acbc2d870e6237f03c93 Mon Sep 17 00:00:00 2001 From: Universe Date: Sun, 8 Feb 2026 01:57:16 +0900 Subject: [PATCH 4/8] chore: eslint --- editor/eslint.config.mjs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/editor/eslint.config.mjs b/editor/eslint.config.mjs index 2d6245ce4e..457f484465 100644 --- a/editor/eslint.config.mjs +++ b/editor/eslint.config.mjs @@ -31,11 +31,9 @@ const eslintConfig = defineConfig([ rules: { // preserve "@typescript-eslint/no-namespace": "off", + "@typescript-eslint/no-empty-object-type": "off", // remove when ready "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-empty-object-type": "off", - "@typescript-eslint/no-unused-vars": "off", - "@typescript-eslint/no-unused-expressions": "off", }, }, ...(PROGRESSIVE_ENABLEMENT From 1cc02292f716de0137378e11458ebf35f52551bd Mon Sep 17 00:00:00 2001 From: Universe Date: Sun, 8 Feb 2026 02:05:00 +0900 Subject: [PATCH 5/8] chore: docs --- .oxfmtrc.jsonc | 3 +++ AGENTS.md | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/.oxfmtrc.jsonc b/.oxfmtrc.jsonc index eb6dd73e02..7544734c88 100644 --- a/.oxfmtrc.jsonc +++ b/.oxfmtrc.jsonc @@ -5,4 +5,7 @@ // we're migrating from prettier to oxfmt, below will be removed once complete. "printWidth": 80, "trailingComma": "es5", + "experimentalSortPackageJson": { + "sortScripts": true, + }, } diff --git a/AGENTS.md b/AGENTS.md index 77f822381c..63af4aa451 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -63,6 +63,11 @@ Grida heavily relies on Supabase (PostgreSQL). - electron with electron-forge - vite +**Tooling** + +- Turborepo - monorepo build orchestration +- oxfmt (oxc) - code formatter + ## Documentation Documentation files are located in the `./docs` directory. From f3ff2851a5f2d01d859f9717ccaa63129e0b68df Mon Sep 17 00:00:00 2001 From: Universe Date: Sun, 8 Feb 2026 02:07:22 +0900 Subject: [PATCH 6/8] fmt **/package.json --- .../package.json | 14 ++--- .../editor-canvas/package.json | 20 +++---- .../editor-dashboard/package.json | 34 +++++------ .../editor-devtools/package.json | 12 ++-- .../editor-icons-module/package.json | 2 +- .../editor-icons-node/package.json | 8 +-- .../editor-isolated-inspection/package.json | 14 ++--- .../editor-live-session/package.json | 16 ++--- .../package.json | 2 +- .../editor-preview-pip/package.json | 56 +++++++++--------- .../editor-preview-vanilla/package.json | 36 ++++++------ .../editor-property/package.json | 16 ++--- .../editor-services-dart/package.json | 6 +- .../editor-services-esbuild/package.json | 2 +- .../package.json | 2 +- .../package.json | 8 +-- .../editor-services-prettier/package.json | 12 ++-- .../package.json | 2 +- .../editor-shortcuts/package.json | 2 +- .../editor-packages/editor-ui/package.json | 2 +- .../editor-use-sys-theme/package.json | 2 +- .legacy/editor/package.json | 6 +- .legacy/posts/package.json | 2 +- apps/backgrounds/package.json | 4 +- apps/blog/package.json | 14 ++--- apps/docs/package.json | 24 ++++---- apps/viewer/package.json | 4 +- crates/grida-canvas-wasm/package.json | 4 +- crates/grida-canvas/package.json | 2 +- crates/math2/package.json | 2 +- desktop/package.json | 18 +++--- editor/package.json | 10 ++-- package.json | 10 ++-- packages/.legacy/app-blocks/package.json | 42 +++++++------- .../app-fp-customer-support/package.json | 10 ++-- packages/.legacy/app-scene-view/package.json | 14 ++--- packages/.legacy/app/package.json | 2 +- packages/.legacy/core-events/package.json | 6 +- packages/.legacy/core-fs/package.json | 6 +- packages/.legacy/core-model/package.json | 8 +-- packages/.legacy/core-shortcuts/package.json | 6 +- packages/.legacy/core-state/package.json | 4 +- packages/.legacy/core-store/package.json | 10 ++-- packages/grida-canvas-bitmap/package.json | 2 +- packages/grida-canvas-cg/package.json | 28 ++++----- packages/grida-canvas-color/package.json | 30 +++++----- packages/grida-canvas-io-figma/package.json | 6 +- packages/grida-canvas-io-svg/package.json | 2 +- packages/grida-canvas-io/package.json | 6 +- packages/grida-canvas-pixelgrid/package.json | 30 +++++----- .../grida-canvas-react-timeline/package.json | 2 +- packages/grida-canvas-ruler/package.json | 30 +++++----- packages/grida-canvas-schema/package.json | 6 +- packages/grida-canvas-sequence/package.json | 28 ++++----- .../grida-canvas-tailwind-colors/package.json | 24 ++++---- packages/grida-canvas-tailwind/package.json | 4 +- .../package.json | 32 +++++----- packages/grida-canvas-vn/package.json | 20 +++---- packages/grida-cmath/package.json | 42 +++++++------- packages/grida-fonts/package.json | 6 +- packages/grida-format/package.json | 20 +++---- packages/grida-mixed-properties/package.json | 26 ++++----- packages/grida-number-input/package.json | 58 +++++++++---------- packages/grida-tokens/package.json | 30 +++++----- packages/lib/treearray/package.json | 30 +++++----- packages/react-p-queue/package.json | 40 ++++++------- .../package.json | 40 ++++++------- 67 files changed, 509 insertions(+), 509 deletions(-) diff --git a/.legacy/editor-packages/editor-canvas-renderer-bitmap/package.json b/.legacy/editor-packages/editor-canvas-renderer-bitmap/package.json index 3fe23d8e96..9b262d60d9 100644 --- a/.legacy/editor-packages/editor-canvas-renderer-bitmap/package.json +++ b/.legacy/editor-packages/editor-canvas-renderer-bitmap/package.json @@ -1,6 +1,12 @@ { "name": "@code-editor/canvas-renderer-bitmap", "version": "0.0.0", + "dependencies": { + "@code-editor/canvas": "workspace:^", + "@code-editor/canvas-renderer-core": "workspace:^", + "@design-sdk/figma-node": "^0.0.53", + "@mui/material": "^5.15.10" + }, "devDependencies": { "@types/react": "18.2.58", "react": "^18.2.0" @@ -8,11 +14,5 @@ "peerDependencies": { "@types/react": "18.2.58", "react": "^18.2.0" - }, - "dependencies": { - "@code-editor/canvas": "workspace:^", - "@code-editor/canvas-renderer-core": "workspace:^", - "@design-sdk/figma-node": "^0.0.53", - "@mui/material": "^5.15.10" } -} \ No newline at end of file +} diff --git a/.legacy/editor-packages/editor-canvas/package.json b/.legacy/editor-packages/editor-canvas/package.json index 0c7783af33..e7359e5a18 100644 --- a/.legacy/editor-packages/editor-canvas/package.json +++ b/.legacy/editor-packages/editor-canvas/package.json @@ -8,16 +8,6 @@ "dependencies": { "react-in-viewport": "^1.0.0-alpha.20" }, - "peerDependencies": { - "@editor-ui/hooks": "workspace:*", - "@design-sdk/figma-node": "^0.0.53", - "@design-sdk/query": "^0.0.53", - "@editor-ui/context-menu": "workspace:^", - "@emotion/styled": "^11.11.0", - "@use-gesture/react": "*", - "react": "^18", - "react-hot-toast": "^2.4.0" - }, "devDependencies": { "@design-sdk/figma-node": "^0.0.53", "@design-sdk/query": "^0.0.53", @@ -29,5 +19,15 @@ "react-hot-toast": "^2.4.0", "ts-jest": "^29.0.3", "typescript": "^4.8.4" + }, + "peerDependencies": { + "@design-sdk/figma-node": "^0.0.53", + "@design-sdk/query": "^0.0.53", + "@editor-ui/context-menu": "workspace:^", + "@editor-ui/hooks": "workspace:*", + "@emotion/styled": "^11.11.0", + "@use-gesture/react": "*", + "react": "^18", + "react-hot-toast": "^2.4.0" } } diff --git a/.legacy/editor-packages/editor-dashboard/package.json b/.legacy/editor-packages/editor-dashboard/package.json index e0a425ef22..1268c4cbe9 100644 --- a/.legacy/editor-packages/editor-dashboard/package.json +++ b/.legacy/editor-packages/editor-dashboard/package.json @@ -4,23 +4,6 @@ "scripts": { "test": "jest" }, - "devDependencies": { - "@emotion/styled": "^11.11.0", - "@types/node": "^20.11.20", - "@types/react": "18.2.58", - "@types/react-highlight-words": "^0.16.4", - "jest": "^29.3.1", - "next": "^14.1.0", - "react": "^18.2.0", - "react-dnd": "^16.0.1", - "ts-jest": "^29.0.3" - }, - "peerDependencies": { - "@emotion/styled": "^11.11.0", - "@types/react": "18.2.58", - "react": "^18.2.0", - "react-dnd": "16.0.1" - }, "dependencies": { "@code-editor/canvas-renderer-bitmap": "workspace:^", "@code-editor/external-links": "workspace:^", @@ -45,5 +28,22 @@ "react-hot-toast": "^2.4.0", "react-in-viewport": "^1.0.0-alpha.20", "react-selecto": "^1.20.2" + }, + "devDependencies": { + "@emotion/styled": "^11.11.0", + "@types/node": "^20.11.20", + "@types/react": "18.2.58", + "@types/react-highlight-words": "^0.16.4", + "jest": "^29.3.1", + "next": "^14.1.0", + "react": "^18.2.0", + "react-dnd": "^16.0.1", + "ts-jest": "^29.0.3" + }, + "peerDependencies": { + "@emotion/styled": "^11.11.0", + "@types/react": "18.2.58", + "react": "^18.2.0", + "react-dnd": "16.0.1" } } diff --git a/.legacy/editor-packages/editor-devtools/package.json b/.legacy/editor-packages/editor-devtools/package.json index 2786b149ee..f4a4e4a016 100644 --- a/.legacy/editor-packages/editor-devtools/package.json +++ b/.legacy/editor-packages/editor-devtools/package.json @@ -13,22 +13,22 @@ "react-base16-styling": "^0.9.1", "react-json-tree": "^0.15.0" }, - "peerDependencies": { - "@code-editor/ui": "workspace:*", + "devDependencies": { "@design-sdk/figma": "^0.0.53", "@design-sdk/figma-node": "^0.0.53", "@emotion/styled": "^11.11.0", "@reflect-ui/core": "^0.0.9", - "@web-builder/core": "workspace:*", + "@types/node": "^20.11.20", + "@types/react": "18.2.58", "react": "^18" }, - "devDependencies": { + "peerDependencies": { + "@code-editor/ui": "workspace:*", "@design-sdk/figma": "^0.0.53", "@design-sdk/figma-node": "^0.0.53", "@emotion/styled": "^11.11.0", "@reflect-ui/core": "^0.0.9", - "@types/node": "^20.11.20", - "@types/react": "18.2.58", + "@web-builder/core": "workspace:*", "react": "^18" } } diff --git a/.legacy/editor-packages/editor-icons-module/package.json b/.legacy/editor-packages/editor-icons-module/package.json index b263bb5614..5d7f905ded 100644 --- a/.legacy/editor-packages/editor-icons-module/package.json +++ b/.legacy/editor-packages/editor-icons-module/package.json @@ -9,4 +9,4 @@ "@types/react": "18.2.58", "react": "^18.2.0" } -} \ No newline at end of file +} diff --git a/.legacy/editor-packages/editor-icons-node/package.json b/.legacy/editor-packages/editor-icons-node/package.json index 72f15798c9..feb6927d03 100644 --- a/.legacy/editor-packages/editor-icons-node/package.json +++ b/.legacy/editor-packages/editor-icons-node/package.json @@ -1,6 +1,9 @@ { "name": "@code-editor/node-icons", "version": "0.0.0", + "dependencies": { + "@radix-ui/react-icons": "^1.0.3" + }, "devDependencies": { "@design-sdk/figma-node": "^0.0.53", "@types/react": "18.2.58", @@ -10,8 +13,5 @@ "@design-sdk/figma-node": "^0.0.53", "@types/react": "18.2.58", "react": "^18.2.0" - }, - "dependencies": { - "@radix-ui/react-icons": "^1.0.3" } -} \ No newline at end of file +} diff --git a/.legacy/editor-packages/editor-isolated-inspection/package.json b/.legacy/editor-packages/editor-isolated-inspection/package.json index b0b1bf7216..90504c8e6a 100644 --- a/.legacy/editor-packages/editor-isolated-inspection/package.json +++ b/.legacy/editor-packages/editor-isolated-inspection/package.json @@ -1,6 +1,13 @@ { "name": "@code-editor/isolated-inspection", "version": "0.0.0", + "dependencies": { + "@code-editor/canvas": "workspace:^", + "@code-editor/ui": "workspace:^", + "@radix-ui/react-icons": "^1.0.3", + "editor": "workspace:^", + "react-use-measure": "^2.1.1" + }, "devDependencies": { "@emotion/styled": "^11.11.0", "@types/node": "^20.11.20", @@ -12,12 +19,5 @@ "@types/node": "^20.11.20", "@types/react": "18.2.58", "react": "^18.2.0" - }, - "dependencies": { - "@code-editor/canvas": "workspace:^", - "@code-editor/ui": "workspace:^", - "@radix-ui/react-icons": "^1.0.3", - "editor": "workspace:^", - "react-use-measure": "^2.1.1" } } diff --git a/.legacy/editor-packages/editor-live-session/package.json b/.legacy/editor-packages/editor-live-session/package.json index d8227e6a43..b366321c6c 100644 --- a/.legacy/editor-packages/editor-live-session/package.json +++ b/.legacy/editor-packages/editor-live-session/package.json @@ -1,9 +1,9 @@ { - "name": "@editor-app/live-session", - "version": "0.0.0", - "private": false, - "main": "index.ts", - "dependencies": { - "pusher-js": "^7.0.3" - } -} \ No newline at end of file + "name": "@editor-app/live-session", + "version": "0.0.0", + "private": false, + "main": "index.ts", + "dependencies": { + "pusher-js": "^7.0.3" + } +} diff --git a/.legacy/editor-packages/editor-preview-flutter-daemon-view/package.json b/.legacy/editor-packages/editor-preview-flutter-daemon-view/package.json index 29f8ad3663..ffbe378fe7 100644 --- a/.legacy/editor-packages/editor-preview-flutter-daemon-view/package.json +++ b/.legacy/editor-packages/editor-preview-flutter-daemon-view/package.json @@ -5,4 +5,4 @@ "dependencies": { "@flutter-daemon/client": "^0.0.2" } -} \ No newline at end of file +} diff --git a/.legacy/editor-packages/editor-preview-pip/package.json b/.legacy/editor-packages/editor-preview-pip/package.json index d8d1187816..0b86efb213 100644 --- a/.legacy/editor-packages/editor-preview-pip/package.json +++ b/.legacy/editor-packages/editor-preview-pip/package.json @@ -4,13 +4,14 @@ "private": false, "description": "A Resizable Picture-in-Picture component.", "keywords": [ - "Picture-in-Picture", + "Draggable", "PIP", "PIP Window", - "Resizable PIP", + "Picture-in-Picture", "Resizable", - "Draggable" + "Resizable PIP" ], + "license": "MIT", "author": "Itiel Maimon", "contributors": [ { @@ -24,19 +25,39 @@ "url": "https://softmarshmallow.com" } ], - "license": "MIT", - "main": "dist/index.js", - "module": "dist/index.js", + "repository": "https://github.com/gridaco/designto-code", "files": [ "dist", "README.md" ], - "repository": "https://github.com/gridaco/designto-code", + "main": "dist/index.js", + "module": "dist/index.js", + "publishConfig": { + "access": "public" + }, + "scripts": { + "clean": "rimraf dist", + "prepack": "yarn clean && tsc", + "start": "react-scripts start" + }, "dependencies": { "@radix-ui/react-context-menu": "^0.1.1", "react-draggable": "^4.4.4", "react-resizable": "^3.0.4" }, + "devDependencies": { + "@babel/cli": "^7.14.5", + "@babel/core": "^7.14.6", + "@babel/preset-env": "^7.14.7", + "@modulz/design-system": "^1.0.0", + "@testing-library/jest-dom": "^5.14.1", + "@testing-library/react": "^11.2.7", + "@testing-library/user-event": "^12.8.3", + "@types/react": "18.2.58", + "react": "^18.2.0", + "typescript": "^4.4.4", + "web-vitals": "^1.1.2" + }, "peerDependencies": { "@emotion/styled": "^11.3.0", "@modulz/design-system": "^1.0.0", @@ -44,11 +65,6 @@ "react": "^18.2.0", "react-dom": "^18.2.0" }, - "scripts": { - "clean": "rimraf dist", - "prepack": "yarn clean && tsc", - "start": "react-scripts start" - }, "browserslist": { "production": [ ">0.2%", @@ -60,21 +76,5 @@ "last 1 firefox version", "last 1 safari version" ] - }, - "devDependencies": { - "@babel/cli": "^7.14.5", - "@babel/core": "^7.14.6", - "@babel/preset-env": "^7.14.7", - "@modulz/design-system": "^1.0.0", - "@testing-library/jest-dom": "^5.14.1", - "@testing-library/react": "^11.2.7", - "@testing-library/user-event": "^12.8.3", - "@types/react": "18.2.58", - "react": "^18.2.0", - "typescript": "^4.4.4", - "web-vitals": "^1.1.2" - }, - "publishConfig": { - "access": "public" } } diff --git a/.legacy/editor-packages/editor-preview-vanilla/package.json b/.legacy/editor-packages/editor-preview-vanilla/package.json index 4a86209609..d6197408e7 100644 --- a/.legacy/editor-packages/editor-preview-vanilla/package.json +++ b/.legacy/editor-packages/editor-preview-vanilla/package.json @@ -2,23 +2,25 @@ "name": "@code-editor/vanilla-preview", "version": "0.0.2", "private": false, - "main": "dist/index.js", "repository": "https://github.com/gridaco/designto-code", - "scripts": { - "clean": "rimraf dist", - "prepack": "yarn clean && tsc", - "storybook": "start-storybook -p 6006", - "build-storybook": "build-storybook" - }, "files": [ "dist", "LICENSE", "README.md" ], - "peerDependencies": { - "@emotion/styled": "^11.3.0", - "@types/react": "18.2.58", - "react": "^18.2.0" + "main": "dist/index.js", + "publishConfig": { + "access": "public" + }, + "scripts": { + "build-storybook": "build-storybook", + "clean": "rimraf dist", + "prepack": "yarn clean && tsc", + "storybook": "start-storybook -p 6006" + }, + "dependencies": { + "re-resizable": "^6.9.1", + "react-use-size": "^2.0.4" }, "devDependencies": { "@babel/core": "^7.16.7", @@ -32,11 +34,9 @@ "react": "^18.2.0", "typescript": "^4.4.4" }, - "dependencies": { - "re-resizable": "^6.9.1", - "react-use-size": "^2.0.4" - }, - "publishConfig": { - "access": "public" + "peerDependencies": { + "@emotion/styled": "^11.3.0", + "@types/react": "18.2.58", + "react": "^18.2.0" } -} \ No newline at end of file +} diff --git a/.legacy/editor-packages/editor-property/package.json b/.legacy/editor-packages/editor-property/package.json index cb30b348fa..d8bc031d67 100644 --- a/.legacy/editor-packages/editor-property/package.json +++ b/.legacy/editor-packages/editor-property/package.json @@ -1,26 +1,26 @@ { "name": "@code-editor/property", "version": "0.0.0", - "peerDependencies": { + "devDependencies": { "@design-sdk/figma-types": "^0.0.53", "@emotion/styled": "^11.11.0", "@radix-ui/colors": "^3.0.0", "@radix-ui/react-hover-card": "^1.0.7", "@reflect-ui/core": "^0.0.9", "@stitches/react": "^1.2.8", - "@web-builder/styles": "workspace:*", - "react": "^18.2.0" + "@types/node": "^18.11.9", + "@types/react": "^18.0.24", + "@types/react-dom": "^18.0.8", + "typescript": "^4.8.4" }, - "devDependencies": { + "peerDependencies": { "@design-sdk/figma-types": "^0.0.53", "@emotion/styled": "^11.11.0", "@radix-ui/colors": "^3.0.0", "@radix-ui/react-hover-card": "^1.0.7", "@reflect-ui/core": "^0.0.9", "@stitches/react": "^1.2.8", - "@types/node": "^18.11.9", - "@types/react": "^18.0.24", - "@types/react-dom": "^18.0.8", - "typescript": "^4.8.4" + "@web-builder/styles": "workspace:*", + "react": "^18.2.0" } } diff --git a/.legacy/editor-packages/editor-services-dart/package.json b/.legacy/editor-packages/editor-services-dart/package.json index f1d7a29f9c..c7a1b5bf65 100644 --- a/.legacy/editor-packages/editor-services-dart/package.json +++ b/.legacy/editor-packages/editor-services-dart/package.json @@ -1,6 +1,6 @@ { "name": "@code-editor/dart-services", - "description": "dart build services for flutter framework", "version": "0.0.0", - "private": false -} \ No newline at end of file + "private": false, + "description": "dart build services for flutter framework" +} diff --git a/.legacy/editor-packages/editor-services-esbuild/package.json b/.legacy/editor-packages/editor-services-esbuild/package.json index 9788ceaf6e..3f879ae882 100644 --- a/.legacy/editor-packages/editor-services-esbuild/package.json +++ b/.legacy/editor-packages/editor-services-esbuild/package.json @@ -12,4 +12,4 @@ "axios": "^0.26.1 || ^0.21.0", "nanoid": "^3.3.2" } -} \ No newline at end of file +} diff --git a/.legacy/editor-packages/editor-services-estypes-resolver/package.json b/.legacy/editor-packages/editor-services-estypes-resolver/package.json index 0062767cb5..79c522dd11 100644 --- a/.legacy/editor-packages/editor-services-estypes-resolver/package.json +++ b/.legacy/editor-packages/editor-services-estypes-resolver/package.json @@ -8,4 +8,4 @@ "peerDependencies": { "@monaco-editor/react": "^4.6.0" } -} \ No newline at end of file +} diff --git a/.legacy/editor-packages/editor-services-jsx-syntax-highlight/package.json b/.legacy/editor-packages/editor-services-jsx-syntax-highlight/package.json index 679e2e8024..602e42cfc5 100644 --- a/.legacy/editor-packages/editor-services-jsx-syntax-highlight/package.json +++ b/.legacy/editor-packages/editor-services-jsx-syntax-highlight/package.json @@ -5,11 +5,11 @@ "dependencies": { "@code-editor/webworker-services-core": "workspace:^" }, - "peerDependencies": { - "@monaco-editor/react": "^4.4.1", + "devDependencies": { "monaco-editor": "^0.46.0" }, - "devDependencies": { + "peerDependencies": { + "@monaco-editor/react": "^4.4.1", "monaco-editor": "^0.46.0" } -} \ No newline at end of file +} diff --git a/.legacy/editor-packages/editor-services-prettier/package.json b/.legacy/editor-packages/editor-services-prettier/package.json index fdbf03dddd..19f41283fb 100644 --- a/.legacy/editor-packages/editor-services-prettier/package.json +++ b/.legacy/editor-packages/editor-services-prettier/package.json @@ -2,18 +2,18 @@ "name": "@code-editor/prettier-services", "version": "0.0.0", "private": false, - "peerDependencies": { + "dependencies": { + "prettier": "^3.2.5" + }, + "devDependencies": { "@code-editor/webworker-services-core": "workspace:^", - "@monaco-editor/react": "^4.4.1", "dart-style": "1.3.2-dev", "monaco-editor": "^0.46.0" }, - "devDependencies": { + "peerDependencies": { "@code-editor/webworker-services-core": "workspace:^", + "@monaco-editor/react": "^4.4.1", "dart-style": "1.3.2-dev", "monaco-editor": "^0.46.0" - }, - "dependencies": { - "prettier": "^3.2.5" } } diff --git a/.legacy/editor-packages/editor-services-webworker-core/package.json b/.legacy/editor-packages/editor-services-webworker-core/package.json index c38f1014b1..50566856c9 100644 --- a/.legacy/editor-packages/editor-services-webworker-core/package.json +++ b/.legacy/editor-packages/editor-services-webworker-core/package.json @@ -5,4 +5,4 @@ "dependencies": { "p-queue": "^7.2.0" } -} \ No newline at end of file +} diff --git a/.legacy/editor-packages/editor-shortcuts/package.json b/.legacy/editor-packages/editor-shortcuts/package.json index ecfbd5ee23..eb2bc7fc9b 100644 --- a/.legacy/editor-packages/editor-shortcuts/package.json +++ b/.legacy/editor-packages/editor-shortcuts/package.json @@ -1,4 +1,4 @@ { "name": "@code-editor/shortcuts", "version": "0.0.0" -} \ No newline at end of file +} diff --git a/.legacy/editor-packages/editor-ui/package.json b/.legacy/editor-packages/editor-ui/package.json index aa68d1ebc0..ae221b9c00 100644 --- a/.legacy/editor-packages/editor-ui/package.json +++ b/.legacy/editor-packages/editor-ui/package.json @@ -13,4 +13,4 @@ "@types/react": "18.2.58", "react": "^18.2.0" } -} \ No newline at end of file +} diff --git a/.legacy/editor-packages/editor-use-sys-theme/package.json b/.legacy/editor-packages/editor-use-sys-theme/package.json index 9f0cf83a62..3eda18460d 100644 --- a/.legacy/editor-packages/editor-use-sys-theme/package.json +++ b/.legacy/editor-packages/editor-use-sys-theme/package.json @@ -9,4 +9,4 @@ "@types/react": "18.2.58", "react": "^18.2.0" } -} \ No newline at end of file +} diff --git a/.legacy/editor/package.json b/.legacy/editor/package.json index db276c0dd5..ec3398fbc5 100644 --- a/.legacy/editor/package.json +++ b/.legacy/editor/package.json @@ -3,12 +3,12 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev -p 6626", "build": "next build", + "dev": "next dev -p 6626", "lint": "next lint", - "start": "next start -p 6626", + "postbuild": "npm run sitemap", "sitemap": "next-sitemap && node ./.scripts/post-sitemap-mod.js", - "postbuild": "npm run sitemap" + "start": "next start -p 6626" }, "dependencies": { "@base-sdk-fp/auth-components-react": "^0.1.4", diff --git a/.legacy/posts/package.json b/.legacy/posts/package.json index 6d9b872dcd..3750d5fc4e 100644 --- a/.legacy/posts/package.json +++ b/.legacy/posts/package.json @@ -3,8 +3,8 @@ "version": "0.0.0", "private": false, "scripts": { - "dev": "next dev -p 3315", "build": "next build", + "dev": "next dev -p 3315", "start": "next start -p 3315" }, "dependencies": { diff --git a/apps/backgrounds/package.json b/apps/backgrounds/package.json index c935da75c5..5dcef1b936 100644 --- a/apps/backgrounds/package.json +++ b/apps/backgrounds/package.json @@ -4,10 +4,10 @@ "private": true, "homepage": "https://bg.grida.co", "scripts": { - "dev": "next dev", "build": "next build", - "start": "next start", + "dev": "next dev", "lint": "eslint", + "start": "next start", "typecheck": "tsc --noEmit" }, "dependencies": { diff --git a/apps/blog/package.json b/apps/blog/package.json index 3fa3983506..fc8a2b7a44 100644 --- a/apps/blog/package.json +++ b/apps/blog/package.json @@ -3,17 +3,17 @@ "version": "0.0.0", "private": true, "scripts": { - "docusaurus": "docusaurus", - "start": "docusaurus start", - "dev": "docusaurus start", "build": "docusaurus build", - "swizzle": "docusaurus swizzle", - "deploy": "docusaurus deploy", "clear": "docusaurus clear", + "deploy": "docusaurus deploy", + "dev": "docusaurus start", + "docusaurus": "docusaurus", "serve": "docusaurus serve", - "write-translations": "docusaurus write-translations", + "start": "docusaurus start", + "swizzle": "docusaurus swizzle", + "typecheck": "tsc --noEmit", "write-heading-ids": "docusaurus write-heading-ids", - "typecheck": "tsc --noEmit" + "write-translations": "docusaurus write-translations" }, "dependencies": { "@docusaurus/core": "3.7.0", diff --git a/apps/docs/package.json b/apps/docs/package.json index 215ecbd11d..b59fedf3b8 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -3,19 +3,19 @@ "version": "0.0.0", "private": true, "scripts": { - "content:watch": "node ./scripts/watch-docs.js", + "build": "pnpm content:setup && docusaurus build", + "clear": "docusaurus clear", "content:setup": "node ./scripts/postinstall.js", - "postinstall": "pnpm content:setup", + "content:watch": "node ./scripts/watch-docs.js", + "deploy": "docusaurus deploy", + "dev": "content:watch & pnpm start", "docusaurus": "docusaurus", + "postinstall": "pnpm content:setup", + "serve": "docusaurus serve --port 3001", "start": "docusaurus start --port 3001", - "dev": "content:watch & pnpm start", - "build": "pnpm content:setup && docusaurus build", "swizzle": "docusaurus swizzle", - "deploy": "docusaurus deploy", - "clear": "docusaurus clear", - "serve": "docusaurus serve --port 3001", - "write-translations": "docusaurus write-translations", - "write-heading-ids": "docusaurus write-heading-ids" + "write-heading-ids": "docusaurus write-heading-ids", + "write-translations": "docusaurus write-translations" }, "dependencies": { "@docusaurus/core": "3.7.0", @@ -27,10 +27,10 @@ "clsx": "^2.1.1", "katex": "^0.16.11", "prism-react-renderer": "^2.4.1", - "rehype-katex": "^7.0.0", - "remark-math": "^6.0.0", "react": "19.2.1", - "react-dom": "19.2.1" + "react-dom": "19.2.1", + "rehype-katex": "^7.0.0", + "remark-math": "^6.0.0" }, "devDependencies": { "@docusaurus/module-type-aliases": "3.7.0", diff --git a/apps/viewer/package.json b/apps/viewer/package.json index 11373b5a68..3f1ed02d7a 100644 --- a/apps/viewer/package.json +++ b/apps/viewer/package.json @@ -3,10 +3,10 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev", "build": "next build", - "start": "next start", + "dev": "next dev", "lint": "eslint", + "start": "next start", "typecheck": "tsc --noEmit" }, "dependencies": { diff --git a/crates/grida-canvas-wasm/package.json b/crates/grida-canvas-wasm/package.json index 87174ea72f..2f4139ae31 100644 --- a/crates/grida-canvas-wasm/package.json +++ b/crates/grida-canvas-wasm/package.json @@ -22,10 +22,10 @@ "scripts": { "build": "tsup", "dev": "tsup --watch", - "serve": "serve -p 4020", - "test": "vitest run", "prepack": "just build", "prepublishOnly": "[ $(du -sk lib 2>/dev/null | cut -f1) -lt 15360 ]", + "serve": "serve -p 4020", + "test": "vitest run", "typecheck": "tsc --noEmit" }, "devDependencies": { diff --git a/crates/grida-canvas/package.json b/crates/grida-canvas/package.json index 02b2b3f242..a3d97ea174 100644 --- a/crates/grida-canvas/package.json +++ b/crates/grida-canvas/package.json @@ -1,7 +1,7 @@ { "name": "@crates/grida-canvas", - "description": "turbo ci rust wrapper", "private": true, + "description": "turbo ci rust wrapper", "scripts": { "build": "cargo build --release", "test": "cargo test" diff --git a/crates/math2/package.json b/crates/math2/package.json index 0f1fba40b0..c0b3ab6d83 100644 --- a/crates/math2/package.json +++ b/crates/math2/package.json @@ -1,7 +1,7 @@ { "name": "@crates/math2", - "description": "turbo ci rust wrapper", "private": true, + "description": "turbo ci rust wrapper", "scripts": { "build": "cargo build --release" } diff --git a/desktop/package.json b/desktop/package.json index 3191e99c07..d4ed2c2d5d 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -1,25 +1,24 @@ { "name": "desktop", "version": "0.0.1", + "private": true, "description": "Grida Desktop App", - "homepage": "https://grida.co", - "repository": "https://github.com/gridaco/grida", "keywords": [], + "homepage": "https://grida.co", + "license": "MIT", "author": { "name": "Grida", "email": "hello@grida.co" }, - "private": true, + "repository": "https://github.com/gridaco/grida", "main": ".vite/build/main.js", - "packageManager": "pnpm@10.10.0", "scripts": { "dev": "electron-forge start", - "package": "electron-forge package", + "lint": "eslint --ext .ts,.tsx .", "make": "electron-forge make", - "publish:prerelease": "electron-forge publish", - "lint": "eslint --ext .ts,.tsx ." + "package": "electron-forge package", + "publish:prerelease": "electron-forge publish" }, - "license": "MIT", "dependencies": { "clsx": "^2.1.1", "electron-squirrel-startup": "^1.0.1", @@ -59,5 +58,6 @@ "ts-node": "^10.0.0", "typescript": "^5", "vite": "^6.3.5" - } + }, + "packageManager": "pnpm@10.10.0" } diff --git a/editor/package.json b/editor/package.json index f5123a0418..ffb4403bd6 100644 --- a/editor/package.json +++ b/editor/package.json @@ -3,16 +3,16 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev", "build": "next build", - "start": "next start", + "dev": "next dev", + "fmt": "oxfmt", + "fmt:check": "oxfmt --check", "lint": "eslint", "lint:fix": "eslint --fix", + "start": "next start", "test": "vitest run", "test:e2e": "playwright test", - "typecheck": "tsc --noEmit", - "fmt": "oxfmt", - "fmt:check": "oxfmt --check" + "typecheck": "tsc --noEmit" }, "dependencies": { "@ai-sdk/anthropic": "3.0.0", diff --git a/package.json b/package.json index 04350f6b4e..6f2783503e 100644 --- a/package.json +++ b/package.json @@ -3,15 +3,15 @@ "private": true, "license": "Apache 2.0", "scripts": { - "lint": "turbo run lint", + "build": "turbo run build", + "build:packages": "turbo run build --filter=./packages/*", "dev": "turbo run dev", "dev:packages": "turbo run dev --filter=./packages/*", "generate": "turbo run generate", - "build": "turbo run build", - "build:packages": "turbo run build --filter=./packages/*", + "lint": "turbo run lint", + "publish-packages": "turbo run build lint test && changeset version && changeset publish", "test": "turbo run test", - "typecheck": "turbo run typecheck", - "publish-packages": "turbo run build lint test && changeset version && changeset publish" + "typecheck": "turbo run typecheck" }, "devDependencies": { "@changesets/cli": "^2.29.4", diff --git a/packages/.legacy/app-blocks/package.json b/packages/.legacy/app-blocks/package.json index a130688aa8..4be00967a9 100644 --- a/packages/.legacy/app-blocks/package.json +++ b/packages/.legacy/app-blocks/package.json @@ -1,22 +1,22 @@ { - "name": "@app/blocks", - "version": "0.0.0", - "dependencies": { - "@base-sdk/functions-code-format": "^0.0.0", - "@design-sdk/core-types": "^0.0.53", - "@design-sdk/url-analysis": "^0.0.53", - "@emotion/styled": "^11.11.0", - "@monaco-editor/react": "^4.2.2", - "@reflect-blocks/figma-embed": "0.0.4", - "monaco-editor": "^0.26.1", - "nanoid": "^3.1.23" - }, - "peerDependencies": { - "@types/node": "^16.4.13", - "react": "^18.2.0" - }, - "devDependencies": { - "@types/react": "18.2.58", - "react": "^18.2.0" - } -} \ No newline at end of file + "name": "@app/blocks", + "version": "0.0.0", + "dependencies": { + "@base-sdk/functions-code-format": "^0.0.0", + "@design-sdk/core-types": "^0.0.53", + "@design-sdk/url-analysis": "^0.0.53", + "@emotion/styled": "^11.11.0", + "@monaco-editor/react": "^4.2.2", + "@reflect-blocks/figma-embed": "0.0.4", + "monaco-editor": "^0.26.1", + "nanoid": "^3.1.23" + }, + "devDependencies": { + "@types/react": "18.2.58", + "react": "^18.2.0" + }, + "peerDependencies": { + "@types/node": "^16.4.13", + "react": "^18.2.0" + } +} diff --git a/packages/.legacy/app-fp-customer-support/package.json b/packages/.legacy/app-fp-customer-support/package.json index f435a0a54b..693e6be510 100644 --- a/packages/.legacy/app-fp-customer-support/package.json +++ b/packages/.legacy/app-fp-customer-support/package.json @@ -2,15 +2,15 @@ "name": "@app/fp-customer-support", "version": "0.0.0", "private": false, + "dependencies": { + "@editor-ui/dropdown-menu": "workspace:^", + "@emotion/styled": "^11.11.0" + }, "devDependencies": { "@types/react": "18.2.58", "react": "^18.2.0" }, "peerDependencies": { "react": "^18.2.0" - }, - "dependencies": { - "@editor-ui/dropdown-menu": "workspace:^", - "@emotion/styled": "^11.11.0" } -} \ No newline at end of file +} diff --git a/packages/.legacy/app-scene-view/package.json b/packages/.legacy/app-scene-view/package.json index 984e2713eb..c4c7d38876 100644 --- a/packages/.legacy/app-scene-view/package.json +++ b/packages/.legacy/app-scene-view/package.json @@ -1,8 +1,8 @@ { - "name": "@app/scene-view", - "description": "Scene view related components & logics", - "authors": "author", - "version": "0.0.0", - "dependencies": {}, - "private": false -} \ No newline at end of file + "name": "@app/scene-view", + "version": "0.0.0", + "private": false, + "description": "Scene view related components & logics", + "dependencies": {}, + "authors": "author" +} diff --git a/packages/.legacy/app/package.json b/packages/.legacy/app/package.json index 9cd173ce5d..3e132df96a 100644 --- a/packages/.legacy/app/package.json +++ b/packages/.legacy/app/package.json @@ -10,12 +10,12 @@ "@boring-ui/embed": "3.3.4", "@boringso/react-core": "workspace:*", "@core/app-state": "workspace:*", + "@design-sdk/core-types": "^0.0.53", "@design-sdk/figma-auth-store": "^0.0.53", "@design-sdk/figma-remote": "^0.0.53", "@design-sdk/figma-remote-api": "^0.0.53", "@design-sdk/universal": "^0.0.53", "@design-sdk/url-analysis": "^0.0.53", - "@design-sdk/core-types": "^0.0.53", "@editor-ui/dialog": "workspace:*", "@editor-ui/editor": "workspace:*", "@editor-ui/workspace": "workspace:*", diff --git a/packages/.legacy/core-events/package.json b/packages/.legacy/core-events/package.json index dbe5b6fabc..7d9e6f2053 100644 --- a/packages/.legacy/core-events/package.json +++ b/packages/.legacy/core-events/package.json @@ -1,4 +1,4 @@ { - "name": "@bridged.xyz/bridged-events", - "version": "0.0.0" -} \ No newline at end of file + "name": "@bridged.xyz/bridged-events", + "version": "0.0.0" +} diff --git a/packages/.legacy/core-fs/package.json b/packages/.legacy/core-fs/package.json index 12b4861272..d2fffbf21e 100644 --- a/packages/.legacy/core-fs/package.json +++ b/packages/.legacy/core-fs/package.json @@ -1,4 +1,4 @@ { - "name": "@grida.co/bridged-fs", - "version": "0.0.0" -} \ No newline at end of file + "name": "@grida.co/bridged-fs", + "version": "0.0.0" +} diff --git a/packages/.legacy/core-model/package.json b/packages/.legacy/core-model/package.json index 136aca7f72..c611fc8a7c 100644 --- a/packages/.legacy/core-model/package.json +++ b/packages/.legacy/core-model/package.json @@ -1,5 +1,5 @@ { - "name": "@core/model", - "version": "0.0.0", - "description": "Grida core app model definitions" -} \ No newline at end of file + "name": "@core/model", + "version": "0.0.0", + "description": "Grida core app model definitions" +} diff --git a/packages/.legacy/core-shortcuts/package.json b/packages/.legacy/core-shortcuts/package.json index c2109d7a49..3d857133de 100644 --- a/packages/.legacy/core-shortcuts/package.json +++ b/packages/.legacy/core-shortcuts/package.json @@ -1,4 +1,4 @@ { - "name": "@grida.co/grida-shortcuts", - "version": "0.0.0" -} \ No newline at end of file + "name": "@grida.co/grida-shortcuts", + "version": "0.0.0" +} diff --git a/packages/.legacy/core-state/package.json b/packages/.legacy/core-state/package.json index eaa2949374..bacc0582b8 100644 --- a/packages/.legacy/core-state/package.json +++ b/packages/.legacy/core-state/package.json @@ -2,8 +2,8 @@ "name": "@core/state", "version": "0.0.0", "dependencies": { - "immer": "^9.0.3", "@boring.so/action": "workspace:*", - "@boring.so/loader": "workspace:*" + "@boring.so/loader": "workspace:*", + "immer": "^9.0.3" } } diff --git a/packages/.legacy/core-store/package.json b/packages/.legacy/core-store/package.json index c0dd190216..87e0039fe7 100644 --- a/packages/.legacy/core-store/package.json +++ b/packages/.legacy/core-store/package.json @@ -1,7 +1,7 @@ { - "name": "@core/store", - "version": "0.0.0", - "dependencies": { - "idb": "^6.1.2" - } + "name": "@core/store", + "version": "0.0.0", + "dependencies": { + "idb": "^6.1.2" + } } diff --git a/packages/grida-canvas-bitmap/package.json b/packages/grida-canvas-bitmap/package.json index c0a78db726..1939231d5c 100644 --- a/packages/grida-canvas-bitmap/package.json +++ b/packages/grida-canvas-bitmap/package.json @@ -1,7 +1,7 @@ { "name": "@grida/bitmap", - "description": "Core Bitmap Graphics Editor", "private": true, + "description": "Core Bitmap Graphics Editor", "dependencies": { "@grida/cmath": "workspace:*", "@grida/color": "workspace:*" diff --git a/packages/grida-canvas-cg/package.json b/packages/grida-canvas-cg/package.json index 629a212db4..336d089767 100644 --- a/packages/grida-canvas-cg/package.json +++ b/packages/grida-canvas-cg/package.json @@ -1,24 +1,23 @@ { "name": "@grida/cg", - "description": "Grida Canvas Core Graphics", "version": "0.0.0", - "homepage": "https://grida.co", - "repository": "https://github.com/gridaco/grida", - "license": "MIT", - "author": "softmarshmallow", "private": false, + "description": "Grida Canvas Core Graphics", "keywords": [ - "grida", "canvas", "cg", "core", + "dts", "graphics", - "dts" + "grida" + ], + "homepage": "https://grida.co", + "license": "MIT", + "author": "softmarshmallow", + "repository": "https://github.com/gridaco/grida", + "files": [ + "dist" ], - "scripts": { - "dev": "tsup index.ts --format cjs,esm --dts --watch", - "build": "tsup index.ts --format cjs,esm --dts" - }, "main": "./dist/index.js", "module": "./dist/index.mjs", "types": "./dist/index.d.ts", @@ -29,9 +28,10 @@ "require": "./dist/index.js" } }, - "files": [ - "dist" - ], + "scripts": { + "build": "tsup index.ts --format cjs,esm --dts", + "dev": "tsup index.ts --format cjs,esm --dts --watch" + }, "dependencies": { "@grida/color": "workspace:*" } diff --git a/packages/grida-canvas-color/package.json b/packages/grida-canvas-color/package.json index f143400206..16aa0a3922 100644 --- a/packages/grida-canvas-color/package.json +++ b/packages/grida-canvas-color/package.json @@ -1,22 +1,20 @@ { "name": "@grida/color", - "description": "Grida Core Graphics Color Lib", "version": "0.0.0", - "homepage": "https://grida.co", - "repository": "https://github.com/gridaco/grida", - "license": "MIT", - "author": "softmarshmallow", "private": false, + "description": "Grida Core Graphics Color Lib", "keywords": [ - "grida", "canvas", - "color" + "color", + "grida" + ], + "homepage": "https://grida.co", + "license": "MIT", + "author": "softmarshmallow", + "repository": "https://github.com/gridaco/grida", + "files": [ + "dist" ], - "scripts": { - "dev": "tsup index.ts --format cjs,esm --dts --watch", - "build": "tsup index.ts --format cjs,esm --dts", - "test": "vitest run" - }, "main": "./dist/index.js", "module": "./dist/index.mjs", "types": "./dist/index.d.ts", @@ -27,7 +25,9 @@ "require": "./dist/index.js" } }, - "files": [ - "dist" - ] + "scripts": { + "build": "tsup index.ts --format cjs,esm --dts", + "dev": "tsup index.ts --format cjs,esm --dts --watch", + "test": "vitest run" + } } diff --git a/packages/grida-canvas-io-figma/package.json b/packages/grida-canvas-io-figma/package.json index 769635afbb..f8fd99c0fb 100644 --- a/packages/grida-canvas-io-figma/package.json +++ b/packages/grida-canvas-io-figma/package.json @@ -1,10 +1,10 @@ { "name": "@grida/io-figma", - "description": "Figma I/O for Grida Canvas", "private": true, + "description": "Figma I/O for Grida Canvas", "scripts": { - "typecheck": "tsc --noEmit", - "test": "vitest run" + "test": "vitest run", + "typecheck": "tsc --noEmit" }, "dependencies": { "@grida/cmath": "workspace:*", diff --git a/packages/grida-canvas-io-svg/package.json b/packages/grida-canvas-io-svg/package.json index 0409651a8b..219e790909 100644 --- a/packages/grida-canvas-io-svg/package.json +++ b/packages/grida-canvas-io-svg/package.json @@ -1,7 +1,7 @@ { "name": "@grida/io-svg", - "description": "SVG I/O for Grida Canvas", "private": true, + "description": "SVG I/O for Grida Canvas", "dependencies": { "@grida/color": "workspace:*", "@grida/vn": "workspace:*" diff --git a/packages/grida-canvas-io/package.json b/packages/grida-canvas-io/package.json index 3799c3ec93..a7887463e4 100644 --- a/packages/grida-canvas-io/package.json +++ b/packages/grida-canvas-io/package.json @@ -1,11 +1,11 @@ { "name": "@grida/io", - "description": "IO model for Grida Canvas", "version": "0.0.0", "private": true, + "description": "IO model for Grida Canvas", "scripts": { - "typecheck": "tsc --noEmit", - "test": "vitest run" + "test": "vitest run", + "typecheck": "tsc --noEmit" }, "dependencies": { "@grida/cg": "workspace:*", diff --git a/packages/grida-canvas-pixelgrid/package.json b/packages/grida-canvas-pixelgrid/package.json index 8a4e4aea32..f877b77c26 100644 --- a/packages/grida-canvas-pixelgrid/package.json +++ b/packages/grida-canvas-pixelgrid/package.json @@ -1,31 +1,27 @@ { "name": "@grida/pixel-grid", - "description": "Pixel Grid component for Infinite Canvas", "version": "0.0.0", - "homepage": "https://grida.co/packages/@grida/pixel-grid", - "repository": "https://github.com/gridaco/grida", - "license": "MIT", - "author": "softmarshmallow", "private": false, + "description": "Pixel Grid component for Infinite Canvas", "keywords": [ - "grida", "canvas", - "pixel", - "grid", "design", "editor", + "grid", + "grida", + "pixel", "react" ], - "scripts": { - "dev": "tsup index.ts react.tsx --format cjs,esm --dts --watch", - "build": "tsup index.ts react.tsx --format cjs,esm --dts" - }, - "main": "./dist/index.js", - "module": "./dist/index.mjs", - "types": "./dist/index.d.ts", + "homepage": "https://grida.co/packages/@grida/pixel-grid", + "license": "MIT", + "author": "softmarshmallow", + "repository": "https://github.com/gridaco/grida", "files": [ "dist" ], + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", "exports": { ".": { "types": "./dist/index.d.ts", @@ -38,6 +34,10 @@ "require": "./dist/react.js" } }, + "scripts": { + "build": "tsup index.ts react.tsx --format cjs,esm --dts", + "dev": "tsup index.ts react.tsx --format cjs,esm --dts --watch" + }, "devDependencies": { "@types/react": "^19", "react": "^19.0.0" diff --git a/packages/grida-canvas-react-timeline/package.json b/packages/grida-canvas-react-timeline/package.json index 6c6fb869cb..f33fbd5d3c 100644 --- a/packages/grida-canvas-react-timeline/package.json +++ b/packages/grida-canvas-react-timeline/package.json @@ -1,7 +1,7 @@ { "name": "@grida/react-timeline", - "description": "React Timeline Editor", "private": true, + "description": "React Timeline Editor", "devDependencies": { "@types/react": "^19", "react": "^19.0.0" diff --git a/packages/grida-canvas-ruler/package.json b/packages/grida-canvas-ruler/package.json index 0d1ca55fb0..c4bab398ba 100644 --- a/packages/grida-canvas-ruler/package.json +++ b/packages/grida-canvas-ruler/package.json @@ -1,30 +1,26 @@ { "name": "@grida/ruler", - "description": "Zero-Dependency Canvas Ruler Component for Infinite Canvas", "version": "0.0.0", - "homepage": "https://grida.co/packages/@grida/ruler", - "repository": "https://github.com/gridaco/grida", - "license": "MIT", - "author": "softmarshmallow", "private": false, + "description": "Zero-Dependency Canvas Ruler Component for Infinite Canvas", "keywords": [ - "grida", "canvas", - "ruler", "design", "editor", - "react" + "grida", + "react", + "ruler" ], - "scripts": { - "dev": "tsup index.ts react.tsx --format cjs,esm --dts --watch", - "build": "tsup index.ts react.tsx --format cjs,esm --dts" - }, - "main": "./dist/index.js", - "module": "./dist/index.mjs", - "types": "./dist/index.d.ts", + "homepage": "https://grida.co/packages/@grida/ruler", + "license": "MIT", + "author": "softmarshmallow", + "repository": "https://github.com/gridaco/grida", "files": [ "dist" ], + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", "exports": { ".": { "types": "./dist/index.d.ts", @@ -37,6 +33,10 @@ "require": "./dist/react.js" } }, + "scripts": { + "build": "tsup index.ts react.tsx --format cjs,esm --dts", + "dev": "tsup index.ts react.tsx --format cjs,esm --dts --watch" + }, "devDependencies": { "@types/react": "^19", "react": "^19.0.0" diff --git a/packages/grida-canvas-schema/package.json b/packages/grida-canvas-schema/package.json index eefea5a0be..a098edbfc3 100644 --- a/packages/grida-canvas-schema/package.json +++ b/packages/grida-canvas-schema/package.json @@ -1,10 +1,10 @@ { "name": "@grida/schema", - "description": "Grida Canvas Document Model", "private": true, + "description": "Grida Canvas Document Model", "scripts": { - "typecheck": "tsc --noEmit", - "test": "vitest run" + "test": "vitest run", + "typecheck": "tsc --noEmit" }, "dependencies": { "@grida/cg": "workspace:*" diff --git a/packages/grida-canvas-sequence/package.json b/packages/grida-canvas-sequence/package.json index 97ada57826..16d607b5a2 100644 --- a/packages/grida-canvas-sequence/package.json +++ b/packages/grida-canvas-sequence/package.json @@ -1,36 +1,36 @@ { "name": "@grida/sequence", + "version": "0.0.0", "description": "Fractional indexing implementation for CRDT-based ordered lists", "keywords": [ + "canvas", + "collaborative", "crdt", "fractional-indexing", - "order", "list", - "canvas", - "collaborative" + "order" ], - "version": "0.0.0", "homepage": "https://grida.co", - "repository": "https://github.com/gridaco/grida", "license": "CC0-1.0", "author": "softmarshmallow", - "scripts": { - "typecheck": "tsc --noEmit", - "dev": "tsup index.ts --format cjs,esm --dts --watch", - "build": "tsup index.ts --format cjs,esm --dts", - "test": "vitest run" - }, - "main": "./dist/index.js", - "module": "./dist/index.mjs", - "types": "./dist/index.d.ts", + "repository": "https://github.com/gridaco/grida", "files": [ "dist" ], + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", "exports": { ".": { "types": "./dist/index.d.ts", "import": "./dist/index.mjs", "require": "./dist/index.js" } + }, + "scripts": { + "build": "tsup index.ts --format cjs,esm --dts", + "dev": "tsup index.ts --format cjs,esm --dts --watch", + "test": "vitest run", + "typecheck": "tsc --noEmit" } } diff --git a/packages/grida-canvas-tailwind-colors/package.json b/packages/grida-canvas-tailwind-colors/package.json index f0e9046832..17f4b052bb 100644 --- a/packages/grida-canvas-tailwind-colors/package.json +++ b/packages/grida-canvas-tailwind-colors/package.json @@ -1,23 +1,19 @@ { "name": "@grida/tailwindcss-colors", - "description": "Tailwind CSS color data package - provides color values in multiple formats (RGBA, HEX, OKLCH) for programmatic use. Not intended for direct CSS import in production.", "version": "4.0.1", - "homepage": "https://grida.co", - "repository": "https://github.com/gridaco/grida", - "license": "MIT", - "author": "softmarshmallow", "private": false, + "description": "Tailwind CSS color data package - provides color values in multiple formats (RGBA, HEX, OKLCH) for programmatic use. Not intended for direct CSS import in production.", "keywords": [ + "colors", + "data", "grida", "tailwind", - "colors", - "tailwindcss", - "data" + "tailwindcss" ], - "scripts": { - "generate": "deno run --allow-read --allow-write --allow-net --allow-env --no-prompt scripts/generate.ts", - "prepublishOnly": "pnpm generate" - }, + "homepage": "https://grida.co", + "license": "MIT", + "author": "softmarshmallow", + "repository": "https://github.com/gridaco/grida", "files": [ "css", "json", @@ -33,5 +29,9 @@ "./json/rgba.json": "./json/rgba.json", "./json/hex.json": "./json/hex.json", "./json/oklch.json": "./json/oklch.json" + }, + "scripts": { + "generate": "deno run --allow-read --allow-write --allow-net --allow-env --no-prompt scripts/generate.ts", + "prepublishOnly": "pnpm generate" } } diff --git a/packages/grida-canvas-tailwind/package.json b/packages/grida-canvas-tailwind/package.json index bae5a5e175..a69e93be2a 100644 --- a/packages/grida-canvas-tailwind/package.json +++ b/packages/grida-canvas-tailwind/package.json @@ -1,5 +1,5 @@ { "name": "@grida/tailwindcss", - "description": "TailwindCSS Integration for Grida Canvas", - "private": true + "private": true, + "description": "TailwindCSS Integration for Grida Canvas" } diff --git a/packages/grida-canvas-transparency-grid/package.json b/packages/grida-canvas-transparency-grid/package.json index 6c084ac867..7366fdb525 100644 --- a/packages/grida-canvas-transparency-grid/package.json +++ b/packages/grida-canvas-transparency-grid/package.json @@ -1,32 +1,28 @@ { "name": "@grida/transparency-grid", - "description": "Transparency Grid component for Infinite Canvas", "version": "0.0.0", - "homepage": "https://grida.co/packages/@grida/transparency-grid", - "repository": "https://github.com/gridaco/grida", - "license": "MIT", - "author": "softmarshmallow", "private": false, + "description": "Transparency Grid component for Infinite Canvas", "keywords": [ - "grida", "canvas", - "transparency", - "grid", "checkerboard", "design", "editor", - "react" + "grid", + "grida", + "react", + "transparency" ], - "scripts": { - "dev": "tsup index.ts react.tsx --format cjs,esm --dts --watch", - "build": "tsup index.ts react.tsx --format cjs,esm --dts" - }, - "main": "./dist/index.js", - "module": "./dist/index.mjs", - "types": "./dist/index.d.ts", + "homepage": "https://grida.co/packages/@grida/transparency-grid", + "license": "MIT", + "author": "softmarshmallow", + "repository": "https://github.com/gridaco/grida", "files": [ "dist" ], + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", "exports": { ".": { "types": "./dist/index.d.ts", @@ -39,6 +35,10 @@ "require": "./dist/react.js" } }, + "scripts": { + "build": "tsup index.ts react.tsx --format cjs,esm --dts", + "dev": "tsup index.ts react.tsx --format cjs,esm --dts --watch" + }, "dependencies": { "color-parse": "^2.0.2" }, diff --git a/packages/grida-canvas-vn/package.json b/packages/grida-canvas-vn/package.json index 5c64b7aa6e..b722c4161c 100644 --- a/packages/grida-canvas-vn/package.json +++ b/packages/grida-canvas-vn/package.json @@ -1,20 +1,14 @@ { "name": "@grida/vn", - "description": "Vector Network Spec", "version": "0.0.0", "private": true, - "scripts": { - "dev": "tsup index.ts --format cjs,esm --dts --watch", - "build": "tsup index.ts --format cjs,esm --dts", - "typecheck": "tsc -p tsconfig.json --noEmit", - "test": "vitest run" - }, - "main": "./dist/index.js", - "module": "./dist/index.mjs", - "types": "./dist/index.d.ts", + "description": "Vector Network Spec", "files": [ "dist" ], + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", "exports": { ".": { "types": "./dist/index.d.ts", @@ -22,6 +16,12 @@ "require": "./dist/index.js" } }, + "scripts": { + "build": "tsup index.ts --format cjs,esm --dts", + "dev": "tsup index.ts --format cjs,esm --dts --watch", + "test": "vitest run", + "typecheck": "tsc -p tsconfig.json --noEmit" + }, "dependencies": { "@grida/cmath": "workspace:*", "svg-pathdata": "^7.2.0" diff --git a/packages/grida-cmath/package.json b/packages/grida-cmath/package.json index cd452d77e0..1180b72a7c 100644 --- a/packages/grida-cmath/package.json +++ b/packages/grida-cmath/package.json @@ -1,40 +1,35 @@ { "name": "@grida/cmath", + "version": "0.0.0", "description": "unopinionated canvas math", "keywords": [ - "canvas", - "math", - "geometry", - "vector", - "rectangle", - "circle", - "ellipse", - "polygon", - "path", - "svg", "bezier", "blob", + "canvas", + "circle", "dnd", + "ellipse", + "geometry", "layout", + "math", "measurement", - "snap" + "path", + "polygon", + "rectangle", + "snap", + "svg", + "vector" ], - "version": "0.0.0", "homepage": "https://grida.co", - "repository": "https://github.com/gridaco/grida", "license": "MIT", "author": "softmarshmallow", - "scripts": { - "dev": "tsup index.ts _blob.ts _dnd.ts _layout.ts _measurement.ts _snap.ts --format cjs,esm --dts --watch", - "build": "tsup index.ts _blob.ts _dnd.ts _layout.ts _measurement.ts _snap.ts --format cjs,esm --dts", - "test": "vitest run" - }, - "main": "./dist/index.js", - "module": "./dist/index.mjs", - "types": "./dist/index.d.ts", + "repository": "https://github.com/gridaco/grida", "files": [ "dist" ], + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", "exports": { ".": { "types": "./dist/index.d.ts", @@ -66,5 +61,10 @@ "import": "./dist/_snap.mjs", "require": "./dist/_snap.js" } + }, + "scripts": { + "build": "tsup index.ts _blob.ts _dnd.ts _layout.ts _measurement.ts _snap.ts --format cjs,esm --dts", + "dev": "tsup index.ts _blob.ts _dnd.ts _layout.ts _measurement.ts _snap.ts --format cjs,esm --dts --watch", + "test": "vitest run" } } diff --git a/packages/grida-fonts/package.json b/packages/grida-fonts/package.json index 370ca1b047..8e9a0a3d2f 100644 --- a/packages/grida-fonts/package.json +++ b/packages/grida-fonts/package.json @@ -48,10 +48,10 @@ } }, "scripts": { - "typecheck": "tsc --noEmit", - "dev": "tsup google.ts fontface.ts fontface-dom.ts typr/index.ts parse/index.ts parser-worker/index.ts parser-worker/worker.ts k.ts --format cjs,esm --dts --watch", "build": "tsup google.ts fontface.ts fontface-dom.ts typr/index.ts parse/index.ts parser-worker/index.ts parser-worker/worker.ts k.ts --format cjs,esm --dts", - "test": "vitest run" + "dev": "tsup google.ts fontface.ts fontface-dom.ts typr/index.ts parse/index.ts parser-worker/index.ts parser-worker/worker.ts k.ts --format cjs,esm --dts --watch", + "test": "vitest run", + "typecheck": "tsc --noEmit" }, "devDependencies": { "@types/node": "^22" diff --git a/packages/grida-format/package.json b/packages/grida-format/package.json index 0bd3dc4b60..ffcd854bf3 100644 --- a/packages/grida-format/package.json +++ b/packages/grida-format/package.json @@ -2,22 +2,22 @@ "name": "@grida/format", "version": "0.0.0", "private": true, + "files": [ + "dist" + ], + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", "scripts": { + "build": "tsup src/index.ts --format cjs,esm --dts", + "dev": "tsup src/index.ts --format cjs,esm --dts --watch", "flatc:clean": "rm -rf src/grida src/grida.ts", "flatc:generate": "pnpm flatc:clean && python3 ../../bin/activate-flatc -- --ts --ts-no-import-ext -o src ../../format/grida.fbs", "generate": "pnpm flatc:generate", "prebuild": "pnpm flatc:generate", - "dev": "tsup src/index.ts --format cjs,esm --dts --watch", - "build": "tsup src/index.ts --format cjs,esm --dts", - "typecheck": "tsc --noEmit", - "test": "vitest run" + "test": "vitest run", + "typecheck": "tsc --noEmit" }, - "main": "./dist/index.js", - "module": "./dist/index.mjs", - "types": "./dist/index.d.ts", - "files": [ - "dist" - ], "dependencies": { "flatbuffers": "^25.9.23" } diff --git a/packages/grida-mixed-properties/package.json b/packages/grida-mixed-properties/package.json index 8343e357fd..96dc96d5ea 100644 --- a/packages/grida-mixed-properties/package.json +++ b/packages/grida-mixed-properties/package.json @@ -1,31 +1,31 @@ { "name": "@grida/mixed-properties", - "description": "Mixed property analysis utilities for Grida", "version": "0.0.0", - "homepage": "https://grida.co", - "repository": "https://github.com/gridaco/grida", - "license": "MIT", - "author": "softmarshmallow", "private": false, + "description": "Mixed property analysis utilities for Grida", "keywords": [ + "aggregator", "grida", "json", "jsonsschema", - "aggregator", "mixed", "properties" ], + "homepage": "https://grida.co", + "license": "MIT", + "author": "softmarshmallow", + "repository": "https://github.com/gridaco/grida", + "files": [ + "dist" + ], + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", "scripts": { - "dev": "tsup index.ts --format cjs,esm --dts --watch", "build": "tsup index.ts --format cjs,esm --dts", + "dev": "tsup index.ts --format cjs,esm --dts --watch", "test": "vitest run" }, - "main": "./dist/index.js", - "module": "./dist/index.mjs", - "types": "./dist/index.d.ts", - "files": [ - "dist" - ], "dependencies": { "fast-deep-equal": "^3.1.3" }, diff --git a/packages/grida-number-input/package.json b/packages/grida-number-input/package.json index 240d49f5c9..3194aaa0aa 100644 --- a/packages/grida-number-input/package.json +++ b/packages/grida-number-input/package.json @@ -1,39 +1,33 @@ { "name": "@grida/number-input", - "description": "Core parsing, formatting, and UI binding utilities for number inputs with multi-unit support", "version": "0.0.0", - "homepage": "https://grida.co", - "repository": "https://github.com/gridaco/grida", - "license": "MIT", - "author": "softmarshmallow", "private": false, + "description": "Core parsing, formatting, and UI binding utilities for number inputs with multi-unit support", "keywords": [ - "number", + "accessibility", "format", - "parsing", + "grida", + "hook", "input", + "number", + "parsing", + "precision", "react", - "hook", + "scaling", "ui", - "accessibility", "units", - "scaling", - "precision", - "validation", - "grida" + "validation" ], - "scripts": { - "typecheck": "tsc --noEmit", - "dev": "tsup src/index.ts src/react/index.ts --format cjs,esm --dts --watch", - "build": "tsup src/index.ts src/react/index.ts --format cjs,esm --dts", - "test": "vitest run" - }, - "main": "./dist/index.js", - "module": "./dist/index.mjs", - "types": "./dist/index.d.ts", + "homepage": "https://grida.co", + "license": "MIT", + "author": "softmarshmallow", + "repository": "https://github.com/gridaco/grida", "files": [ "dist" ], + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", "exports": { ".": { "types": "./dist/index.d.ts", @@ -46,10 +40,21 @@ "require": "./dist/react/index.js" } }, + "scripts": { + "build": "tsup src/index.ts src/react/index.ts --format cjs,esm --dts", + "dev": "tsup src/index.ts src/react/index.ts --format cjs,esm --dts --watch", + "test": "vitest run", + "typecheck": "tsc --noEmit" + }, "dependencies": {}, + "devDependencies": { + "@types/react": "^19", + "@use-gesture/react": "^10", + "react": "^19.0.0" + }, "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "@use-gesture/react": "^10" + "@use-gesture/react": "^10", + "react": "^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "react": { @@ -58,10 +63,5 @@ "@use-gesture/react": { "optional": true } - }, - "devDependencies": { - "@types/react": "^19", - "@use-gesture/react": "^10", - "react": "^19.0.0" } } diff --git a/packages/grida-tokens/package.json b/packages/grida-tokens/package.json index c8e40c6ef6..0270afb8b4 100644 --- a/packages/grida-tokens/package.json +++ b/packages/grida-tokens/package.json @@ -1,30 +1,25 @@ { "name": "@grida/tokens", - "description": "Grida AST logic model", "version": "0.0.0", - "homepage": "https://grida.co", - "repository": "https://github.com/gridaco/grida", - "license": "MIT", - "author": "softmarshmallow", "private": false, + "description": "Grida AST logic model", "keywords": [ - "grida", + "ast", "design", + "grida", "tokens", - "ast", "typescript" ], - "scripts": { - "dev": "tsup src/index.ts src/utils.ts src/locales.ts --format cjs,esm --dts --watch", - "build": "tsup src/index.ts src/utils.ts src/locales.ts --format cjs,esm --dts", - "test": "vitest run" - }, - "main": "./dist/index.js", - "module": "./dist/index.mjs", - "types": "./dist/index.d.ts", + "homepage": "https://grida.co", + "license": "MIT", + "author": "softmarshmallow", + "repository": "https://github.com/gridaco/grida", "files": [ "dist" ], + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", "exports": { ".": { "types": "./dist/index.d.ts", @@ -41,5 +36,10 @@ "import": "./dist/locales.mjs", "require": "./dist/locales.js" } + }, + "scripts": { + "build": "tsup src/index.ts src/utils.ts src/locales.ts --format cjs,esm --dts", + "dev": "tsup src/index.ts src/utils.ts src/locales.ts --format cjs,esm --dts --watch", + "test": "vitest run" } } diff --git a/packages/lib/treearray/package.json b/packages/lib/treearray/package.json index ec46404051..5703b75f43 100644 --- a/packages/lib/treearray/package.json +++ b/packages/lib/treearray/package.json @@ -1,28 +1,28 @@ { "name": "treearray", - "description": "sort tree data as in array form of data", "version": "0.0.0", - "homepage": "https://grida.co", - "repository": "https://github.com/gridaco/grida", - "license": "MIT", - "author": "softmarshmallow", "private": true, + "description": "sort tree data as in array form of data", "keywords": [ - "grida", - "tree", "array", + "grida", "sort", + "tree", "treearray" ], - "scripts": { - "dev": "tsup index.ts --format cjs,esm --dts --watch", - "build": "tsup index.ts --format cjs,esm --dts", - "test": "vitest run" - }, + "homepage": "https://grida.co", + "license": "MIT", + "author": "softmarshmallow", + "repository": "https://github.com/gridaco/grida", + "files": [ + "dist" + ], "main": "./dist/index.js", "module": "./dist/index.mjs", "types": "./dist/index.d.ts", - "files": [ - "dist" - ] + "scripts": { + "build": "tsup index.ts --format cjs,esm --dts", + "dev": "tsup index.ts --format cjs,esm --dts --watch", + "test": "vitest run" + } } diff --git a/packages/react-p-queue/package.json b/packages/react-p-queue/package.json index f990af02a9..352782a3b0 100644 --- a/packages/react-p-queue/package.json +++ b/packages/react-p-queue/package.json @@ -1,32 +1,27 @@ { "name": "react-p-queue", - "description": "A React library for handling promise-based queue management with support for batch processing, throttling, and concurrency control using `p-queue`", "version": "0.0.0", - "homepage": "https://grida.co", - "repository": "https://github.com/gridaco/grida", - "license": "MIT", - "author": "softmarshmallow", "private": false, + "description": "A React library for handling promise-based queue management with support for batch processing, throttling, and concurrency control using `p-queue`", "keywords": [ + "batch", + "concurrency", "grida", - "react", "p-queue", "queue", - "batch", - "throttle", - "concurrency" + "react", + "throttle" ], - "scripts": { - "dev": "tsup index.tsx --format cjs,esm --dts --watch", - "build": "tsup index.tsx --format cjs,esm --dts", - "test": "vitest run" - }, - "main": "./dist/index.js", - "module": "./dist/index.mjs", - "types": "./dist/index.d.ts", + "homepage": "https://grida.co", + "license": "MIT", + "author": "softmarshmallow", + "repository": "https://github.com/gridaco/grida", "files": [ "dist" ], + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", "exports": { ".": { "types": "./dist/index.d.ts", @@ -34,6 +29,14 @@ "require": "./dist/index.js" } }, + "scripts": { + "build": "tsup index.tsx --format cjs,esm --dts", + "dev": "tsup index.tsx --format cjs,esm --dts --watch", + "test": "vitest run" + }, + "dependencies": { + "p-queue": "^7.4.1" + }, "devDependencies": { "@types/react": "^19", "react": "^19.0.0" @@ -41,8 +44,5 @@ "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" - }, - "dependencies": { - "p-queue": "^7.4.1" } } diff --git a/services/grida-canvas-document-worker-cf/package.json b/services/grida-canvas-document-worker-cf/package.json index 0836df4aa2..b73801f4ad 100644 --- a/services/grida-canvas-document-worker-cf/package.json +++ b/services/grida-canvas-document-worker-cf/package.json @@ -1,22 +1,22 @@ { - "name": "grida-canvas-document-worker-cf", - "version": "0.0.0", - "private": true, - "scripts": { - "typecheck": "tsc --noEmit", - "deploy": "wrangler deploy", - "dev": "wrangler dev", - "start": "wrangler dev", - "cf-typegen": "wrangler types" - }, - "devDependencies": { - "typescript": "^5.5.2", - "wrangler": "^4.40.1" - }, - "dependencies": { - "hono": "^4.9.8", - "lib0": "^0.2.114", - "y-protocols": "^1.0.6", - "yjs": "^13.6.27" - } + "name": "grida-canvas-document-worker-cf", + "version": "0.0.0", + "private": true, + "scripts": { + "cf-typegen": "wrangler types", + "deploy": "wrangler deploy", + "dev": "wrangler dev", + "start": "wrangler dev", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "hono": "^4.9.8", + "lib0": "^0.2.114", + "y-protocols": "^1.0.6", + "yjs": "^13.6.27" + }, + "devDependencies": { + "typescript": "^5.5.2", + "wrangler": "^4.40.1" + } } From e09e368c205dea37b4418776832f4777b3a67720 Mon Sep 17 00:00:00 2001 From: Universe Date: Sun, 8 Feb 2026 02:30:44 +0900 Subject: [PATCH 7/8] Refactor empty state components for consistency and improved UI - Replaced the deprecated EmptyWelcome component with a new Empty component across multiple pages, enhancing the visual presentation of empty states. - Updated the CampaignsPage and WelcomeNewPage to utilize the new Empty component, providing a more cohesive user experience. - Modified the EmptyRowsRenderer in the grid scaffold to align with the new empty state design, ensuring consistent messaging and styling. --- .../(console)/(resources)/campaigns/page.tsx | 27 +++++++++---- .../[id]/data/(data)/table/~new/page.tsx | 24 +++++++++--- editor/components/empty.tsx | 34 ---------------- editor/scaffolds/grid/grid-empty-state.tsx | 39 +++++++++++-------- 4 files changed, 61 insertions(+), 63 deletions(-) delete mode 100644 editor/components/empty.tsx diff --git a/editor/app/(workbench)/[org]/[proj]/(console)/(resources)/campaigns/page.tsx b/editor/app/(workbench)/[org]/[proj]/(console)/(resources)/campaigns/page.tsx index 5a991ef290..97e249851e 100644 --- a/editor/app/(workbench)/[org]/[proj]/(console)/(resources)/campaigns/page.tsx +++ b/editor/app/(workbench)/[org]/[proj]/(console)/(resources)/campaigns/page.tsx @@ -1,12 +1,19 @@ "use client"; import Link from "next/link"; +import { Megaphone } from "lucide-react"; import { CampaignCard } from "./campaign-card"; import { createBrowserWestReferralClient } from "@/lib/supabase/client"; import { useProject } from "@/scaffolds/workspace"; import { Spinner } from "@/components/ui/spinner"; import { Platform } from "@/lib/platform"; import { Button } from "@/components/ui/button"; -import EmptyWelcome from "@/components/empty"; +import { + Empty, + EmptyDescription, + EmptyHeader, + EmptyMedia, + EmptyTitle, +} from "@/components/ui/empty"; import useSWR from "swr"; export default function CampaignsPage() { @@ -50,12 +57,18 @@ export default function CampaignsPage() {
{campaigns.length === 0 && ( - + + + + + + No Campaigns + + Campaign is for Enterprise customers. Please contact your + administrator for setting up campaigns. + + + )}
{campaigns.map((c) => { diff --git a/editor/app/(workbench)/[org]/[proj]/[id]/data/(data)/table/~new/page.tsx b/editor/app/(workbench)/[org]/[proj]/[id]/data/(data)/table/~new/page.tsx index f66eff5d47..fd7e0fa19e 100644 --- a/editor/app/(workbench)/[org]/[proj]/[id]/data/(data)/table/~new/page.tsx +++ b/editor/app/(workbench)/[org]/[proj]/[id]/data/(data)/table/~new/page.tsx @@ -2,7 +2,6 @@ import React, { useEffect } from "react"; import { TableIcon } from "@radix-ui/react-icons"; -import EmptyWelcome from "@/components/empty"; import Image from "next/image"; import { Dialog, @@ -14,6 +13,13 @@ import { import { useDialogState } from "@/components/hooks/use-dialog-state"; import { Button } from "@/components/ui/button"; import artwork from "../../../../../../../../../public/images/abstract-database-illustration.png"; +import { + Empty, + EmptyDescription, + EmptyHeader, + EmptyMedia, + EmptyTitle, +} from "@/components/ui/empty"; export default function WelcomeNewPage() { const welcome = useDialogState(); @@ -28,11 +34,17 @@ export default function WelcomeNewPage() { return ( <> - } - title={"Create your first table"} - paragraph={"Let's get started by creating your first table."} - /> + + + + + + Create your first table + + Let's get started by creating your first table. + + +
diff --git a/editor/components/empty.tsx b/editor/components/empty.tsx deleted file mode 100644 index 512f9fe9d6..0000000000 --- a/editor/components/empty.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import React from "react"; - -export default function EmptyWelcome({ - art, - title, - paragraph, -}: { - art?: React.ReactNode; - title: React.ReactNode; - paragraph: React.ReactNode; -}) { - return ( -
-
-
-
{art}
-

- {title} -

-

{paragraph}

- {/*
- - Back to project home - -
*/} -
-
-
- ); -} diff --git a/editor/scaffolds/grid/grid-empty-state.tsx b/editor/scaffolds/grid/grid-empty-state.tsx index 358756c8e0..5feae240df 100644 --- a/editor/scaffolds/grid/grid-empty-state.tsx +++ b/editor/scaffolds/grid/grid-empty-state.tsx @@ -1,5 +1,12 @@ -import EmptyWelcome from "@/components/empty"; +import { Table2 } from "lucide-react"; import { Skeleton } from "@/components/ui/skeleton"; +import { + Empty, + EmptyDescription, + EmptyHeader, + EmptyMedia, + EmptyTitle, +} from "@/components/ui/empty"; export function EmptyRowsRenderer({ loading, @@ -20,21 +27,21 @@ export function EmptyRowsRenderer({ ); return (
- No Results : Table is empty - } - paragraph={ - hasPredicates ? ( - - No records match the criteria. Try changing the filters or search - query. - - ) : ( - Create a new record to get started - ) - } - /> + + + + + + + {hasPredicates ? "No Results" : "Table is empty"} + + + {hasPredicates + ? "No records match the criteria. Try changing the filters or search query." + : "Create a new record to get started"} + + +
); } From 63e66debbcef2c1966129f1caa558f2cf4d3c056 Mon Sep 17 00:00:00 2001 From: Universe Date: Sun, 8 Feb 2026 02:38:39 +0900 Subject: [PATCH 8/8] Refactor empty state components for improved consistency and user experience - Replaced existing empty state implementations with a new unified Empty component across various pages, including Campaigns, Portal Presets, Tags, and Documents. - Enhanced visual presentation and messaging for empty states, ensuring a cohesive design throughout the application. - Updated related UI elements to utilize the new Empty component, improving overall usability and aesthetics. --- .../[campaign]/_components/overview.tsx | 31 +++++++---- .../(resources)/ciam/portal/page.tsx | 36 +++++++++---- .../(console)/(resources)/tags/tags-table.tsx | 23 ++++++-- .../[proj]/[id]/objects/[[...path]]/page.tsx | 29 +++++++--- .../[org]/_components/documents-grid.tsx | 30 +++++++---- editor/app/(workspace)/[org]/page.tsx | 53 ++++++++++--------- 6 files changed, 135 insertions(+), 67 deletions(-) diff --git a/editor/app/(workbench)/[org]/[proj]/(console)/(campaign)/campaigns/[campaign]/_components/overview.tsx b/editor/app/(workbench)/[org]/[proj]/(console)/(campaign)/campaigns/[campaign]/_components/overview.tsx index d4e7831ad2..624cbe2a4d 100644 --- a/editor/app/(workbench)/[org]/[proj]/(console)/(campaign)/campaigns/[campaign]/_components/overview.tsx +++ b/editor/app/(workbench)/[org]/[proj]/(console)/(campaign)/campaigns/[campaign]/_components/overview.tsx @@ -27,7 +27,14 @@ import { import { Analytics } from "@/lib/analytics"; import useSWR from "swr"; import { useCampaign } from "../store"; -import { ActivityIcon, Loader2 } from "lucide-react"; +import { + Empty, + EmptyDescription, + EmptyHeader, + EmptyMedia, + EmptyTitle, +} from "@/components/ui/empty"; +import { Activity, Loader2 } from "lucide-react"; interface DateRange { from: Date; @@ -92,16 +99,18 @@ function getEventTotals(data: AnalyzedData): EventTotal[] { function EmptyState() { return ( -
-
- -
-

No activity yet

-

- Your campaign is ready to go! Once participants start engaging with your - campaign, you'll see activity data here. -

-
+ + + + + + No activity yet + + Your campaign is ready to go! Once participants start engaging with + your campaign, you'll see activity data here. + + + ); } diff --git a/editor/app/(workbench)/[org]/[proj]/(console)/(resources)/ciam/portal/page.tsx b/editor/app/(workbench)/[org]/[proj]/(console)/(resources)/ciam/portal/page.tsx index 063bb3522e..9a498235de 100644 --- a/editor/app/(workbench)/[org]/[proj]/(console)/(resources)/ciam/portal/page.tsx +++ b/editor/app/(workbench)/[org]/[proj]/(console)/(resources)/ciam/portal/page.tsx @@ -27,7 +27,15 @@ import { DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; -import { PlusIcon, StarIcon } from "lucide-react"; +import { + Empty, + EmptyContent, + EmptyDescription, + EmptyHeader, + EmptyMedia, + EmptyTitle, +} from "@/components/ui/empty"; +import { Mail, PlusIcon, StarIcon } from "lucide-react"; import type { Database } from "@app/database"; type PortalPresetRow = @@ -81,8 +89,7 @@ function usePortalPresets() { } export default function PortalPresetsPage() { - const { presets, isLoading, createPreset, setPrimary } = - usePortalPresets(); + const { presets, isLoading, createPreset, setPrimary } = usePortalPresets(); const pathname = usePathname(); const [dialogOpen, setDialogOpen] = useState(false); @@ -168,15 +175,24 @@ export default function PortalPresetsPage() { ))}
) : !presets || presets.length === 0 ? ( - - - No presets yet - + + + + + + No presets yet + Create a portal preset to customize the verification email sent to customers when they log in. - - - + + + + + + ) : (
{presets.map((preset) => ( diff --git a/editor/app/(workbench)/[org]/[proj]/(console)/(resources)/tags/tags-table.tsx b/editor/app/(workbench)/[org]/[proj]/(console)/(resources)/tags/tags-table.tsx index b98f6f5654..eca8bbb614 100644 --- a/editor/app/(workbench)/[org]/[proj]/(console)/(resources)/tags/tags-table.tsx +++ b/editor/app/(workbench)/[org]/[proj]/(console)/(resources)/tags/tags-table.tsx @@ -19,8 +19,15 @@ import { import { Badge } from "@/components/ui/badge"; import { EditTagDialog } from "./edit-tag-dialog"; import { DeleteTagDialog } from "./delete-tag-dialog"; -import { MoreHorizontal, Pencil, Trash2 } from "lucide-react"; +import { MoreHorizontal, Pencil, Tag, Trash2 } from "lucide-react"; import { useTags } from "@/scaffolds/workspace"; +import { + Empty, + EmptyDescription, + EmptyHeader, + EmptyMedia, + EmptyTitle, +} from "@/components/ui/empty"; import type { Platform } from "@/lib/platform"; function getContrastColor(hexColor: string) { @@ -100,8 +107,18 @@ export function TagsTable() { {tags.length === 0 ? ( - - No tags found. Create your first tag to get started. + + + + + + + No tags found + + Create your first tag to get started. + + + ) : ( diff --git a/editor/app/(workbench)/[org]/[proj]/[id]/objects/[[...path]]/page.tsx b/editor/app/(workbench)/[org]/[proj]/[id]/objects/[[...path]]/page.tsx index 7c81b8312c..e6a4c7a3c8 100644 --- a/editor/app/(workbench)/[org]/[proj]/[id]/objects/[[...path]]/page.tsx +++ b/editor/app/(workbench)/[org]/[proj]/[id]/objects/[[...path]]/page.tsx @@ -9,6 +9,14 @@ import React, { } from "react"; import { format } from "date-fns"; import Link from "next/link"; +import { + Empty, + EmptyContent, + EmptyDescription, + EmptyHeader, + EmptyMedia, + EmptyTitle, +} from "@/components/ui/empty"; import { FolderIcon, GridIcon, ListIcon, UploadIcon } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; @@ -639,13 +647,20 @@ function FolderEmptyState() { }, [plainFiles, upload]); return ( -
- -
- Drop files here to upload -
- -
+ + + + + + Drop files here to upload + + Upload files to this folder or drag and drop them here. + + + + + + ); } diff --git a/editor/app/(workspace)/[org]/_components/documents-grid.tsx b/editor/app/(workspace)/[org]/_components/documents-grid.tsx index 7e1fe7ef76..a354db79e5 100644 --- a/editor/app/(workspace)/[org]/_components/documents-grid.tsx +++ b/editor/app/(workspace)/[org]/_components/documents-grid.tsx @@ -7,7 +7,7 @@ import { GridCard, RowCard, } from "@/app/(workspace)/[org]/_components/form-card"; -import { BoxSelectIcon } from "lucide-react"; +import { FileText } from "lucide-react"; import { editorlink } from "@/host/url"; import { ContextMenu, @@ -22,6 +22,13 @@ import { DeleteConfirmationAlertDialog, DeleteConfirmationSnippet, } from "@/components/dialogs/delete-confirmation-dialog"; +import { + Empty, + EmptyDescription, + EmptyHeader, + EmptyMedia, + EmptyTitle, +} from "@/components/ui/empty"; import { TrashIcon } from "@radix-ui/react-icons"; import { createBrowserClient } from "@/lib/supabase/client"; @@ -125,15 +132,18 @@ export function DocumentsGrid({ )} {documents.length === 0 && ( -
-
-
- - - No documents yet - -
-
+
+ + + + + + No documents yet + + Create a document to get started. + + +
)} {documents.map((doc, i) => { diff --git a/editor/app/(workspace)/[org]/page.tsx b/editor/app/(workspace)/[org]/page.tsx index 3025e3e97e..504ef0a7e2 100644 --- a/editor/app/(workspace)/[org]/page.tsx +++ b/editor/app/(workspace)/[org]/page.tsx @@ -12,14 +12,16 @@ import { import { CreateNewDocumentButton } from "@/scaffolds/workspace/create-new-document-button"; import { ProjectStats } from "@/scaffolds/analytics/stats"; import { PoweredByGridaFooter } from "@/grida-forms-hosted/e/powered-by-brand-footer"; -import { BoxSelectIcon } from "lucide-react"; +import { FolderPlus } from "lucide-react"; import { CreateNewProjectDialog } from "@/scaffolds/workspace/new-project-dialog"; import { - Card, - CardContent, - CardFooter, - CardHeader, -} from "@/components/ui/card"; + Empty, + EmptyContent, + EmptyDescription, + EmptyHeader, + EmptyMedia, + EmptyTitle, +} from "@/components/ui/empty"; import { Button } from "@/components/ui/button"; import { useWorkspace } from "@/scaffolds/workspace"; import { Skeleton } from "@/components/ui/skeleton"; @@ -70,26 +72,25 @@ export default function OrganizationDashboardPage(props: { ) : ( <> {projects.length === 0 && ( - - - -
-
- -

- No projects yet -

-
- - - -
- -
-
+ + + + + + No projects yet + + Create your first project to get started. + + + + + + + + )} {projects.map((p) => { const projectdocuments = documents.filter(