From 994cbd41cfb0e8702cd4535bf4c9af0929bff8f8 Mon Sep 17 00:00:00 2001 From: Austin1serb Date: Thu, 31 Jul 2025 23:47:16 -0700 Subject: [PATCH] added useScopedUI hook --- .gitignore | 2 +- package.json | 5 +- packages/core/__tests__/e2e/next.spec.js | 3 +- packages/core/__tests__/e2e/vite.spec.js | 3 +- .../fixtures/next/.zero-ui/attributes.js | 3 - .../core/__tests__/fixtures/next/app/FAQ.tsx | 7 +- .../__tests__/fixtures/next/app/layout.tsx | 20 ++- .../core/__tests__/fixtures/next/app/page.tsx | 17 +- .../fixtures/vite/.zero-ui/attributes.d.ts | 1 + .../fixtures/vite/.zero-ui/attributes.js | 4 +- .../core/__tests__/fixtures/vite/src/App.css | 4 - .../core/__tests__/fixtures/vite/src/App.tsx | 30 +++- .../fixtures/vite/src/ChildComponent.tsx | 20 +++ .../fixtures/vite/src/ChildWithoutSetter.tsx | 14 ++ .../core/__tests__/fixtures/vite/src/FAQ.tsx | 7 +- packages/core/package.json | 2 +- packages/core/src/cli/postInstall.ts | 4 +- packages/core/src/index.ts | 145 ++++-------------- packages/core/src/internal.ts | 71 +++++++++ .../core/src/postcss/ast-generating.test.ts | 2 +- packages/core/src/postcss/ast-parsing.test.ts | 35 ++++- packages/core/src/postcss/ast-parsing.ts | 53 ++++--- packages/core/src/postcss/helpers.test.ts | 18 +-- packages/core/src/postcss/helpers.ts | 18 ++- packages/core/src/postcss/index.cts | 14 +- packages/core/src/postcss/resolvers.test.ts | 2 +- packages/core/src/{ => postcss}/utilities.ts | 0 27 files changed, 296 insertions(+), 208 deletions(-) create mode 100644 packages/core/__tests__/fixtures/vite/src/ChildComponent.tsx create mode 100644 packages/core/__tests__/fixtures/vite/src/ChildWithoutSetter.tsx create mode 100644 packages/core/src/internal.ts rename packages/core/src/{ => postcss}/utilities.ts (100%) diff --git a/.gitignore b/.gitignore index 2338da7..0091b38 100644 --- a/.gitignore +++ b/.gitignore @@ -19,7 +19,7 @@ yarn-error.log* # tarballs produced during local tests *.tgz - +t.* # keep these files !next-env.d.ts diff --git a/package.json b/package.json index 95ecbc9..6077bb1 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,8 @@ "lint": "eslint .", "lint:fix": "eslint . --fix", "typecheck": "tsc --noEmit --project tsconfig.base.json", - "size": "npx esbuild ./packages/core/dist/index.js --bundle --minify --format=esm --external:react --define:process.env.NODE_ENV='\"production\"' | gzip -c | wc -c" + "size": "npx esbuild ./packages/core/dist/index.js --bundle --minify --format=esm --external:react --define:process.env.NODE_ENV='\"production\"' | gzip -c | wc -c", + "build-output": "npx esbuild ./packages/core/dist/index.js --bundle --minify --format=esm --external:react --define:process.env.NODE_ENV='\"production\"'" }, "devDependencies": { "@eslint/js": "^9.30.1", @@ -48,4 +49,4 @@ "tsx": "^4.20.3", "typescript": "^5.8.3" } -} +} \ No newline at end of file diff --git a/packages/core/__tests__/e2e/next.spec.js b/packages/core/__tests__/e2e/next.spec.js index d3d4c73..b8263a9 100644 --- a/packages/core/__tests__/e2e/next.spec.js +++ b/packages/core/__tests__/e2e/next.spec.js @@ -178,7 +178,8 @@ test.describe('Zero-UI Next.js Integration Tests', () => { // Click scope toggle await page.getByTestId('scope-toggle').click(); - await expect(body).toHaveAttribute('data-scope', 'off'); + const scope = page.getByTestId('scope-container'); + await expect(scope).toHaveAttribute('data-scope', 'on'); // Verify other states are preserved await expect(body).toHaveAttribute('data-theme', 'dark'); diff --git a/packages/core/__tests__/e2e/vite.spec.js b/packages/core/__tests__/e2e/vite.spec.js index 335d58e..6e7b5b3 100644 --- a/packages/core/__tests__/e2e/vite.spec.js +++ b/packages/core/__tests__/e2e/vite.spec.js @@ -167,7 +167,8 @@ test.describe('Zero-UI Next.js Integration Tests', () => { // Click scope toggle await page.getByTestId('scope-toggle').click(); - await expect(body).toHaveAttribute('data-scope', 'off'); + const scope = page.getByTestId('scope-container'); + await expect(scope).toHaveAttribute('data-scope', 'on'); // Verify other states are preserved await expect(body).toHaveAttribute('data-theme', 'dark'); diff --git a/packages/core/__tests__/fixtures/next/.zero-ui/attributes.js b/packages/core/__tests__/fixtures/next/.zero-ui/attributes.js index 025aec9..3db700f 100644 --- a/packages/core/__tests__/fixtures/next/.zero-ui/attributes.js +++ b/packages/core/__tests__/fixtures/next/.zero-ui/attributes.js @@ -1,10 +1,7 @@ /* AUTO-GENERATED - DO NOT EDIT */ export const bodyAttributes = { "data-child": "closed", - "data-faq": "closed", - "data-mobile": "false", "data-number": "1", - "data-scope": "off", "data-theme": "light", "data-theme-2": "light", "data-theme-three": "light", diff --git a/packages/core/__tests__/fixtures/next/app/FAQ.tsx b/packages/core/__tests__/fixtures/next/app/FAQ.tsx index 628ddee..1c69f77 100644 --- a/packages/core/__tests__/fixtures/next/app/FAQ.tsx +++ b/packages/core/__tests__/fixtures/next/app/FAQ.tsx @@ -1,12 +1,13 @@ -import { useUI } from '@react-zero-ui/core'; +import { useScopedUI } from '@react-zero-ui/core'; function FAQ({ question, answer, index }) { - const [, setOpen] = useUI<'open' | 'closed'>('faq', 'closed'); // Same key everywhere! + const [open, setOpen] = useScopedUI<'open' | 'closed'>('faq', 'closed'); // Same key everywhere! return (
+ data-index={index} + data-faq={open}>
+
+
+

Scoped Style Tests

+
@@ -139,6 +147,7 @@ export default function App() { className="scope-off:bg-blue-100 scope-on:bg-blue-900 scope-on:text-white" data-testid="scope-container" //this ref tells the hook to flip the data key here + data-scope={scope} ref={setScope.ref}> +
Scope: False True
+
+ ref={setMobile.ref} + data-mobile={mobile}>
-
+
+ +
+
+ Child: Open Closed +
+
+ ); +} diff --git a/packages/core/__tests__/fixtures/vite/src/ChildWithoutSetter.tsx b/packages/core/__tests__/fixtures/vite/src/ChildWithoutSetter.tsx new file mode 100644 index 0000000..8c90e96 --- /dev/null +++ b/packages/core/__tests__/fixtures/vite/src/ChildWithoutSetter.tsx @@ -0,0 +1,14 @@ +export function ChildWithoutSetter() { + return ( +
+
+
+ Child Scope: False + True +
+
+
+ ); +} diff --git a/packages/core/__tests__/fixtures/vite/src/FAQ.tsx b/packages/core/__tests__/fixtures/vite/src/FAQ.tsx index c14fb9e..e29102b 100644 --- a/packages/core/__tests__/fixtures/vite/src/FAQ.tsx +++ b/packages/core/__tests__/fixtures/vite/src/FAQ.tsx @@ -1,12 +1,13 @@ -import { useUI } from '@react-zero-ui/core'; +import { useScopedUI } from '@react-zero-ui/core'; function FAQ({ question, answer, index }: { question: string; answer: string; index: number }) { - const [, setOpen] = useUI<'open' | 'closed'>('faq', 'closed'); // Same key everywhere! + const [open, setOpen] = useScopedUI<'open' | 'closed'>('faq', 'closed'); // Same key everywhere! return (
+ data-index={index} + data-faq={open}>