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}>