{"_id":"@aisquare/pretty","_rev":"27-8a9941def67460cfea40e7b1a56cab0e","name":"@aisquare/pretty","dist-tags":{"latest":"0.10.34"},"versions":{"0.1.0":{"name":"@aisquare/pretty","version":"0.1.0","keywords":["aisquare","ui","components","tailwind","shadcn","react"],"license":"MIT","_id":"@aisquare/pretty@0.1.0","maintainers":[{"name":"aisquare-bots","email":"bots@aisquare.studio"}],"homepage":"https://github.com/AISquare-Studio/aisquare-pretty#readme","bugs":{"url":"https://github.com/AISquare-Studio/aisquare-pretty/issues"},"dist":{"shasum":"4bd1c23f46fc0961a2113192b316245095777a41","tarball":"https://registry.npmjs.org/@aisquare/pretty/-/pretty-0.1.0.tgz","fileCount":52,"integrity":"sha512-/kT0YsSn1aKIG4yLRdqjWMbW/YOTuwTHJvEL4hMiVx7TTdQ9PhTsEtLuuX7p2RAbBKIQ/fIDs6B16NlKprbJpw==","signatures":[{"sig":"MEUCIB3dKVWGsoMNo4cRQaADP2mDXa1OrpAJbiFNwr1oJcCDAiEA2kI+XKE9l8iA2TlO3TVTpYN2n1v4QysO6ipZ0cldono=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":254461},"main":"./dist/index.js","type":"module","_from":"file:aisquare-pretty-0.1.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json","./tailwind.preset":{"types":"./dist/tailwind.preset.d.ts","import":"./dist/tailwind.preset.js"},"./tokens.template.css":"./src/tokens/tokens.template.css"},"scripts":{"dev":"vite build --watch","lint":"eslint src --ext .ts,.tsx --max-warnings 0","size":"size-limit","test":"vitest","build":"vite build && tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","format":"prettier --write \"src/**/*.{ts,tsx}\" \"*.md\"","test:ci":"vitest --run","typecheck":"tsc --noEmit"},"_npmUser":{"name":"aisquare-bots","email":"bots@aisquare.studio"},"_resolved":"/tmp/77b47586a39d37e5277d7f101c7df4fe/aisquare-pretty-0.1.0.tgz","_integrity":"sha512-/kT0YsSn1aKIG4yLRdqjWMbW/YOTuwTHJvEL4hMiVx7TTdQ9PhTsEtLuuX7p2RAbBKIQ/fIDs6B16NlKprbJpw==","repository":{"url":"git+https://github.com/AISquare-Studio/aisquare-pretty.git","type":"git"},"_npmVersion":"10.8.2","description":"Pretty UI primitives for AISquare. Centralized buttons, inputs, motion, and tokens shared across creator-studio and ai-studio.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.1","sonner":"^1.7.0","lucide-react":"^0.460.0","tailwind-merge":"^2.5.4","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-tooltip":"^1.1.4","class-variance-authority":"^0.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.10","jsdom":"^25.0.1","react":"^18.3.1","eslint":"^8.57.1","vitest":"^2.1.4","axe-core":"^4.10.2","prettier":"^3.3.3","react-dom":"^18.3.1","size-limit":"^11.1.6","typescript":"^5.6.3","vitest-axe":"^0.1.0","@types/node":"^22.5.0","tailwindcss":"^3.4.14","@types/react":"^18.3.12","framer-motion":"^11.11.0","vite-plugin-dts":"^4.3.0","@types/react-dom":"^18.3.1","@vitejs/plugin-react":"^4.3.3","@testing-library/react":"^16.0.1","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/parser":"^8.13.0","eslint-plugin-react-hooks":"^5.0.0","@testing-library/user-event":"^14.5.2","eslint-plugin-react-refresh":"^0.4.14","@size-limit/preset-small-lib":"^11.1.6","@typescript-eslint/eslint-plugin":"^8.13.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":">=3.4.0","framer-motion":">=11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/pretty_0.1.0_1777412892391_0.306715826405235","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@aisquare/pretty","version":"0.3.0","keywords":["aisquare","ui","components","tailwind","shadcn","react"],"license":"MIT","_id":"@aisquare/pretty@0.3.0","maintainers":[{"name":"aisquare-bots","email":"bots@aisquare.studio"}],"homepage":"https://github.com/AISquare-Studio/aisquare-pretty#readme","bugs":{"url":"https://github.com/AISquare-Studio/aisquare-pretty/issues"},"dist":{"shasum":"45ee88bd75bb7fd0939dec0dbab051a6df5bf46a","tarball":"https://registry.npmjs.org/@aisquare/pretty/-/pretty-0.3.0.tgz","fileCount":9,"integrity":"sha512-Rw4jBy06T3Tz52BWBdNqP83PXj675kKj+V0zy+LuNpIGMnh2Q3kDgvsjKEQ+xSVGgT6xSyARurS5ofogatl2Lw==","signatures":[{"sig":"MEUCIQDdUbcTQUKhPuhROoHLEKqtCsFfIXpwbq2uKl9KBe8E9gIgCs84Gp0ZFrOfvhSvEW+P+xJ8KYV5Z0ddr6fuEnQyVhw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":463464},"main":"./dist/index.js","type":"module","_from":"file:aisquare-pretty-0.3.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json","./tailwind.preset":{"types":"./dist/tailwind.preset.d.cts","import":"./dist/tailwind.preset.cjs","default":"./dist/tailwind.preset.cjs","require":"./dist/tailwind.preset.cjs"},"./tokens.template.css":"./src/tokens/tokens.template.css"},"scripts":{"dev":"vite build --watch","lint":"eslint src --ext .ts,.tsx --max-warnings 0","size":"size-limit","test":"vitest","build":"vite build && tsup --config tsup.preset.config.ts","format":"prettier --write \"src/**/*.{ts,tsx}\" \"*.md\"","test:ci":"vitest --run","typecheck":"tsc --noEmit","build:check-exports":"attw --pack . --ignore-rules cjs-resolves-to-esm cjs-only-exports-default no-resolution named-exports"},"_npmUser":{"name":"aisquare-bots","email":"bots@aisquare.studio"},"_resolved":"/tmp/d031015355ea61d925b9244aa0e00636/aisquare-pretty-0.3.0.tgz","_integrity":"sha512-Rw4jBy06T3Tz52BWBdNqP83PXj675kKj+V0zy+LuNpIGMnh2Q3kDgvsjKEQ+xSVGgT6xSyARurS5ofogatl2Lw==","repository":{"url":"git+https://github.com/AISquare-Studio/aisquare-pretty.git","type":"git"},"_npmVersion":"10.8.2","description":"Pretty UI primitives for AISquare. Centralized buttons, inputs, motion, and tokens shared across creator-studio and ai-studio.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.1","sonner":"^1.7.0","lucide-react":"^0.460.0","tailwind-merge":"^2.5.4","tailwindcss-motion":"^1.1.1","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-popover":"^1.1.15","@radix-ui/react-tooltip":"^1.1.4","class-variance-authority":"^0.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vite":"^5.4.10","jsdom":"^25.0.1","lenis":"^1.3.23","react":"^18.3.1","eslint":"^8.57.1","motion":"^12.38.0","vitest":"^2.1.4","axe-core":"^4.10.2","prettier":"^3.3.3","react-dom":"^18.3.1","size-limit":"^11.1.6","typescript":"^5.6.3","vitest-axe":"^0.1.0","@types/node":"^22.5.0","tailwindcss":"^3.4.14","@types/react":"^18.3.12","canvas-confetti":"^1.9.4","vite-plugin-dts":"^4.3.0","@types/react-dom":"^18.3.1","@vitejs/plugin-react":"^4.3.3","@arethetypeswrong/cli":"^0.18.2","@testing-library/react":"^16.0.1","@types/canvas-confetti":"^1.9.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/parser":"^8.13.0","eslint-plugin-react-hooks":"^5.0.0","@testing-library/user-event":"^14.5.2","eslint-plugin-react-refresh":"^0.4.14","@size-limit/preset-small-lib":"^11.1.6","@typescript-eslint/eslint-plugin":"^8.13.0"},"peerDependencies":{"lenis":">=1.3.0","react":"^18.0.0 || ^19.0.0","motion":">=12.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":">=3.4.0","canvas-confetti":">=1.9.0"},"peerDependenciesMeta":{"lenis":{"optional":true},"canvas-confetti":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pretty_0.3.0_1777442984018_0.41273329002565196","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@aisquare/pretty","version":"0.4.1","keywords":["aisquare","ui","components","tailwind","shadcn","react"],"license":"MIT","_id":"@aisquare/pretty@0.4.1","maintainers":[{"name":"aisquare-bots","email":"bots@aisquare.studio"}],"homepage":"https://github.com/AISquare-Studio/aisquare-pretty#readme","bugs":{"url":"https://github.com/AISquare-Studio/aisquare-pretty/issues"},"dist":{"shasum":"3202105b5a12214236b55029d02fa0cf215bde9c","tarball":"https://registry.npmjs.org/@aisquare/pretty/-/pretty-0.4.1.tgz","fileCount":9,"integrity":"sha512-6jFJbiEa29bhQ30lfa+zSH0YgaHzn5Q6+DHa3HXr497WlAdPyEdZ15XRWzRtuyeOe9QvXKabCWlQ26GGk2DyyQ==","signatures":[{"sig":"MEYCIQCtSmD1JwKvvUiPjyMDpcHMeR+hp0okBetirKB0dnB46wIhAJ9ZshKPruR9ENhjMyw+hAKSkhMHl8Z3NFL0RJ80bIdJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":490945},"main":"./dist/index.js","type":"module","_from":"file:aisquare-pretty-0.4.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json","./tailwind.preset":{"types":"./dist/tailwind.preset.d.cts","import":"./dist/tailwind.preset.cjs","default":"./dist/tailwind.preset.cjs","require":"./dist/tailwind.preset.cjs"},"./tokens.template.css":"./src/tokens/tokens.template.css"},"scripts":{"dev":"vite build --watch","lint":"eslint src --ext .ts,.tsx --max-warnings 0","size":"size-limit","test":"vitest","build":"vite build && tsup --config tsup.preset.config.ts","format":"prettier --write \"src/**/*.{ts,tsx}\" \"*.md\"","test:ci":"vitest --run","typecheck":"tsc --noEmit","build:check-exports":"attw --pack . --ignore-rules cjs-resolves-to-esm cjs-only-exports-default no-resolution named-exports"},"_npmUser":{"name":"aisquare-bots","email":"bots@aisquare.studio"},"_resolved":"/tmp/5195a09186827dae8f9893e4d08d5b84/aisquare-pretty-0.4.1.tgz","_integrity":"sha512-6jFJbiEa29bhQ30lfa+zSH0YgaHzn5Q6+DHa3HXr497WlAdPyEdZ15XRWzRtuyeOe9QvXKabCWlQ26GGk2DyyQ==","repository":{"url":"git+https://github.com/AISquare-Studio/aisquare-pretty.git","type":"git"},"_npmVersion":"10.8.2","description":"Pretty UI primitives for AISquare. Centralized buttons, inputs, motion, and tokens shared across creator-studio and ai-studio.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.1","sonner":"^1.7.0","remark-gfm":"^4.0.1","lucide-react":"^0.460.0","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","tailwind-merge":"^2.5.4","rehype-sanitize":"^6.0.0","tailwindcss-motion":"^1.1.1","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-popover":"^1.1.15","@radix-ui/react-tooltip":"^1.1.4","@tailwindcss/typography":"^0.5.19","class-variance-authority":"^0.7.0","react-syntax-highlighter":"^16.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vite":"^5.4.10","jsdom":"^25.0.1","lenis":"^1.3.23","react":"^18.3.1","eslint":"^8.57.1","motion":"^12.38.0","vitest":"^2.1.4","axe-core":"^4.10.2","prettier":"^3.3.3","react-dom":"^18.3.1","size-limit":"^11.1.6","typescript":"^5.6.3","vitest-axe":"^0.1.0","@types/node":"^22.5.0","tailwindcss":"^3.4.14","@types/react":"^18.3.12","canvas-confetti":"^1.9.4","vite-plugin-dts":"^4.3.0","@types/react-dom":"^18.3.1","@vitejs/plugin-react":"^4.3.3","@arethetypeswrong/cli":"^0.18.2","@testing-library/react":"^16.0.1","@types/canvas-confetti":"^1.9.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/parser":"^8.13.0","eslint-plugin-react-hooks":"^5.0.0","@testing-library/user-event":"^14.5.2","eslint-plugin-react-refresh":"^0.4.14","@size-limit/preset-small-lib":"^11.1.6","@types/react-syntax-highlighter":"^15.5.13","@typescript-eslint/eslint-plugin":"^8.13.0"},"peerDependencies":{"lenis":">=1.3.0","react":"^18.0.0 || ^19.0.0","motion":">=12.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":">=3.4.0","canvas-confetti":">=1.9.0"},"peerDependenciesMeta":{"lenis":{"optional":true},"canvas-confetti":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pretty_0.4.1_1777490066359_0.7947526282701178","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@aisquare/pretty","version":"0.4.2","keywords":["aisquare","ui","components","tailwind","shadcn","react"],"license":"MIT","_id":"@aisquare/pretty@0.4.2","maintainers":[{"name":"aisquare-bots","email":"bots@aisquare.studio"}],"homepage":"https://github.com/AISquare-Studio/aisquare-pretty#readme","bugs":{"url":"https://github.com/AISquare-Studio/aisquare-pretty/issues"},"dist":{"shasum":"47c20dcb40226a973611b67896c55064415518e0","tarball":"https://registry.npmjs.org/@aisquare/pretty/-/pretty-0.4.2.tgz","fileCount":9,"integrity":"sha512-NLFDMsCKb76YGktQwqWV8bBu65R51oHmJ+YDsdJ3vc2VPMo72/KlG/g6L+vfOzK60u5x2wv/jVi6ZbSAeQKYKw==","signatures":[{"sig":"MEUCIQC3tPp8bykebZzGDRigDevbTi7Kfm0C6DXclkOjHEEM+QIgPY98pjYtyvPbHdoX+piDkPgqYBwdZayE6Lx2FyA7eeU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":528961},"main":"./dist/index.js","type":"module","_from":"file:aisquare-pretty-0.4.2.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json","./tailwind.preset":{"types":"./dist/tailwind.preset.d.cts","import":"./dist/tailwind.preset.cjs","default":"./dist/tailwind.preset.cjs","require":"./dist/tailwind.preset.cjs"},"./tokens.template.css":"./src/tokens/tokens.template.css"},"scripts":{"dev":"vite build --watch","lint":"eslint src --ext .ts,.tsx --max-warnings 0","size":"size-limit","test":"vitest","build":"vite build && tsup --config tsup.preset.config.ts","format":"prettier --write \"src/**/*.{ts,tsx}\" \"*.md\"","test:ci":"vitest --run","typecheck":"tsc --noEmit","build:check-exports":"attw --pack . --ignore-rules cjs-resolves-to-esm cjs-only-exports-default no-resolution named-exports"},"_npmUser":{"name":"aisquare-bots","email":"bots@aisquare.studio"},"_resolved":"/tmp/7de07194385be90c18f7e37c49d6dd6e/aisquare-pretty-0.4.2.tgz","_integrity":"sha512-NLFDMsCKb76YGktQwqWV8bBu65R51oHmJ+YDsdJ3vc2VPMo72/KlG/g6L+vfOzK60u5x2wv/jVi6ZbSAeQKYKw==","repository":{"url":"git+https://github.com/AISquare-Studio/aisquare-pretty.git","type":"git"},"_npmVersion":"10.8.2","description":"Pretty UI primitives for AISquare. Centralized buttons, inputs, motion, and tokens shared across creator-studio and ai-studio.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.1","sonner":"^1.7.0","remark-gfm":"^4.0.1","lucide-react":"^0.460.0","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","tailwind-merge":"^2.5.4","rehype-sanitize":"^6.0.0","tailwindcss-motion":"^1.1.1","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-popover":"^1.1.15","@radix-ui/react-tooltip":"^1.1.4","@tailwindcss/typography":"^0.5.19","class-variance-authority":"^0.7.0","react-syntax-highlighter":"^16.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vite":"^5.4.10","jsdom":"^25.0.1","lenis":"^1.3.23","react":"^18.3.1","eslint":"^8.57.1","motion":"^12.38.0","vitest":"^2.1.4","axe-core":"^4.10.2","prettier":"^3.3.3","react-dom":"^18.3.1","size-limit":"^11.1.6","typescript":"^5.6.3","vitest-axe":"^0.1.0","@types/node":"^22.5.0","tailwindcss":"^3.4.14","@types/react":"^18.3.12","canvas-confetti":"^1.9.4","vite-plugin-dts":"^4.3.0","@types/react-dom":"^18.3.1","@vitejs/plugin-react":"^4.3.3","@arethetypeswrong/cli":"^0.18.2","@testing-library/react":"^16.0.1","@types/canvas-confetti":"^1.9.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/parser":"^8.13.0","eslint-plugin-react-hooks":"^5.0.0","@testing-library/user-event":"^14.5.2","eslint-plugin-react-refresh":"^0.4.14","@size-limit/preset-small-lib":"^11.1.6","@types/react-syntax-highlighter":"^15.5.13","@typescript-eslint/eslint-plugin":"^8.13.0"},"peerDependencies":{"lenis":">=1.3.0","react":"^18.0.0 || ^19.0.0","motion":">=12.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":">=3.4.0","canvas-confetti":">=1.9.0"},"peerDependenciesMeta":{"lenis":{"optional":true},"canvas-confetti":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pretty_0.4.2_1777495767228_0.8069243740478971","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@aisquare/pretty","version":"0.7.0","keywords":["aisquare","ui","components","tailwind","shadcn","react"],"license":"MIT","_id":"@aisquare/pretty@0.7.0","maintainers":[{"name":"aisquare-bots","email":"bots@aisquare.studio"}],"homepage":"https://github.com/AISquare-Studio/aisquare-pretty#readme","bugs":{"url":"https://github.com/AISquare-Studio/aisquare-pretty/issues"},"dist":{"shasum":"0164b1cef4417a9a56ed8b6f25e59feb29ec3247","tarball":"https://registry.npmjs.org/@aisquare/pretty/-/pretty-0.7.0.tgz","fileCount":123,"integrity":"sha512-bR7kIyslJz6dVREPLL7D3BR7ahtTYfBEN1TNFEGs5V4Tw2wivm81eyKJxbuxzcIv79mz199JpuSnS5iID2AAuQ==","signatures":[{"sig":"MEUCIHaIyjXCfKJMs6i8o0UJGNhoTMjslo9fpPYN7+wi65PkAiEAyRIYHV4O96jUt9fgajsDuMwNfHMUmeiTJJycHE7W9wM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1420064},"main":"./dist/index.js","type":"module","_from":"file:aisquare-pretty-0.7.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json","./tailwind.preset":{"types":"./dist/tailwind.preset.d.cts","import":"./dist/tailwind.preset.cjs","default":"./dist/tailwind.preset.cjs","require":"./dist/tailwind.preset.cjs"},"./tokens.template.css":"./src/tokens/tokens.template.css"},"scripts":{"dev":"vite build --watch","lint":"eslint src --ext .ts,.tsx --max-warnings 0","size":"size-limit","test":"vitest","build":"vite build && tsup --config tsup.preset.config.ts","format":"prettier --write \"src/**/*.{ts,tsx}\" \"*.md\"","test:ci":"vitest --run","typecheck":"tsc --noEmit","build:check-exports":"attw --pack . --ignore-rules cjs-resolves-to-esm cjs-only-exports-default no-resolution named-exports"},"_npmUser":{"name":"aisquare-bots","email":"bots@aisquare.studio"},"_resolved":"/tmp/27978b6459fb64e25d6609de08bd974a/aisquare-pretty-0.7.0.tgz","_integrity":"sha512-bR7kIyslJz6dVREPLL7D3BR7ahtTYfBEN1TNFEGs5V4Tw2wivm81eyKJxbuxzcIv79mz199JpuSnS5iID2AAuQ==","repository":{"url":"git+https://github.com/AISquare-Studio/aisquare-pretty.git","type":"git"},"_npmVersion":"10.8.2","description":"Pretty UI primitives for AISquare. Centralized buttons, inputs, motion, and tokens shared across creator-studio and ai-studio.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.1","sonner":"^1.7.0","remark-gfm":"^4.0.1","lucide-react":"^0.460.0","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","tailwind-merge":"^2.5.4","rehype-sanitize":"^6.0.0","tailwindcss-motion":"^1.1.1","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-tabs":"^1.1.13","@radix-ui/react-popover":"^1.1.15","@radix-ui/react-tooltip":"^1.1.4","@tailwindcss/typography":"^0.5.19","class-variance-authority":"^0.7.0","react-syntax-highlighter":"^16.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.13.0","tsup":"^8.5.1","vite":"^5.4.10","jsdom":"^25.0.1","lenis":"^1.3.23","react":"^18.3.1","eslint":"^8.57.1","motion":"^12.38.0","vitest":"^2.1.4","axe-core":"^4.10.2","prettier":"^3.3.3","react-dom":"^18.3.1","size-limit":"^11.1.6","typescript":"^5.6.3","vitest-axe":"^0.1.0","@types/node":"^22.5.0","tailwindcss":"^3.4.14","@types/react":"^18.3.12","canvas-confetti":"^1.9.4","vite-plugin-dts":"^4.3.0","@types/react-dom":"^18.3.1","@vitejs/plugin-react":"^4.3.3","@arethetypeswrong/cli":"^0.18.2","@testing-library/react":"^16.0.1","@types/canvas-confetti":"^1.9.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/parser":"^8.13.0","eslint-plugin-react-hooks":"^5.0.0","@testing-library/user-event":"^14.5.2","eslint-plugin-react-refresh":"^0.4.14","@size-limit/preset-small-lib":"^11.1.6","@types/react-syntax-highlighter":"^15.5.13","@typescript-eslint/eslint-plugin":"^8.13.0"},"peerDependencies":{"gsap":">=3.12.0","lenis":">=1.3.0","react":"^18.0.0 || ^19.0.0","motion":">=12.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":">=3.4.0","canvas-confetti":">=1.9.0"},"peerDependenciesMeta":{"gsap":{"optional":true},"lenis":{"optional":true},"canvas-confetti":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pretty_0.7.0_1777502686525_0.3048310621761092","host":"s3://npm-registry-packages-npm-production"}},"0.8.2":{"name":"@aisquare/pretty","version":"0.8.2","keywords":["aisquare","ui","components","tailwind","shadcn","react"],"license":"MIT","_id":"@aisquare/pretty@0.8.2","maintainers":[{"name":"aisquare-bots","email":"bots@aisquare.studio"}],"homepage":"https://github.com/AISquare-Studio/aisquare-pretty#readme","bugs":{"url":"https://github.com/AISquare-Studio/aisquare-pretty/issues"},"dist":{"shasum":"0df218b43e9ade2e20d6e705beec4cbef945503d","tarball":"https://registry.npmjs.org/@aisquare/pretty/-/pretty-0.8.2.tgz","fileCount":129,"integrity":"sha512-Dj+hjM38iH748clGtGnsZSuphT+PNwOWuO1oaHYv+WIzAMXjgNeEkgmKoyKtAQTzg0ENemQCeisrc8CCliSnWA==","signatures":[{"sig":"MEQCICiENrplbvB0pgKUv6/ipdxZjeVPFJK44xCdvxobtEXsAiAbweFod+EOo8f5sR10nc6iL+ir5kyQudzyODmRkukLpg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1515161},"main":"./dist/index.js","type":"module","_from":"file:aisquare-pretty-0.8.2.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json","./tailwind.preset":{"types":"./dist/tailwind.preset.d.cts","import":"./dist/tailwind.preset.cjs","default":"./dist/tailwind.preset.cjs","require":"./dist/tailwind.preset.cjs"},"./tokens.template.css":"./src/tokens/tokens.template.css"},"scripts":{"dev":"vite build --watch","lint":"eslint src --ext .ts,.tsx --max-warnings 0","size":"size-limit","test":"vitest","build":"vite build && tsup --config tsup.preset.config.ts","format":"prettier --write \"src/**/*.{ts,tsx}\" \"*.md\"","test:ci":"vitest --run","typecheck":"tsc --noEmit","build:check-exports":"attw --pack . --ignore-rules cjs-resolves-to-esm cjs-only-exports-default no-resolution named-exports"},"_npmUser":{"name":"aisquare-bots","email":"bots@aisquare.studio"},"_resolved":"/tmp/ef1fe205cfeb6c52f69557bebb30a58d/aisquare-pretty-0.8.2.tgz","_integrity":"sha512-Dj+hjM38iH748clGtGnsZSuphT+PNwOWuO1oaHYv+WIzAMXjgNeEkgmKoyKtAQTzg0ENemQCeisrc8CCliSnWA==","repository":{"url":"git+https://github.com/AISquare-Studio/aisquare-pretty.git","type":"git"},"_npmVersion":"10.8.2","description":"Pretty UI primitives for AISquare. Centralized buttons, inputs, motion, and tokens shared across creator-studio and ai-studio.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.1","sonner":"^1.7.0","remark-gfm":"^4.0.1","lucide-react":"^0.460.0","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","tailwind-merge":"^2.5.4","rehype-sanitize":"^6.0.0","tailwindcss-motion":"^1.1.1","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-tabs":"^1.1.13","@radix-ui/react-popover":"^1.1.15","@radix-ui/react-tooltip":"^1.1.4","@tailwindcss/typography":"^0.5.19","class-variance-authority":"^0.7.0","react-syntax-highlighter":"^16.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.13.0","tsup":"^8.5.1","vite":"^5.4.10","jsdom":"^25.0.1","lenis":"^1.3.23","react":"^18.3.1","eslint":"^8.57.1","motion":"^12.38.0","vitest":"^2.1.4","axe-core":"^4.10.2","prettier":"^3.3.3","react-dom":"^18.3.1","size-limit":"^11.1.6","typescript":"^5.6.3","vitest-axe":"^0.1.0","@types/node":"^22.5.0","tailwindcss":"^3.4.14","@types/react":"^18.3.12","canvas-confetti":"^1.9.4","vite-plugin-dts":"^4.3.0","@types/react-dom":"^18.3.1","@vitejs/plugin-react":"^4.3.3","@arethetypeswrong/cli":"^0.18.2","@testing-library/react":"^16.0.1","@types/canvas-confetti":"^1.9.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/parser":"^8.13.0","eslint-plugin-react-hooks":"^5.0.0","@testing-library/user-event":"^14.5.2","eslint-plugin-react-refresh":"^0.4.14","@size-limit/preset-small-lib":"^11.1.6","@types/react-syntax-highlighter":"^15.5.13","@typescript-eslint/eslint-plugin":"^8.13.0"},"peerDependencies":{"gsap":">=3.12.0","lenis":">=1.3.0","react":"^18.0.0 || ^19.0.0","motion":">=12.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":">=3.4.0","canvas-confetti":">=1.9.0"},"peerDependenciesMeta":{"gsap":{"optional":true},"lenis":{"optional":true},"canvas-confetti":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pretty_0.8.2_1777507096977_0.1345316205053826","host":"s3://npm-registry-packages-npm-production"}},"0.8.4":{"name":"@aisquare/pretty","version":"0.8.4","keywords":["aisquare","ui","components","tailwind","shadcn","react"],"license":"MIT","_id":"@aisquare/pretty@0.8.4","maintainers":[{"name":"aisquare-bots","email":"bots@aisquare.studio"}],"homepage":"https://github.com/AISquare-Studio/aisquare-pretty#readme","bugs":{"url":"https://github.com/AISquare-Studio/aisquare-pretty/issues"},"dist":{"shasum":"7f3ce0a014628902b64efa1c604b43461101b8a2","tarball":"https://registry.npmjs.org/@aisquare/pretty/-/pretty-0.8.4.tgz","fileCount":131,"integrity":"sha512-9ltW1WYUJI5Loiib58DfRuKaiVgmuFmGoyZbE/KjAKBojWf0K089s6r8HMxoX+yjxbO9VSboAj4aBL16sck/Yg==","signatures":[{"sig":"MEYCIQCla/4llZkunBxplTSW4xznaRfYcUp73cza2VbTIgFLtQIhAOfPn/pgPUIbjop6R2ck161Hl8dN2gCivl/Y9UstWAvf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1521162},"main":"./dist/index.js","type":"module","_from":"file:aisquare-pretty-0.8.4.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json","./tailwind.preset":{"types":"./dist/tailwind.preset.d.cts","import":"./dist/tailwind.preset.cjs","default":"./dist/tailwind.preset.cjs","require":"./dist/tailwind.preset.cjs"},"./tokens.template.css":"./src/tokens/tokens.template.css"},"scripts":{"dev":"vite build --watch","lint":"eslint src --ext .ts,.tsx --max-warnings 0","size":"size-limit","test":"vitest","build":"vite build && tsup --config tsup.preset.config.ts","format":"prettier --write \"src/**/*.{ts,tsx}\" \"*.md\"","test:ci":"vitest --run","typecheck":"tsc --noEmit","build:check-exports":"attw --pack . --ignore-rules cjs-resolves-to-esm cjs-only-exports-default no-resolution named-exports"},"_npmUser":{"name":"aisquare-bots","email":"bots@aisquare.studio"},"_resolved":"/tmp/20f476571f101a4a3b1a2cc9a1e28d00/aisquare-pretty-0.8.4.tgz","_integrity":"sha512-9ltW1WYUJI5Loiib58DfRuKaiVgmuFmGoyZbE/KjAKBojWf0K089s6r8HMxoX+yjxbO9VSboAj4aBL16sck/Yg==","repository":{"url":"git+https://github.com/AISquare-Studio/aisquare-pretty.git","type":"git"},"_npmVersion":"10.8.2","description":"Pretty UI primitives for AISquare. Centralized buttons, inputs, motion, and tokens shared across creator-studio and ai-studio.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.1","sonner":"^1.7.0","remark-gfm":"^4.0.1","lucide-react":"^0.460.0","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","tailwind-merge":"^2.5.4","rehype-sanitize":"^6.0.0","tailwindcss-motion":"^1.1.1","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-tabs":"^1.1.13","@radix-ui/react-popover":"^1.1.15","@radix-ui/react-tooltip":"^1.1.4","@tailwindcss/typography":"^0.5.19","class-variance-authority":"^0.7.0","react-syntax-highlighter":"^16.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.13.0","tsup":"^8.5.1","vite":"^5.4.10","jsdom":"^25.0.1","lenis":"^1.3.23","react":"^18.3.1","eslint":"^8.57.1","motion":"^12.38.0","vitest":"^2.1.4","axe-core":"^4.10.2","prettier":"^3.3.3","react-dom":"^18.3.1","size-limit":"^11.1.6","typescript":"^5.6.3","vitest-axe":"^0.1.0","@types/node":"^22.5.0","tailwindcss":"^3.4.14","@types/react":"^18.3.12","canvas-confetti":"^1.9.4","vite-plugin-dts":"^4.3.0","@types/react-dom":"^18.3.1","@vitejs/plugin-react":"^4.3.3","@arethetypeswrong/cli":"^0.18.2","@testing-library/react":"^16.0.1","@types/canvas-confetti":"^1.9.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/parser":"^8.13.0","eslint-plugin-react-hooks":"^5.0.0","@testing-library/user-event":"^14.5.2","eslint-plugin-react-refresh":"^0.4.14","@size-limit/preset-small-lib":"^11.1.6","@types/react-syntax-highlighter":"^15.5.13","@typescript-eslint/eslint-plugin":"^8.13.0"},"peerDependencies":{"gsap":">=3.12.0","lenis":">=1.3.0","react":"^18.0.0 || ^19.0.0","motion":">=12.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":">=3.4.0","canvas-confetti":">=1.9.0"},"peerDependenciesMeta":{"gsap":{"optional":true},"lenis":{"optional":true},"canvas-confetti":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pretty_0.8.4_1777515387618_0.7921370186750654","host":"s3://npm-registry-packages-npm-production"}},"0.9.2":{"name":"@aisquare/pretty","version":"0.9.2","keywords":["aisquare","ui","components","tailwind","shadcn","react"],"license":"MIT","_id":"@aisquare/pretty@0.9.2","maintainers":[{"name":"aisquare-bots","email":"bots@aisquare.studio"}],"homepage":"https://github.com/AISquare-Studio/aisquare-pretty#readme","bugs":{"url":"https://github.com/AISquare-Studio/aisquare-pretty/issues"},"dist":{"shasum":"8ac52501bc8f159ee24dca13e7f9d92f7573b7e1","tarball":"https://registry.npmjs.org/@aisquare/pretty/-/pretty-0.9.2.tgz","fileCount":139,"integrity":"sha512-J1QC+T7Dt/pn2hpr0pEDpdaRLhW0HE0nwoznY7KY5dU8j+daDOsg+647AZqfdLc/uE1Yszx1Sp0RHHCgmKCfzw==","signatures":[{"sig":"MEYCIQCp3ZNUsv1Do1qSzb2WoCfyhod18TVO6CNidIBg5bugXAIhAKvibKKAVwssDfSDOxoV5YMIgh5KEIKgJGtIsUwJjnfz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1570121},"main":"./dist/index.js","type":"module","_from":"file:aisquare-pretty-0.9.2.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json","./smooth-scroll":{"types":"./dist/entries/smooth-scroll.d.ts","import":"./dist/entries/smooth-scroll.js"},"./tailwind.preset":{"types":"./dist/tailwind.preset.d.cts","import":"./dist/tailwind.preset.cjs","default":"./dist/tailwind.preset.cjs","require":"./dist/tailwind.preset.cjs"},"./tokens.template.css":"./src/tokens/tokens.template.css"},"scripts":{"dev":"vite build --watch","lint":"eslint src --ext .ts,.tsx --max-warnings 0","size":"size-limit","test":"vitest","build":"vite build && tsup --config tsup.preset.config.ts","format":"prettier --write \"src/**/*.{ts,tsx}\" \"*.md\"","test:ci":"vitest --run","typecheck":"tsc --noEmit","build:check-exports":"attw --pack . --ignore-rules cjs-resolves-to-esm cjs-only-exports-default no-resolution named-exports"},"_npmUser":{"name":"aisquare-bots","email":"bots@aisquare.studio"},"_resolved":"/tmp/979689140230eba8a6a1cfc759571c9b/aisquare-pretty-0.9.2.tgz","_integrity":"sha512-J1QC+T7Dt/pn2hpr0pEDpdaRLhW0HE0nwoznY7KY5dU8j+daDOsg+647AZqfdLc/uE1Yszx1Sp0RHHCgmKCfzw==","repository":{"url":"git+https://github.com/AISquare-Studio/aisquare-pretty.git","type":"git"},"_npmVersion":"10.8.2","description":"Pretty UI primitives for AISquare. Centralized buttons, inputs, motion, and tokens shared across creator-studio and ai-studio.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.1","sonner":"^1.7.0","remark-gfm":"^4.0.1","lucide-react":"^0.460.0","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","tailwind-merge":"^2.5.4","rehype-sanitize":"^6.0.0","tailwindcss-motion":"^1.1.1","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-tabs":"^1.1.13","@radix-ui/react-popover":"^1.1.15","@radix-ui/react-tooltip":"^1.1.4","@tailwindcss/typography":"^0.5.19","class-variance-authority":"^0.7.0","react-syntax-highlighter":"^16.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.13.0","tsup":"^8.5.1","vite":"^5.4.10","jsdom":"^25.0.1","lenis":"^1.3.23","react":"^18.3.1","eslint":"^8.57.1","motion":"^12.38.0","vitest":"^2.1.4","axe-core":"^4.10.2","prettier":"^3.3.3","react-dom":"^18.3.1","size-limit":"^11.1.6","typescript":"^5.6.3","vitest-axe":"^0.1.0","@types/node":"^22.5.0","tailwindcss":"^3.4.14","@types/react":"^18.3.12","canvas-confetti":"^1.9.4","vite-plugin-dts":"^4.3.0","@types/react-dom":"^18.3.1","@vitejs/plugin-react":"^4.3.3","@arethetypeswrong/cli":"^0.18.2","@testing-library/react":"^16.0.1","@types/canvas-confetti":"^1.9.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/parser":"^8.13.0","eslint-plugin-react-hooks":"^5.0.0","@testing-library/user-event":"^14.5.2","eslint-plugin-react-refresh":"^0.4.14","@size-limit/preset-small-lib":"^11.1.6","@types/react-syntax-highlighter":"^15.5.13","@typescript-eslint/eslint-plugin":"^8.13.0"},"peerDependencies":{"gsap":">=3.12.0","lenis":">=1.3.0","react":"^18.0.0 || ^19.0.0","motion":">=12.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":">=3.4.0","canvas-confetti":">=1.9.0"},"peerDependenciesMeta":{"gsap":{"optional":true},"lenis":{"optional":true},"canvas-confetti":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pretty_0.9.2_1777527826287_0.34596928570507623","host":"s3://npm-registry-packages-npm-production"}},"0.10.1":{"name":"@aisquare/pretty","version":"0.10.1","keywords":["aisquare","ui","components","tailwind","shadcn","react"],"license":"MIT","_id":"@aisquare/pretty@0.10.1","maintainers":[{"name":"aisquare-bots","email":"bots@aisquare.studio"}],"homepage":"https://github.com/AISquare-Studio/aisquare-pretty#readme","bugs":{"url":"https://github.com/AISquare-Studio/aisquare-pretty/issues"},"dist":{"shasum":"fb2f57a8b047b0b2fdf429583fe90684422cc36b","tarball":"https://registry.npmjs.org/@aisquare/pretty/-/pretty-0.10.1.tgz","fileCount":161,"integrity":"sha512-EJpCVP6kn1BQyXjyNAZnFvSHfCEw0dJf1AGR2/0Ni7o/g2MCbLwau4Zb6r1i0Bou8gzQSQLIfS52ggNSEzXXYg==","signatures":[{"sig":"MEYCIQC27SPOBiwJ7noG91ff4SUCZp0lxr1gcZD52t/rwTknFAIhAMavRzETHB1ANZF9ENyKYJDianMvgnvYj0kImdGKq1Rd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1961768},"main":"./dist/index.js","type":"module","_from":"file:aisquare-pretty-0.10.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json","./smooth-scroll":{"types":"./dist/entries/smooth-scroll.d.ts","import":"./dist/entries/smooth-scroll.js"},"./tailwind.preset":{"types":"./dist/tailwind.preset.d.cts","import":"./dist/tailwind.preset.cjs","default":"./dist/tailwind.preset.cjs","require":"./dist/tailwind.preset.cjs"},"./tokens.template.css":"./src/tokens/tokens.template.css"},"scripts":{"dev":"vite build --watch","lint":"eslint src --ext .ts,.tsx --max-warnings 0","size":"size-limit","test":"vitest","build":"vite build && tsup --config tsup.preset.config.ts","format":"prettier --write \"src/**/*.{ts,tsx}\" \"*.md\"","test:ci":"vitest --run","typecheck":"tsc --noEmit","build:check-exports":"attw --pack . --ignore-rules cjs-resolves-to-esm cjs-only-exports-default no-resolution named-exports"},"_npmUser":{"name":"aisquare-bots","email":"bots@aisquare.studio"},"_resolved":"/tmp/60ae12fd8f7ae9076bd4e69b21a163e7/aisquare-pretty-0.10.1.tgz","_integrity":"sha512-EJpCVP6kn1BQyXjyNAZnFvSHfCEw0dJf1AGR2/0Ni7o/g2MCbLwau4Zb6r1i0Bou8gzQSQLIfS52ggNSEzXXYg==","repository":{"url":"git+https://github.com/AISquare-Studio/aisquare-pretty.git","type":"git"},"_npmVersion":"10.8.2","description":"Pretty UI primitives for AISquare. Centralized buttons, inputs, motion, and tokens shared across creator-studio and ai-studio.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.1","sonner":"^1.7.0","remark-gfm":"^4.0.1","lucide-react":"^0.460.0","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","tailwind-merge":"^2.5.4","rehype-sanitize":"^6.0.0","tailwindcss-motion":"^1.1.1","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-tabs":"^1.1.13","@radix-ui/react-popover":"^1.1.15","@radix-ui/react-tooltip":"^1.1.4","@tailwindcss/typography":"^0.5.19","class-variance-authority":"^0.7.0","react-syntax-highlighter":"^16.1.1","@radix-ui/react-dropdown-menu":"^2.1.16"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.13.0","tsup":"^8.5.1","vite":"^5.4.10","jsdom":"^25.0.1","lenis":"^1.3.23","react":"^18.3.1","eslint":"^8.57.1","motion":"^12.38.0","vitest":"^2.1.4","axe-core":"^4.10.2","prettier":"^3.3.3","react-dom":"^18.3.1","size-limit":"^11.1.6","typescript":"^5.6.3","vitest-axe":"^0.1.0","@types/node":"^22.5.0","tailwindcss":"^3.4.14","@types/react":"^18.3.12","canvas-confetti":"^1.9.4","vite-plugin-dts":"^4.3.0","@types/react-dom":"^18.3.1","@vitejs/plugin-react":"^4.3.3","@arethetypeswrong/cli":"^0.18.2","@testing-library/react":"^16.0.1","@types/canvas-confetti":"^1.9.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/parser":"^8.13.0","eslint-plugin-react-hooks":"^5.0.0","@testing-library/user-event":"^14.5.2","eslint-plugin-react-refresh":"^0.4.14","@size-limit/preset-small-lib":"^11.1.6","@types/react-syntax-highlighter":"^15.5.13","@typescript-eslint/eslint-plugin":"^8.13.0"},"peerDependencies":{"gsap":">=3.12.0","lenis":">=1.3.0","react":"^18.0.0 || ^19.0.0","motion":">=12.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":">=3.4.0","canvas-confetti":">=1.9.0"},"peerDependenciesMeta":{"gsap":{"optional":true},"lenis":{"optional":true},"canvas-confetti":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pretty_0.10.1_1777535125701_0.487363826132843","host":"s3://npm-registry-packages-npm-production"}},"0.10.7":{"name":"@aisquare/pretty","version":"0.10.7","keywords":["aisquare","ui","components","tailwind","shadcn","react"],"license":"MIT","_id":"@aisquare/pretty@0.10.7","maintainers":[{"name":"aisquare-bots","email":"bots@aisquare.studio"}],"homepage":"https://github.com/AISquare-Studio/aisquare-pretty#readme","bugs":{"url":"https://github.com/AISquare-Studio/aisquare-pretty/issues"},"dist":{"shasum":"d8324c3387ed87b55d53a2b7eaa3262a5bf6aab2","tarball":"https://registry.npmjs.org/@aisquare/pretty/-/pretty-0.10.7.tgz","fileCount":181,"integrity":"sha512-bYjH9y8/dj/2fM8QnAEBme1UBS7RshKfE6Ya03es/E3ckyRh1HP4F8y3bLVVB+5UVgGtjeeDFc/aGA26mBUJpg==","signatures":[{"sig":"MEQCIDB6CAkyDqlS/kK4cbnPJ6Ud2YcqYsToj4+qS4i7INdXAiBtpMdIM13YIZzwNm+0at4yrqKs/CsujLarQUTAnXJnYQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2156127},"main":"./dist/index.js","type":"module","_from":"file:aisquare-pretty-0.10.7.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json","./smooth-scroll":{"types":"./dist/entries/smooth-scroll.d.ts","import":"./dist/entries/smooth-scroll.js"},"./tailwind.preset":{"types":"./dist/tailwind.preset.d.cts","import":"./dist/tailwind.preset.cjs","default":"./dist/tailwind.preset.cjs","require":"./dist/tailwind.preset.cjs"},"./tokens.template.css":"./src/tokens/tokens.template.css"},"scripts":{"dev":"vite build --watch","lint":"eslint src --ext .ts,.tsx --max-warnings 0","size":"size-limit","test":"vitest","build":"vite build && tsup --config tsup.preset.config.ts","format":"prettier --write \"src/**/*.{ts,tsx}\" \"*.md\"","test:ci":"vitest --run","typecheck":"tsc --noEmit","build:check-exports":"attw --pack . --ignore-rules cjs-resolves-to-esm cjs-only-exports-default no-resolution named-exports"},"_npmUser":{"name":"aisquare-bots","email":"bots@aisquare.studio"},"_resolved":"/tmp/371af1dc74bad3de22e06cb589ebdaea/aisquare-pretty-0.10.7.tgz","_integrity":"sha512-bYjH9y8/dj/2fM8QnAEBme1UBS7RshKfE6Ya03es/E3ckyRh1HP4F8y3bLVVB+5UVgGtjeeDFc/aGA26mBUJpg==","repository":{"url":"git+https://github.com/AISquare-Studio/aisquare-pretty.git","type":"git"},"_npmVersion":"10.8.2","description":"Pretty UI primitives for AISquare. Centralized buttons, inputs, motion, and tokens shared across creator-studio and ai-studio.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.1","sonner":"^1.7.0","remark-gfm":"^4.0.1","lucide-react":"^0.460.0","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","tailwind-merge":"^2.5.4","rehype-sanitize":"^6.0.0","tailwindcss-motion":"^1.1.1","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-tabs":"^1.1.13","@radix-ui/react-popover":"^1.1.15","@radix-ui/react-tooltip":"^1.1.4","@tailwindcss/typography":"^0.5.19","class-variance-authority":"^0.7.0","react-syntax-highlighter":"^16.1.1","@radix-ui/react-dropdown-menu":"^2.1.16"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.13.0","tsup":"^8.5.1","vite":"^5.4.10","jsdom":"^25.0.1","lenis":"^1.3.23","react":"^18.3.1","eslint":"^8.57.1","motion":"^12.38.0","vitest":"^2.1.4","axe-core":"^4.10.2","prettier":"^3.3.3","react-dom":"^18.3.1","size-limit":"^11.1.6","typescript":"^5.6.3","vitest-axe":"^0.1.0","@types/node":"^22.5.0","tailwindcss":"^3.4.14","@types/react":"^18.3.12","canvas-confetti":"^1.9.4","vite-plugin-dts":"^4.3.0","@types/react-dom":"^18.3.1","@vitejs/plugin-react":"^4.3.3","@arethetypeswrong/cli":"^0.18.2","@testing-library/react":"^16.0.1","@types/canvas-confetti":"^1.9.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/parser":"^8.13.0","eslint-plugin-react-hooks":"^5.0.0","@testing-library/user-event":"^14.5.2","eslint-plugin-react-refresh":"^0.4.14","@size-limit/preset-small-lib":"^11.1.6","@types/react-syntax-highlighter":"^15.5.13","@typescript-eslint/eslint-plugin":"^8.13.0"},"peerDependencies":{"gsap":">=3.12.0","lenis":">=1.3.0","react":"^18.0.0 || ^19.0.0","motion":">=12.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":">=3.4.0","canvas-confetti":">=1.9.0"},"peerDependenciesMeta":{"gsap":{"optional":true},"lenis":{"optional":true},"canvas-confetti":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pretty_0.10.7_1777596379502_0.6044264033503299","host":"s3://npm-registry-packages-npm-production"}},"0.10.14":{"name":"@aisquare/pretty","version":"0.10.14","keywords":["aisquare","ui","components","tailwind","shadcn","react"],"license":"MIT","_id":"@aisquare/pretty@0.10.14","maintainers":[{"name":"aisquare-bots","email":"bots@aisquare.studio"}],"homepage":"https://github.com/AISquare-Studio/aisquare-pretty#readme","bugs":{"url":"https://github.com/AISquare-Studio/aisquare-pretty/issues"},"dist":{"shasum":"6899245a11af9957a50dc4ac0a95c87925111da6","tarball":"https://registry.npmjs.org/@aisquare/pretty/-/pretty-0.10.14.tgz","fileCount":197,"integrity":"sha512-6vPgJ9F0cEvyIvCSzGttE70yRGYx2acHzNB6Sf6vN/WDGMpEe0aaHaokCEQuPAqVjxjPMC36Pmmc0zYnQokWWA==","signatures":[{"sig":"MEYCIQC8i3QeK9ky/yJp2z3+B/o5y0OH3MLe7HRe9P2ERnzU4AIhAI7Oz6CdXsPj5D/X/N5Dev+0MA4pDY9GelRRYyOIHkHe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2312732},"main":"./dist/index.js","type":"module","_from":"file:aisquare-pretty-0.10.14.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json","./smooth-scroll":{"types":"./dist/entries/smooth-scroll.d.ts","import":"./dist/entries/smooth-scroll.js"},"./tailwind.preset":{"types":"./dist/tailwind.preset.d.cts","import":"./dist/tailwind.preset.cjs","default":"./dist/tailwind.preset.cjs","require":"./dist/tailwind.preset.cjs"},"./tokens.template.css":"./src/tokens/tokens.template.css"},"scripts":{"dev":"vite build --watch","lint":"eslint src --ext .ts,.tsx --max-warnings 0","size":"size-limit","test":"vitest","build":"vite build && tsup --config tsup.preset.config.ts","format":"prettier --write \"src/**/*.{ts,tsx}\" \"*.md\"","test:ci":"vitest --run","typecheck":"tsc --noEmit","build:check-exports":"attw --pack . --ignore-rules cjs-resolves-to-esm cjs-only-exports-default no-resolution named-exports"},"_npmUser":{"name":"aisquare-bots","email":"bots@aisquare.studio"},"_resolved":"/tmp/f9971718744074c2713c76ccaaeeab46/aisquare-pretty-0.10.14.tgz","_integrity":"sha512-6vPgJ9F0cEvyIvCSzGttE70yRGYx2acHzNB6Sf6vN/WDGMpEe0aaHaokCEQuPAqVjxjPMC36Pmmc0zYnQokWWA==","repository":{"url":"git+https://github.com/AISquare-Studio/aisquare-pretty.git","type":"git"},"_npmVersion":"10.8.2","description":"Pretty UI primitives for AISquare. Centralized buttons, inputs, motion, and tokens shared across creator-studio and ai-studio.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.1","sonner":"^1.7.0","remark-gfm":"^4.0.1","lucide-react":"^0.460.0","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","tailwind-merge":"^2.5.4","rehype-sanitize":"^6.0.0","tailwindcss-motion":"^1.1.1","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-tabs":"^1.1.13","@radix-ui/react-popover":"^1.1.15","@radix-ui/react-tooltip":"^1.1.4","@tailwindcss/typography":"^0.5.19","class-variance-authority":"^0.7.0","react-syntax-highlighter":"^16.1.1","@radix-ui/react-accordion":"^1.2.0","@radix-ui/react-dropdown-menu":"^2.1.16"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.13.0","tsup":"^8.5.1","vite":"^5.4.10","jsdom":"^25.0.1","lenis":"^1.3.23","react":"^18.3.1","eslint":"^8.57.1","motion":"^12.38.0","vitest":"^2.1.4","axe-core":"^4.10.2","prettier":"^3.3.3","react-dom":"^18.3.1","size-limit":"^11.1.6","typescript":"^5.6.3","vitest-axe":"^0.1.0","@types/node":"^22.5.0","tailwindcss":"^3.4.14","@types/react":"^18.3.12","canvas-confetti":"^1.9.4","vite-plugin-dts":"^4.3.0","@types/react-dom":"^18.3.1","@vitejs/plugin-react":"^4.3.3","@arethetypeswrong/cli":"^0.18.2","@testing-library/react":"^16.0.1","@types/canvas-confetti":"^1.9.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/parser":"^8.13.0","eslint-plugin-react-hooks":"^5.0.0","@testing-library/user-event":"^14.5.2","eslint-plugin-react-refresh":"^0.4.14","@size-limit/preset-small-lib":"^11.1.6","@types/react-syntax-highlighter":"^15.5.13","@typescript-eslint/eslint-plugin":"^8.13.0"},"peerDependencies":{"gsap":">=3.12.0","lenis":">=1.3.0","react":"^18.0.0 || ^19.0.0","motion":">=12.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":">=3.4.0","canvas-confetti":">=1.9.0"},"peerDependenciesMeta":{"gsap":{"optional":true},"lenis":{"optional":true},"canvas-confetti":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pretty_0.10.14_1777680769379_0.5072510565109394","host":"s3://npm-registry-packages-npm-production"}},"0.10.15":{"name":"@aisquare/pretty","version":"0.10.15","keywords":["aisquare","ui","components","tailwind","shadcn","react"],"license":"MIT","_id":"@aisquare/pretty@0.10.15","maintainers":[{"name":"aisquare-bots","email":"bots@aisquare.studio"}],"homepage":"https://github.com/AISquare-Studio/aisquare-pretty#readme","bugs":{"url":"https://github.com/AISquare-Studio/aisquare-pretty/issues"},"dist":{"shasum":"47c1cb7fc737a960c9cfa9a05a8dbf72372614d2","tarball":"https://registry.npmjs.org/@aisquare/pretty/-/pretty-0.10.15.tgz","fileCount":197,"integrity":"sha512-1BLw4jKTzywUDZ1T3OThIqxA96+LvWG0diSmEN85MoMg1/sHEJkkN04oAoNTgvMFOqegikIuckcTRvoYcMR/yQ==","signatures":[{"sig":"MEUCIFP4SsjQ5uMoPEbNZtk3wNVDsY+byrjBqOGeFadKuPUeAiEAj2K9QGWfb4sK5BR8B0b43KDYdQlhdyFnTGu/qCYEC5E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2317359},"main":"./dist/index.js","type":"module","_from":"file:aisquare-pretty-0.10.15.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json","./smooth-scroll":{"types":"./dist/entries/smooth-scroll.d.ts","import":"./dist/entries/smooth-scroll.js"},"./tailwind.preset":{"types":"./dist/tailwind.preset.d.cts","import":"./dist/tailwind.preset.cjs","default":"./dist/tailwind.preset.cjs","require":"./dist/tailwind.preset.cjs"},"./tokens.template.css":"./src/tokens/tokens.template.css"},"scripts":{"dev":"vite build --watch","lint":"eslint src --ext .ts,.tsx --max-warnings 0","size":"size-limit","test":"vitest","build":"vite build && tsup --config tsup.preset.config.ts","format":"prettier --write \"src/**/*.{ts,tsx}\" \"*.md\"","test:ci":"vitest --run","typecheck":"tsc --noEmit","build:check-exports":"attw --pack . --ignore-rules cjs-resolves-to-esm cjs-only-exports-default no-resolution named-exports"},"_npmUser":{"name":"aisquare-bots","email":"bots@aisquare.studio"},"_resolved":"/tmp/1797a58bc0d153be9444d225004f9091/aisquare-pretty-0.10.15.tgz","_integrity":"sha512-1BLw4jKTzywUDZ1T3OThIqxA96+LvWG0diSmEN85MoMg1/sHEJkkN04oAoNTgvMFOqegikIuckcTRvoYcMR/yQ==","repository":{"url":"git+https://github.com/AISquare-Studio/aisquare-pretty.git","type":"git"},"_npmVersion":"10.8.2","description":"Pretty UI primitives for AISquare. Centralized buttons, inputs, motion, and tokens shared across creator-studio and ai-studio.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.1","sonner":"^1.7.0","remark-gfm":"^4.0.1","lucide-react":"^0.460.0","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","tailwind-merge":"^2.5.4","rehype-sanitize":"^6.0.0","tailwindcss-motion":"^1.1.1","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-tabs":"^1.1.13","@radix-ui/react-popover":"^1.1.15","@radix-ui/react-tooltip":"^1.1.4","@tailwindcss/typography":"^0.5.19","class-variance-authority":"^0.7.0","react-syntax-highlighter":"^16.1.1","@radix-ui/react-accordion":"^1.2.0","@radix-ui/react-dropdown-menu":"^2.1.16"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.13.0","tsup":"^8.5.1","vite":"^5.4.10","jsdom":"^25.0.1","lenis":"^1.3.23","react":"^18.3.1","eslint":"^8.57.1","motion":"^12.38.0","vitest":"^2.1.4","axe-core":"^4.10.2","prettier":"^3.3.3","react-dom":"^18.3.1","size-limit":"^11.1.6","typescript":"^5.6.3","vitest-axe":"^0.1.0","@types/node":"^22.5.0","tailwindcss":"^3.4.14","@types/react":"^18.3.12","canvas-confetti":"^1.9.4","vite-plugin-dts":"^4.3.0","@types/react-dom":"^18.3.1","@vitejs/plugin-react":"^4.3.3","@arethetypeswrong/cli":"^0.18.2","@testing-library/react":"^16.0.1","@types/canvas-confetti":"^1.9.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/parser":"^8.13.0","eslint-plugin-react-hooks":"^5.0.0","@testing-library/user-event":"^14.5.2","eslint-plugin-react-refresh":"^0.4.14","@size-limit/preset-small-lib":"^11.1.6","@types/react-syntax-highlighter":"^15.5.13","@typescript-eslint/eslint-plugin":"^8.13.0"},"peerDependencies":{"gsap":">=3.12.0","lenis":">=1.3.0","react":"^18.0.0 || ^19.0.0","motion":">=12.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":">=3.4.0","canvas-confetti":">=1.9.0"},"peerDependenciesMeta":{"gsap":{"optional":true},"lenis":{"optional":true},"canvas-confetti":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pretty_0.10.15_1777684039167_0.07710385453458435","host":"s3://npm-registry-packages-npm-production"}},"0.10.16":{"name":"@aisquare/pretty","version":"0.10.16","keywords":["aisquare","ui","components","tailwind","shadcn","react"],"license":"MIT","_id":"@aisquare/pretty@0.10.16","maintainers":[{"name":"aisquare-bots","email":"bots@aisquare.studio"}],"homepage":"https://github.com/AISquare-Studio/aisquare-pretty#readme","bugs":{"url":"https://github.com/AISquare-Studio/aisquare-pretty/issues"},"dist":{"shasum":"111cd93107294404349b5fdbc2edd81a9e07d28b","tarball":"https://registry.npmjs.org/@aisquare/pretty/-/pretty-0.10.16.tgz","fileCount":197,"integrity":"sha512-c6tdln3O03SOb8oSpK7ywe3N6mkUqWmg/LAk/z1nqxlEmpL3vfVVh6HFXHzTgrHSj8Su+jMt13SKFMQExRHBRQ==","signatures":[{"sig":"MEQCIEcWxAtCieB1xQae6G0ccoNpMtQGFBPWFT1urvDE2B07AiBuS3q1iohxGY1GE7Qis4SM28Y2hDolTUacp6PtpDFV5A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2322075},"main":"./dist/index.js","type":"module","_from":"file:aisquare-pretty-0.10.16.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json","./smooth-scroll":{"types":"./dist/entries/smooth-scroll.d.ts","import":"./dist/entries/smooth-scroll.js"},"./tailwind.preset":{"types":"./dist/tailwind.preset.d.cts","import":"./dist/tailwind.preset.cjs","default":"./dist/tailwind.preset.cjs","require":"./dist/tailwind.preset.cjs"},"./tokens.template.css":"./src/tokens/tokens.template.css"},"scripts":{"dev":"vite build --watch","lint":"eslint src --ext .ts,.tsx --max-warnings 0","size":"size-limit","test":"vitest","build":"vite build && tsup --config tsup.preset.config.ts","format":"prettier --write \"src/**/*.{ts,tsx}\" \"*.md\"","test:ci":"vitest --run","typecheck":"tsc --noEmit","build:check-exports":"attw --pack . --ignore-rules cjs-resolves-to-esm cjs-only-exports-default no-resolution named-exports"},"_npmUser":{"name":"aisquare-bots","email":"bots@aisquare.studio"},"_resolved":"/tmp/c72a702919641dbb96be7efa8b63ff35/aisquare-pretty-0.10.16.tgz","_integrity":"sha512-c6tdln3O03SOb8oSpK7ywe3N6mkUqWmg/LAk/z1nqxlEmpL3vfVVh6HFXHzTgrHSj8Su+jMt13SKFMQExRHBRQ==","repository":{"url":"git+https://github.com/AISquare-Studio/aisquare-pretty.git","type":"git"},"_npmVersion":"10.8.2","description":"Pretty UI primitives for AISquare. Centralized buttons, inputs, motion, and tokens shared across creator-studio and ai-studio.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.1","sonner":"^1.7.0","remark-gfm":"^4.0.1","lucide-react":"^0.460.0","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","tailwind-merge":"^2.5.4","rehype-sanitize":"^6.0.0","tailwindcss-motion":"^1.1.1","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-tabs":"^1.1.13","@radix-ui/react-popover":"^1.1.15","@radix-ui/react-tooltip":"^1.1.4","@tailwindcss/typography":"^0.5.19","class-variance-authority":"^0.7.0","react-syntax-highlighter":"^16.1.1","@radix-ui/react-accordion":"^1.2.0","@radix-ui/react-dropdown-menu":"^2.1.16"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.13.0","tsup":"^8.5.1","vite":"^5.4.10","jsdom":"^25.0.1","lenis":"^1.3.23","react":"^18.3.1","eslint":"^8.57.1","motion":"^12.38.0","vitest":"^2.1.4","axe-core":"^4.10.2","prettier":"^3.3.3","react-dom":"^18.3.1","size-limit":"^11.1.6","typescript":"^5.6.3","vitest-axe":"^0.1.0","@types/node":"^22.5.0","tailwindcss":"^3.4.14","@types/react":"^18.3.12","canvas-confetti":"^1.9.4","vite-plugin-dts":"^4.3.0","@types/react-dom":"^18.3.1","@vitejs/plugin-react":"^4.3.3","@arethetypeswrong/cli":"^0.18.2","@testing-library/react":"^16.0.1","@types/canvas-confetti":"^1.9.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/parser":"^8.13.0","eslint-plugin-react-hooks":"^5.0.0","@testing-library/user-event":"^14.5.2","eslint-plugin-react-refresh":"^0.4.14","@size-limit/preset-small-lib":"^11.1.6","@types/react-syntax-highlighter":"^15.5.13","@typescript-eslint/eslint-plugin":"^8.13.0"},"peerDependencies":{"gsap":">=3.12.0","lenis":">=1.3.0","react":"^18.0.0 || ^19.0.0","motion":">=12.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":">=3.4.0","canvas-confetti":">=1.9.0"},"peerDependenciesMeta":{"gsap":{"optional":true},"lenis":{"optional":true},"canvas-confetti":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pretty_0.10.16_1777687927258_0.15167907109813905","host":"s3://npm-registry-packages-npm-production"}},"0.10.18":{"name":"@aisquare/pretty","version":"0.10.18","keywords":["aisquare","ui","components","tailwind","shadcn","react"],"license":"MIT","_id":"@aisquare/pretty@0.10.18","maintainers":[{"name":"aisquare-bots","email":"bots@aisquare.studio"}],"homepage":"https://github.com/AISquare-Studio/aisquare-pretty#readme","bugs":{"url":"https://github.com/AISquare-Studio/aisquare-pretty/issues"},"dist":{"shasum":"0a7633995cac6b782d066826f6d81513f3666b84","tarball":"https://registry.npmjs.org/@aisquare/pretty/-/pretty-0.10.18.tgz","fileCount":201,"integrity":"sha512-qLYUr8+FFyaR5TXNae6cQ6CLCo5gy6x6JhpFPhKb5yf8Fsti96jBDFYl5xV+010SA7cu0DanP/pPfhI2Ap+TDQ==","signatures":[{"sig":"MEUCIQDIHsWTWVL9gq0PYRdVoeGpN/frl34grrbvfEog72G5vwIgF98ZQrFPLXNBsQ9xQdxmaiTjHXpqx2DLyvb2qiYVanI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2348202},"main":"./dist/index.js","type":"module","_from":"file:aisquare-pretty-0.10.18.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json","./smooth-scroll":{"types":"./dist/entries/smooth-scroll.d.ts","import":"./dist/entries/smooth-scroll.js"},"./tailwind.preset":{"types":"./dist/tailwind.preset.d.cts","import":"./dist/tailwind.preset.cjs","default":"./dist/tailwind.preset.cjs","require":"./dist/tailwind.preset.cjs"},"./tokens.template.css":"./src/tokens/tokens.template.css"},"scripts":{"dev":"vite build --watch","lint":"eslint src --ext .ts,.tsx --max-warnings 0","size":"size-limit","test":"vitest","build":"vite build && tsup --config tsup.preset.config.ts","format":"prettier --write \"src/**/*.{ts,tsx}\" \"*.md\"","test:ci":"vitest --run","typecheck":"tsc --noEmit","build:check-exports":"attw --pack . --ignore-rules cjs-resolves-to-esm cjs-only-exports-default no-resolution named-exports"},"_npmUser":{"name":"aisquare-bots","email":"bots@aisquare.studio"},"_resolved":"/tmp/32f1ff9abcf50ec7cccef59b34f74c30/aisquare-pretty-0.10.18.tgz","_integrity":"sha512-qLYUr8+FFyaR5TXNae6cQ6CLCo5gy6x6JhpFPhKb5yf8Fsti96jBDFYl5xV+010SA7cu0DanP/pPfhI2Ap+TDQ==","repository":{"url":"git+https://github.com/AISquare-Studio/aisquare-pretty.git","type":"git"},"_npmVersion":"10.8.2","description":"Pretty UI primitives for AISquare. Centralized buttons, inputs, motion, and tokens shared across creator-studio and ai-studio.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.1","sonner":"^1.7.0","remark-gfm":"^4.0.1","lucide-react":"^0.460.0","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","tailwind-merge":"^2.5.4","rehype-sanitize":"^6.0.0","tailwindcss-motion":"^1.1.1","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-tabs":"^1.1.13","@radix-ui/react-popover":"^1.1.15","@radix-ui/react-tooltip":"^1.1.4","@tailwindcss/typography":"^0.5.19","class-variance-authority":"^0.7.0","react-syntax-highlighter":"^16.1.1","@radix-ui/react-accordion":"^1.2.0","@radix-ui/react-dropdown-menu":"^2.1.16"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.13.0","tsup":"^8.5.1","vite":"^5.4.10","jsdom":"^25.0.1","lenis":"^1.3.23","react":"^18.3.1","eslint":"^8.57.1","motion":"^12.38.0","vitest":"^2.1.4","axe-core":"^4.10.2","prettier":"^3.3.3","react-dom":"^18.3.1","size-limit":"^11.1.6","typescript":"^5.6.3","vitest-axe":"^0.1.0","@types/node":"^22.5.0","tailwindcss":"^3.4.14","@types/react":"^18.3.12","canvas-confetti":"^1.9.4","vite-plugin-dts":"^4.3.0","@types/react-dom":"^18.3.1","@vitejs/plugin-react":"^4.3.3","@arethetypeswrong/cli":"^0.18.2","@testing-library/react":"^16.0.1","@types/canvas-confetti":"^1.9.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/parser":"^8.13.0","eslint-plugin-react-hooks":"^5.0.0","@testing-library/user-event":"^14.5.2","eslint-plugin-react-refresh":"^0.4.14","@size-limit/preset-small-lib":"^11.1.6","@types/react-syntax-highlighter":"^15.5.13","@typescript-eslint/eslint-plugin":"^8.13.0"},"peerDependencies":{"gsap":">=3.12.0","lenis":">=1.3.0","react":"^18.0.0 || ^19.0.0","motion":">=12.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":">=3.4.0","canvas-confetti":">=1.9.0"},"peerDependenciesMeta":{"gsap":{"optional":true},"lenis":{"optional":true},"canvas-confetti":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pretty_0.10.18_1777694587920_0.7906663652798578","host":"s3://npm-registry-packages-npm-production"}},"0.10.19":{"name":"@aisquare/pretty","version":"0.10.19","keywords":["aisquare","ui","components","tailwind","shadcn","react"],"license":"MIT","_id":"@aisquare/pretty@0.10.19","maintainers":[{"name":"aisquare-bots","email":"bots@aisquare.studio"}],"homepage":"https://github.com/AISquare-Studio/aisquare-pretty#readme","bugs":{"url":"https://github.com/AISquare-Studio/aisquare-pretty/issues"},"dist":{"shasum":"68703412a3e2cd573c8ae40346828cbd5e2bca5c","tarball":"https://registry.npmjs.org/@aisquare/pretty/-/pretty-0.10.19.tgz","fileCount":201,"integrity":"sha512-93BCY/JXQXD8ZtTvjxu6l78/2X0B+X2m3SHzr/EqphSoY8rrAys3+9hlUEZO7X9aVHZwr6UrJL8yVElEcNtE5A==","signatures":[{"sig":"MEUCIQDFgKKcgIMiKCoiL90XUMzAZCSm9YMJzG9DXKblcgS3yAIgS1pq+I/vCu0gFvWU7GfdyMACbPR4zsoLMZTQWsmoGTA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2349061},"main":"./dist/index.js","type":"module","_from":"file:aisquare-pretty-0.10.19.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json","./smooth-scroll":{"types":"./dist/entries/smooth-scroll.d.ts","import":"./dist/entries/smooth-scroll.js"},"./tailwind.preset":{"types":"./dist/tailwind.preset.d.cts","import":"./dist/tailwind.preset.cjs","default":"./dist/tailwind.preset.cjs","require":"./dist/tailwind.preset.cjs"},"./tokens.template.css":"./src/tokens/tokens.template.css"},"scripts":{"dev":"vite build --watch","lint":"eslint src --ext .ts,.tsx --max-warnings 0","size":"size-limit","test":"vitest","build":"vite build && tsup --config tsup.preset.config.ts","format":"prettier --write \"src/**/*.{ts,tsx}\" \"*.md\"","test:ci":"vitest --run","typecheck":"tsc --noEmit","build:check-exports":"attw --pack . --ignore-rules cjs-resolves-to-esm cjs-only-exports-default no-resolution named-exports"},"_npmUser":{"name":"aisquare-bots","email":"bots@aisquare.studio"},"_resolved":"/tmp/3460fe2739917eca05e5f0249ee3511f/aisquare-pretty-0.10.19.tgz","_integrity":"sha512-93BCY/JXQXD8ZtTvjxu6l78/2X0B+X2m3SHzr/EqphSoY8rrAys3+9hlUEZO7X9aVHZwr6UrJL8yVElEcNtE5A==","repository":{"url":"git+https://github.com/AISquare-Studio/aisquare-pretty.git","type":"git"},"_npmVersion":"10.8.2","description":"Pretty UI primitives for AISquare. Centralized buttons, inputs, motion, and tokens shared across creator-studio and ai-studio.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.1","sonner":"^1.7.0","remark-gfm":"^4.0.1","lucide-react":"^0.460.0","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","tailwind-merge":"^2.5.4","rehype-sanitize":"^6.0.0","tailwindcss-motion":"^1.1.1","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-tabs":"^1.1.13","@radix-ui/react-popover":"^1.1.15","@radix-ui/react-tooltip":"^1.1.4","@tailwindcss/typography":"^0.5.19","class-variance-authority":"^0.7.0","react-syntax-highlighter":"^16.1.1","@radix-ui/react-accordion":"^1.2.0","@radix-ui/react-dropdown-menu":"^2.1.16"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.13.0","tsup":"^8.5.1","vite":"^5.4.10","jsdom":"^25.0.1","lenis":"^1.3.23","react":"^18.3.1","eslint":"^8.57.1","motion":"^12.38.0","vitest":"^2.1.4","axe-core":"^4.10.2","prettier":"^3.3.3","react-dom":"^18.3.1","size-limit":"^11.1.6","typescript":"^5.6.3","vitest-axe":"^0.1.0","@types/node":"^22.5.0","tailwindcss":"^3.4.14","@types/react":"^18.3.12","canvas-confetti":"^1.9.4","vite-plugin-dts":"^4.3.0","@types/react-dom":"^18.3.1","@vitejs/plugin-react":"^4.3.3","@arethetypeswrong/cli":"^0.18.2","@testing-library/react":"^16.0.1","@types/canvas-confetti":"^1.9.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/parser":"^8.13.0","eslint-plugin-react-hooks":"^5.0.0","@testing-library/user-event":"^14.5.2","eslint-plugin-react-refresh":"^0.4.14","@size-limit/preset-small-lib":"^11.1.6","@types/react-syntax-highlighter":"^15.5.13","@typescript-eslint/eslint-plugin":"^8.13.0"},"peerDependencies":{"gsap":">=3.12.0","lenis":">=1.3.0","react":"^18.0.0 || ^19.0.0","motion":">=12.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":">=3.4.0","canvas-confetti":">=1.9.0"},"peerDependenciesMeta":{"gsap":{"optional":true},"lenis":{"optional":true},"canvas-confetti":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pretty_0.10.19_1777698874968_0.09546419623715163","host":"s3://npm-registry-packages-npm-production"}},"0.10.20":{"name":"@aisquare/pretty","version":"0.10.20","keywords":["aisquare","ui","components","tailwind","shadcn","react"],"license":"MIT","_id":"@aisquare/pretty@0.10.20","maintainers":[{"name":"aisquare-bots","email":"bots@aisquare.studio"}],"homepage":"https://github.com/AISquare-Studio/aisquare-pretty#readme","bugs":{"url":"https://github.com/AISquare-Studio/aisquare-pretty/issues"},"dist":{"shasum":"d2460d9f787241f590c9dd4cb36e414fdb9a2403","tarball":"https://registry.npmjs.org/@aisquare/pretty/-/pretty-0.10.20.tgz","fileCount":201,"integrity":"sha512-JDRsZaSRJCK7QVkRIvRGOV67yeYE6fl01nEr740nnhRPId21yyuMtH+V97PT1pZG3KE0lr5ryTCIPgaidukoGw==","signatures":[{"sig":"MEUCIQClCy+ucQut21uIF/U9J8lfhJ23JAT+1Eew99sfmvtGGQIgReL9E2kltRerijalFx4MZLw/Vy2+9hOBO4Hrb8MKILU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2352655},"main":"./dist/index.js","type":"module","_from":"file:aisquare-pretty-0.10.20.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json","./smooth-scroll":{"types":"./dist/entries/smooth-scroll.d.ts","import":"./dist/entries/smooth-scroll.js"},"./tailwind.preset":{"types":"./dist/tailwind.preset.d.cts","import":"./dist/tailwind.preset.cjs","default":"./dist/tailwind.preset.cjs","require":"./dist/tailwind.preset.cjs"},"./tokens.template.css":"./src/tokens/tokens.template.css"},"scripts":{"dev":"vite build --watch","lint":"eslint src --ext .ts,.tsx --max-warnings 0","size":"size-limit","test":"vitest","build":"vite build && tsup --config tsup.preset.config.ts","format":"prettier --write \"src/**/*.{ts,tsx}\" \"*.md\"","test:ci":"vitest --run","typecheck":"tsc --noEmit","build:check-exports":"attw --pack . --ignore-rules cjs-resolves-to-esm cjs-only-exports-default no-resolution named-exports"},"_npmUser":{"name":"aisquare-bots","email":"bots@aisquare.studio"},"_resolved":"/tmp/e4b7d933c8dd0b3c074135ee5624cd8e/aisquare-pretty-0.10.20.tgz","_integrity":"sha512-JDRsZaSRJCK7QVkRIvRGOV67yeYE6fl01nEr740nnhRPId21yyuMtH+V97PT1pZG3KE0lr5ryTCIPgaidukoGw==","repository":{"url":"git+https://github.com/AISquare-Studio/aisquare-pretty.git","type":"git"},"_npmVersion":"10.8.2","description":"Pretty UI primitives for AISquare. Centralized buttons, inputs, motion, and tokens shared across creator-studio and ai-studio.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.1","sonner":"^1.7.0","remark-gfm":"^4.0.1","lucide-react":"^0.460.0","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","tailwind-merge":"^2.5.4","rehype-sanitize":"^6.0.0","tailwindcss-motion":"^1.1.1","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-tabs":"^1.1.13","@radix-ui/react-popover":"^1.1.15","@radix-ui/react-tooltip":"^1.1.4","@tailwindcss/typography":"^0.5.19","class-variance-authority":"^0.7.0","react-syntax-highlighter":"^16.1.1","@radix-ui/react-accordion":"^1.2.0","@radix-ui/react-dropdown-menu":"^2.1.16"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.13.0","tsup":"^8.5.1","vite":"^5.4.10","jsdom":"^25.0.1","lenis":"^1.3.23","react":"^18.3.1","eslint":"^8.57.1","motion":"^12.38.0","vitest":"^2.1.4","axe-core":"^4.10.2","prettier":"^3.3.3","react-dom":"^18.3.1","size-limit":"^11.1.6","typescript":"^5.6.3","vitest-axe":"^0.1.0","@types/node":"^22.5.0","tailwindcss":"^3.4.14","@types/react":"^18.3.12","canvas-confetti":"^1.9.4","vite-plugin-dts":"^4.3.0","@types/react-dom":"^18.3.1","@vitejs/plugin-react":"^4.3.3","@arethetypeswrong/cli":"^0.18.2","@testing-library/react":"^16.0.1","@types/canvas-confetti":"^1.9.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/parser":"^8.13.0","eslint-plugin-react-hooks":"^5.0.0","@testing-library/user-event":"^14.5.2","eslint-plugin-react-refresh":"^0.4.14","@size-limit/preset-small-lib":"^11.1.6","@types/react-syntax-highlighter":"^15.5.13","@typescript-eslint/eslint-plugin":"^8.13.0"},"peerDependencies":{"gsap":">=3.12.0","lenis":">=1.3.0","react":"^18.0.0 || ^19.0.0","motion":">=12.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":">=3.4.0","canvas-confetti":">=1.9.0"},"peerDependenciesMeta":{"gsap":{"optional":true},"lenis":{"optional":true},"canvas-confetti":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pretty_0.10.20_1777701059415_0.1982983890817589","host":"s3://npm-registry-packages-npm-production"}},"0.10.21":{"name":"@aisquare/pretty","version":"0.10.21","keywords":["aisquare","ui","components","tailwind","shadcn","react"],"license":"MIT","_id":"@aisquare/pretty@0.10.21","maintainers":[{"name":"aisquare-bots","email":"bots@aisquare.studio"}],"homepage":"https://github.com/AISquare-Studio/aisquare-pretty#readme","bugs":{"url":"https://github.com/AISquare-Studio/aisquare-pretty/issues"},"dist":{"shasum":"11431059cd7608c6deca4d8cc5fb08be73fff18d","tarball":"https://registry.npmjs.org/@aisquare/pretty/-/pretty-0.10.21.tgz","fileCount":207,"integrity":"sha512-BL036y1f72TBCIvqO9TEcRLayslti6iCQosch/jbJbxMvvCK6w4M+PjOF7LKF+mweqLYrm2lvkAa5QT3ASfMMA==","signatures":[{"sig":"MEQCIGePUFT4+Y1p77C6X6VnivrzDU1br01zwcWVRx/YhAjnAiAlw/sGn83tELMXoTo2+k2WvaM96k4M9l33JPvzhhZo1A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2386294},"main":"./dist/index.js","type":"module","_from":"file:aisquare-pretty-0.10.21.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json","./smooth-scroll":{"types":"./dist/entries/smooth-scroll.d.ts","import":"./dist/entries/smooth-scroll.js"},"./tailwind.preset":{"types":"./dist/tailwind.preset.d.cts","import":"./dist/tailwind.preset.cjs","default":"./dist/tailwind.preset.cjs","require":"./dist/tailwind.preset.cjs"},"./tokens.template.css":"./src/tokens/tokens.template.css"},"scripts":{"dev":"vite build --watch","lint":"eslint src --ext .ts,.tsx --max-warnings 0","size":"size-limit","test":"vitest","build":"vite build && tsup --config tsup.preset.config.ts","format":"prettier --write \"src/**/*.{ts,tsx}\" \"*.md\"","test:ci":"vitest --run","typecheck":"tsc --noEmit","build:check-exports":"attw --pack . --ignore-rules cjs-resolves-to-esm cjs-only-exports-default no-resolution named-exports"},"_npmUser":{"name":"aisquare-bots","email":"bots@aisquare.studio"},"_resolved":"/tmp/cc66e99d1cf15fd3cc92fe77a5d226d3/aisquare-pretty-0.10.21.tgz","_integrity":"sha512-BL036y1f72TBCIvqO9TEcRLayslti6iCQosch/jbJbxMvvCK6w4M+PjOF7LKF+mweqLYrm2lvkAa5QT3ASfMMA==","repository":{"url":"git+https://github.com/AISquare-Studio/aisquare-pretty.git","type":"git"},"_npmVersion":"10.8.2","description":"Pretty UI primitives for AISquare. Centralized buttons, inputs, motion, and tokens shared across creator-studio and ai-studio.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.1","sonner":"^1.7.0","remark-gfm":"^4.0.1","lucide-react":"^0.460.0","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","tailwind-merge":"^2.5.4","rehype-sanitize":"^6.0.0","tailwindcss-motion":"^1.1.1","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-tabs":"^1.1.13","@radix-ui/react-popover":"^1.1.15","@radix-ui/react-tooltip":"^1.1.4","@tailwindcss/typography":"^0.5.19","class-variance-authority":"^0.7.0","react-syntax-highlighter":"^16.1.1","@radix-ui/react-accordion":"^1.2.0","@radix-ui/react-dropdown-menu":"^2.1.16"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.13.0","tsup":"^8.5.1","vite":"^5.4.10","jsdom":"^25.0.1","lenis":"^1.3.23","react":"^18.3.1","eslint":"^8.57.1","motion":"^12.38.0","vitest":"^2.1.4","axe-core":"^4.10.2","prettier":"^3.3.3","react-dom":"^18.3.1","size-limit":"^11.1.6","typescript":"^5.6.3","vitest-axe":"^0.1.0","@types/node":"^22.5.0","tailwindcss":"^3.4.14","@types/react":"^18.3.12","canvas-confetti":"^1.9.4","vite-plugin-dts":"^4.3.0","@types/react-dom":"^18.3.1","@vitejs/plugin-react":"^4.3.3","@arethetypeswrong/cli":"^0.18.2","@testing-library/react":"^16.0.1","@types/canvas-confetti":"^1.9.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/parser":"^8.13.0","eslint-plugin-react-hooks":"^5.0.0","@testing-library/user-event":"^14.5.2","eslint-plugin-react-refresh":"^0.4.14","@size-limit/preset-small-lib":"^11.1.6","@types/react-syntax-highlighter":"^15.5.13","@typescript-eslint/eslint-plugin":"^8.13.0"},"peerDependencies":{"gsap":">=3.12.0","lenis":">=1.3.0","react":"^18.0.0 || ^19.0.0","motion":">=12.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":">=3.4.0","canvas-confetti":">=1.9.0"},"peerDependenciesMeta":{"gsap":{"optional":true},"lenis":{"optional":true},"canvas-confetti":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pretty_0.10.21_1777751717934_0.1762019722151309","host":"s3://npm-registry-packages-npm-production"}},"0.10.23":{"name":"@aisquare/pretty","version":"0.10.23","keywords":["aisquare","ui","components","tailwind","shadcn","react"],"license":"MIT","_id":"@aisquare/pretty@0.10.23","maintainers":[{"name":"aisquare-bots","email":"bots@aisquare.studio"}],"homepage":"https://github.com/AISquare-Studio/aisquare-pretty#readme","bugs":{"url":"https://github.com/AISquare-Studio/aisquare-pretty/issues"},"dist":{"shasum":"14fa53ede3fdeb7c489a7098be87c0236cdf444f","tarball":"https://registry.npmjs.org/@aisquare/pretty/-/pretty-0.10.23.tgz","fileCount":209,"integrity":"sha512-1bF6HfcktHquGBHAGgo/7pwk50DEJKVLWwVl6k1ULt+HM9926xvrt+A7HLpVgtduBV68zEgxaJD7xYBAAp3XFA==","signatures":[{"sig":"MEUCIHeWYYJji1WmzxWJHlKfD3o84GQk2NtHJoQ9vbKToP50AiEAhvUdwzKFUF4y9jYoyVHHnX20i8DghPOaSCwV+wJhc4c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2441243},"main":"./dist/index.js","type":"module","_from":"file:aisquare-pretty-0.10.23.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json","./smooth-scroll":{"types":"./dist/entries/smooth-scroll.d.ts","import":"./dist/entries/smooth-scroll.js"},"./tailwind.preset":{"types":"./dist/tailwind.preset.d.cts","import":"./dist/tailwind.preset.cjs","default":"./dist/tailwind.preset.cjs","require":"./dist/tailwind.preset.cjs"},"./tokens.template.css":"./src/tokens/tokens.template.css"},"scripts":{"dev":"vite build --watch","lint":"eslint src --ext .ts,.tsx --max-warnings 0","size":"size-limit","test":"vitest","build":"vite build && tsup --config tsup.preset.config.ts","format":"prettier --write \"src/**/*.{ts,tsx}\" \"*.md\"","test:ci":"vitest --run","typecheck":"tsc --noEmit","build:check-exports":"attw --pack . --ignore-rules cjs-resolves-to-esm cjs-only-exports-default no-resolution named-exports"},"_npmUser":{"name":"aisquare-bots","email":"bots@aisquare.studio"},"_resolved":"/tmp/529ac503218fbfd917614234a354903f/aisquare-pretty-0.10.23.tgz","_integrity":"sha512-1bF6HfcktHquGBHAGgo/7pwk50DEJKVLWwVl6k1ULt+HM9926xvrt+A7HLpVgtduBV68zEgxaJD7xYBAAp3XFA==","repository":{"url":"git+https://github.com/AISquare-Studio/aisquare-pretty.git","type":"git"},"_npmVersion":"10.8.2","description":"Pretty UI primitives for AISquare. Centralized buttons, inputs, motion, and tokens shared across creator-studio and ai-studio.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.1","sonner":"^1.7.0","remark-gfm":"^4.0.1","lucide-react":"^0.460.0","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","tailwind-merge":"^2.5.4","rehype-sanitize":"^6.0.0","tailwindcss-motion":"^1.1.1","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-tabs":"^1.1.13","@radix-ui/react-popover":"^1.1.15","@radix-ui/react-tooltip":"^1.1.4","@tailwindcss/typography":"^0.5.19","class-variance-authority":"^0.7.0","react-syntax-highlighter":"^16.1.1","@radix-ui/react-accordion":"^1.2.0","@radix-ui/react-dropdown-menu":"^2.1.16"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.13.0","tsup":"^8.5.1","vite":"^5.4.10","jsdom":"^25.0.1","lenis":"^1.3.23","react":"^18.3.1","eslint":"^8.57.1","motion":"^12.38.0","vitest":"^2.1.4","axe-core":"^4.10.2","prettier":"^3.3.3","react-dom":"^18.3.1","size-limit":"^11.1.6","typescript":"^5.6.3","vitest-axe":"^0.1.0","@types/node":"^22.5.0","tailwindcss":"^3.4.14","@types/react":"^18.3.12","canvas-confetti":"^1.9.4","vite-plugin-dts":"^4.3.0","@types/react-dom":"^18.3.1","@vitejs/plugin-react":"^4.3.3","@arethetypeswrong/cli":"^0.18.2","@testing-library/react":"^16.0.1","@types/canvas-confetti":"^1.9.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/parser":"^8.13.0","eslint-plugin-react-hooks":"^5.0.0","@testing-library/user-event":"^14.5.2","eslint-plugin-react-refresh":"^0.4.14","@size-limit/preset-small-lib":"^11.1.6","@types/react-syntax-highlighter":"^15.5.13","@typescript-eslint/eslint-plugin":"^8.13.0"},"peerDependencies":{"gsap":">=3.12.0","lenis":">=1.3.0","react":"^18.0.0 || ^19.0.0","motion":">=12.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":">=3.4.0","canvas-confetti":">=1.9.0"},"peerDependenciesMeta":{"gsap":{"optional":true},"lenis":{"optional":true},"canvas-confetti":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pretty_0.10.23_1777765646156_0.04342305488903264","host":"s3://npm-registry-packages-npm-production"}},"0.10.24":{"name":"@aisquare/pretty","version":"0.10.24","keywords":["aisquare","ui","components","tailwind","shadcn","react"],"license":"MIT","_id":"@aisquare/pretty@0.10.24","maintainers":[{"name":"aisquare-bots","email":"bots@aisquare.studio"}],"homepage":"https://github.com/AISquare-Studio/aisquare-pretty#readme","bugs":{"url":"https://github.com/AISquare-Studio/aisquare-pretty/issues"},"dist":{"shasum":"4775bbc55b6c7d7c31e2555c145be92060bfa302","tarball":"https://registry.npmjs.org/@aisquare/pretty/-/pretty-0.10.24.tgz","fileCount":213,"integrity":"sha512-Z0SNeV3dADQBujeiQl4vQZeDy7NIwo9i7dlvgcyeyj6lvzIMS74N2ow4Swtv7BpQpH5WC9HrPzs8AeGWcZOvlw==","signatures":[{"sig":"MEUCIGRzfkEg0yfNlzkf0RCDTXfXFJU4j2jvUk1MKqGZ5brQAiEA1H1Ra2+lijdtaseXyVIHXuR8gYQ7RQahPkpPyR6fMkM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2554187},"main":"./dist/index.js","type":"module","_from":"file:aisquare-pretty-0.10.24.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json","./smooth-scroll":{"types":"./dist/entries/smooth-scroll.d.ts","import":"./dist/entries/smooth-scroll.js"},"./tailwind.preset":{"types":"./dist/tailwind.preset.d.cts","import":"./dist/tailwind.preset.cjs","default":"./dist/tailwind.preset.cjs","require":"./dist/tailwind.preset.cjs"},"./tokens.template.css":"./src/tokens/tokens.template.css"},"scripts":{"dev":"vite build --watch","lint":"eslint src --ext .ts,.tsx --max-warnings 0","size":"size-limit","test":"vitest","build":"vite build && tsup --config tsup.preset.config.ts","format":"prettier --write \"src/**/*.{ts,tsx}\" \"*.md\"","test:ci":"vitest --run","typecheck":"tsc --noEmit","build:check-exports":"attw --pack . --ignore-rules cjs-resolves-to-esm cjs-only-exports-default no-resolution named-exports"},"_npmUser":{"name":"aisquare-bots","email":"bots@aisquare.studio"},"_resolved":"/tmp/4f48679055aaa8aea1ad89a7b0e766e2/aisquare-pretty-0.10.24.tgz","_integrity":"sha512-Z0SNeV3dADQBujeiQl4vQZeDy7NIwo9i7dlvgcyeyj6lvzIMS74N2ow4Swtv7BpQpH5WC9HrPzs8AeGWcZOvlw==","repository":{"url":"git+https://github.com/AISquare-Studio/aisquare-pretty.git","type":"git"},"_npmVersion":"10.8.2","description":"Pretty UI primitives for AISquare. Centralized buttons, inputs, motion, and tokens shared across creator-studio and ai-studio.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.1","sonner":"^1.7.0","remark-gfm":"^4.0.1","lucide-react":"^0.460.0","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","tailwind-merge":"^2.5.4","rehype-sanitize":"^6.0.0","tailwindcss-motion":"^1.1.1","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-tabs":"^1.1.13","@radix-ui/react-popover":"^1.1.15","@radix-ui/react-tooltip":"^1.1.4","@tailwindcss/typography":"^0.5.19","class-variance-authority":"^0.7.0","react-syntax-highlighter":"^16.1.1","@radix-ui/react-accordion":"^1.2.0","@radix-ui/react-dropdown-menu":"^2.1.16"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.13.0","tsup":"^8.5.1","vite":"^5.4.10","jsdom":"^25.0.1","lenis":"^1.3.23","react":"^18.3.1","eslint":"^8.57.1","motion":"^12.38.0","vitest":"^2.1.4","axe-core":"^4.10.2","prettier":"^3.3.3","react-dom":"^18.3.1","size-limit":"^11.1.6","typescript":"^5.6.3","vitest-axe":"^0.1.0","@types/node":"^22.5.0","tailwindcss":"^3.4.14","@types/react":"^18.3.12","canvas-confetti":"^1.9.4","vite-plugin-dts":"^4.3.0","@types/react-dom":"^18.3.1","@vitejs/plugin-react":"^4.3.3","@arethetypeswrong/cli":"^0.18.2","@testing-library/react":"^16.0.1","@types/canvas-confetti":"^1.9.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/parser":"^8.13.0","eslint-plugin-react-hooks":"^5.0.0","@testing-library/user-event":"^14.5.2","eslint-plugin-react-refresh":"^0.4.14","@size-limit/preset-small-lib":"^11.1.6","@types/react-syntax-highlighter":"^15.5.13","@typescript-eslint/eslint-plugin":"^8.13.0"},"peerDependencies":{"gsap":">=3.12.0","lenis":">=1.3.0","react":"^18.0.0 || ^19.0.0","motion":">=12.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":">=3.4.0","canvas-confetti":">=1.9.0"},"peerDependenciesMeta":{"gsap":{"optional":true},"lenis":{"optional":true},"canvas-confetti":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pretty_0.10.24_1777936139038_0.5096581197053536","host":"s3://npm-registry-packages-npm-production"}},"0.10.27":{"name":"@aisquare/pretty","version":"0.10.27","keywords":["aisquare","ui","components","tailwind","shadcn","react"],"license":"MIT","_id":"@aisquare/pretty@0.10.27","maintainers":[{"name":"aisquare-bots","email":"bots@aisquare.studio"}],"homepage":"https://github.com/AISquare-Studio/aisquare-pretty#readme","bugs":{"url":"https://github.com/AISquare-Studio/aisquare-pretty/issues"},"dist":{"shasum":"54f8b2227fedc3be74f14e7ca427beb459cbe8fc","tarball":"https://registry.npmjs.org/@aisquare/pretty/-/pretty-0.10.27.tgz","fileCount":219,"integrity":"sha512-Mejxqc2Fo7Z+mnwLQ+Pf3L05pLmOUiOGIemaS17aaXX8W8zMs6+AiMnFAqNKeV/7opv3eTpcdnZQUmarkgBclw==","signatures":[{"sig":"MEUCIGuiqUViBBfHAJJxe1S/sbBu32QRzsn1uGmn4fqnFFpNAiEAgO8WxpiU7CMPku0qK9gs4SnT3AQ0sT6T0SI95agsORg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2592574},"main":"./dist/index.js","type":"module","_from":"file:aisquare-pretty-0.10.27.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json","./smooth-scroll":{"types":"./dist/entries/smooth-scroll.d.ts","import":"./dist/entries/smooth-scroll.js"},"./tailwind.preset":{"types":"./dist/tailwind.preset.d.cts","import":"./dist/tailwind.preset.cjs","default":"./dist/tailwind.preset.cjs","require":"./dist/tailwind.preset.cjs"},"./tokens.template.css":"./src/tokens/tokens.template.css"},"scripts":{"dev":"vite build --watch","lint":"eslint src --ext .ts,.tsx --max-warnings 0","size":"size-limit","test":"vitest","build":"vite build && tsup --config tsup.preset.config.ts","format":"prettier --write \"src/**/*.{ts,tsx}\" \"*.md\"","test:ci":"vitest --run","typecheck":"tsc --noEmit","build:check-exports":"attw --pack . --ignore-rules cjs-resolves-to-esm cjs-only-exports-default no-resolution named-exports"},"_npmUser":{"name":"aisquare-bots","email":"bots@aisquare.studio"},"_resolved":"/tmp/5a4e341ff4cc5b161d1f782d8127848d/aisquare-pretty-0.10.27.tgz","_integrity":"sha512-Mejxqc2Fo7Z+mnwLQ+Pf3L05pLmOUiOGIemaS17aaXX8W8zMs6+AiMnFAqNKeV/7opv3eTpcdnZQUmarkgBclw==","repository":{"url":"git+https://github.com/AISquare-Studio/aisquare-pretty.git","type":"git"},"_npmVersion":"10.8.2","description":"Pretty UI primitives for AISquare. Centralized buttons, inputs, motion, and tokens shared across creator-studio and ai-studio.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.1","sonner":"^1.7.0","remark-gfm":"^4.0.1","lucide-react":"^0.460.0","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","tailwind-merge":"^2.5.4","rehype-sanitize":"^6.0.0","tailwindcss-motion":"^1.1.1","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-tabs":"^1.1.13","@radix-ui/react-popover":"^1.1.15","@radix-ui/react-tooltip":"^1.1.4","@tailwindcss/typography":"^0.5.19","class-variance-authority":"^0.7.0","react-syntax-highlighter":"^16.1.1","@radix-ui/react-accordion":"^1.2.0","@radix-ui/react-dropdown-menu":"^2.1.16"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.13.0","tsup":"^8.5.1","vite":"^5.4.10","jsdom":"^25.0.1","lenis":"^1.3.23","react":"^18.3.1","eslint":"^8.57.1","motion":"^12.38.0","vitest":"^2.1.4","axe-core":"^4.10.2","prettier":"^3.3.3","react-dom":"^18.3.1","size-limit":"^11.1.6","typescript":"^5.6.3","vitest-axe":"^0.1.0","@types/node":"^22.5.0","tailwindcss":"^3.4.14","@types/react":"^18.3.12","canvas-confetti":"^1.9.4","vite-plugin-dts":"^4.3.0","@types/react-dom":"^18.3.1","@vitejs/plugin-react":"^4.3.3","@arethetypeswrong/cli":"^0.18.2","@testing-library/react":"^16.0.1","@types/canvas-confetti":"^1.9.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/parser":"^8.13.0","eslint-plugin-react-hooks":"^5.0.0","@testing-library/user-event":"^14.5.2","eslint-plugin-react-refresh":"^0.4.14","@size-limit/preset-small-lib":"^11.1.6","@types/react-syntax-highlighter":"^15.5.13","@typescript-eslint/eslint-plugin":"^8.13.0"},"peerDependencies":{"gsap":">=3.12.0","lenis":">=1.3.0","react":"^18.0.0 || ^19.0.0","motion":">=12.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":">=3.4.0","canvas-confetti":">=1.9.0"},"peerDependenciesMeta":{"gsap":{"optional":true},"lenis":{"optional":true},"canvas-confetti":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pretty_0.10.27_1778315274672_0.5483283335368763","host":"s3://npm-registry-packages-npm-production"}},"0.10.29":{"name":"@aisquare/pretty","version":"0.10.29","keywords":["aisquare","ui","components","tailwind","shadcn","react"],"license":"MIT","_id":"@aisquare/pretty@0.10.29","maintainers":[{"name":"aisquare-bots","email":"bots@aisquare.studio"}],"homepage":"https://github.com/AISquare-Studio/aisquare-pretty#readme","bugs":{"url":"https://github.com/AISquare-Studio/aisquare-pretty/issues"},"dist":{"shasum":"a263f257bb50d85f5f7b2985b63218f429cf5642","tarball":"https://registry.npmjs.org/@aisquare/pretty/-/pretty-0.10.29.tgz","fileCount":233,"integrity":"sha512-kR0UPVTc96vWx54SBwbXz7oFpury4S5Se0ZmoZ4plG8OCgxiQbmZgEgiLXmGgLiprgbHhd8S928umHrFgWfnZA==","signatures":[{"sig":"MEUCIQCGADulCUPhmvGhv3Dd4WP0II07ZntsiP6E/KND8l/RwQIgHdux7cNfbzyCryFQgZnjV7aezo+wuEFec+iqhxLzfU0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2637607},"main":"./dist/index.js","type":"module","_from":"file:aisquare-pretty-0.10.29.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json","./smooth-scroll":{"types":"./dist/entries/smooth-scroll.d.ts","import":"./dist/entries/smooth-scroll.js"},"./tailwind.preset":{"types":"./dist/tailwind.preset.d.cts","import":"./dist/tailwind.preset.cjs","default":"./dist/tailwind.preset.cjs","require":"./dist/tailwind.preset.cjs"},"./tokens.template.css":"./src/tokens/tokens.template.css"},"scripts":{"dev":"vite build --watch","lint":"eslint src --ext .ts,.tsx --max-warnings 0","size":"size-limit","test":"vitest","build":"vite build && tsup --config tsup.preset.config.ts","format":"prettier --write \"src/**/*.{ts,tsx}\" \"*.md\"","test:ci":"vitest --run","typecheck":"tsc --noEmit","check:playground":"node scripts/check-playground-coverage.js","build:check-exports":"attw --pack . --ignore-rules cjs-resolves-to-esm cjs-only-exports-default no-resolution named-exports"},"_npmUser":{"name":"aisquare-bots","email":"bots@aisquare.studio"},"_resolved":"/tmp/6b33b556422ec30f954f1dd3d5c306ab/aisquare-pretty-0.10.29.tgz","_integrity":"sha512-kR0UPVTc96vWx54SBwbXz7oFpury4S5Se0ZmoZ4plG8OCgxiQbmZgEgiLXmGgLiprgbHhd8S928umHrFgWfnZA==","repository":{"url":"git+https://github.com/AISquare-Studio/aisquare-pretty.git","type":"git"},"_npmVersion":"10.8.2","description":"Pretty UI primitives for AISquare. Centralized buttons, inputs, motion, and tokens shared across creator-studio and ai-studio.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.1","sonner":"^1.7.0","remark-gfm":"^4.0.1","lucide-react":"^0.460.0","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","tailwind-merge":"^2.5.4","rehype-sanitize":"^6.0.0","tailwindcss-motion":"^1.1.1","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-tabs":"^1.1.13","@radix-ui/react-switch":"^1.2.6","@radix-ui/react-popover":"^1.1.15","@radix-ui/react-tooltip":"^1.1.4","@tailwindcss/typography":"^0.5.19","@radix-ui/react-checkbox":"^1.3.3","class-variance-authority":"^0.7.0","react-syntax-highlighter":"^16.1.1","@radix-ui/react-accordion":"^1.2.0","@radix-ui/react-dropdown-menu":"^2.1.16"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.13.0","tsup":"^8.5.1","vite":"^5.4.10","jsdom":"^25.0.1","lenis":"^1.3.23","react":"^18.3.1","eslint":"^8.57.1","motion":"^12.38.0","vitest":"^2.1.4","axe-core":"^4.10.2","prettier":"^3.3.3","react-dom":"^18.3.1","size-limit":"^11.1.6","typescript":"^5.6.3","vitest-axe":"^0.1.0","@types/node":"^22.5.0","tailwindcss":"^3.4.14","@types/react":"^18.3.12","canvas-confetti":"^1.9.4","vite-plugin-dts":"^4.3.0","@types/react-dom":"^18.3.1","@vitejs/plugin-react":"^4.3.3","@arethetypeswrong/cli":"^0.18.2","@testing-library/react":"^16.0.1","@types/canvas-confetti":"^1.9.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/parser":"^8.13.0","eslint-plugin-react-hooks":"^5.0.0","@testing-library/user-event":"^14.5.2","eslint-plugin-react-refresh":"^0.4.14","@size-limit/preset-small-lib":"^11.1.6","@types/react-syntax-highlighter":"^15.5.13","@typescript-eslint/eslint-plugin":"^8.13.0"},"peerDependencies":{"gsap":">=3.12.0","lenis":">=1.3.0","react":"^18.0.0 || ^19.0.0","motion":">=12.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":">=3.4.0","canvas-confetti":">=1.9.0"},"peerDependenciesMeta":{"gsap":{"optional":true},"lenis":{"optional":true},"canvas-confetti":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pretty_0.10.29_1778353421727_0.2667968640350027","host":"s3://npm-registry-packages-npm-production"}},"0.10.30":{"name":"@aisquare/pretty","version":"0.10.30","keywords":["aisquare","ui","components","tailwind","shadcn","react"],"license":"MIT","_id":"@aisquare/pretty@0.10.30","maintainers":[{"name":"aisquare-bots","email":"bots@aisquare.studio"}],"homepage":"https://github.com/AISquare-Studio/aisquare-pretty#readme","bugs":{"url":"https://github.com/AISquare-Studio/aisquare-pretty/issues"},"dist":{"shasum":"1c44aaaaf6076fca7bd17f76c703787b40ada628","tarball":"https://registry.npmjs.org/@aisquare/pretty/-/pretty-0.10.30.tgz","fileCount":249,"integrity":"sha512-jFVVUNF/MT3rRyGiSbWn3pBy2VvSDb8TwIlGyWluyiqb3HuVpSsjctVBtg8fW6EPlcmxMAo1urI3Yp+YMoyISQ==","signatures":[{"sig":"MEUCIDdb6Hyh/LpEqKcjP5DykHF1ncp8aL1+f0W529eVMJPDAiEAyDptG5lqflpp7bk9ECH5ihy9mD51hRlsr5N3luXtHgE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2738331},"main":"./dist/index.js","type":"module","_from":"file:aisquare-pretty-0.10.30.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json","./smooth-scroll":{"types":"./dist/entries/smooth-scroll.d.ts","import":"./dist/entries/smooth-scroll.js"},"./tailwind.preset":{"types":"./dist/tailwind.preset.d.cts","import":"./dist/tailwind.preset.cjs","default":"./dist/tailwind.preset.cjs","require":"./dist/tailwind.preset.cjs"},"./tokens.template.css":"./src/tokens/tokens.template.css"},"scripts":{"dev":"vite build --watch","lint":"eslint src --ext .ts,.tsx --max-warnings 0","size":"size-limit","test":"vitest","build":"vite build && tsup --config tsup.preset.config.ts","format":"prettier --write \"src/**/*.{ts,tsx}\" \"*.md\"","test:ci":"vitest --run","typecheck":"tsc --noEmit","generate:covers":"node scripts/generate-cover-placeholders.mjs","check:playground":"node scripts/check-playground-coverage.js","build:check-exports":"attw --pack . --ignore-rules cjs-resolves-to-esm cjs-only-exports-default no-resolution named-exports"},"_npmUser":{"name":"aisquare-bots","email":"bots@aisquare.studio"},"_resolved":"/tmp/c0d5b3a78e1e248a27fac1af53df2fc2/aisquare-pretty-0.10.30.tgz","_integrity":"sha512-jFVVUNF/MT3rRyGiSbWn3pBy2VvSDb8TwIlGyWluyiqb3HuVpSsjctVBtg8fW6EPlcmxMAo1urI3Yp+YMoyISQ==","repository":{"url":"git+https://github.com/AISquare-Studio/aisquare-pretty.git","type":"git"},"_npmVersion":"10.8.2","description":"Pretty UI primitives for AISquare. Centralized buttons, inputs, motion, and tokens shared across creator-studio and ai-studio.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.1","sonner":"^1.7.0","remark-gfm":"^4.0.1","lucide-react":"^0.460.0","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","tailwind-merge":"^2.5.4","rehype-sanitize":"^6.0.0","tailwindcss-motion":"^1.1.1","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-tabs":"^1.1.13","@radix-ui/react-switch":"^1.2.6","@radix-ui/react-popover":"^1.1.15","@radix-ui/react-tooltip":"^1.1.4","@tailwindcss/typography":"^0.5.19","@radix-ui/react-checkbox":"^1.3.3","class-variance-authority":"^0.7.0","react-syntax-highlighter":"^16.1.1","@radix-ui/react-accordion":"^1.2.0","@radix-ui/react-dropdown-menu":"^2.1.16"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.13.0","tsup":"^8.5.1","vite":"^5.4.10","jsdom":"^25.0.1","lenis":"^1.3.23","react":"^18.3.1","eslint":"^8.57.1","motion":"^12.38.0","vitest":"^2.1.4","axe-core":"^4.10.2","prettier":"^3.3.3","react-dom":"^18.3.1","size-limit":"^11.1.6","typescript":"^5.6.3","vitest-axe":"^0.1.0","@types/node":"^22.5.0","tailwindcss":"^3.4.14","@types/react":"^18.3.12","canvas-confetti":"^1.9.4","vite-plugin-dts":"^4.3.0","@types/react-dom":"^18.3.1","@vitejs/plugin-react":"^4.3.3","@arethetypeswrong/cli":"^0.18.2","@testing-library/react":"^16.0.1","@types/canvas-confetti":"^1.9.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/parser":"^8.13.0","eslint-plugin-react-hooks":"^5.0.0","@testing-library/user-event":"^14.5.2","eslint-plugin-react-refresh":"^0.4.14","@size-limit/preset-small-lib":"^11.1.6","@types/react-syntax-highlighter":"^15.5.13","@typescript-eslint/eslint-plugin":"^8.13.0"},"peerDependencies":{"gsap":">=3.12.0","lenis":">=1.3.0","react":"^18.0.0 || ^19.0.0","motion":">=12.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":">=3.4.0","canvas-confetti":">=1.9.0"},"peerDependenciesMeta":{"gsap":{"optional":true},"lenis":{"optional":true},"canvas-confetti":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pretty_0.10.30_1778643774688_0.8212539308874724","host":"s3://npm-registry-packages-npm-production"}},"0.10.33":{"name":"@aisquare/pretty","version":"0.10.33","keywords":["aisquare","ui","components","tailwind","shadcn","react"],"license":"MIT","_id":"@aisquare/pretty@0.10.33","maintainers":[{"name":"aisquare-bots","email":"bots@aisquare.studio"}],"homepage":"https://github.com/AISquare-Studio/aisquare-pretty#readme","bugs":{"url":"https://github.com/AISquare-Studio/aisquare-pretty/issues"},"dist":{"shasum":"332807bfb7eb85f6f3cbe6b35014eb1c0a865d9e","tarball":"https://registry.npmjs.org/@aisquare/pretty/-/pretty-0.10.33.tgz","fileCount":273,"integrity":"sha512-lr337E2SW5ZRMklDveX+q3naCYLTFpDdp6NhqdKebp0lbXPVZYGPkUju5NqQKJfa87pJ3LTu9M2ZIgUBX5/dYg==","signatures":[{"sig":"MEUCIELDPENUO+x0C08gJw8wsqA3rzsGyD8vo3S0dnaqx8oMAiEA+V0H16rmdHYw02xfR1hgghd3dOUeNQ8w9SPxbLRJpGo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2944372},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json","./smooth-scroll":{"types":"./dist/entries/smooth-scroll.d.ts","import":"./dist/entries/smooth-scroll.js"},"./tailwind.preset":{"types":"./dist/tailwind.preset.d.cts","import":"./dist/tailwind.preset.cjs","default":"./dist/tailwind.preset.cjs","require":"./dist/tailwind.preset.cjs"},"./tokens.template.css":"./src/tokens/tokens.template.css"},"gitHead":"4ec6a8a4c9e1a4b8a7648e397d0d966b26522f73","scripts":{"dev":"vite build --watch","lint":"eslint src --ext .ts,.tsx --max-warnings 0","size":"size-limit","test":"vitest","build":"vite build && tsup --config tsup.preset.config.ts","format":"prettier --write \"src/**/*.{ts,tsx}\" \"*.md\"","test:ci":"vitest --run","typecheck":"tsc --noEmit","prepublishOnly":"npm run build","generate:covers":"node scripts/generate-cover-placeholders.mjs","check:playground":"node scripts/check-playground-coverage.js","generate:catalog":"node scripts/build-primitives-catalog.mjs","build:check-exports":"attw --pack . --ignore-rules cjs-resolves-to-esm cjs-only-exports-default no-resolution named-exports"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:74cf1852-f833-4d45-91b5-0651eb8c6fbb"}},"repository":{"url":"git+https://github.com/AISquare-Studio/aisquare-pretty.git","type":"git"},"_npmVersion":"11.16.0","description":"Pretty UI primitives for AISquare. Centralized buttons, inputs, motion, and tokens shared across creator-studio and ai-studio.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.1","sonner":"^1.7.0","remark-gfm":"^4.0.1","lucide-react":"^0.460.0","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","tailwind-merge":"^2.5.4","rehype-sanitize":"^6.0.0","tailwindcss-motion":"^1.1.1","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-tabs":"^1.1.13","@radix-ui/react-switch":"^1.2.6","@radix-ui/react-popover":"^1.1.15","@radix-ui/react-tooltip":"^1.1.4","@tailwindcss/typography":"^0.5.19","@radix-ui/react-checkbox":"^1.3.3","class-variance-authority":"^0.7.0","react-syntax-highlighter":"^16.1.1","@radix-ui/react-accordion":"^1.2.0","@radix-ui/react-dropdown-menu":"^2.1.16"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.13.0","tsup":"^8.5.1","vite":"^5.4.10","jsdom":"^25.0.1","lenis":"^1.3.23","react":"^18.3.1","eslint":"^8.57.1","motion":"^12.38.0","vitest":"^2.1.4","axe-core":"^4.10.2","prettier":"^3.3.3","react-dom":"^18.3.1","size-limit":"^11.1.6","typescript":"^5.6.3","vitest-axe":"^0.1.0","@types/node":"^22.5.0","tailwindcss":"^3.4.14","@types/react":"^18.3.12","canvas-confetti":"^1.9.4","vite-plugin-dts":"^4.3.0","@types/react-dom":"^18.3.1","@vitejs/plugin-react":"^4.3.3","@arethetypeswrong/cli":"^0.18.2","@testing-library/react":"^16.0.1","@types/canvas-confetti":"^1.9.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/parser":"^8.13.0","eslint-plugin-react-hooks":"^5.0.0","@testing-library/user-event":"^14.5.2","eslint-plugin-react-refresh":"^0.4.14","@size-limit/preset-small-lib":"^11.1.6","@types/react-syntax-highlighter":"^15.5.13","@typescript-eslint/eslint-plugin":"^8.13.0"},"peerDependencies":{"gsap":">=3.12.0","lenis":">=1.3.0","react":"^18.0.0 || ^19.0.0","motion":">=12.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":">=3.4.0","canvas-confetti":">=1.9.0"},"peerDependenciesMeta":{"gsap":{"optional":true},"lenis":{"optional":true},"canvas-confetti":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pretty_0.10.33_1779968134950_0.1620394762807642","host":"s3://npm-registry-packages-npm-production"}},"0.10.34":{"name":"@aisquare/pretty","version":"0.10.34","description":"Pretty UI primitives for AISquare. Centralized buttons, inputs, motion, and tokens shared across creator-studio and ai-studio.","license":"MIT","repository":{"type":"git","url":"git+https://github.com/AISquare-Studio/aisquare-pretty.git"},"homepage":"https://github.com/AISquare-Studio/aisquare-pretty#readme","keywords":["aisquare","ui","components","tailwind","shadcn","react"],"type":"module","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./smooth-scroll":{"types":"./dist/entries/smooth-scroll.d.ts","import":"./dist/entries/smooth-scroll.js"},"./tailwind.preset":{"types":"./dist/tailwind.preset.d.cts","import":"./dist/tailwind.preset.cjs","require":"./dist/tailwind.preset.cjs","default":"./dist/tailwind.preset.cjs"},"./tokens.template.css":"./src/tokens/tokens.template.css","./package.json":"./package.json"},"sideEffects":false,"scripts":{"build":"vite build && tsup --config tsup.preset.config.ts","build:check-exports":"attw --pack . --ignore-rules cjs-resolves-to-esm cjs-only-exports-default no-resolution named-exports","dev":"vite build --watch","lint":"eslint src --ext .ts,.tsx --max-warnings 0","format":"prettier --write \"src/**/*.{ts,tsx}\" \"*.md\"","typecheck":"tsc --noEmit","test":"vitest","test:ci":"vitest --run","size":"size-limit","check:playground":"node scripts/check-playground-coverage.js","generate:catalog":"node scripts/build-primitives-catalog.mjs","generate:covers":"node scripts/generate-cover-placeholders.mjs","prepublishOnly":"npm run build"},"peerDependencies":{"canvas-confetti":">=1.9.0","gsap":">=3.12.0","lenis":">=1.3.0","motion":">=12.0.0","react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":">=3.4.0"},"peerDependenciesMeta":{"canvas-confetti":{"optional":true},"gsap":{"optional":true},"lenis":{"optional":true}},"dependencies":{"@radix-ui/react-accordion":"^1.2.0","@radix-ui/react-checkbox":"^1.3.3","@radix-ui/react-dropdown-menu":"^2.1.16","@radix-ui/react-popover":"^1.1.15","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-switch":"^1.2.6","@radix-ui/react-tabs":"^1.1.13","@radix-ui/react-tooltip":"^1.1.4","@tailwindcss/typography":"^0.5.19","class-variance-authority":"^0.7.0","clsx":"^2.1.1","lucide-react":"^0.460.0","react-markdown":"^10.1.0","react-syntax-highlighter":"^16.1.1","rehype-sanitize":"^6.0.0","remark-breaks":"^4.0.0","remark-gfm":"^4.0.1","sonner":"^1.7.0","tailwind-merge":"^2.5.4","tailwindcss-animate":"^1.0.7","tailwindcss-motion":"^1.1.1"},"devDependencies":{"@arethetypeswrong/cli":"^0.18.2","@size-limit/preset-small-lib":"^11.1.6","@testing-library/jest-dom":"^6.6.3","@testing-library/react":"^16.0.1","@testing-library/user-event":"^14.5.2","@types/canvas-confetti":"^1.9.0","@types/node":"^22.5.0","@types/react":"^18.3.12","@types/react-dom":"^18.3.1","@types/react-syntax-highlighter":"^15.5.13","@typescript-eslint/eslint-plugin":"^8.13.0","@typescript-eslint/parser":"^8.13.0","@vitejs/plugin-react":"^4.3.3","axe-core":"^4.10.2","canvas-confetti":"^1.9.4","eslint":"^8.57.1","eslint-plugin-react-hooks":"^5.0.0","eslint-plugin-react-refresh":"^0.4.14","gsap":"^3.13.0","jsdom":"^25.0.1","lenis":"^1.3.23","motion":"^12.38.0","prettier":"^3.3.3","react":"^18.3.1","react-dom":"^18.3.1","size-limit":"^11.1.6","tailwindcss":"^3.4.14","tsup":"^8.5.1","typescript":"^5.6.3","vite":"^5.4.10","vite-plugin-dts":"^4.3.0","vitest":"^2.1.4","vitest-axe":"^0.1.0"},"publishConfig":{"access":"public"},"engines":{"node":">=18"},"gitHead":"13436bc3883f7079e5d295159bd40c5436e8b661","_id":"@aisquare/pretty@0.10.34","bugs":{"url":"https://github.com/AISquare-Studio/aisquare-pretty/issues"},"_nodeVersion":"20.20.2","_npmVersion":"11.18.0","dist":{"integrity":"sha512-oDvSA0uHxObICqhMuJV0ie2Wug4DXkfZAi8l1btOemniGVKTMskH2X/ubM2Ed4R/RizVR11ePCgcjoG7jpoWGQ==","shasum":"e36b7032a44420c7946785fc6329342128cab94b","tarball":"https://registry.npmjs.org/@aisquare/pretty/-/pretty-0.10.34.tgz","fileCount":273,"unpackedSize":2947470,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC65uGRyPCLSGuQrqWem5oGN9dYKuQWvHYcgaA7nK2w5gIhAKhF8ReVvSeGXuLP33WzZoO+Njr5dwIkU8fJse7E7nIT"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:74cf1852-f833-4d45-91b5-0651eb8c6fbb"}},"directories":{},"maintainers":[{"name":"aisquare-bots","email":"bots@aisquare.studio"},{"name":"akshit_sanghani","email":"akshit.sanghani@opengrowth.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pretty_0.10.34_1782917840883_0.7769288775406182"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-28T21:48:12.263Z","modified":"2026-07-01T14:57:21.209Z","0.1.0":"2026-04-28T21:48:12.527Z","0.3.0":"2026-04-29T06:09:44.167Z","0.4.1":"2026-04-29T19:14:26.561Z","0.4.2":"2026-04-29T20:49:27.401Z","0.7.0":"2026-04-29T22:44:46.868Z","0.8.2":"2026-04-29T23:58:17.183Z","0.8.4":"2026-04-30T02:16:27.933Z","0.9.2":"2026-04-30T05:43:46.445Z","0.10.1":"2026-04-30T07:45:25.882Z","0.10.7":"2026-05-01T00:46:19.746Z","0.10.14":"2026-05-02T00:12:49.613Z","0.10.15":"2026-05-02T01:07:19.386Z","0.10.16":"2026-05-02T02:12:07.467Z","0.10.18":"2026-05-02T04:03:08.102Z","0.10.19":"2026-05-02T05:14:35.177Z","0.10.20":"2026-05-02T05:50:59.598Z","0.10.21":"2026-05-02T19:55:18.117Z","0.10.23":"2026-05-02T23:47:26.399Z","0.10.24":"2026-05-04T23:08:59.289Z","0.10.27":"2026-05-09T08:27:54.852Z","0.10.29":"2026-05-09T19:03:41.955Z","0.10.30":"2026-05-13T03:42:54.903Z","0.10.33":"2026-05-28T11:35:35.105Z","0.10.34":"2026-07-01T14:57:21.065Z"},"bugs":{"url":"https://github.com/AISquare-Studio/aisquare-pretty/issues"},"license":"MIT","homepage":"https://github.com/AISquare-Studio/aisquare-pretty#readme","keywords":["aisquare","ui","components","tailwind","shadcn","react"],"repository":{"type":"git","url":"git+https://github.com/AISquare-Studio/aisquare-pretty.git"},"description":"Pretty UI primitives for AISquare. Centralized buttons, inputs, motion, and tokens shared across creator-studio and ai-studio.","maintainers":[{"name":"aisquare-bots","email":"bots@aisquare.studio"},{"name":"akshit_sanghani","email":"akshit.sanghani@opengrowth.com"}],"readme":"# aisquare-pretty\n\n> Pretty UI primitives for AISquare. Centralized buttons, inputs, motion, and tokens shared across `creator-studio` and `ai-studio`.\n\n**Motto:** Pretty, centralized, quick. Customer-non-impacting wins only.\n\nIf a change in here would visibly disrupt a paying customer's flow, it doesn't ship — find a smaller win or scope it as a deliberate version bump with a migration note. Everything else: ship fast.\n\n---\n\n## Install\n\n```bash\npnpm add aisquare-pretty\n# or: npm install aisquare-pretty\n```\n\nNo tokens, no `.npmrc`, no setup. Public npm package, private source.\n\n## Wire it up (one-time per consumer app)\n\n1. **Tailwind preset** — extend in your `tailwind.config.ts`:\n\n   ```ts\n   import aisquarePreset from \"@aisquare/pretty/tailwind.preset\";\n\n   export default {\n     presets: [aisquarePreset],\n     content: [\"./src/**/*.{ts,tsx}\"],\n   };\n   ```\n\n2. **CSS variables** — your app already defines `--primary`, `--radius`, `--accent`, etc. The library reads from those at render time, so each app keeps its own theme. If starting a new app, copy the AISquare defaults:\n\n   ```css\n   /* in your index.css */\n   @import \"@aisquare/pretty/tokens.template.css\";\n   ```\n\n3. **Mount the Toaster once** (only if using toasts):\n\n   ```tsx\n   import { Toaster } from \"@aisquare/pretty\";\n   // near app root\n   <Toaster />;\n   ```\n\n4. **Import + use:**\n   ```tsx\n   import { Button, ChatInput, EmptyState } from \"@aisquare/pretty\";\n   ```\n\nFor migrating existing apps, see [MIGRATION.md](./MIGRATION.md).\n\nFor an agent-friendly index that fits inside a single Claude session window, see [PRIMITIVES_INDEX.md](./PRIMITIVES_INDEX.md). It carries every primitive with a one-line description and a copy-paste snippet, grouped both by category and by intent (\"for stat reveals\", \"for chat anatomy\", \"for atmospheric backgrounds\", etc.).\n\nFor an interactive card-grid browser of every primitive with a Copy JSX button per card, run `pnpm dev` inside `examples/playground/` and open the default **Browser** tab. The other tabs (Foundations, Display, Aiko, ...) host the rich, interaction-heavy demos.\n\n---\n\n## Components\n\n### Interactive\n\n#### `Button`\n\n```tsx\n<Button>Default</Button>\n<Button variant=\"gradient\" size=\"lg\">Get started</Button>\n<Button variant=\"outline\" size=\"icon\"><Plus /></Button>\n<Button asChild><Link to=\"/x\">Composed</Link></Button>\n<Button motion={false}>No springback</Button>\n```\n\nVariants: `default / gradient / outline / secondary / ghost / link / destructive`. Sizes: `sm / default / lg / icon`. Hover lift + click springback via Motion (the framework-independent successor to Framer Motion).\n\n#### `Input`\n\n```tsx\n<Input placeholder=\"Type here\" />\n<Input variant=\"ghost\" placeholder=\"Inline edit\" />\n```\n\nVariants: `default / ghost / chat / search`. Sizes: `sm / default / lg`. Use `chat` and `search` directly or via the composed primitives below.\n\n#### `ActionInput` — generalized \"input with one trailing CTA\"\n\n```tsx\n<ActionInput\n  variant=\"default\"\n  leadingIcon={<Search />}\n  trailingAction={\n    <Button size=\"icon\">\n      <ArrowRight />\n    </Button>\n  }\n  showActionWhen=\"non-empty\" // \"always\" | \"non-empty\" | \"focus\" | \"never\"\n  placeholder=\"Where to?\"\n/>\n```\n\nThe base for `ChatInput` and `ExploreSearchBar`. Use directly when none of those fit.\n\n#### `ChatInput`\n\n```tsx\n<ChatInput\n  onSubmit={(value) => sendMessage(value)}\n  isSending={isSending}\n  placeholder=\"Ask anything\"\n  maxRows={8}\n/>\n\n// Voice dictation — Web Speech API, feature-detected + SSR-safe\n<ChatInput\n  onSubmit={onSend}\n  voice\n/>\n\n// File attachments — picker built in, chip rendering consumer-owned\n<ChatInput\n  onSubmit={onSend}\n  onPickFiles={(files) => upload(files)}\n  accept=\"application/pdf,image/*\"\n  attachments={files.map(f => <Badge key={f.id}>{f.name}</Badge>)}\n/>\n\n// Voice + attachments together — full-featured composer\n<ChatInput\n  onSubmit={onSend}\n  voice={{ onTranscript: t => analytics.track(\"dictation\", { length: t.length }) }}\n  onPickFiles={onUpload}\n  attachments={chips}\n/>\n```\n\nAutoresizing textarea, animated send button, Enter-to-send / Shift+Enter newline, IME-aware. Optional `voice` prop (boolean or callbacks object) enables Web Speech dictation — mic button hides when the browser doesn't support `SpeechRecognition`. Optional `onPickFiles` adds a paperclip leading-action; chips render via the `attachments` slot above the input. Send is allowed when `attachments` is truthy even with empty text (file-only messages). Custom `leadingActions` slot stays available for app-specific buttons; visual order is `[attach] [mic] [custom] | [send]`.\n\n#### `ExploreSearchBar`\n\n```tsx\n<ExploreSearchBar\n  value={query}\n  onChange={(e) => setQuery(e.target.value)}\n  onClear={() => setQuery(\"\")}\n  suggestions={\n    <ul>\n      {results.map((r) => (\n        <li key={r.id}>{r.label}</li>\n      ))}\n    </ul>\n  }\n/>\n```\n\nPill input with search-icon prefix, animated clear button, suggestions panel.\n\n#### `SmartSearch`\n\n```tsx\n<SmartSearch\n  value={query}\n  onChange={setQuery}\n  data={items}\n  onItemSelect={(item) => navigate(item.id)}\n  placeholderPrompts={[\"Search your content...\", \"Find a quest...\", \"Search by tag or status...\"]}\n  voice\n  assistant={{ label: \"Ask Aiko\", onAsk: openAskPanel }}\n/>\n```\n\nThe AI-aware sibling of `ExploreSearchBar`. Voice input (Web Speech API, feature-detected + SSR-safe), animated placeholder cycling that pauses on focus, scored fuzzy match over `data` (capped at 5 by default), and an \"Ask Aiko\" footer that always renders when `assistant` is set so the assistant is the natural fallback. Pass `<AikoMark size=\"xs\" />` as `leadingIcon` for the brand-prefix variant. Composes `ActionInput` + `Button` + `AikoMark` — no new external deps.\n\nReach for `ExploreSearchBar` when you want the lean default; reach for `SmartSearch` when the surface earns the AI affordances.\n\n### Display + status\n\n#### `Badge`\n\n```tsx\n<Badge variant=\"success\">Active</Badge>\n<Badge variant=\"live\"><PulseDot size=\"sm\" /> Live</Badge>\n<Badge variant=\"new\">New</Badge>\n```\n\nVariants: `default / secondary / outline / success / warning / destructive / accent / live / new / beta`.\n\n#### `Avatar`\n\n```tsx\n<Avatar name=\"Jatin Saini\" />\n<Avatar name=\"Jatin Saini\" src=\"/me.jpg\" size=\"lg\" status=\"online\" />\n<Avatar name=\"Studio\" shape=\"rounded\" colorFromName />     // monogram tile, gradient backdrop\n<Avatar name=\"Studio\" shape=\"square\" />                    // hard corners\n```\n\nImage with initials fallback. Optional status dot (`online / offline / busy / away`). Shape variants: `circle` (default — profile-picture read), `rounded` (rounded-2xl monogram tile, drop-in replacement for `InitialAvatar`-style brand placeholders), `square` (hard corners).\n\n#### `AvatarGroup`\n\n```tsx\n<AvatarGroup\n  items={[\n    { name: \"Jatin Saini\" },\n    { name: \"Aiko Helper\", src: \"/aiko.png\" },\n    { name: \"Studio Bot\" },\n  ]}\n  maxVisible={3}\n/>\n```\n\nStacked overlapping avatars with a `+N` overflow pill once `items.length` exceeds `maxVisible`. Same sizing scale as `Avatar`. Pass any `Avatar` props per item (src, status, etc).\n\n#### `PulseDot`\n\n```tsx\n<PulseDot tone=\"live\" />            // green, pulsing\n<PulseDot tone=\"destructive\" />     // red, pulsing\n<PulseDot static />                 // no animation\n```\n\nPairs with Badge live variant for \"online\" indicators.\n\n#### `Kbd`\n\n```tsx\nPress <Kbd>⌘ K</Kbd> to search.\n```\n\nInline keyboard-shortcut display.\n\n### Editorial / tracked-changes (document review surfaces)\n\nPrimitives that compose into a contract / document review canvas. Each reads\nthe editorial token set (`--paper`, `--ink`, `--rule`, `--ins`, `--del`,\n`--comment`) which the preset's `editorialTokensPlugin` injects with light +\ndark defaults — opt-in styling for any consumer that ships a long-form\ndocument review surface.\n\n#### `RedlineSpan`\n\n```tsx\n<RedlineSpan variant=\"suggestion\" suggestionId=\"sug-42\">\n  net thirty\n</RedlineSpan>\n```\n\nInline span that marks tracked changes in document text. Variants:\n`insertion` (added text, green underline), `deletion` (red strikethrough),\n`suggestion` (AI proposal, dotted green underline, click-to-open),\n`comment-anchor` (text tied to a comment thread, amber underline). Use\n`asChild` to compose with `<em>` / `<strong>` / other inline elements your\nclause renderer already wraps text in. Click delegation via `data-sug-id`\nor `data-edit-id` — a parent document handler reads the dataset to open the\nright reasoning popover or comment thread.\n\n#### `AttributionChip`\n\n```tsx\n<AttributionChip\n  name=\"Anika Patel\"\n  avatarUrl={user.avatarUrl}\n  timestamp=\"2026-05-06T14:22:00Z\"\n  tone=\"ins\"\n  actions={\n    <>\n      <button onClick={accept}>Accept</button>\n      <button onClick={reject}>Reject</button>\n    </>\n  }\n/>\n```\n\nFloating chip that attributes an inline edit / comment / suggestion to a\nuser. Composes Avatar + name + relative timestamp (\"12m ago\", auto-formatted\nfrom ISO) with an actions slot for accept/reject mini-controls. Default\npositioning is absolute (consumer wraps in a relatively-positioned anchor\nand offsets via top/left); pass `placement=\"inline\"` for flow layout.\nTones tint the chip to match the variant of the change it labels: `ins`,\n`del`, `ai`, or `default`. Mounts via the `attribution-fade-in` keyframe\n(220ms, smooth-out); `motion={false}` opts out.\n\n#### `CommentPopover`\n\n```tsx\n<CommentPopover\n  authorName=\"Anika Patel\"\n  authorAvatarUrl={user.avatarUrl}\n  onUploadImage={blob => uploadAttachment(blob)}\n  onSubmit={({ text, imageUrl }) => postComment({ text, imageUrl })}\n>\n  <button>Add comment</button>\n</CommentPopover>\n```\n\nPopover composer for adding a comment to an inline edit or clause. Wraps\nRadix Popover with a header (avatar + author name), an auto-grow textarea,\nan inline image-paste affordance (Cmd/Ctrl+V drops the clipboard image into\nthe composer; `onUploadImage(blob)` returns a URL), and Cancel / Post\ncontrols. Image-paste is silently disabled when `onUploadImage` is omitted.\nStorage is consumer-owned; the primitive only owns the UX.\n\n#### `RecheckIssueIndicator`\n\n```tsx\n<RecheckIssueIndicator\n  severity=\"warn\"\n  message=\"Net-45 deviates from playbook §14.2 (default net-30).\"\n  onClick={() => scrollToClause(\"3.4\")}\n/>\n```\n\nPill that surfaces a single consistency-scan issue underneath a clause /\nform field / inline target. Composes PulseDot for a severity dot (`warn`\namber, `error` red), a one-line message, and an optional `onClick` that\nmakes the whole pill an activatable button (Enter / Space activate, focus\nring, etc.). Pass `stale` to dim the indicator when the document has\nchanged since the last scan; consumers usually pair with a Rescan CTA.\n\n#### `DiffRow`\n\n```tsx\n<DiffRow\n  removed=\"net thirty\"\n  added=\"net forty-five\"\n  meta=\"§3.4 — Payment\"\n  verdict={<Badge variant=\"outline\">Outside playbook</Badge>}\n  onClick={() => scrollToClause(\"3.4\")}\n/>\n```\n\nSingle-row diff view for inline change lists — counter-redline review,\nversion diff side-rail, audit-log entries that compare before/after. Left\ncell shows removed text (red strikethrough); right cell shows added text\n(green). Optional `meta` line under the diff carries clause anchors or\ncontext notes; optional `verdict` slot floats on the right edge for status\nbadges or accept/reject controls.\n\n#### `ContentTypeIcon`\n\n```tsx\n<ContentTypeIcon type=\"video\" />              // cyan Video glyph, decorative\n<ContentTypeIcon type=\"expert\" size=\"lg\" />   // larger emerald Brain\n<ContentTypeIcon type=\"quest\" tone=\"plain\" aria-label=\"Quiz\" />\n```\n\nBare glyph for one of `video | note | expert | podcast | quest | studio | collection | experience` (or any string, with the neutral fallback). Pulls icon + colour from `getExperienceTypeMeta` so it always agrees with `<ExperienceTypeBadge>` on the same surface. Sizes `xs | sm | md | lg | xl`. `tone=\"plain\"` falls back to `currentColor` for use inside coloured chips. Cover-placeholder rasters at `assets/covers/<type>.{svg,png}` (1200x675, regenerate via `pnpm generate:covers`).\n\n### Layout\n\n#### `Accordion`\n\n```tsx\n<Accordion type=\"single\" collapsible defaultValue=\"features\">\n  <AccordionItem value=\"features\">\n    <AccordionTrigger>What's in the box</AccordionTrigger>\n    <AccordionContent>\n      Five experience types. One studio. Zero glue code.\n    </AccordionContent>\n  </AccordionItem>\n  <AccordionItem value=\"pricing\">\n    <AccordionTrigger>Pricing</AccordionTrigger>\n    <AccordionContent>Free while we're cooking.</AccordionContent>\n  </AccordionItem>\n</Accordion>\n```\n\nComposes `@radix-ui/react-accordion` for full keyboard navigation (`↑` / `↓` between triggers, `Home` / `End`, `Enter` / `Space` toggle), `data-state` open/close attributes, and `aria-expanded` / `aria-controls` wiring out of the box. Single (`type=\"single\"`) and multiple (`type=\"multiple\"`) selection both pass through. Two visual variants picked at the `<AccordionItem>` level: `default` (minimal, item-separated by `border-b`) and `card` (each item is a rounded card with border + soft `bg-card`). Open/close animations use the `accordion-down` / `accordion-up` keyframes registered in the preset; `motion-reduce` skips them automatically.\n\nThe trigger wraps `<AccordionPrimitive.Header>` so screen readers see each open/close control as a heading; default tag is `<h3>`, override per surface via `<AccordionTrigger level=\"h2\">`. Override the chevron with `icon=` if a different glyph fits the surface. Pass `asHeader={false}` on the trigger to suppress the `<h3>` wrapper when the accordion lives inside an existing heading hierarchy.\n\n#### `GlassInputFrame`\n\n```tsx\nimport { GlassInputFrame, ChatInput } from \"@aisquare/pretty\";\n\n// Wrap any composer in the gradient ring\n<GlassInputFrame>\n  <ChatInput onSubmit={send} placeholder=\"Ask AIKO...\" />\n</GlassInputFrame>\n\n// Literal blue-purple-indigo from AIStudio-v3 (theme-exempt)\n<GlassInputFrame colorScheme=\"studio\">\n  <ChatInput onSubmit={send} placeholder=\"Ask AIKO...\" />\n</GlassInputFrame>\n\n// Or use ChatInput's built-in shorthand\n<ChatInput glassFrame glassColorScheme=\"brand\" onSubmit={send} />\n<ChatInput glassFrame glassColorScheme=\"studio\" onSubmit={send} />\n```\n\nGradient-ring outer shell extracted from `AISquare-AIStudio-v3 AikoChat.tsx`. A 1px gradient border wraps an inner panel (`bg-background rounded-2xl`). `colorScheme=\"brand\"` (default) uses `primary/25` and `accent/25` CSS-var tokens so the ring adapts to per-studio retinting; `colorScheme=\"studio\"` uses the literal `blue-400/30 → purple-400/30 → indigo-400/30` from the v3 original (hardcoded, theme-exempt). Use directly when the inner composer is not a `ChatInput`; for `ChatInput`, prefer the `glassFrame` + `glassColorScheme` shorthand which delegates to this wrapper internally.\n\n### Overlays\n\n#### `Tooltip`\n\n```tsx\n<TooltipProvider>\n  <Tooltip>\n    <TooltipTrigger asChild>\n      <Button>Hover</Button>\n    </TooltipTrigger>\n    <TooltipContent>Useful hint</TooltipContent>\n  </Tooltip>\n</TooltipProvider>\n```\n\nWrap your app once with `<TooltipProvider>`, reuse Tooltip everywhere.\n\n#### `SmoothScroll`\n\n```tsx\n// Sub-entry import — SmoothScroll lives behind its own path so the main\n// barrel never references the optional `lenis` peer (#93).\nimport { SmoothScroll, useLenis } from \"@aisquare/pretty/smooth-scroll\";\n\n// Wrap once near the app root\n<SmoothScroll>\n  <App />\n</SmoothScroll>\n\n// Disable inside surfaces where smooth scroll fights inputs (e.g. editors)\n<SmoothScroll enabled={!isEditorFocused}>...</SmoothScroll>\n\n// Read the active Lenis instance for advanced cases\nfunction ProgressBar() {\n  const [progress, setProgress] = useState(0);\n  useLenis((lenis) => setProgress(lenis.progress));\n  return <div style={{ width: `${progress * 100}%` }} />;\n}\n```\n\nLenis-powered smooth scroll. Honors `prefers-reduced-motion` automatically (silently degrades to native scroll). Pair with `useScrollProgress` for scroll-linked motion. Opting in to this primitive is the only path that pulls `lenis` into your bundle — consumers who don't import from `@aisquare/pretty/smooth-scroll` don't need `lenis` installed at all.\n\n#### `Toaster` + `aiko`\n\n```tsx\nimport { Toaster, aiko } from \"@aisquare/pretty\";\n\n// near app root\n<Toaster />;\n\n// anywhere\naiko.success(\"Saved.\");\naiko.error(\"Couldn't save. Try again.\");\naiko.loading(\"Working on it.\");\nconst id = aiko.loading(\"Uploading\");\n// later:\naiko.success(\"Done.\", { id });\n\n// Confetti + toast for milestone moments\naiko.celebrate(\"First studio shipped.\");\naiko.celebrate(\"Plan upgraded.\", { intensity: \"shower\" });\n\n// Or just the confetti\nimport { celebrate } from \"@aisquare/pretty\";\ncelebrate(); // default burst\ncelebrate({ intensity: \"sparkle\" }); // restrained\ncelebrate({ intensity: \"shower\" }); // big moment, multi-origin\n```\n\nSonner under the hood, AISquare-styled, AIKO-voiced defaults. `aiko.celebrate()` and the `celebrate` helper honor `prefers-reduced-motion` (skip the confetti, still show the toast).\n\n### Abstract states\n\n#### `Spinner`\n\n```tsx\n<Spinner />\n<Spinner size=\"lg\" />\n<Spinner decorative />   // when paired with text label\n```\n\nFor inline / sub-300ms loading (Button submit, validating an input). For \"the platform is doing AI work\" moments (>300ms — initial load, AI generation, image processing) reach for `AikoLoader`.\n\n#### `TypingIndicator`\n\n```tsx\n<TypingIndicator />                              // dots, default size\n<TypingIndicator size=\"lg\" />                    // dots, larger\n<TypingIndicator variant=\"aiko\" />               // breathing AikoMark\n<TypingIndicator motion={false} />               // static frame\n<TypingIndicator aria-label=\"Aiko's preparing your answer\" />\n```\n\nChat-row \"AIKO is typing\" cue. Drop inside a `MessageRow` placeholder while the assistant is composing. Default `variant=\"dots\"` is three bouncing dots (the universal chat convention — iMessage, WhatsApp, Slack, assistant-ui); `variant=\"aiko\"` swaps in the breathing `AikoMark` for AIKO-led surfaces. `role=\"status\"` + `aria-live=\"polite\"` announce a default `aria-label=\"AIKO is typing\"` to screen readers; reduce-motion + `motion={false}` render the resting frame.\n\nFor longer-running platform AI work (initial load, generation), reach for `AikoLoader` instead — `TypingIndicator` is sized to live inline next to or inside a message bubble.\n\n#### `ThinkingDots`\n\n```tsx\nimport { ThinkingDots } from \"@aisquare/pretty\";\n\n<ThinkingDots />           // md (default) — maps to TypingIndicator size=\"default\"\n<ThinkingDots size=\"sm\" /> // sm\n```\n\nStudio-v3 alias for `<TypingIndicator variant=\"dots\">`. Ported from `AISquare-AIStudio-v3 AikoChat.tsx` for drop-in parity. Shares the same animation engine, reduced-motion handling, and `role=\"status\"` a11y contract. `size` prop uses Studio-v3's `sm | md` vocabulary and maps to `TypingIndicator`'s `sm | default`. For surfaces that already use `TypingIndicator`, prefer that directly; use `ThinkingDots` when migrating v3 code that referenced the local component by this name.\n\n#### `AikoLoader`\n\n```tsx\n<AikoLoader />\n<AikoLoader size=\"lg\" label=\"Generating preview\" />\n<AikoLoader glow={false} label=\"Saving\" />   // for nested contexts\n```\n\nBranded loader. Composes `AikoMark`'s breathing animation with a soft pulse-glow halo. Sizes: `sm / default / lg` (32 / 56 / 80 px). Optional `label` slot rendered below in muted ink. `role=\"status\" aria-live=\"polite\"` on the wrapper. Reduce-motion users get a static halo + resting mark.\n\n#### `EditingBeam`\n\n```tsx\n<EditingBeam loading={isAikoEditing}>\n  <input value={title} onChange={...} />\n</EditingBeam>\n\n<EditingBeam loading={isAikoEditing} speed={0.9}>\n  <p className=\"text-2xl font-semibold\">{draft}</p>\n</EditingBeam>\n\n<EditingBeam loading={isAikoEditing} motion={false}>\n  <p>{draft}</p>                      // dim only, no glide\n</EditingBeam>\n\n<EditingBeam loading={isAikoEditing} className=\"rounded-none border-0 p-0\">\n  <textarea ... />                    // borderless surface override\n</EditingBeam>\n```\n\nBlock-level \"AIKO is editing this\" cue. While `loading` is true, children dim to muted ink and a skewed gradient beam glides across the wrapper at `speed` seconds per cycle (default `1.1`); when false, the wrapper is a plain pass-through. `aria-busy={loading}` is the screen-reader signal. `motion={false}` and `prefers-reduced-motion` both drop the beam — the dim + aria-busy stay so the cue persists. Pair with `<TypingIndicator>` for inline chat-row \"composing\" states; reach for `EditingBeam` when AIKO is rewriting a whole field, title, or paragraph.\n\n#### `Skeleton`\n\n```tsx\n<Skeleton variant=\"card\" className=\"h-32\" />\n<Skeleton variant=\"avatar\" className=\"h-12 w-12\" />\n<SkeletonParagraph lines={3} />\n```\n\nVariants: `block / text / avatar / card / button`.\n\n#### `EmptyState`\n\n```tsx\n<EmptyState />   // default AIKO copy\n<EmptyState\n  icon={<Sparkles />}\n  title=\"No studios yet\"\n  description=\"Pick a topic and we'll get the first one going.\"\n  action={<Button>Create studio</Button>}\n/>\n```\n\n#### `ErrorState`\n\n```tsx\n<ErrorState onRetry={refetch} />        // default AIKO copy + retry button\n<ErrorState\n  title=\"Couldn't load profile\"\n  description=\"The server hiccupped. One more shot?\"\n  onRetry={refetch}\n  isRetrying={isRetrying}\n/>\n```\n\n### Content (images, markdown, media chrome)\n\n#### `Image`\n\n```tsx\nimport { Image } from \"@aisquare/pretty\";\n\n<Image src={url} alt=\"Hero\" aspectRatio=\"16/9\" priority />\n\n<Image\n  src={experience.cover}\n  alt={experience.title}\n  fallbackSrc=\"/static/cover-fallback.png\"\n  onError={(e) => analytics.imageFailed(experience.id)}\n  aspectRatio=\"4/3\"\n  rounded=\"lg\"\n  className=\"w-full\"\n/>\n\n<Image\n  src={undefined}\n  alt=\"\"\n  errorContent={<EmptyState title=\"No cover yet\" />}\n  aspectRatio=\"1/1\"\n/>\n```\n\nSealed wrapper around `<img>` that owns the loading skeleton, one-shot fallback retry, error chrome, and CLS-prevention slot. Native `loading=\"lazy\"` by default; flips to `eager` + `fetchpriority=\"high\"` when `priority` is set. `aspectRatio` (`\"16/9\"`, `\"1/1\"`, etc.) forwards to CSS `aspect-ratio` on the wrapper. `rounded` cva variant: `none / sm / default / lg / full`.\n\nComposition: `errorContent` slot replaces the default error chrome; `fallbackSrc` provides one-shot retry. `onError` fires AFTER the internal retry, so consumer-side multi-step fallback chains keep working — the primitive resyncs when `src` changes.\n\nA11y: `aria-busy=\"true\"` during load, `role=\"img\" aria-label={errorLabel}` on error (suppressed for decorative `alt=\"\"` images). Honors `prefers-reduced-motion` automatically (load crossfade collapses to instant).\n\n#### `Markdown`\n\n```tsx\nimport { Markdown } from \"@aisquare/pretty\";\n\n<Markdown content={message.text} />\n\n// Custom anchor handling — shallow-merged with the primitive's defaults\n<Markdown\n  content={message.text}\n  components={{\n    a: ({ href, children, ...rest }) => {\n      if (href?.startsWith(\"#resource:\")) return <ResourceLink href={href}>{children}</ResourceLink>;\n      return <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" {...rest}>{children}</a>;\n    },\n  }}\n/>\n```\n\nSealed renderer for chat-aligned markdown. GFM (tables, strikethrough, task lists, autolinks), soft line breaks, sanitized HTML with `language-*` className preserved on code, syntax-highlighted fenced blocks (`react-syntax-highlighter` + Prism + `oneDark`), copy buttons, inline code in `bg-muted`, scrollable tables, and new-tab anchors. Empty / whitespace-only `content` returns `null`.\n\nComposition seam is the `components` prop — type `Partial<Components>` from `react-markdown`, shallow-merged with the primitive's defaults. Use it to intercept specific element renderers (most commonly `a` for app-specific routing); everything else stays default. There is no `asChild` — `<Markdown>` renders content from a string, not a child element.\n\nStreaming chat: pass `streaming` to render an inline-block blinking caret as the last child of the prose container — pulses while live tokens arrive, disappears the moment you flip the prop:\n\n```tsx\n<Markdown content={message.text} streaming={isResponseStreaming} />\n```\n\nEmpty / whitespace-only `content` still returns `null` even with `streaming` — surface a `<TypingIndicator>` for the pre-first-token gap. The cursor honors `prefers-reduced-motion` (steady block instead of pulse) and is `aria-hidden` so screen readers aren't bombarded with \"blinking\" chatter — the streaming cue comes from the consumer's `aria-live` region (typically `<MessageRow role=\"assistant\">`). Re-renders during streaming are cheap thanks to `React.memo` + `forwardRef` for direct ref access to the prose container.\n\nThe rehype-sanitize schema extension that allows `language-*` className is exported as `markdownSanitizeSchema` for consumers who need to extend it further.\n\n#### `Truncate`\n\n```tsx\nimport { Truncate } from \"@aisquare/pretty\";\n\n<Truncate>{customUrl}</Truncate>                         // 1-line ellipsis (<span>)\n<Truncate as=\"p\" lines={2}>{description}</Truncate>      // 2-line clamp\n<Truncate tooltipBody={fullName}>                        // override body for icon children\n  <span className=\"inline-flex items-center gap-1\">\n    <Icon /> {nick}\n  </span>\n</Truncate>\n```\n\nTruncates text at N lines AND auto-renders an `<AikoTooltip>` showing the full text only when overflow is actually present. Drops the need for consumers to plumb `useIsTruncated` state into a tooltip themselves. `lines={1}` (default) maps to Tailwind `truncate`; `lines={2|3|4}` maps to `line-clamp-{n}`. Polymorphic via `as` (default `\"span\"`).\n\nTooltip semantics: when `children` is a string or number, that's the default tooltip body. When children is a non-string ReactNode, pass `tooltipBody` explicitly to opt in (we don't stringify arbitrary nodes). `disableTooltip` skips the wrapper entirely. The wrapper stays mounted across resize-driven truncation flips with `open={false}` pinned when not truncated, so transient resizes don't remount the trigger child.\n\nSSR-safe: ResizeObserver gated behind `useIsomorphicLayoutEffect`, so server-rendered markup is just the bare element with truncation classes; the tooltip wrap evaluates after first client measurement.\n\nFor 1-line truncation to take effect, the parent should be a flex container with `min-w-0` (or any block parent with constrained width) — same constraint as raw `truncate`. Multi-line clamp needs no parent constraint. Requires `<TooltipProvider>` at the app root (per `<AikoTooltip>`).\n\n### Chat anatomy\n\n#### `ChatLog`\n\n```tsx\nimport { ChatLog, MessageRow, ScrollToBottomButton, useScrollToBottom } from \"@aisquare/pretty\";\n\nfunction ChatScroller({ messages, loadOlder, isLoadingOlder, unreadCount }) {\n  const { scrollRef, sentinelRef, isAtBottom, scrollToBottom } = useScrollToBottom<\n    HTMLDivElement,\n    HTMLDivElement\n  >();\n\n  return (\n    <div className=\"relative h-full\">\n      <ChatLog\n        ref={scrollRef}\n        onLoadOlder={loadOlder}\n        isLoadingOlder={isLoadingOlder}\n        empty={<EmptyState title=\"Say hi to AIKO\" />}\n      >\n        {messages.map((m) => (\n          <MessageRow key={m.id} role={m.role}>\n            <Markdown content={m.text} />\n          </MessageRow>\n        ))}\n        <div ref={sentinelRef} aria-hidden />\n      </ChatLog>\n      <ScrollToBottomButton\n        visible={!isAtBottom}\n        unreadCount={unreadCount}\n        onClick={() => scrollToBottom()}\n      />\n    </div>\n  );\n}\n```\n\nScroll container for a conversation of `<MessageRow>` children. Owns the right CSS for an append-only chat surface — vertical overflow with `scrollbar-gutter: stable` so chip rows don't jiggle, and `overflow-anchor: auto` so newly-rendered messages don't yank the user's reading position. Two density variants — `comfortable` default and `compact` for tighter rails.\n\n`onLoadOlder` adds a 1px top sentinel that fires the callback once when scrolled into view (rate-limited to 250ms so layout shifts don't double-fire). `isLoadingOlder` surfaces an AIKO-voiced \"Loading earlier messages\" status row above the messages and latches the sentinel to prevent re-firing during the load. `loadingOlderLabel` overrides the copy.\n\n`empty` slot renders when `children` is null / undefined / false / an empty array — drop in an `<EmptyState>` for the pre-first-message moment.\n\nForwards `ref` to the scroll container so you can wire `useScrollToBottom`'s `scrollRef` directly. Virtualization-friendly: a single overflow scroller with a flat children stack means `react-virtuoso` / `@tanstack/react-virtual` can wrap without structural change.\n\n#### `ScrollToBottomButton` + `useScrollToBottom()`\n\n```tsx\nimport { ScrollToBottomButton, useScrollToBottom } from \"@aisquare/pretty\";\n\nfunction ChatScroller({ messages, unreadCount }) {\n  const { scrollRef, sentinelRef, isAtBottom, scrollToBottom } = useScrollToBottom<\n    HTMLDivElement,\n    HTMLDivElement\n  >();\n\n  return (\n    <div ref={scrollRef} className=\"relative h-full overflow-y-auto\">\n      {messages.map((m) => (\n        <MessageRow key={m.id} {...m} />\n      ))}\n      <div ref={sentinelRef} aria-hidden />\n      <ScrollToBottomButton\n        visible={!isAtBottom}\n        unreadCount={unreadCount}\n        onClick={() => scrollToBottom()}\n      />\n    </div>\n  );\n}\n```\n\nThe hook owns `IntersectionObserver`-based at-bottom detection plus a `scrollToBottom({ smooth })` action. The button is the visible \"Jump to latest\" affordance — absolutely positioned by default (`absolute bottom-3 left-1/2 -translate-x-1/2 z-10`), so wrap it inside a `position: relative` scroller. Override placement via `className` for sidebar / right-aligned use cases.\n\n`unreadCount` renders a small badge in the top-right corner (\"3\", \"99+\"). The label folds into `aria-label` so SR users hear \"Jump to latest, 3 unread\". Default 180ms fade+slide entrance; `motion={false}` and `prefers-reduced-motion` skip it.\n\nFor non-default content (e.g. a `<TypingIndicator />` while AIKO is composing), pass children: `<ScrollToBottomButton ...><TypingIndicator size=\"sm\" /></ScrollToBottomButton>`.\n\n#### `ContextBar`\n\n```tsx\nimport { ContextBar, AikoMark, Button } from \"@aisquare/pretty\";\nimport { LogOut } from \"lucide-react\";\n\n// Bordered banner above the chat scroller, sticky-wrapped by the consumer\n<div className=\"sticky top-0 z-10\">\n  <ContextBar\n    lead={<AikoMark size=\"xs\" />}\n    context=\"AIKO is in Founders & Friends\"\n    actions={\n      <Button variant=\"ghost\" size=\"sm\" onClick={exitExperience}>\n        <LogOut className=\"size-3.5\" />\n        Exit\n      </Button>\n    }\n  />\n</div>\n\n// Flatter inline variant — tucks under a chat header\n<ContextBar\n  variant=\"muted\"\n  context=\"AIKO knows you are looking at the Vault\"\n  actions={\n    <Button variant=\"ghost\" size=\"sm\" onClick={clearScope}>Clear</Button>\n  }\n/>\n```\n\n\"AIKO knows you're on X\" banner that signals which scope the agent has loaded. Three slots — `lead` (conventionally `<AikoMark>`), `context` (the label, single-line truncated), `actions` (Clear / Edit / Exit-experience). Two variants — `default` bordered card surface, `muted` flatter pill.\n\nThe primitive renders as a regular block-level element. Sticky behavior is the consumer's call — wrap with `sticky top-0 z-10` to ride the scroller. `role=\"status\"` + `aria-live=\"polite\"` so screen readers announce scope changes; `aria-label` infers from `context` when it's a string, otherwise falls back to `\"Chat context\"` (override per surface). Default 240ms fade+slide-down entrance; `motion={false}` and `prefers-reduced-motion` skip it.\n\n#### `WizardStageIndicator`\n\n```tsx\nimport { WizardStageIndicator, ContextBar, AikoMark } from \"@aisquare/pretty\";\n\n<WizardStageIndicator stages={[\"Upload\", \"Review\", \"Publish\"]} current={1} />\n\n<WizardStageIndicator\n  stages={[\n    { id: \"upload\", label: \"Upload\" },\n    { id: \"review\", label: \"Review\" },\n    { id: \"publish\", label: \"Publish\" },\n  ]}\n  current=\"review\"\n  variant=\"labels\"\n/>\n\n// Composing inside <ContextBar>:\n<ContextBar\n  lead={<AikoMark size=\"xs\" />}\n  context=\"AIKO is in Founders & Friends\"\n  actions={\n    <WizardStageIndicator\n      stages={[\"Upload\", \"Review\", \"Publish\"]}\n      current={1}\n      aria-label=\"AIKO is on Step 2 of 3, Review\"\n    />\n  }\n/>;\n```\n\nRead-only \"you are here\" breadcrumb for multi-stage flows. Conventionally renders inside `<ContextBar>` (in the `actions` slot) so AIKO's loaded scope can show stage progression without bespoke per-page UI. Two variants — `compact` (default — dots + \"Step N of T · Label\" line; fits inside ContextBar) and `labels` (full breadcrumb with completed / current / pending icons + connectors; suitable for page headers).\n\nStages accept `string[]` for ergonomics or `{id, label}[]` when you need stable ids for `current` lookup. `current` accepts a 0-based index OR a stage id (string); out-of-range numbers clamp, unknown ids fall back to 0. Returns `null` on empty stages — no need to gate at the call site.\n\nA11y: `role=\"progressbar\"` with `aria-valuenow` / `aria-valuemax` / `aria-valuemin` / `aria-label`. Default `aria-label` is voice-neutral (`\"Step N of T: Label\"`) so non-AIKO consumers get a sensible SR announcement; AIKO surfaces pass an explicit override (`aria-label=\"AIKO is on Step 2 of 3, Review\"`). The `labels` variant also adds visually-hidden `(complete)` / `(current)` / `(pending)` text per stage so SR users get the full state without relying on icons.\n\nDistinct from `<Stepper>` (above): Stepper drives interactive multi-step flows with content panels + keyboard navigation; WizardStageIndicator is the read-only display of where the consumer state machine has the user. Pick Stepper when the user controls the step (walkthrough, recovery flow); pick WizardStageIndicator when consumer state controls the step and you want to surface \"where am I\" inline.\n\n#### `MessageRow`\n\n```tsx\nimport { MessageRow, AikoMark, Avatar } from \"@aisquare/pretty\";\n\n// User message — right-aligned bubble, soft primary tint\n<MessageRow\n  role=\"user\"\n  avatar={<Avatar src={user.avatar} fallback={user.initials} />}\n  actions={<CopyButton onClick={...} />}\n  timestamp={<time dateTime={msg.createdAt}>2 min ago</time>}\n>\n  Hi AIKO, what can you do?\n</MessageRow>\n\n// Assistant — left-aligned bare text, AIKO mark on the leading edge\n<MessageRow role=\"assistant\" avatar={<AikoMark />} actions={<CopyButton />}>\n  <Markdown content={msg.text} />\n</MessageRow>\n\n// Tool — left-aligned host for a ToolCard\n<MessageRow role=\"tool\">\n  <ToolCard label=\"search_experiences\" status=\"success\" args={...} result={...} />\n</MessageRow>\n\n// System — full-width centered divider\n<MessageRow role=\"system\">Returned to AIKO chat</MessageRow>\n\n// Error — destructive surface with retry slot\n<MessageRow role=\"error\" actions={<RetryButton onClick={resend} />}>\n  Connection interrupted, retry your message\n</MessageRow>\n```\n\nFive role variants (`user / assistant / tool / system / error`) drive the layout — slot props (`avatar`, `actions`, `timestamp`) compose the same vocabulary across roles. Default 240ms `cubic-bezier(0.16, 1, 0.3, 1)` fade+slide entrance; opt out per call with `animate={false}`. `prefers-reduced-motion` forces static.\n\n`system` and `error` rows carry `role=\"status\"` so SR users hear thread-state cues. Hover-revealed action groups respond to `:focus-within` too, so keyboard users see the same affordance.\n\nFor the placeholder while AIKO composes, render `<TypingIndicator>` inside `<MessageRow role=\"assistant\">` rather than reaching for a custom surface.\n\n`senderName` renders a small label above the bubble — useful for multi-agent threads where distinguishing tool names or assistant personas matters. Supported on `assistant` and `tool` roles.\n\n#### `CollapsedMessageBody`\n\n```tsx\nimport { CollapsedMessageBody } from \"@aisquare/pretty\";\n\n// Short bodies pass through unchanged — no collapse chrome\n<CollapsedMessageBody>\n  AIKO is ready. Ask me anything.\n</CollapsedMessageBody>\n\n// Long bodies collapse to a one-line headline + toggle\n<CollapsedMessageBody threshold={280}>\n  {longAssistantMarkdown}\n</CollapsedMessageBody>\n\n// Override the auto-extracted headline\n<CollapsedMessageBody headline=\"Summary of your weekly analytics\">\n  {veryLongText}\n</CollapsedMessageBody>\n\n// Open by default\n<CollapsedMessageBody defaultOpen>\n  {assistantReply}\n</CollapsedMessageBody>\n```\n\nInline collapse/expand for long chat message bodies. Bodies at or below `threshold` (default 280 chars) render children directly with no chrome — safe to drop in every `<MessageRow>` without visible change for short replies. Above threshold, shows a one-line headline + `\"N+ more chars\"` toggle; body DOM is unmounted when collapsed so large off-screen trees stay light. Headline auto-extracted from children text content (strips markdown headers, takes first line, trims to 140 chars); override via `headline`. `aria-expanded` + `aria-controls` wire the toggle to the body region for screen readers.\n\n#### `ToolCard`\n\n```tsx\nimport { ToolCard, Markdown } from \"@aisquare/pretty\";\nimport { Search } from \"lucide-react\";\n\n// Live tool-call card — pending while running, auto-collapses on success\n<ToolCard\n  icon={<Search className=\"size-3.5\" />}\n  label=\"search_experiences\"\n  status=\"pending\"\n  args={<pre className=\"font-mono text-[11px]\">{JSON.stringify({ q: \"ml\" }, null, 2)}</pre>}\n/>\n\n// Completed call — body collapsed by default, click to expand\n<ToolCard\n  label=\"upload_to_vault\"\n  status=\"success\"\n  args={<>file.pdf · 1.4 MB</>}\n  result={<Markdown content={`Uploaded. **document_id: 42**`} />}\n/>\n\n// Errored call — body open by default so the user sees the failure\n<ToolCard\n  label=\"delete_studio\"\n  status=\"error\"\n  result={<>permission denied</>}\n/>\n\n// Compact label-only row (no body sections — disclosure trigger disabled)\n<ToolCard label=\"get_studio_stats\" status=\"success\" />\n```\n\nCollapsible tool-call surface for AIKO chat. Three statuses (`pending` / `success` / `error`) drive a colored status pill (Running / Done / Failed) and the chrome tint. Body holds optional `args` and `result` slots — consumers pass pre-formatted `ReactNode`s, typically `<Markdown>` for the result and a `<pre>{JSON}</pre>` block for the args.\n\nDisclosure follows WAI-ARIA: trigger button has `aria-expanded` + `aria-controls`, body region has `aria-labelledby` pointing to the label cell. Body opens by default while pending or errored, collapsed once success lands so the assistant's reply stays the focus. Auto-collapses on the `pending → success` transition (uncontrolled mode); user clicks after that stick. Pass `defaultOpen` to override the heuristic, or `open` + `onOpenChange` for full control. `motion={false}` and `prefers-reduced-motion` skip the height animation and the pending pulse.\n\nComposition: drop inside `<MessageRow role=\"tool\">` for proper avatar-rail alignment within the chat scroller.\n\n#### `SuggestedReplies`\n\n```tsx\nimport { SuggestedReplies } from \"@aisquare/pretty\";\n\n<SuggestedReplies\n  replies={[\"Show me my top studios\", \"What can I do here?\", \"Switch workspace\"]}\n  onSelect={(text) => composer.fill(text)}\n/>\n\n// Compact variant for tighter rails\n<SuggestedReplies\n  replies={msg.actionChips ?? []}\n  variant=\"muted\"\n  align=\"end\"\n  onSelect={sendNow}\n/>\n\n// Disable while AIKO is composing the next reply\n<SuggestedReplies\n  replies={msg.actionChips ?? []}\n  onSelect={sendNow}\n  disabled={isThinking}\n/>\n```\n\nPill-chip row that lives under the last assistant message. Two visual variants (`default` bordered pill on `bg-card`, `muted` flatter pill on `bg-muted`). `align=\"start\"` (default) or `\"end\"` for right-aligned rails. `disabled` dims every chip and blocks `onSelect`. Returns `null` for an empty `replies` array — drop in without an outer length guard. `role=\"group\"` with a default `aria-label=\"Suggested replies\"`. Default 24ms-staggered fade-in entrance; `motion={false}` and `prefers-reduced-motion` skip the stagger.\n\n#### `CitationRow`\n\n```tsx\nimport { CitationRow } from \"@aisquare/pretty\";\n\n// Inline anchor — drops between sentences with hover preview\n<p>\n  Climate science is broad\n  <CitationRow\n    index={1}\n    title=\"Earth science: a 5-step path\"\n    summary=\"A quick overview of feedback loops and forcings.\"\n    badge=\"quest\"\n    thumbnail=\"https://example.com/quest-thumb.png\"\n    href=\"/quest/earth-science\"\n  />.\n</p>\n\n// Row variant — full card in a \"Sources\" list at the bottom of a message\n<div className=\"space-y-2\">\n  {message.referencedResources.map((r, i) => (\n    <CitationRow\n      key={r.uid}\n      variant=\"row\"\n      index={i + 1}\n      title={r.title}\n      summary={r.focus_area}\n      thumbnail={r.image_url}\n      badge={r.experience_type}\n      onActivate={() => openResource(r)}\n    />\n  ))}\n</div>\n\n// asChild — slot through to a router Link\n<CitationRow asChild index={2} title=\"Linked elsewhere\">\n  <Link to={`/q/${id}`} />\n</CitationRow>\n```\n\nFootnote-style citation for resources cited in an assistant turn. Two variants for two render contexts: `anchor` (default) is an inline `[N]` chip that drops between sentences and reveals a Radix-Tooltip-anchored preview on hover/focus; `row` is the full card on its own line, used in a \"Sources\" list at the bottom of an assistant message. Both share the same content vocabulary — `index`, `title`, `summary?`, `thumbnail?` (URL or `ReactNode`), `badge?` (string or `ReactNode`).\n\nActivation: pass `onActivate` for click-to-open behavior, `href` for a real `<a>` (so middle-click + cmd-click follow the URL natively), or both — `onActivate` wins on plain left-clicks; modifier-clicks fall through to the browser. `asChild` slots through to a custom anchor (a router `<Link>`, an analytics-instrumented wrapper). The anchor's accessible name defaults to `\"Citation N: <title>\"`; override with `aria-label`.\n\nThe inline anchor is sized to drop into prose without breaking line height (`h-[18px]`, `text-[11px]`, `tabular-nums`). Tooltip Provider is self-contained — drop a `CitationRow` into any tree without setup.\n\n### Motion / delight\n\n#### `AnimatedCounter`\n\n```tsx\n<AnimatedCounter value={subscriberCount} />\n<AnimatedCounter value={revenue} format={(n) => `$${n.toFixed(2)}`} duration={1200} />\n```\n\nRespects `prefers-reduced-motion`.\n\n#### `Typewriter`\n\n```tsx\n<Typewriter\n  phrases={[\"AI Studios.\", \"experiences.\", \"communities.\"]}\n  typeSpeed={60}\n  holdDuration={1800}\n/>\n```\n\nCycles through phrases with a typewriter effect. Reduced-motion shows the longest phrase statically.\n\n#### `TypewriterText`\n\n```tsx\nimport { TypewriterText } from \"@aisquare/pretty\";\n\n// Types one string to completion, then fires onDone\n<TypewriterText\n  text=\"Your studio analytics are ready.\"\n  speed={15}           // ms per character (default 15)\n  onDone={() => setStreaming(false)}\n/>\n\n// Key-remount to replay (common pattern for demos and retries)\n<TypewriterText key={replayKey} text={assistantFirstLine} />\n```\n\nOne-shot character-by-character type-out. Unlike `<Typewriter>` (phrase loop), this types a single string to completion and fires `onDone`. Designed for first-token streaming reveals in chat UIs. Blinking caret appears while typing, disappears when done. `prefers-reduced-motion` renders the full string immediately and fires `onDone` synchronously on mount. Remount via a `key` change to replay.\n\n#### `StaggeredText`\n\n```tsx\n<StaggeredText\n  text=\"The platform is thinking\"\n  by=\"word\" // \"char\" | \"word\"\n  delay={60} // ms between staggered tokens\n  shimmer // optional gradient sweep over each token\n/>;\n\n// Imperative: replay on a state change\nconst ref = useRef<StaggeredTextHandle>(null);\nref.current?.play();\nref.current?.reset();\n```\n\nAnimated text reveal — fade-in-stagger per char/word. Optional shimmer pass for AI-thinking surfaces. `aria-live` announces the full string at once for screen readers (no per-token noise). Reduced-motion renders text statically.\n\n#### `AnimatedList`\n\n```tsx\n<AnimatedList\n  items={[\n    { id: 1, content: \"Aiko's Studio is now live.\" },\n    { id: 2, content: \"Daniel subscribed.\" },\n    { id: 3, content: \"New comment on Quest #42.\" },\n  ]}\n  animationType=\"slide\"\n  enterFrom=\"top\"\n  hoverEffect=\"scale\"\n  fadeEdges\n  pauseOnHover\n  height=\"320px\"\n/>\n\n// Bounded notification stack — older items fall off when maxItems is hit\n<AnimatedList\n  items={notifications}\n  autoAddDelay={4000}\n  maxItems={5}\n  swipeToDismiss\n  onDismiss={(item) => analytics.dismiss(item.id)}\n  renderItem={(item) => (\n    <NotificationRow icon={item.content.icon} title={item.content.title} />\n  )}\n/>\n```\n\nVertically-stacked list with motion-driven entrance / exit, optional auto-add cycling, swipe-to-dismiss, ripple/press click effects, and fade-edge masks. Adopted from React Bits Pro and adapted to pretty's anatomy — all hardcoded palette colors swapped for theme tokens (`bg-card`, `border-border`, `text-foreground`, `text-destructive`); `prefers-reduced-motion` collapses entrance / exit to instant transitions and falls back to fade for the bouncy spring animation; `forwardRef` on the wrapper for layout measurement. Use for the Studio Quick-Filter rail, Aiko notification stacks, recent-activity feeds, anywhere you want a list that _animates_ through state.\n\n#### `AnimatedContent`\n\n```tsx\n<AnimatedContent direction=\"vertical\" distance={80} delay={0.2}>\n  <h2>Build experiences your audience trusts.</h2>\n</AnimatedContent>\n\n<AnimatedContent direction=\"horizontal\" reverse distance={120}>\n  <FeatureBlock />\n</AnimatedContent>\n```\n\nScroll-triggered entrance — directional slide + optional scale + fade once the element crosses a viewport threshold. GSAP-powered. Adopted from React Bits OSS and adapted to pretty's anatomy: `forwardRef`, `cn` for className merge, `window` as the default scroll target (the upstream's hardcoded `snap-main-container` lookup is gone). `prefers-reduced-motion` paints the final state immediately and still fires `onComplete` so consumer state machines resolve. Optional `disappearAfter` hides the element on a timer once revealed. Requires the `gsap` peer-optional dep.\n\n#### `FadeContent`\n\n```tsx\n<FadeContent duration={0.8} delay={0.1} blur>\n  <p>Numbers tell the story.</p>\n</FadeContent>\n```\n\nThe quieter sibling — pure opacity ramp (with optional blur ramp) on scroll-into-view. Same anatomy + reduced-motion handling as AnimatedContent. Use when \"this section just slid into view\" is the right read but you don't want directional movement or scale. All time props (`duration`, `delay`, `disappearAfter`) are seconds — pretty unified them since the upstream's mixed ms/s heuristic was ambiguous. Requires the `gsap` peer-optional dep.\n\n#### `FeatureTabs`\n\n```tsx\nimport { FeatureTabs, type FeatureTab } from \"@aisquare/pretty\";\nimport { Layers, Sparkles, Bot } from \"lucide-react\";\n\nconst tabs: FeatureTab[] = [\n  { value: \"designers\", label: \"Designers\", icon: <Layers />, content: <DesignersPane /> },\n  { value: \"builders\", label: \"Builders\", icon: <Sparkles />, content: <BuildersPane /> },\n  { value: \"audience\", label: \"Audience\", icon: <Bot />, content: <AudiencePane /> },\n];\n\n<FeatureTabs tabs={tabs} defaultValue=\"designers\" />;\n```\n\nPersona-card tab selector with an animated radial-gradient indicator that slides between active triggers, plus motion-driven content fade-up on swap. Adopted from `@reactbits-pro/features-9`. Composes `@radix-ui/react-tabs` underneath for full keyboard navigation (`←` / `→` between triggers, `Home` / `End`, `Enter` / `Space` activate), `role=\"tablist\"` / `role=\"tab\"` / `role=\"tabpanel\"` semantics, and ARIA wiring out of the box. Active-card halo uses `--accent` so the indicator follows per-studio brand retinting via `<StudioBrand>`. Reduce-motion users get an instant snap. Use for marketing landing sections (hero · personas · features grid), studio dashboard \"switch the active workspace lens\" patterns, or any consumer-facing surface that needs a top-row category selector with animated content swap. The `examples/playground` itself is built on this primitive.\n\n#### `MorphingRail` / `MorphingRailStage`\n\n```tsx\nimport { MorphingRail, MorphingRailStage } from \"@aisquare/pretty\";\n\n// The dock — a stack of morphing circles (parked items / quick switcher).\n<MorphingRail\n  items={items}              // [{ id, icon, label, accentColor? }]\n  activeId={activeKey}       // optional — which one is currently in the stage\n  onSelect={(id) => restore(byId[id])}\n  onDismiss={(id) => dismiss(byId[id])}\n  morphGroup=\"experience\"\n/>\n\n// The stage wrapper — same morphGroup, the active item's id.\n<MorphingRailStage morphGroup=\"experience\" morphId={activeKey}>\n  <YourFullStageContent />\n</MorphingRailStage>\n```\n\nPaired primitive that morphs an item between a tile in a side rail and a full stage panel via Framer `layoutId`, with macOS-dock-style cursor magnification on the rail side. Designed to replace hand-rolled morphs that animate `flexGrow` / `flexBasis` on the stage container — a layout-trigger that fights Framer's FLIP and re-paints heavy children (chat / video / markdown stages) every frame. `MorphingRailStage` is transform-only on enter / exit (`opacity` and `scale`) and applies `contain: paint` so the inner content does not get re-rasterised mid-morph; `MorphingRail` mirrors the FLIP from the dock side using the same `layoutId`. Both halves share the namespace via `morphGroup`, and the rail item id must match the stage's `morphId`. Item silhouette is configurable (`shape: \"circle\" | \"rounded\" | \"square\"`, default `rounded` so it reads consistently with rounded-square dock buttons). Items pass an `accentColor` (6-digit hex) and the dock auto-tints the tile background (~15% alpha) and border (~40%); fall back to `accentClassName` when the consumer's accent is a CSS variable rather than a hex. Cursor magnification (adapted from React Bits Pro `navigation-4`) tracks `mouseY` / `mouseX` against each tile's center via `useTransform` + `useSpring` (mass 0.1, stiffness 150, damping 12) and lifts the tile under the cursor to ~1.2× — disable per-instance with `magnify={false}` when the dock should stay static. Toolbar semantics (`role=\"toolbar\"`, `aria-pressed` on the active tile), per-tile `<AikoTooltip>` on the off-axis side, optional sibling dismiss button shown on hover / focus with a 90° rotate-on-hover X. Each restore button carries `data-morph-id={item.id}` so consumers can re-focus across the morph (the rail and the stage live in different parts of the React tree, so DOM focus does not survive a swap on its own — wire a small `requestAnimationFrame` re-focus when the consumer needs it). Honors `prefers-reduced-motion` — collapses both the FLIP and the magnify to instant. Self-wraps `<TooltipProvider>`. Drop-in for AIStudio v3's `ExperienceBubble` + the `motion.div` wrapper around `CenterStage`.\n\n#### `SpotlightCard`\n\n```tsx\nimport { SpotlightCard } from \"@aisquare/pretty\";\n\n<SpotlightCard intensity=\"default\" color=\"primary\">\n  <h3>Aiko's Studio</h3>\n  <p className=\"text-muted-foreground\">Live now</p>\n</SpotlightCard>;\n```\n\nSurface wrapper with a cursor-following radial-glow overlay, adopted from React Bits Pro `@reactbits-starter/spotlight-card-tw`. Glow color drives from theme tokens (`--primary` / `--accent` / `--secondary`) so per-studio brand retinting via `<StudioBrand>` flows through automatically — never a hardcoded hex. `intensity` (`subtle` / `default` / `strong`) scales the gradient opacity; `radius` and `padding` variants drop the chrome into common card silhouettes; `spread` (default 400px) tunes the gradient radius. Reduce-motion users get a centered static glow on hover instead of live cursor tracking — the affordance stays, the motion stops. SSR-safe (no `window` at module scope), `forwardRef<HTMLDivElement>` for layout measurement. Use for Quest cards, studio tile grids, featured-experience cards, and Aiko nudge surfaces where the spotlight reads as \"the assistant is paying attention to where you are.\" Wrap interactive elements (Link, button) inside, not around — `asChild` is intentionally a v2 concern (the two-layer overlay structure doesn't collapse cleanly into a single Slot child).\n\n#### `BorderGlow`\n\n```tsx\nimport { BorderGlow } from \"@aisquare/pretty\";\n\n<BorderGlow color=\"primary\" intensity=\"default\">\n  <StudioCard />\n</BorderGlow>;\n\n// Asymmetric color — semantic statuses\n<BorderGlow color=\"success\" intensity=\"subtle\" pulse={false}>\n  <PlanCard tier=\"active\" />\n</BorderGlow>;\n\n// Slot onto a Link — outer element is the anchor\n<BorderGlow color=\"warning\" asChild>\n  <a href=\"/upgrade\">Upgrade</a>\n</BorderGlow>;\n```\n\nSteady or breathing halo around a surface's perimeter — sibling to the internal `<BorderBeam>` (sweeping arc on `<Badge variant=\"premium\">`). `intensity` (`subtle` / `default` / `strong`) scales spread / blur / alpha; `color` (`primary` / `accent` / `success` / `warning`) drives the halo from `hsl(var(--token) / X)` so per-studio retinting via `<StudioBrand>` cascades through automatically. `pulse` defaults to `true` and reuses the preset's `animate-pulse-glow` keyframe by overriding `--shadow-glow` + `--shadow-glow-aurora` per instance — one keyframe drives every color × intensity combination. Reduce-motion users get a static halo (the affordance stays visible; the breathing stops). `asChild` slots the glow onto a `<Link>` / `<button>` / etc. via Radix Slot. Composes with `<BorderBeam>` on the same host element for a \"premium + active\" combination — beam sweeps the perimeter, glow is the steady backdrop. Use for active studio rail cards, subscribed-state community cards, Aiko nudge surfaces (\"I'm here, paying attention\"), and premium / upgrade prompts.\n\n#### `Stepper`\n\n```tsx\nimport { Stepper } from \"@aisquare/pretty\";\n\n// Self-rendering — pass steps + (optional) per-step content\n<Stepper\n  steps={[\n    { label: \"Vault\", description: \"Where uploads land\" },\n    { label: \"Publish\", description: \"One click to ship\" },\n    { label: \"Analytics\", description: \"See who's tuned in\" },\n  ]}\n  defaultValue={0}\n  onComplete={() => closeWalkthrough()}\n/>;\n\n// Headless — render-prop owns the layout (content panel + footer buttons)\n<Stepper steps={steps} value={step} onValueChange={setStep}>\n  {({ step, total, next, prev, complete }) => (\n    <footer className=\"flex justify-between gap-3 mt-4\">\n      <Button variant=\"ghost\" onClick={prev} disabled={step === 0}>\n        Back\n      </Button>\n      <Button onClick={step === total - 1 ? complete : next}>\n        {step === total - 1 ? \"Done\" : \"Next\"}\n      </Button>\n    </footer>\n  )}\n</Stepper>;\n```\n\nMulti-step indicator with optional content panel + WAI-ARIA tablist keyboard navigation. Drives multi-step flows (first-run walkthroughs, quest authoring tutorials, paywall onboarding, Aiko-led recovery) that previously lived as ad-hoc `useState({ step: 0..3 })` per surface. Variants: `orientation` (`horizontal` / `vertical`), `size` (`sm` / `default` / `lg`), `indicator` (`numbers` / `dots` / `progress`). Controlled (`value` + `onValueChange`) and uncontrolled (`defaultValue`) modes; `interactive: false` swaps `role=\"tablist\"` for `role=\"progressbar\"` so display-only flows pick up the right ARIA shape automatically. Keyboard nav follows the WAI-ARIA tablist pattern: ← / → for horizontal, ↑ / ↓ for vertical, Home / End. Reduce-motion users get an instant step transition. The render-prop slot is the composition seam for `<AikoTip>` integration: `<AikoTip body={<Stepper steps={...}>{({ next }) => ...}</Stepper>}>` plumbs Aiko-led multi-step recovery without prop-drilling.\n\n### Aiko (brand mascot + helper surfaces)\n\nThe AISquare AI assistant lives across these primitives. They share a single visual anatomy (paper-shell silhouette, breathing AikoMark, anti-intrusion contract) and one mental model: the platform has a personality, and it shows up where it can help.\n\n#### `AikoMark`\n\n```tsx\n<AikoMark size=\"md\" />\n<AikoMark size=\"2xl\" animated={false} />     // resting frame\n<AikoMark aria-label=\"AISquare assistant\" /> // announce; otherwise decorative\n```\n\nThe brand mascot. One file, single source of truth — every Aiko surface (Tip, Sheet, Whisper, Loader, marketing) composes this. Sizes: `xs / sm / md / lg / xl / 2xl` (24 / 28 / 32 / 40 / 56 / 80 px). Honors `prefers-reduced-motion` (resting frame). To change Aiko's look across the whole platform, edit only `AikoMark.tsx`.\n\n#### `AikoTip`\n\n```tsx\n<AikoTip\n  trigger=\"click\" // \"click\" | \"hover\"\n  variant=\"rail\" // label | info | single | rail | pages | pages-passive\n  title=\"Recall lives across chats\"\n  body=\"Aiko remembers the last 50 turns to keep context tight.\"\n  actions={[\n    { label: \"Got it\", primary: true },\n    { label: \"Snooze 30 min\", onClick: snooze },\n  ]}\n>\n  <Button variant=\"outline\">What's recall?</Button>\n</AikoTip>\n```\n\nThe Aiko helper bubble. Six content silhouettes share one paper shell + breathing AikoMark. Built on Radix Popover so positioning, focus, ESC, and click-outside are handled. Drop-in replacement for traditional tooltips when the helper has personality + content + (optionally) actions. `trigger=\"hover\"` makes it a label-style tooltip instead of a click-to-open popover.\n\n#### `AikoTooltip`\n\n```tsx\n<AikoTooltip body=\"Save\">                                          // → minimal: no mark, light shell\n  <IconButton onClick={save} />\n</AikoTooltip>\n\n<AikoTooltip body=\"This will permanently delete the experience.\">  // → full: branded card with mark\n  <IconButton onClick={remove} />\n</AikoTooltip>\n\n<AikoTooltip title=\"Save\" body=\"Saves and exits the editor\" side=\"right\">  // → full (header)\n  <IconButton />\n</AikoTooltip>\n\n<AikoTooltip body=\"Save\" tone=\"full\">                              // pin full when the heuristic guesses wrong\n  <IconButton />\n</AikoTooltip>\n```\n\nThe drop-in replacement for shadcn-style `<Tooltip><TooltipTrigger><TooltipContent>` compositions. The visual treatment auto-adapts via the `tone` heuristic: short string body, no title → light label-style tooltip; longer body, JSX node, or `title` → branded paper card with the AikoMark. Brand the act, not the chrome — short button labels stay quiet so substantive AIKO comms stand out. Override with `tone=\"full\" | \"minimal\"` when you need to pin a style. Hover-only — for click-to-open helpers reach for `<AikoTip>` directly. Built on Radix Tooltip so the consumer's `<TooltipProvider>` configures cross-tooltip delay-skipping and free `aria-describedby` wiring. Default `delayDuration={400}` aligns with industry norms (Linear ≈500, GitHub ≈400) so cursor-traversal doesn't trigger noise.\n\n#### `AikoHint`\n\n```tsx\n<AikoHint title=\"Why this matters\" body=\"One sentence. Aiko keeps it brief.\" />\n\n<AikoHint\n  title=\"Heads up\"\n  body=\"This will overwrite the current draft.\"\n  actions={[{ label: \"Got it\" }]}\n  channelId=\"form.experience-name\"\n/>\n```\n\nSmall Aiko mark that teases on hover and reveals on click. Hover (120ms delay) shows a tiny label tip with the `teaser` text (default `\"Aiko has a tip\"`). Click opens a fuller info card with title + body + optional actions. Use to replace always-visible \"subtext\" / `FormDescription` patterns where the explanation should be one click away — quiet by default, informative on demand. Built on Radix Popover. Honors the [anti-intrusion contract](./docs/contracts/aiko-intrusion.md) when `channelId` is set + wrapped in `<AikoProvider>`.\n\n#### `AikoWhisper` / `AikoNudge` / `AikoIntervene`\n\n```tsx\nconst ref = useRef<HTMLButtonElement>(null);\nconst aiko = useAikoSignal(\"checkout.confused\");\n\nuseAikoDwellSignal(ref, { channelId: \"checkout.confused\", ms: 2000 });\nuseAikoRageClickSignal(ref, { channelId: \"checkout.confused\", threshold: 3 });\n\n<Button ref={ref}>Submit order</Button>;\n<AikoWhisper anchorRef={ref} open={aiko.canShow && aiko.level === \"whisper\"}\n  channelId=\"checkout.confused\" onExpand={() => aiko.signal(\"rage-click\")}\n  previewText=\"Aiko has a hint. Click to see it.\" />\n<AikoNudge anchorRef={ref} open={aiko.canShow && aiko.level === \"nudge\"}\n  channelId=\"checkout.confused\">\n  Looks confusing — try <em>refreshing your library</em>.\n</AikoNudge>\n<AikoIntervene anchorRef={ref} open={aiko.canShow && aiko.level === \"intervene\"}\n  channelId=\"checkout.confused\" title=\"Need a hand?\" body=\"...\"\n  primaryAction={{ label: \"Try this\", onClick: fix }} />\n```\n\nThe three escalation surfaces (Phase 3). Whisper is a tiny breathing pip; Nudge is a one-line balloon; Intervene is a full helper card. Drive `open` from `useAikoSignal(channelId).level`. All three honor the [anti-intrusion contract](./docs/contracts/aiko-intrusion.md) — closing fires `dismiss()` which snoozes 30 min, three dismisses → silent for the session, mute persists.\n\n`AikoWhisper`'s optional `previewText` opens a paper-shelled `AikoTip` (label variant) on hover/focus — progressive disclosure without committing to escalation.\n\n#### `AikoProvider` + signal hooks\n\n```tsx\nimport {\n  AikoProvider,\n  useAiko,\n  useAikoChannel,\n  useAikoSignal,\n  useAikoDwellSignal,\n  useAikoRageClickSignal,\n  useAikoHoverLoopSignal,\n} from \"@aisquare/pretty\";\n\n// Wrap once near app root\n<AikoProvider snoozeMinutes={30} sessionDismissThreshold={3}>\n  <App />\n</AikoProvider>;\n\n// Read or control any channel\nconst channel = useAikoChannel(\"library.refresh-tip\");\nchannel.canShow; // false if muted, snoozed, or session-silent\nchannel.dismiss(); // counts as one dismiss\nchannel.snoozeFor(60_000);\nchannel.mute(); // until unmute()\nchannel.reset();\n\n// Detect intent → drive the level state machine\nconst sig = useAikoSignal(\"library.refresh-tip\");\nsig.level; // \"off\" | \"whisper\" | \"nudge\" | \"intervene\"\nsig.signal(\"rage-click\"); // user-triggered escalation\nsig.resetLevel();\n\n// Auto-detectors — point at any element ref\nuseAikoDwellSignal(ref, { channelId: \"...\", ms: 2000 });\nuseAikoRageClickSignal(ref, { channelId: \"...\", threshold: 3, windowMs: 1500 });\nuseAikoHoverLoopSignal(ref, { channelId: \"...\", loopThreshold: 3 });\n```\n\nThe state machine + persistence layer behind every Aiko surface. Provider owns per-channel mute/snooze/session-dismiss-count; hooks expose typed read/write APIs. Detectors translate user behavior (long hover, rage-click, hover loops) into level escalations without you wiring it. Full anti-intrusion contract spec at [`docs/contracts/aiko-intrusion.md`](./docs/contracts/aiko-intrusion.md).\n\n### Theming\n\n#### `ThemeProvider`\n\n```tsx\nimport { ThemeProvider, useTheme } from \"@aisquare/pretty\";\n\n<ThemeProvider defaultTheme=\"system\" storageKey=\"aisquare-theme\">\n  <App />\n</ThemeProvider>;\n```\n\nAdds `light` or `dark` to `<html>`, persists the choice in `localStorage`, and follows the OS `prefers-color-scheme` when set to `\"system\"`. Read or change inside the tree:\n\n```tsx\nconst { theme, resolvedTheme, setTheme } = useTheme();\n<Button onClick={() => setTheme(resolvedTheme === \"dark\" ? \"light\" : \"dark\")}>Switch</Button>;\n```\n\nFor zero-flash apps (Next.js, Remix, Astro), inline the script in `<head>`:\n\n```tsx\nimport { getThemeScript } from \"@aisquare/pretty\";\n<script dangerouslySetInnerHTML={{ __html: getThemeScript() }} />;\n```\n\n#### `StudioBrand`\n\nPer-studio brand cascade. Sets CSS vars on a wrapper so every primitive inside inherits the studio's brand, with no per-primitive code change.\n\n```tsx\n<StudioBrand\n  primary=\"280 70% 50%\"\n  accent=\"220 80% 60%\"\n  radius=\"14px\"\n  font=\"'Geist Sans', sans-serif\"\n>\n  <Button>Visit studio</Button>\n</StudioBrand>\n```\n\nTwo studios side-by-side stay scoped:\n\n```tsx\n<div className=\"grid grid-cols-2\">\n  <StudioBrand primary=\"280 70% 50%\">\n    <App />\n  </StudioBrand>\n  <StudioBrand primary=\"14 90% 55%\">\n    <App />\n  </StudioBrand>\n</div>\n```\n\nColor values accept HSL triplets (`\"280 70% 50%\"`) or wrapped strings (`\"hsl(280 70% 50%)\"`); both work. Use `vars` to set arbitrary CSS variables (`--shadow-glow`, custom tokens). Use `asChild` to apply the brand to your own element with no extra wrapper. Composes with `ThemeProvider`: light/dark applies globally, brand vars override locally.\n\n---\n\n### Office surface primitives (iter-37-F2)\n\nSeven primitives for the AISquare Office multi-agent collaboration surface. All compose existing pretty primitives where possible.\n\n#### `RailItem`\n\nLeft-rail session navigation row. Composes `SlugTag` + `CornerMark` + `PulseDot`.\n\n```tsx\nimport { RailItem } from \"@aisquare/pretty\";\n\n<RailItem slug=\"api-stabilization\" hue=\"#1F8A5B\" status=\"open\" unread={3} summary=\"v2 contract\" />\n<RailItem slug=\"auth-refactor\" hue=\"#D97757\" status=\"stuck\" active />\n<RailItem slug=\"init\" status=\"sealed\" sealed />\n```\n\n#### `PaneHeader`\n\nCenter-pane top-section layout shell (23px/700 title + status + summary + actions slots).\n\n```tsx\nimport { PaneHeader, Tag, Pill } from \"@aisquare/pretty\";\n\n<PaneHeader\n  title=\"#api-stabilization\"\n  status={<Tag label=\"OPEN\" tone=\"success\" />}\n  summary=\"Stabilise the v2 API contract.\"\n  actions={<Pill label=\"stuck\" tone=\"destructive\" appearance=\"solid\" />}\n/>\n```\n\n#### `OfficeMsg` + sub-components\n\nOffice-specific message row. Distinct from `MessageRow` (role-based): sender identity expressed via SlugTag hue + 2px hue left-rail.\n\n```tsx\nimport { OfficeMsg, OfficeMsgTimestamp, OfficeMsgSender, OfficeMsgBody, ThreadRow } from \"@aisquare/pretty\";\n\n<OfficeMsg slug=\"founder-0\" hue=\"#D97757\" ts=\"09:55\" isOwner>\n  Synthesis complete. Proposing lock.\n</OfficeMsg>\n<OfficeMsg slug=\"founder-9\" hue=\"#1F8A5B\" ts=\"09:57\" selfFlag=\"force-analysis\"\n  thread={{ replyCount: 3, status: \"open\", loaded: [\"f0\"] }}>\n  Tests pass.\n</OfficeMsg>\n```\n\n#### `F0Card`\n\nFounder-0 lock-proposal decision card. cardChrome(coral) surface with 4px left-bar and optional worklog row.\n\n```tsx\nimport { F0Card } from \"@aisquare/pretty\";\n\n<F0Card\n  ts=\"10:01\"\n  body=\"api-stabilization is locked.\"\n  worklog={{ id: \"w24-032\",","readmeFilename":"README.md"}