{"_id":"@123usmanhaider321/ui","_rev":"8-978788f7f8b5254367f6a65bae649d0a","name":"@123usmanhaider321/ui","dist-tags":{"latest":"1.0.6"},"versions":{"0.1.0":{"name":"@123usmanhaider321/ui","version":"0.1.0","_id":"@123usmanhaider321/ui@0.1.0","maintainers":[{"name":"123usmanhaider321","email":"usmanhaiderweb2005@gmail.com"}],"dist":{"shasum":"50d47c22d98f0a6f1e67b8ceecfd813cf7635895","tarball":"https://registry.npmjs.org/@123usmanhaider321/ui/-/ui-0.1.0.tgz","fileCount":1076,"integrity":"sha512-zisFM5Xk3OSCeeE9BvoEe302zfs9evuU2E46uq4YaVVDfkcHgve8Xs/KhyCAtgMdpf5yysIEwfjDiaelc0S4LA==","signatures":[{"sig":"MEUCIQDFcvciqvk1+EmNhfZkuce2PYCIo6ibgxXjbTDzjwa26gIgT7lxzZQ5zO02QRtLzcNdtK+t/r3drc9y56WvwWVPFio=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7203441},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":"./dist/index.js","./styles.css":"./dist/styles.css","./package.json":"./package.json"},"scripts":{"dev":"vite","lint":"eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"vite build && npm run build:css","preview":"vite preview","build:css":"npx tailwindcss -i ./src/index.css -o ./dist/styles.css","storybook":"storybook dev -p 6006","build-storybook":"storybook build"},"_npmUser":{"name":"123usmanhaider321","email":"usmanhaiderweb2005@gmail.com"},"_npmVersion":"11.2.0","description":"Shared UI components for Ticketly portals","directories":{},"sideEffects":["**/*.css","./dist/styles.css"],"_nodeVersion":"22.12.0","_hasShrinkwrap":false,"devDependencies":{"zod":"^4.3.6","clsx":"^2.1.0","vite":"^5.1.4","dayjs":"^1.11.20","jsdom":"^28.1.0","react":"^19.2.5","terser":"^5.46.1","vitest":"^1.3.1","postcss":"^8.4.35","react-dom":"^19.2.5","storybook":"^10.3.5","playwright":"^1.59.1","typescript":"^5.2.2","@types/node":"^25.6.0","react-icons":"^5.6.0","react-imask":"^7.6.1","tailwindcss":"^4.0.0","@types/react":"^18.2.56 || ^19.0.0","autoprefixer":"^10.4.17","lucide-react":"^1.8.0","@dnd-kit/core":"^6.3.1","framer-motion":"^12.38.0","tailwind-merge":"^2.2.1","@vitest/browser":"^1.3.1","vite-plugin-dts":"^3.7.3","@heroicons/react":"^2.2.0","@tailwindcss/cli":"^4.2.2","@types/react-dom":"^18.2.19 || ^19.0.0","@dnd-kit/sortable":"^10.0.0","@headlessui/react":"^2.2.10","@dnd-kit/utilities":"^3.2.2","@vitest/coverage-v8":"^1.3.1","@tailwindcss/postcss":"^4.0.0","@vitejs/plugin-react":"^4.2.1","@storybook/addon-a11y":"^10.3.5","@storybook/addon-docs":"^10.3.5","@storybook/react-vite":"^10.3.5","@testing-library/react":"^14.2.1","@storybook/addon-vitest":"^10.3.5","@chromatic-com/storybook":"^5.1.1","@testing-library/jest-dom":"^6.4.2","@storybook/addon-onboarding":"^10.3.5","@fortawesome/react-fontawesome":"^3.3.0","@fortawesome/fontawesome-svg-core":"^7.2.0","@fortawesome/free-solid-svg-icons":"^7.2.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ui_0.1.0_1776145122597_0.10849543537687212","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@123usmanhaider321/ui","version":"0.1.6","_id":"@123usmanhaider321/ui@0.1.6","maintainers":[{"name":"123usmanhaider321","email":"usmanhaiderweb2005@gmail.com"}],"dist":{"shasum":"e6a04269b9c7347b1f455094fb32e1aee4f7a87b","tarball":"https://registry.npmjs.org/@123usmanhaider321/ui/-/ui-0.1.6.tgz","fileCount":497,"integrity":"sha512-cvTxticrhQqKTyNXqX6WqculBFt+DDlkATsmLldKSzL6ZpsjvK9YSC6DP2ytDNb9RqLUHFnr7t/5Q2+ID3q61g==","signatures":[{"sig":"MEUCIA4XnoZYI1R9rNVElr/Y9Osva4J7n3G2tvlzaaXkjhnZAiEA1mwg5PUrUXwtuTLC1IhGeV+XrAk4nGpRZhwbCpa83Ig=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7612528},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":"./dist/index.js","./styles.css":"./dist/styles.css","./package.json":"./package.json"},"scripts":{"dev":"vite","lint":"eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"vite build && npm run build:css","preview":"vite preview","build:css":"npx tailwindcss -i ./src/index.css -o ./dist/styles.css","storybook":"storybook dev -p 6006","build-storybook":"storybook build"},"_npmUser":{"name":"123usmanhaider321","email":"usmanhaiderweb2005@gmail.com"},"_npmVersion":"11.2.0","description":"Shared UI components for Ticketly portals","directories":{},"sideEffects":["**/*.css","./dist/styles.css"],"_nodeVersion":"22.12.0","dependencies":{"moment":"^2.30.1","firebase":"^12.12.0","react-redux":"^9.2.0","sweetalert2":"^11.26.24","@tiptap/react":"^3.22.3","react-easy-crop":"^5.5.7","react-quill-new":"^3.8.3","@reduxjs/toolkit":"^2.11.2","react-input-mask":"^2.0.4","@tiptap/starter-kit":"^3.22.3","@tiptap/extension-link":"^3.22.3","@tiptap/extension-underline":"^3.22.3","@tiptap/extension-placeholder":"^3.22.3"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.3.6","clsx":"^2.1.0","next":"^16.2.3","vite":"^5.1.4","dayjs":"^1.11.20","jsdom":"^28.1.0","react":"^19.2.5","terser":"^5.46.1","vitest":"^1.3.1","postcss":"^8.4.35","react-dom":"^19.2.5","storybook":"^10.3.5","playwright":"^1.59.1","typescript":"^5.2.2","@types/node":"^25.6.0","react-icons":"^5.6.0","react-imask":"^7.6.1","tailwindcss":"^4.0.0","@types/react":"^18.2.56 || ^19.0.0","autoprefixer":"^10.4.17","lucide-react":"^1.8.0","@dnd-kit/core":"^6.3.1","framer-motion":"^12.38.0","tailwind-merge":"^2.2.1","@vitest/browser":"^1.3.1","vite-plugin-dts":"^3.7.3","@heroicons/react":"^2.2.0","@tailwindcss/cli":"^4.2.2","@types/react-dom":"^18.2.19 || ^19.0.0","@dnd-kit/sortable":"^10.0.0","@headlessui/react":"^2.2.10","@dnd-kit/utilities":"^3.2.2","@vitest/coverage-v8":"^1.3.1","@tailwindcss/postcss":"^4.0.0","@vitejs/plugin-react":"^4.2.1","@storybook/addon-a11y":"^10.3.5","@storybook/addon-docs":"^10.3.5","@storybook/react-vite":"^10.3.5","@testing-library/react":"^14.2.1","@storybook/addon-vitest":"^10.3.5","@chromatic-com/storybook":"^5.1.1","@testing-library/jest-dom":"^6.4.2","@storybook/addon-onboarding":"^10.3.5","@fortawesome/react-fontawesome":"^3.3.0","@fortawesome/fontawesome-svg-core":"^7.2.0","@fortawesome/free-solid-svg-icons":"^7.2.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ui_0.1.6_1776342270954_0.4830991847910733","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@123usmanhaider321/ui","version":"0.1.8","_id":"@123usmanhaider321/ui@0.1.8","maintainers":[{"name":"123usmanhaider321","email":"usmanhaiderweb2005@gmail.com"}],"dist":{"shasum":"259a8c326febfb39d4f4b6bf11e19b389821aac5","tarball":"https://registry.npmjs.org/@123usmanhaider321/ui/-/ui-0.1.8.tgz","fileCount":497,"integrity":"sha512-ANYNWS4Z1jRo/KI4eUXyzP7hUKwgxC/Qd4VMhhSRTJzyHN8IvCvln3xauKHTKIuEwf4lbPEX+QPBVr3w50K9fw==","signatures":[{"sig":"MEYCIQCeGGr2iTqaf+ix2bilewARFHbRPcRVr4suhKXC1eHtPwIhALhZjmkRMQJZCgjZ63PC2BDD18EkGEdy3y7UX2lEkORe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7612939},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":"./dist/index.js","./styles.css":"./dist/styles.css","./package.json":"./package.json"},"scripts":{"dev":"vite","lint":"eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"vite build && npm run build:css","preview":"vite preview","build:css":"npx tailwindcss -i ./src/index.css -o ./dist/styles.css","storybook":"storybook dev -p 6006","build-storybook":"storybook build"},"_npmUser":{"name":"123usmanhaider321","email":"usmanhaiderweb2005@gmail.com"},"_npmVersion":"11.2.0","description":"Shared UI components for Ticketly portals","directories":{},"sideEffects":["**/*.css","./dist/styles.css"],"_nodeVersion":"22.12.0","dependencies":{"moment":"^2.30.1","firebase":"^12.12.0","react-redux":"^9.2.0","sweetalert2":"^11.26.24","@tiptap/react":"^3.22.3","react-easy-crop":"^5.5.7","react-quill-new":"^3.8.3","@reduxjs/toolkit":"^2.11.2","react-input-mask":"^2.0.4","@tiptap/starter-kit":"^3.22.3","@tiptap/extension-link":"^3.22.3","@tiptap/extension-underline":"^3.22.3","@tiptap/extension-placeholder":"^3.22.3"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.3.6","clsx":"^2.1.0","next":"^16.2.3","vite":"^5.1.4","dayjs":"^1.11.20","jsdom":"^28.1.0","react":"^19.2.5","terser":"^5.46.1","vitest":"^1.3.1","postcss":"^8.4.35","react-dom":"^19.2.5","storybook":"^10.3.5","playwright":"^1.59.1","typescript":"^5.2.2","@types/node":"^25.6.0","react-icons":"^5.6.0","react-imask":"^7.6.1","tailwindcss":"^4.0.0","@types/react":"^18.2.56 || ^19.0.0","autoprefixer":"^10.4.17","lucide-react":"^1.8.0","@dnd-kit/core":"^6.3.1","framer-motion":"^12.38.0","tailwind-merge":"^2.2.1","@vitest/browser":"^1.3.1","vite-plugin-dts":"^3.7.3","@heroicons/react":"^2.2.0","@tailwindcss/cli":"^4.2.2","@types/react-dom":"^18.2.19 || ^19.0.0","@dnd-kit/sortable":"^10.0.0","@headlessui/react":"^2.2.10","@dnd-kit/utilities":"^3.2.2","@vitest/coverage-v8":"^1.3.1","@tailwindcss/postcss":"^4.0.0","@vitejs/plugin-react":"^4.2.1","@storybook/addon-a11y":"^10.3.5","@storybook/addon-docs":"^10.3.5","@storybook/react-vite":"^10.3.5","@testing-library/react":"^14.2.1","@storybook/addon-vitest":"^10.3.5","@chromatic-com/storybook":"^5.1.1","@testing-library/jest-dom":"^6.4.2","@storybook/addon-onboarding":"^10.3.5","@fortawesome/react-fontawesome":"^3.3.0","@fortawesome/fontawesome-svg-core":"^7.2.0","@fortawesome/free-solid-svg-icons":"^7.2.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ui_0.1.8_1776344452508_0.515781086758436","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@123usmanhaider321/ui","version":"1.0.0","_id":"@123usmanhaider321/ui@1.0.0","maintainers":[{"name":"123usmanhaider321","email":"usmanhaiderweb2005@gmail.com"}],"dist":{"shasum":"29677b781ff24159f5864227643c068d23403986","tarball":"https://registry.npmjs.org/@123usmanhaider321/ui/-/ui-1.0.0.tgz","fileCount":121,"integrity":"sha512-ll67LEljcffuVYL4w3Nk6Iuc6zSd+vJYPh9tTh3un2UIC1WGbp+SNnQucjpeyIC5MeHDEaj5qEKE4bZ66OBukQ==","signatures":[{"sig":"MEUCIQD2ap9USyfJ8gnDYXgkRjOEbK6VsDrDwrI2XgyAVR7AlQIgesmiJ3AXN520UDI23zKhK94cFJZf4AoAAaqnLrDG7n8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14214933},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./*":"./*","./styles.css":"./dist/styles.css","./dist/styles.css":"./dist/styles.css"},"gitHead":"81fbd27e04eef06d06c4cf7ec27cef596e2dd416","scripts":{"dev":"vite","lint":"eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0","build":"vite build && npm run build:css","preview":"vite preview","build:css":"tailwindcss -i ./src/index.css -o ./dist/styles.css","playground":"vite playground -c playground/vite.config.ts --host 127.0.0.1 --port 5173"},"_npmUser":{"name":"123usmanhaider321","email":"usmanhaiderweb2005@gmail.com"},"_npmVersion":"11.2.0","description":"Ticketly's shared UI component library — a Vite-built React package designed to be consumed inside **Next.js** applications. Ships the full `AddEventStepper` flow (multi-step event creation/editing), Redux RTK Query APIs, utilities, and a provider for inj","directories":{},"_nodeVersion":"22.12.0","dependencies":{"react-tailwindcss-datepicker":"^2.0.0","react-tailwindcss-datetimepicker":"^3.3.3"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.22.4","clsx":"^2.1.0","next":"^14.1.0","vite":"^5.1.4","dayjs":"^1.11.20","react":"^18.0.0","eslint":"^8.56.0","lodash":"^4.17.21","moment":"^2.30.1","postcss":"^8.4.35","firebase":"^10.8.0","dompurify":"^3.0.9","react-dom":"^18.0.0","react-use":"^17.5.0","typescript":"^5.3.3","@types/node":"^20.0.0","react-icons":"^5.0.1","react-imask":"^7.5.0","react-redux":"^9.2.0","sweetalert2":"^11.10.5","tailwindcss":"^3.4.1","@types/react":"^18.0.0","autoprefixer":"^10.4.17","lottie-react":"^2.4.0","lucide-react":"^0.344.0","@dnd-kit/core":"^6.1.0","@tiptap/react":"^2.2.4","@types/lodash":"^4.17.0","framer-motion":"^11.0.0","react-youtube":"^10.1.0","firebase-admin":"^13.8.0","react-confetti":"^6.1.0","react-toastify":"^10.0.4","tailwind-merge":"^2.2.1","react-easy-crop":"^5.0.5","react-quill-new":"^3.3.3","vite-plugin-dts":"^3.7.3","@heroicons/react":"^2.1.1","@reduxjs/toolkit":"^2.11.2","@types/dompurify":"^3.0.5","@types/react-dom":"^18.0.0","react-input-mask":"^2.0.4","@dnd-kit/sortable":"^8.0.0","@headlessui/react":"^2.2.0","@dnd-kit/utilities":"^3.2.2","@tailwindcss/forms":"^0.5.11","@types/react-redux":"^7.1.34","tailwind-scrollbar":"^4.0.2","@tiptap/starter-kit":"^2.2.4","react-confirm-alert":"^3.0.6","tailwindcss-animate":"^1.0.7","@vitejs/plugin-react":"^4.2.1","react-type-animation":"^3.2.0","@tiptap/extension-link":"^2.2.4","@tailwindcss/aspect-ratio":"^0.4.2","@typescript-eslint/parser":"^7.0.0","eslint-plugin-react-hooks":"^4.6.0","@tiptap/extension-underline":"^2.2.4","eslint-plugin-react-refresh":"^0.4.5","@tiptap/extension-placeholder":"^2.2.4","@fortawesome/react-fontawesome":"^3.3.1","@typescript-eslint/eslint-plugin":"^7.0.0","@fortawesome/fontawesome-svg-core":"^7.2.0","@fortawesome/free-solid-svg-icons":"^7.2.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0","react-redux":"^9.0.0","framer-motion":"^11.0.0 || ^12.0.0","redux-persist":"^6.0.0","@reduxjs/toolkit":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ui_1.0.0_1777380748355_0.829338446559911","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@123usmanhaider321/ui","version":"1.0.2","_id":"@123usmanhaider321/ui@1.0.2","maintainers":[{"name":"123usmanhaider321","email":"usmanhaiderweb2005@gmail.com"}],"dist":{"shasum":"83ff3a566a775a0f3c28fc2c9737e2740adf5350","tarball":"https://registry.npmjs.org/@123usmanhaider321/ui/-/ui-1.0.2.tgz","fileCount":121,"integrity":"sha512-SJ4byXSIP8pxuCEUD+EekTExO8rXCCUOWzubElO8ypwwLyGTCNpfmajHtV141Bv3iiwu2/KYFlULbHDacWrHGw==","signatures":[{"sig":"MEYCIQCn+qUrnC9fso/os+bP79gNh+xgc6pMgj5JuH5+A7XsawIhAI0GVrj21y7T4hVW6sb/3kFAv03dXmFL+wNjbeuT+dbI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14215121},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./*":"./*","./styles.css":"./dist/styles.css","./dist/styles.css":"./dist/styles.css"},"gitHead":"9d2ed3b0ac2a4853d9ed0ebb4cfdc52ad7858497","scripts":{"dev":"vite","lint":"eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0","build":"vite build && npm run build:css","preview":"vite preview","build:css":"tailwindcss -i ./src/index.css -o ./dist/styles.css","playground":"vite playground -c playground/vite.config.ts --host 127.0.0.1 --port 5173"},"_npmUser":{"name":"123usmanhaider321","email":"usmanhaiderweb2005@gmail.com"},"_npmVersion":"11.2.0","description":"Ticketly's shared UI component library — a Vite-built React package designed to be consumed inside **Next.js** applications. Ships the full `AddEventStepper` flow (multi-step event creation/editing), Redux RTK Query APIs, utilities, and a provider for inj","directories":{},"_nodeVersion":"22.12.0","dependencies":{"react-tailwindcss-datepicker":"^2.0.0","react-tailwindcss-datetimepicker":"^3.3.3"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.22.4","clsx":"^2.1.0","next":"^14.1.0","vite":"^5.1.4","dayjs":"^1.11.20","react":"^18.0.0","eslint":"^8.56.0","lodash":"^4.17.21","moment":"^2.30.1","postcss":"^8.4.35","firebase":"^10.8.0","dompurify":"^3.0.9","react-dom":"^18.0.0","react-use":"^17.5.0","typescript":"^5.3.3","@types/node":"^20.0.0","react-icons":"^5.0.1","react-imask":"^7.5.0","react-redux":"^9.2.0","sweetalert2":"^11.10.5","tailwindcss":"^3.4.1","@types/react":"^18.0.0","autoprefixer":"^10.4.17","lottie-react":"^2.4.0","lucide-react":"^0.344.0","@dnd-kit/core":"^6.1.0","@tiptap/react":"^2.2.4","@types/lodash":"^4.17.0","framer-motion":"^11.0.0","react-youtube":"^10.1.0","firebase-admin":"^13.8.0","react-confetti":"^6.1.0","react-toastify":"^10.0.4","tailwind-merge":"^2.2.1","react-easy-crop":"^5.0.5","react-quill-new":"^3.3.3","vite-plugin-dts":"^3.7.3","@heroicons/react":"^2.1.1","@reduxjs/toolkit":"^2.11.2","@types/dompurify":"^3.0.5","@types/react-dom":"^18.0.0","react-input-mask":"^2.0.4","@dnd-kit/sortable":"^8.0.0","@headlessui/react":"^2.2.0","@dnd-kit/utilities":"^3.2.2","@tailwindcss/forms":"^0.5.11","@types/react-redux":"^7.1.34","tailwind-scrollbar":"^4.0.2","@tiptap/starter-kit":"^2.2.4","react-confirm-alert":"^3.0.6","tailwindcss-animate":"^1.0.7","@vitejs/plugin-react":"^4.2.1","react-type-animation":"^3.2.0","@tiptap/extension-link":"^2.2.4","@tailwindcss/aspect-ratio":"^0.4.2","@typescript-eslint/parser":"^7.0.0","eslint-plugin-react-hooks":"^4.6.0","@tiptap/extension-underline":"^2.2.4","eslint-plugin-react-refresh":"^0.4.5","@tiptap/extension-placeholder":"^2.2.4","@fortawesome/react-fontawesome":"^3.3.1","@typescript-eslint/eslint-plugin":"^7.0.0","@fortawesome/fontawesome-svg-core":"^7.2.0","@fortawesome/free-solid-svg-icons":"^7.2.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0","react-redux":"^9.0.0","framer-motion":"^11.0.0 || ^12.0.0","redux-persist":"^6.0.0","@reduxjs/toolkit":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ui_1.0.2_1777450538218_0.22110496220317777","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@123usmanhaider321/ui","version":"1.0.4","_id":"@123usmanhaider321/ui@1.0.4","maintainers":[{"name":"123usmanhaider321","email":"usmanhaiderweb2005@gmail.com"}],"dist":{"shasum":"2f0f93cd8d40793b50e2471dfd5b0266253e1e36","tarball":"https://registry.npmjs.org/@123usmanhaider321/ui/-/ui-1.0.4.tgz","fileCount":121,"integrity":"sha512-Gcrqnekdnin6SsD/NjzmoUgXZn4I4t9tjhI2A2c0hcYf14IVNteHCkDe/0kmF5E5nBsCksQr/B82SC6xyWmKxA==","signatures":[{"sig":"MEUCIQDISO1Iv9FaG+0RXwOfmtJwdVx+7ZmTJMgiumUe25yYNQIgLCSodKsd7a860Mwfv7dPIJc8bAQe+57Vvw46K1IcLEo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14215286},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./*":"./*","./styles.css":"./dist/styles.css","./dist/styles.css":"./dist/styles.css"},"gitHead":"e89113a8c609fac9ad11de9f10caa9cae03a85cd","scripts":{"dev":"vite","lint":"eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0","build":"vite build && npm run build:css","preview":"vite preview","build:css":"tailwindcss -i ./src/index.css -o ./dist/styles.css","playground":"vite playground -c playground/vite.config.ts --host 127.0.0.1 --port 5173"},"_npmUser":{"name":"123usmanhaider321","email":"usmanhaiderweb2005@gmail.com"},"_npmVersion":"11.2.0","description":"Ticketly's shared UI component library — a Vite-built React package designed to be consumed inside **Next.js** applications. Ships the full `AddEventStepper` flow (multi-step event creation/editing), Redux RTK Query APIs, utilities, and a provider for inj","directories":{},"_nodeVersion":"22.12.0","dependencies":{"react-tailwindcss-datepicker":"^2.0.0","react-tailwindcss-datetimepicker":"^3.3.3"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.22.4","clsx":"^2.1.0","next":"^14.1.0","vite":"^5.1.4","dayjs":"^1.11.20","react":"^18.0.0","eslint":"^8.56.0","lodash":"^4.17.21","moment":"^2.30.1","postcss":"^8.4.35","firebase":"^10.8.0","dompurify":"^3.0.9","react-dom":"^18.0.0","react-use":"^17.5.0","typescript":"^5.3.3","@types/node":"^20.0.0","react-icons":"^5.0.1","react-imask":"^7.5.0","react-redux":"^9.2.0","sweetalert2":"^11.10.5","tailwindcss":"^3.4.1","@types/react":"^18.0.0","autoprefixer":"^10.4.17","lottie-react":"^2.4.0","lucide-react":"^0.344.0","@dnd-kit/core":"^6.1.0","@tiptap/react":"^2.2.4","@types/lodash":"^4.17.0","framer-motion":"^11.0.0","react-youtube":"^10.1.0","firebase-admin":"^13.8.0","react-confetti":"^6.1.0","react-toastify":"^10.0.4","tailwind-merge":"^2.2.1","react-easy-crop":"^5.0.5","react-quill-new":"^3.3.3","vite-plugin-dts":"^3.7.3","@heroicons/react":"^2.1.1","@reduxjs/toolkit":"^2.11.2","@types/dompurify":"^3.0.5","@types/react-dom":"^18.0.0","react-input-mask":"^2.0.4","@dnd-kit/sortable":"^8.0.0","@headlessui/react":"^2.2.0","@dnd-kit/utilities":"^3.2.2","@tailwindcss/forms":"^0.5.11","@types/react-redux":"^7.1.34","tailwind-scrollbar":"^4.0.2","@tiptap/starter-kit":"^2.2.4","react-confirm-alert":"^3.0.6","tailwindcss-animate":"^1.0.7","@vitejs/plugin-react":"^4.2.1","react-type-animation":"^3.2.0","@tiptap/extension-link":"^2.2.4","@tailwindcss/aspect-ratio":"^0.4.2","@typescript-eslint/parser":"^7.0.0","eslint-plugin-react-hooks":"^4.6.0","@tiptap/extension-underline":"^2.2.4","eslint-plugin-react-refresh":"^0.4.5","@tiptap/extension-placeholder":"^2.2.4","@fortawesome/react-fontawesome":"^3.3.1","@typescript-eslint/eslint-plugin":"^7.0.0","@fortawesome/fontawesome-svg-core":"^7.2.0","@fortawesome/free-solid-svg-icons":"^7.2.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0","react-redux":"^9.0.0","framer-motion":"^11.0.0 || ^12.0.0","redux-persist":"^6.0.0","@reduxjs/toolkit":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ui_1.0.4_1777457647804_0.9675374200686768","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@123usmanhaider321/ui","version":"1.0.5","_id":"@123usmanhaider321/ui@1.0.5","maintainers":[{"name":"123usmanhaider321","email":"usmanhaiderweb2005@gmail.com"}],"dist":{"shasum":"4bddc61a4bead7a713cc79d6c426c750b5818bf6","tarball":"https://registry.npmjs.org/@123usmanhaider321/ui/-/ui-1.0.5.tgz","fileCount":121,"integrity":"sha512-SQAdJTL4yZLNXDALUPtMK8tbKfDeTRCRS7cPTbPUCRej5niJcOnu3310vN1u3U95VwOmCnv+6SpJYvkSyGHggA==","signatures":[{"sig":"MEYCIQDWsINrVY/9WajnlCORnigf32713vzUVYmAOgNa7BAGmAIhANVoMxKrdNGi1qltsXWdObYmbz5nLSRbiKpWyTwEmCRm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14215286},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./*":"./*","./styles.css":"./dist/styles.css","./dist/styles.css":"./dist/styles.css"},"gitHead":"f72eec449d37277217c965f10649533a9cbc5d38","scripts":{"dev":"vite","lint":"eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0","build":"vite build && npm run build:css","preview":"vite preview","build:css":"tailwindcss -i ./src/index.css -o ./dist/styles.css","playground":"vite playground -c playground/vite.config.ts --host 127.0.0.1 --port 5173"},"_npmUser":{"name":"123usmanhaider321","email":"usmanhaiderweb2005@gmail.com"},"_npmVersion":"11.2.0","description":"Ticketly's shared UI component library — a Vite-built React package designed to be consumed inside **Next.js** applications. Ships the full `AddEventStepper` flow (multi-step event creation/editing), Redux RTK Query APIs, utilities, and a provider for inj","directories":{},"_nodeVersion":"22.12.0","dependencies":{"react-tailwindcss-datepicker":"^2.0.0","react-tailwindcss-datetimepicker":"^3.3.3"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.22.4","clsx":"^2.1.0","next":"^14.1.0","vite":"^5.1.4","dayjs":"^1.11.20","react":"^18.0.0","eslint":"^8.56.0","lodash":"^4.17.21","moment":"^2.30.1","postcss":"^8.4.35","firebase":"^10.8.0","dompurify":"^3.0.9","react-dom":"^18.0.0","react-use":"^17.5.0","typescript":"^5.3.3","@types/node":"^20.0.0","react-icons":"^5.0.1","react-imask":"^7.5.0","react-redux":"^9.2.0","sweetalert2":"^11.10.5","tailwindcss":"^3.4.1","@types/react":"^18.0.0","autoprefixer":"^10.4.17","lottie-react":"^2.4.0","lucide-react":"^0.344.0","@dnd-kit/core":"^6.1.0","@tiptap/react":"^2.2.4","@types/lodash":"^4.17.0","framer-motion":"^11.0.0","react-youtube":"^10.1.0","firebase-admin":"^13.8.0","react-confetti":"^6.1.0","react-toastify":"^10.0.4","tailwind-merge":"^2.2.1","react-easy-crop":"^5.0.5","react-quill-new":"^3.3.3","vite-plugin-dts":"^3.7.3","@heroicons/react":"^2.1.1","@reduxjs/toolkit":"^2.11.2","@types/dompurify":"^3.0.5","@types/react-dom":"^18.0.0","react-input-mask":"^2.0.4","@dnd-kit/sortable":"^8.0.0","@headlessui/react":"^2.2.0","@dnd-kit/utilities":"^3.2.2","@tailwindcss/forms":"^0.5.11","@types/react-redux":"^7.1.34","tailwind-scrollbar":"^4.0.2","@tiptap/starter-kit":"^2.2.4","react-confirm-alert":"^3.0.6","tailwindcss-animate":"^1.0.7","@vitejs/plugin-react":"^4.2.1","react-type-animation":"^3.2.0","@tiptap/extension-link":"^2.2.4","@tailwindcss/aspect-ratio":"^0.4.2","@typescript-eslint/parser":"^7.0.0","eslint-plugin-react-hooks":"^4.6.0","@tiptap/extension-underline":"^2.2.4","eslint-plugin-react-refresh":"^0.4.5","@tiptap/extension-placeholder":"^2.2.4","@fortawesome/react-fontawesome":"^3.3.1","@typescript-eslint/eslint-plugin":"^7.0.0","@fortawesome/fontawesome-svg-core":"^7.2.0","@fortawesome/free-solid-svg-icons":"^7.2.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0","react-redux":"^9.0.0","framer-motion":"^11.0.0 || ^12.0.0","redux-persist":"^6.0.0","@reduxjs/toolkit":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ui_1.0.5_1777464502234_0.4387189890508949","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@123usmanhaider321/ui","version":"1.0.6","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","require":"./dist/index.js","default":"./dist/index.js"},"./dist/styles.css":"./dist/styles.css","./styles.css":"./dist/styles.css","./*":"./*"},"scripts":{"dev":"vite","build":"vite build && npm run build:css","build:css":"tailwindcss -i ./src/index.css -o ./dist/styles.css","lint":"eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0","preview":"vite preview","playground":"vite playground -c playground/vite.config.ts --host 127.0.0.1 --port 5173"},"peerDependencies":{"@reduxjs/toolkit":"^2.0.0","framer-motion":"^11.0.0 || ^12.0.0","react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0","react-redux":"^9.0.0","redux-persist":"^6.0.0"},"devDependencies":{"@dnd-kit/core":"^6.1.0","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.2.2","@fortawesome/fontawesome-svg-core":"^7.2.0","@fortawesome/free-solid-svg-icons":"^7.2.0","@fortawesome/react-fontawesome":"^3.3.1","@headlessui/react":"^2.2.0","@heroicons/react":"^2.1.1","@reduxjs/toolkit":"^2.11.2","@tailwindcss/aspect-ratio":"^0.4.2","@tailwindcss/forms":"^0.5.11","@tiptap/extension-link":"^2.2.4","@tiptap/extension-placeholder":"^2.2.4","@tiptap/extension-underline":"^2.2.4","@tiptap/react":"^2.2.4","@tiptap/starter-kit":"^2.2.4","@types/dompurify":"^3.0.5","@types/lodash":"^4.17.0","@types/node":"^20.0.0","@types/react":"^18.0.0","@types/react-dom":"^18.0.0","@types/react-redux":"^7.1.34","@typescript-eslint/eslint-plugin":"^7.0.0","@typescript-eslint/parser":"^7.0.0","@vitejs/plugin-react":"^4.2.1","autoprefixer":"^10.4.17","clsx":"^2.1.0","dayjs":"^1.11.20","dompurify":"^3.0.9","eslint":"^8.56.0","eslint-plugin-react-hooks":"^4.6.0","eslint-plugin-react-refresh":"^0.4.5","firebase":"^10.8.0","firebase-admin":"^13.8.0","framer-motion":"^11.0.0","lodash":"^4.17.21","lottie-react":"^2.4.0","lucide-react":"^0.344.0","moment":"^2.30.1","next":"^14.1.0","postcss":"^8.4.35","react":"^18.0.0","react-confetti":"^6.1.0","react-confirm-alert":"^3.0.6","react-dom":"^18.0.0","react-easy-crop":"^5.0.5","react-icons":"^5.0.1","react-imask":"^7.5.0","react-input-mask":"^2.0.4","react-quill-new":"^3.3.3","react-redux":"^9.2.0","react-toastify":"^10.0.4","react-type-animation":"^3.2.0","react-use":"^17.5.0","react-youtube":"^10.1.0","sweetalert2":"^11.10.5","tailwind-merge":"^2.2.1","tailwind-scrollbar":"^4.0.2","tailwindcss":"^3.4.1","tailwindcss-animate":"^1.0.7","typescript":"^5.3.3","vite":"^5.1.4","vite-plugin-dts":"^3.7.3","zod":"^3.22.4"},"dependencies":{"react-tailwindcss-datepicker":"^2.0.0","react-tailwindcss-datetimepicker":"^3.3.3"},"_id":"@123usmanhaider321/ui@1.0.6","gitHead":"9339744fdc2b24395ef63f4cc966a60e8e47ef89","description":"Ticketly's shared UI component library — a Vite-built React package designed to be consumed inside **Next.js** applications. Ships the full `AddEventStepper` flow (multi-step event creation/editing), Redux RTK Query APIs, utilities, and a provider for inj","_nodeVersion":"22.12.0","_npmVersion":"11.2.0","dist":{"integrity":"sha512-RMIvGJDDbsV52OZvEf4iK9xUPIwjo29WZ3lPv/BRO6ABTAlETS7tFK44HAwXRNsrK0dwIVYgUn1g4TNUpFMl2A==","shasum":"2aa44215d0bcefd64d14a0d169af6069c69d558b","tarball":"https://registry.npmjs.org/@123usmanhaider321/ui/-/ui-1.0.6.tgz","fileCount":121,"unpackedSize":14222563,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAutwxddSmbXPL3ooJZBxuPSgUq1uTcjdoXbv3xwQuW7AiEAptU3ODgaNb2x5Mcqsau7q6v8guVqYICPwiS0QQIf9As="}]},"_npmUser":{"name":"123usmanhaider321","email":"usmanhaiderweb2005@gmail.com"},"directories":{},"maintainers":[{"name":"123usmanhaider321","email":"usmanhaiderweb2005@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ui_1.0.6_1777464880727_0.40018600617134115"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-14T05:38:42.473Z","modified":"2026-04-29T12:14:41.187Z","0.1.0":"2026-04-14T05:38:42.884Z","0.1.6":"2026-04-16T12:24:31.171Z","0.1.8":"2026-04-16T13:00:52.682Z","1.0.0":"2026-04-28T12:52:28.656Z","1.0.2":"2026-04-29T08:15:38.490Z","1.0.4":"2026-04-29T10:14:08.155Z","1.0.5":"2026-04-29T12:08:22.589Z","1.0.6":"2026-04-29T12:14:41.087Z"},"description":"Ticketly's shared UI component library — a Vite-built React package designed to be consumed inside **Next.js** applications. Ships the full `AddEventStepper` flow (multi-step event creation/editing), Redux RTK Query APIs, utilities, and a provider for inj","maintainers":[{"name":"123usmanhaider321","email":"usmanhaiderweb2005@gmail.com"}],"readme":"# @123usmanhaider321/ui\n\nTicketly's shared UI component library — a Vite-built React package designed to be consumed inside **Next.js** applications. Ships the full `AddEventStepper` flow (multi-step event creation/editing), Redux RTK Query APIs, utilities, and a provider for injecting auth services and environment config.\n\n---\n\n## Table of Contents\n\n- [Installation](#installation)\n- [Peer Dependencies](#peer-dependencies)\n- [Next.js Integration](#nextjs-integration)\n  - [1. transpilePackages](#1-transpilepackages)\n  - [2. Import styles](#2-import-styles)\n  - [3. Tailwind config](#3-tailwind-config)\n  - [4. Redux store](#4-redux-store)\n  - [5. Provider setup](#5-provider-setup)\n- [Components](#components)\n  - [AddEventStepper](#addeventstepper)\n- [Configuration Reference](#configuration-reference)\n- [Services Interface](#services-interface)\n- [Exported Utilities](#exported-utilities)\n- [Redux API Hooks](#redux-api-hooks)\n- [Development — Playground](#development--playground)\n\n---\n\n## Installation\n\n**From npm:**\n```bash\nnpm install @123usmanhaider321/ui\n```\n\n**Local file link (monorepo / sibling directory):**\n```json\n\"dependencies\": {\n  \"@123usmanhaider321/ui\": \"file:../ticketly-shared-ui\"\n}\n```\n\n---\n\n## Peer Dependencies\n\nThese must be installed in the consuming app. They are **not** bundled.\n\n```bash\nnpm install react react-dom @reduxjs/toolkit react-redux redux-persist framer-motion next\n```\n\n| Package | Required version |\n|---|---|\n| `react` | `^18.0.0` |\n| `react-dom` | `^18.0.0` |\n| `@reduxjs/toolkit` | `^2.0.0` |\n| `react-redux` | `^9.0.0` |\n| `redux-persist` | `^6.0.0` |\n| `framer-motion` | `^11.0.0` |\n| `next` | `^14.0.0` |\n\n---\n\n## Next.js Integration\n\n### 1. transpilePackages\n\nThe package is published as ESM. Add it to `transpilePackages` so Next.js compiles it instead of loading it raw, and alias shared singletons to prevent duplicate-React/duplicate-framer-motion errors:\n\n```js\n// next.config.js\nconst path = require('path');\n\n/** @type {import('next').NextConfig} */\nconst nextConfig = {\n  transpilePackages: ['@123usmanhaider321/ui'],\n  webpack: (config) => {\n    config.resolve.alias = {\n      ...config.resolve.alias,\n      react: path.resolve('node_modules/react'),\n      'react-dom': path.resolve('node_modules/react-dom'),\n      'framer-motion': path.resolve('node_modules/framer-motion'),\n      next: path.resolve('node_modules/next'),\n    };\n    return config;\n  },\n};\n\nmodule.exports = nextConfig;\n```\n\n> If you see `TypeError: Cannot read properties of null (reading 'useContext')` it means there are two copies of React. The alias above forces both the app and the library to share the same one.\n\n### 2. Import styles\n\n**For Tailwind v3 consumers:** Import the pre-built stylesheet once at the root of your app:\n\n```tsx\n// app/layout.tsx  (App Router)\nimport '@123usmanhaider321/ui/dist/styles.css';\n```\n\n**For Tailwind v4 consumers:** Import the pre-built stylesheet inside a cascade layer within your global CSS file (or a scoped CSS file). This prevents the unlayered Tailwind 3 package CSS from overriding your Tailwind 4 utility classes:\n\n```css\n/* app/globals.css */\n@import \"tailwindcss\";\n@import \"@123usmanhaider321/ui/dist/styles.css\" layer(components);\n```\n\n> The CSS file contains all Tailwind utility classes used by the library. It is independent of the consuming app's Tailwind build.\n\n### 3. Tailwind config\n\nIf you want the library's Tailwind classes generated by **your** app's build (instead of the pre-built CSS), add the compiled dist to your `content` array:\n\n```ts\n// tailwind.config.ts\nexport default {\n  content: [\n    './app/**/*.{ts,tsx}',\n    './components/**/*.{ts,tsx}',\n    './node_modules/@123usmanhaider321/ui/dist/**/*.js',\n  ],\n};\n```\n\n### 4. Redux store\n\nThe library exposes two RTK Query APIs that **must** be registered in your store. It also reads from a `state.event` key — this must exist to avoid a runtime crash in `EventSubmissionConfirmationModal`.\n\n```ts\n// store/index.ts\n'use client';\n\nimport { configureStore, createSlice } from '@reduxjs/toolkit';\nimport { singleEventApi, eventApi } from '@123usmanhaider321/ui';\n\n// Required — EventSubmissionConfirmationModal selects these flags from state.event.\n// Replace with your own event slice if you have one.\nconst eventSlice = createSlice({\n  name: 'event',\n  initialState: {\n    addLoading: false,\n    addError: null as string | null,\n    addSuccess: false,\n    updateLoading: false,\n    updateError: null as string | null,\n    updateSuccess: false,\n  },\n  reducers: {},\n});\n\nexport const store = configureStore({\n  reducer: {\n    // ...your own reducers\n    [singleEventApi.reducerPath]: singleEventApi.reducer,\n    [eventApi.reducerPath]: eventApi.reducer,\n    event: eventSlice.reducer,\n  },\n  middleware: (getDefaultMiddleware) =>\n    getDefaultMiddleware({ serializableCheck: false })\n      .concat(singleEventApi.middleware)\n      .concat(eventApi.middleware),\n});\n\nexport type RootState = ReturnType<typeof store.getState>;\nexport type AppDispatch = typeof store.dispatch;\n```\n\nWrap your app with a `\"use client\"` Provider component:\n\n```tsx\n// app/providers.tsx\n'use client';\nimport { Provider } from 'react-redux';\nimport { store } from '@/store';\n\nexport function StoreProvider({ children }: { children: React.ReactNode }) {\n  return <Provider store={store}>{children}</Provider>;\n}\n```\n\n### 5. Provider setup\n\n`TicketlyUIProvider` injects auth services and environment config into the library. It must sit inside a `\"use client\"` component, **below** the Redux `<Provider>`.\n\n```tsx\n// app/providers.tsx\n'use client';\n\nimport { Provider } from 'react-redux';\nimport { TicketlyUIProvider } from '@123usmanhaider321/ui';\nimport { store } from '@/store';\nimport { auth } from '@/lib/firebase'; // your app's Firebase Auth instance\nimport { onAuthStateChanged } from 'firebase/auth';\n\nexport function Providers({ children }: { children: React.ReactNode }) {\n  const services = {\n    getAuthToken: () =>\n      auth.currentUser?.getIdToken() ?? Promise.resolve(null),\n    onAuthStateChanged: (cb: (user: any) => void) => {\n      return onAuthStateChanged(auth, cb);\n    },\n    getUserId: () => auth.currentUser?.uid ?? null,\n    isAuthenticated: () => !!auth.currentUser,\n  };\n\n  return (\n    <Provider store={store}>\n      <TicketlyUIProvider\n        services={services}\n        config={{\n          BASE_URL: process.env.NEXT_PUBLIC_API_URL!,\n          FIREBASE_API_KEY: process.env.NEXT_PUBLIC_FIREBASE_API_KEY!,\n          FIREBASE_AUTH_DOMAIN: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN!,\n          FIREBASE_PROJECT_ID: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID!,\n          FIREBASE_STORAGE_BUCKET: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET!,\n          FIREBASE_MESSAGING_SENDER_ID: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID!,\n          FIREBASE_APP_ID: process.env.NEXT_PUBLIC_FIREBASE_APP_ID!,\n          GOOGLE_MAPS_API_KEY: process.env.NEXT_PUBLIC_GOOGLE_MAPS_API_KEY!,\n          PAYFAST_MERCHANT_ID: process.env.NEXT_PUBLIC_PAYFAST_MERCHANT_ID!,\n          PAYFAST_CHECKOUT_URL: process.env.NEXT_PUBLIC_PAYFAST_CHECKOUT_URL!,\n          PAYFAST_API_URL: process.env.NEXT_PUBLIC_PAYFAST_API_URL!,\n          HEADER_KEY: process.env.NEXT_PUBLIC_HEADER_KEY!,\n          BODY_KEY: process.env.NEXT_PUBLIC_BODY_KEY!,\n          VENDOR_API_KEY: process.env.NEXT_PUBLIC_VENDOR_API_KEY!,\n          VENDOR_API_SECRET: process.env.NEXT_PUBLIC_VENDOR_API_SECRET!,\n        }}\n      >\n        {children}\n      </TicketlyUIProvider>\n    </Provider>\n  );\n}\n```\n\nThen in your root layout:\n\n```tsx\n// app/layout.tsx\nimport '@123usmanhaider321/ui/dist/styles.css';\nimport { Providers } from './providers';\n\nexport default function RootLayout({ children }: { children: React.ReactNode }) {\n  return (\n    <html lang=\"en\">\n      <body>\n        <Providers>{children}</Providers>\n      </body>\n    </html>\n  );\n}\n```\n\n> **Sticky layout warning:** Do not put `overflow: hidden` or `overflow-x: hidden` on any element that wraps these components. It breaks `position: sticky` used by the file upload sidebar inside the stepper. Use `overflow: clip` instead if you need to contain horizontal bleed.\n\n---\n\n## Components\n\n### AddEventStepper\n\nThe primary export. A fully self-contained multi-step form for creating and editing events. All steps, validation, API calls, and navigation guards are internal.\n\n```tsx\n// app/events/create/page.tsx\n'use client';\n\nimport { AddEventStepper } from '@123usmanhaider321/ui';\n\nexport default function CreateEventPage() {\n  return (\n    <AddEventStepper\n      organizer_id=\"org-123\"\n      onEventCreated={(eventId) => {\n        console.log('Event created:', eventId);\n      }}\n    />\n  );\n}\n```\n\n**Edit mode:**\n\n```tsx\n<AddEventStepper\n  edit\n  id=\"existing-event-id\"\n  organizer_id=\"org-123\"\n  onEventCreated={(id) => router.push(`/events/${id}`)}\n/>\n```\n\n**Restricted modes** — open on a specific step group only:\n\n```tsx\n// Jump straight to the questions editor\n<AddEventStepper organizer_id=\"org-123\" id=\"event-id\" mode=\"questions\" />\n\n// Jump straight to the social profiles step\n<AddEventStepper organizer_id=\"org-123\" id=\"event-id\" mode=\"social\" />\n```\n\n**Persisting in-progress state across page reloads:**\n\n```tsx\n<AddEventStepper\n  organizer_id=\"org-123\"\n  SCOPED_ID_KEY=\"create_event_id\"\n  SCOPED_FORM_KEY=\"create_event_form\"\n  onEventCreated={(id) => router.push(`/events/${id}`)}\n/>\n```\n\n#### Props\n\n| Prop | Type | Default | Description |\n|---|---|---|---|\n| `organizer_id` | `string` | **required** | The organizer's ID — attached to all event API payloads. |\n| `edit` | `boolean` | `false` | Edit mode — loads the event specified by `id`. |\n| `id` | `string` | — | Event ID to fetch in edit mode, or to resume an in-progress creation. |\n| `onEventCreated` | `(id: string) => void` | — | Callback after a successful create or update. |\n| `isClearing` | `boolean` | `false` | Renders a global loading overlay while the parent is resetting state. |\n| `SCOPED_ID_KEY` | `string` | `\"\"` | `localStorage` key for persisting the in-progress event ID between page reloads. |\n| `SCOPED_FORM_KEY` | `string` | `\"\"` | `localStorage` key for persisting form state between page reloads. |\n| `isSameQuestionTitleAllowed` | `boolean` | — | Allow duplicate question titles in the custom form builder. |\n| `closed_loop_id` | `string` | — | Attaches a closed-loop ID to the event payload. |\n| `initialStep` | `number` | — | Force the stepper to open at a specific step number on mount. |\n| `mode` | `\"questions\" \\| \"social\" \\| null` | `null` | Restrict the stepper to only the questions steps or only the social profiles step. |\n| `test` | `boolean` | `false` | **Dev only.** Enables free click-navigation between all steps, bypassing validation and event ID guards. |\n\n---\n\n## Configuration Reference\n\nAll keys are passed to `TicketlyUIProvider` via the `config` prop and stored in a singleton. Defaults are empty strings except `BASE_URL`.\n\n| Key | Description |\n|---|---|\n| `BASE_URL` | Base URL for all API calls. Default: `http://localhost:8080` |\n| `FIREBASE_API_KEY` | Firebase project API key |\n| `FIREBASE_AUTH_DOMAIN` | Firebase auth domain |\n| `FIREBASE_PROJECT_ID` | Firebase project ID |\n| `FIREBASE_STORAGE_BUCKET` | Firebase Storage bucket |\n| `FIREBASE_MESSAGING_SENDER_ID` | Firebase Cloud Messaging sender ID |\n| `FIREBASE_APP_ID` | Firebase app ID |\n| `FIREBASE_MEASUREMENT_ID` | Firebase Analytics measurement ID |\n| `GOOGLE_MAPS_API_KEY` | Google Maps API key (venue autocomplete) |\n| `PAYFAST_MERCHANT_ID` | PayFast merchant ID |\n| `PAYFAST_CHECKOUT_URL` | PayFast checkout callback URL |\n| `PAYFAST_API_URL` | PayFast API endpoint |\n| `PAYMO_PG_PAYFAST_CHECKOUT_URL` | Paymo PG PayFast callback URL |\n| `HEADER_KEY` | Request encryption header key |\n| `BODY_KEY` | Request encryption body key |\n| `TICKETING_PORTAL_HEADER_KEY` | Ticketing portal encryption header key |\n| `TICKETING_PORTAL_BODY_KEY` | Ticketing portal encryption body key |\n| `VENDOR_API_KEY` | Vendor API key |\n| `VENDOR_API_SECRET` | Vendor API secret |\n| `INSTAGRAM_URL` | Instagram URL used in social profile links |\n\n---\n\n## Services Interface\n\n```ts\ninterface TicketlyUIServices {\n  // Returns a valid Firebase ID token for authenticated API requests\n  getAuthToken: () => Promise<string | null>;\n\n  // Subscribe to auth state changes; returns an unsubscribe function\n  onAuthStateChanged: (callback: (user: any) => void) => () => void;\n\n  // Returns the current user's UID, or null if unauthenticated\n  getUserId: () => string | null;\n\n  // Returns whether the current user is authenticated\n  isAuthenticated: () => boolean;\n}\n```\n\n---\n\n## Exported Utilities\n\n```ts\nimport {\n  cn,                       // clsx + tailwind-merge\n  formatDateForApi,         // formats a Date to the API-expected string\n  formatDate,               // human-readable date string\n  formatDateTime,           // human-readable date + time string\n  isSameDay,                // compares two dates by calendar day\n  isDefaultDateRange,       // checks if a range is still the default placeholder\n  toDate,                   // parses multiple input types to a Date\n  extractDateAndTime,       // splits a datetime string → { date, time }\n  convertDateFormat,        // converts between date format conventions\n  getDateRange,             // builds a { start, end } range object\n  getCurrentTierAndMember,  // resolves the active ticket tier and member info\n  encrypt,                  // AES-encrypt a string using HEADER_KEY / BODY_KEY\n  decrypt,                  // AES-decrypt a string\n  fetchWrapper,             // typed fetch wrapper used internally by all API calls\n} from '@123usmanhaider321/ui';\n```\n\n---\n\n## Redux API Hooks\n\nRe-exported from the library for use alongside the stepper in your own components:\n\n```ts\nimport {\n  useAddEventMutation,\n  useUpdateEventMutation,\n  useGetEventDetailsByIdQuery,\n  useUpdateEventSocialProfilesMutation,\n  useSubmitEventForApprovalMutation,\n} from '@123usmanhaider321/ui';\n```\n\n---\n\n## Development — Playground\n\nA standalone Vite playground lets you develop and test components without a Next.js app.\n\n```bash\nnpm run playground\n# → http://127.0.0.1:5173\n```\n\nThe playground mocks `next/navigation`, `next/image`, `next/link`, and `next/dynamic` via Vite aliases in `playground/vite.config.ts` — no Next.js install required.\n\nEdit `playground/App.tsx` to swap in different components and configs.\n\n```bash\nnpm run build       # build the library → dist/ (ESM + type declarations)\nnpm run build:css   # compile Tailwind → dist/styles.css\n```\n","readmeFilename":"README.md"}