{"_id":"@adobe-commerce/aio-experience-kit","_rev":"13-c58cf85223dc0e29edc1c8a985ea3174","name":"@adobe-commerce/aio-experience-kit","dist-tags":{"latest":"1.0.9"},"versions":{"1.0.0":{"name":"@adobe-commerce/aio-experience-kit","version":"1.0.0","keywords":["typescript","aio","typescript-library","admin-ui","ui-components","typescript-react","react-spectrum","adobe-commerce","adobe-app-builder"],"author":{"name":"Hitarth Pattani","email":"hpattani@adobe.com"},"license":"SEE LICENSE IN LICENSE","_id":"@adobe-commerce/aio-experience-kit@1.0.0","maintainers":[{"name":"grahamcrackers","email":"gmrogers04@gmail.com"},{"name":"kaydenalthen","email":"althen@adobe.com"},{"name":"depatil","email":"depatil@adobe.com"},{"name":"r48patel","email":"r48patel@gmail.com"},{"name":"wbrandon_adobe","email":"wbrandon@adobe.com"}],"dist":{"shasum":"d64f045310b627d0891e95b0b1129efb4aecab0e","tarball":"https://registry.npmjs.org/@adobe-commerce/aio-experience-kit/-/aio-experience-kit-1.0.0.tgz","fileCount":186,"integrity":"sha512-RuNV82srSEkfBonzAqQfiDE18HQMCSbBg4oDaeq2RjDVw2TqSFunOBL8MdY2iEEfFIYAi7X5NPZRlqUZQtK9Fg==","signatures":[{"sig":"MEUCIQCJMlbUosDzk9sPhsJSsFNzCpKq/c5E3o0b7tQtmlL/tgIgfPPzseGYz1d3TcZtKe2bvtWn/lToHRbtPcDNR8MLAcw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":435724},"main":"./dist/cjs/index.js","types":"./dist/esm/types/index.d.ts","module":"./dist/esm/index.js","engines":{"npm":">=7.0.0","node":">=16.0.0"},"exports":{".":{"types":"./dist/esm/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"}},"gitHead":"aaf9ef9c5bfbd690c4c453f67391f9c18d81c7ce","scripts":{"dev":"rollup -c -w","lint":"eslint src test --ext .ts,.tsx","test":"jest","build":"rollup -c","clean":"rimraf dist","format":"prettier --write \"{src,test}/**/*.{ts,tsx}\"","prepack":"npm run clean && npm run build","prepare":"husky","test:ci":"jest --ci --coverage --watchAll=false","lint:fix":"eslint src test --ext .ts,.tsx --fix","test:fast":"jest --passWithNoTests --silent","typecheck":"tsc --noEmit","test:watch":"jest --watch","type-check":"tsc --noEmit","build:watch":"rollup -c -w","format:check":"prettier --check \"{src,test}/**/*.{ts,tsx}\"","test:coverage":"jest --coverage","validate:push":"npm run format:check && npm run lint && npm run type-check && npm run test:ci && npm run build","prepublishOnly":"npm run clean && npm run build","validate:commit":"npm run type-check && npm run lint:fix && npm run format && npm run test:fast"},"_npmUser":{"name":"r48patel","email":"r48patel@gmail.com"},"_npmVersion":"10.8.2","description":"A comprehensive TypeScript toolkit for building Adobe Commerce Admin UI extensions with React Spectrum components. Provides production-ready components and utilities for Adobe I/O extensibility platform integration.","directories":{},"lint-staged":{"src/**/*.{ts,tsx}":["eslint --fix","prettier --write"],"test/**/*.{ts,tsx}":["eslint --fix","prettier --write"]},"_nodeVersion":"20.19.5","dependencies":{"@adobe/uix-guest":"^1.0.4","@adobe/react-spectrum":"^3.36.0","@react-spectrum/provider":"^3.9.9","@react-spectrum/theme-default":"^3.4.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","react":"^18.2.0","tslib":"^2.6.2","eslint":"^8.57.0","rimraf":"^5.0.5","rollup":"^4.12.0","ts-jest":"^29.4.1","prettier":"^3.2.5","react-dom":"^18.2.0","typescript":"^5.3.3","@babel/core":"^7.24.0","@types/jest":"^29.5.12","lint-staged":"^16.1.6","@types/react":"^18.2.61","@commitlint/cli":"^19.8.1","@types/react-dom":"^18.2.19","react-router-dom":"^6.30.1","@babel/preset-env":"^7.24.0","identity-obj-proxy":"^3.0.0","@babel/preset-react":"^7.24.0","eslint-plugin-react":"^7.34.0","@rollup/plugin-babel":"^6.0.4","@testing-library/react":"^14.2.1","eslint-config-prettier":"^9.1.2","eslint-plugin-prettier":"^5.5.4","jest-environment-jsdom":"^29.7.0","@rollup/plugin-commonjs":"^25.0.7","@babel/preset-typescript":"^7.24.0","@rollup/plugin-typescript":"^11.1.6","@testing-library/jest-dom":"^6.4.2","@typescript-eslint/parser":"^8.43.0","eslint-plugin-react-hooks":"^4.6.0","@rollup/plugin-node-resolve":"^15.2.3","@testing-library/user-event":"^14.5.2","@commitlint/config-conventional":"^19.8.1","@typescript-eslint/eslint-plugin":"^8.43.0","rollup-plugin-peer-deps-external":"^2.2.4"},"peerDependencies":{"react":">=16.8.0","react-dom":">=16.8.0","react-router-dom":">=6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/aio-experience-kit_1.0.0_1758565061939_0.509571367045885","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@adobe-commerce/aio-experience-kit","version":"1.0.1","keywords":["typescript","aio","typescript-library","admin-ui","ui-components","typescript-react","react-spectrum","adobe-commerce","adobe-app-builder"],"author":{"name":"Hitarth Pattani","email":"hpattani@adobe.com"},"license":"SEE LICENSE IN LICENSE","_id":"@adobe-commerce/aio-experience-kit@1.0.1","maintainers":[{"name":"grahamcrackers","email":"gmrogers04@gmail.com"},{"name":"kaydenalthen","email":"althen@adobe.com"},{"name":"depatil","email":"depatil@adobe.com"},{"name":"r48patel","email":"r48patel@gmail.com"},{"name":"wbrandon_adobe","email":"wbrandon@adobe.com"}],"dist":{"shasum":"cd925ad1cf8e86b1b02cda0ad9afc5eeca13fb68","tarball":"https://registry.npmjs.org/@adobe-commerce/aio-experience-kit/-/aio-experience-kit-1.0.1.tgz","fileCount":194,"integrity":"sha512-WwZp7TZkwxe+fXE+VSOo9B+5QEFdUSy/bE1drPOfUqA1M79Bh3EoSBjA0+zT0QUPJjHnwNUxSAOGMBCGTHfNRQ==","signatures":[{"sig":"MEUCIQC5zQDMTMNgS4G4q2tjfAkhTM3H34rujZAkUeXI5pB7HAIgCLepYBQjnMLyXMVqZ5ZZf9vfiGJ1dNZVzqmia4DqLjU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":539000},"main":"./dist/cjs/index.js","types":"./dist/esm/types/index.d.ts","module":"./dist/esm/index.js","engines":{"npm":">=7.0.0","node":">=16.0.0"},"exports":{".":{"types":"./dist/esm/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"}},"gitHead":"fdc34352a8fd544c0c9635ae43a3ac1c12bdedf9","scripts":{"dev":"rollup -c -w","lint":"eslint src test","test":"jest","build":"rollup -c","clean":"rimraf dist","format":"prettier --write \"{src,test}/**/*.{ts,tsx}\"","prepack":"npm run clean && npm run build","prepare":"husky","test:ci":"jest --ci --coverage --watchAll=false","lint:fix":"eslint src test --fix","test:fast":"jest --passWithNoTests --silent","typecheck":"tsc --noEmit","test:watch":"jest --watch","type-check":"tsc --noEmit","build:watch":"rollup -c -w","format:check":"prettier --check \"{src,test}/**/*.{ts,tsx}\"","test:coverage":"jest --coverage","validate:push":"npm run format:check && npm run lint && npm run type-check && npm run test:ci && npm run build","prepublishOnly":"npm run clean && npm run build","validate:commit":"npm run type-check && npm run lint:fix && npm run format && npm run test:fast"},"_npmUser":{"name":"r48patel","email":"r48patel@gmail.com"},"_npmVersion":"10.8.2","description":"A comprehensive TypeScript toolkit for building Adobe Commerce Admin UI extensions with React Spectrum components. Provides production-ready components and utilities for Adobe I/O extensibility platform integration.","directories":{},"lint-staged":{"src/**/*.{ts,tsx}":["eslint --fix","prettier --write"],"test/**/*.{ts,tsx}":["eslint --fix","prettier --write"]},"_nodeVersion":"20.19.5","dependencies":{"@adobe/uix-guest":"^1.0.5","@adobe/react-spectrum":"^3.45.0","@react-spectrum/provider":"^3.10.11","@react-spectrum/theme-default":"^3.5.22"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","husky":"^9.1.7","react":"^18.3.1","tslib":"^2.8.1","eslint":"^9.37.0","rimraf":"^6.0.1","rollup":"^4.52.4","ts-jest":"^29.4.4","prettier":"^3.6.2","react-dom":"^18.3.1","@eslint/js":"^9.37.0","typescript":"^5.9.3","@babel/core":"^7.24.0","@types/jest":"^30.0.0","lint-staged":"^16.2.3","@types/react":"^18.3.26","@commitlint/cli":"^20.1.0","@types/react-dom":"^18.3.7","react-router-dom":"^6.30.1","@babel/preset-env":"^7.24.0","identity-obj-proxy":"^3.0.0","@babel/preset-react":"^7.24.0","eslint-plugin-react":"^7.37.5","@rollup/plugin-babel":"^6.0.4","@testing-library/react":"^16.3.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","jest-environment-jsdom":"^30.2.0","@rollup/plugin-commonjs":"^28.0.6","@babel/preset-typescript":"^7.24.0","@rollup/plugin-typescript":"^12.1.4","@testing-library/jest-dom":"^6.9.1","@typescript-eslint/parser":"^8.46.0","eslint-plugin-react-hooks":"^7.0.0","@rollup/plugin-node-resolve":"^16.0.2","@testing-library/user-event":"^14.6.1","@commitlint/config-conventional":"^20.0.0","@typescript-eslint/eslint-plugin":"^8.46.0","rollup-plugin-peer-deps-external":"^2.2.4"},"peerDependencies":{"react":">=16.8.0","react-dom":">=16.8.0","react-router-dom":">=6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/aio-experience-kit_1.0.1_1760452608815_0.7415006629689396","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@adobe-commerce/aio-experience-kit","version":"1.0.2","keywords":["typescript","aio","typescript-library","admin-ui","ui-components","typescript-react","react-spectrum","adobe-commerce","adobe-app-builder"],"author":{"name":"Hitarth Pattani","email":"hpattani@adobe.com"},"license":"SEE LICENSE IN LICENSE","_id":"@adobe-commerce/aio-experience-kit@1.0.2","maintainers":[{"name":"grahamcrackers","email":"gmrogers04@gmail.com"},{"name":"kaydenalthen","email":"althen@adobe.com"},{"name":"depatil","email":"depatil@adobe.com"},{"name":"r48patel","email":"r48patel@gmail.com"},{"name":"wbrandon_adobe","email":"wbrandon@adobe.com"},{"name":"adobe-commerce-ops","email":"adobe-commerce-ops@adobe.com"}],"dist":{"shasum":"c7dbe79696c2fee8b0da2323d407a8c4173212b0","tarball":"https://registry.npmjs.org/@adobe-commerce/aio-experience-kit/-/aio-experience-kit-1.0.2.tgz","fileCount":202,"integrity":"sha512-m+1Z8jxOrp/IKhJK673/rv7v8aICeh3yz5LyjCWuZhON5MxZ6n83Taghc+jQdsguhbXxSJAoVQ+8Ib1lX2OBGg==","signatures":[{"sig":"MEYCIQCdMeEvV1Qi8Vm0aoKCLKbCYiabi99OgDOJEeTOshAUSgIhALebkxQac9crdUh3A/55Zp4P6ESruKwkobXptnU4x2pC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":564256},"main":"./dist/cjs/index.js","types":"./dist/esm/types/index.d.ts","module":"./dist/esm/index.js","engines":{"npm":">=7.0.0","node":">=16.0.0"},"exports":{".":{"types":"./dist/esm/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"}},"gitHead":"71c9978c125922b5138c7345784606b4e0d15c29","scripts":{"dev":"rollup -c -w","lint":"eslint src test","test":"jest","build":"rollup -c","clean":"rimraf dist","format":"prettier --write \"{src,test}/**/*.{ts,tsx}\"","prepack":"npm run clean && npm run build","prepare":"husky","test:ci":"jest --ci --coverage --watchAll=false","lint:fix":"eslint src test --fix","test:fast":"jest --passWithNoTests --silent","typecheck":"tsc --noEmit","test:watch":"jest --watch","type-check":"tsc --noEmit","build:watch":"rollup -c -w","format:check":"prettier --check \"{src,test}/**/*.{ts,tsx}\"","test:coverage":"jest --coverage","validate:push":"npm run format:check && npm run lint && npm run type-check && npm run test:ci && npm run build","prepublishOnly":"npm run clean && npm run build","validate:commit":"npm run type-check && npm run lint:fix && npm run format && npm run test:fast"},"_npmUser":{"name":"adobe-commerce-ops","email":"adobe-commerce-ops@adobe.com"},"_npmVersion":"10.8.2","description":"A comprehensive TypeScript toolkit for building Adobe Commerce Admin UI extensions with React Spectrum components. Provides production-ready components and utilities for Adobe I/O extensibility platform integration.","directories":{},"lint-staged":{"src/**/*.{ts,tsx}":["eslint --fix","prettier --write"],"test/**/*.{ts,tsx}":["eslint --fix","prettier --write"]},"_nodeVersion":"20.19.5","dependencies":{"@adobe/uix-guest":"^1.0.5","@adobe/react-spectrum":"^3.45.0","@react-spectrum/provider":"^3.10.11","@react-spectrum/theme-default":"^3.5.22"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","husky":"^9.1.7","react":"^18.3.1","tslib":"^2.8.1","eslint":"^9.37.0","rimraf":"^6.0.1","rollup":"^4.52.4","ts-jest":"^29.4.4","prettier":"^3.6.2","react-dom":"^18.3.1","@eslint/js":"^9.37.0","typescript":"^5.9.3","@babel/core":"^7.24.0","@types/jest":"^30.0.0","lint-staged":"^16.2.3","@types/react":"^18.3.26","@commitlint/cli":"^20.1.0","@types/react-dom":"^18.3.7","react-router-dom":"^6.30.1","@babel/preset-env":"^7.24.0","identity-obj-proxy":"^3.0.0","@babel/preset-react":"^7.24.0","eslint-plugin-react":"^7.37.5","@rollup/plugin-babel":"^6.0.4","@testing-library/react":"^16.3.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","jest-environment-jsdom":"^30.2.0","@rollup/plugin-commonjs":"^28.0.6","@babel/preset-typescript":"^7.24.0","@rollup/plugin-typescript":"^12.1.4","@testing-library/jest-dom":"^6.9.1","@typescript-eslint/parser":"^8.46.0","eslint-plugin-react-hooks":"^7.0.0","@rollup/plugin-node-resolve":"^16.0.2","@testing-library/user-event":"^14.6.1","@commitlint/config-conventional":"^20.0.0","@typescript-eslint/eslint-plugin":"^8.46.0","rollup-plugin-peer-deps-external":"^2.2.4"},"peerDependencies":{"react":">=16.8.0","react-dom":">=16.8.0","react-router-dom":">=6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/aio-experience-kit_1.0.2_1763265495584_0.8197284926608279","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@adobe-commerce/aio-experience-kit","version":"1.0.3","keywords":["typescript","aio","typescript-library","admin-ui","ui-components","typescript-react","react-spectrum","adobe-commerce","adobe-app-builder"],"author":{"name":"Hitarth Pattani","email":"hpattani@adobe.com"},"license":"SEE LICENSE IN LICENSE","_id":"@adobe-commerce/aio-experience-kit@1.0.3","maintainers":[{"name":"grahamcrackers","email":"gmrogers04@gmail.com"},{"name":"kaydenalthen","email":"althen@adobe.com"},{"name":"depatil","email":"depatil@adobe.com"},{"name":"r48patel","email":"r48patel@gmail.com"},{"name":"wbrandon_adobe","email":"wbrandon@adobe.com"},{"name":"adobe-commerce-ops","email":"adobe-commerce-ops@adobe.com"}],"dist":{"shasum":"668f52243fbf491af851b6ed265a26738448649f","tarball":"https://registry.npmjs.org/@adobe-commerce/aio-experience-kit/-/aio-experience-kit-1.0.3.tgz","fileCount":202,"integrity":"sha512-qyd2XCMwfLLqIKYAl7u5uVNL7a7Dv8OXoXO7ly0QiZb3CXRji+AHHk0E8kIJqM5H2aP4o95E0IGUOiGDF62qUg==","signatures":[{"sig":"MEYCIQD2KfjCwyCeL5ptpXgDVpQUnvo2y8kEIjCjA3jGt5XcMwIhANGfjkeNOu90RK9xywUrGEguqPuMQNFspp1vs/wwXmfX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":573688},"main":"./dist/cjs/index.js","types":"./dist/esm/types/index.d.ts","module":"./dist/esm/index.js","engines":{"npm":">=7.0.0","node":">=16.0.0"},"exports":{".":{"types":"./dist/esm/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"}},"gitHead":"186f21363229e91f9cc11d8a8937551878185aeb","scripts":{"dev":"rollup -c -w","lint":"eslint src test","test":"jest","build":"rollup -c","clean":"rimraf dist","format":"prettier --write \"{src,test}/**/*.{ts,tsx}\"","prepack":"npm run clean && npm run build","prepare":"husky","test:ci":"jest --ci --coverage --watchAll=false","lint:fix":"eslint src test --fix","test:fast":"jest --passWithNoTests --silent","typecheck":"tsc --noEmit","test:watch":"jest --watch","type-check":"tsc --noEmit","build:watch":"rollup -c -w","format:check":"prettier --check \"{src,test}/**/*.{ts,tsx}\"","test:coverage":"jest --coverage","validate:push":"npm run format:check && npm run lint && npm run type-check && npm run test:ci && npm run build","prepublishOnly":"npm run clean && npm run build","validate:commit":"npm run type-check && npm run lint:fix && npm run format && npm run test:fast"},"_npmUser":{"name":"adobe-commerce-ops","email":"adobe-commerce-ops@adobe.com"},"_npmVersion":"10.8.2","description":"A comprehensive TypeScript toolkit for building Adobe Commerce Admin UI extensions with React Spectrum components. Provides production-ready components and utilities for Adobe I/O extensibility platform integration.","directories":{},"lint-staged":{"src/**/*.{ts,tsx}":["eslint --fix","prettier --write"],"test/**/*.{ts,tsx}":["eslint --fix","prettier --write"]},"_nodeVersion":"20.19.5","dependencies":{"@adobe/uix-guest":"^1.0.5","@adobe/react-spectrum":"^3.45.0","@react-spectrum/provider":"^3.10.11","@react-spectrum/theme-default":"^3.5.22"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","husky":"^9.1.7","react":"^18.3.1","tslib":"^2.8.1","eslint":"^9.37.0","rimraf":"^6.0.1","rollup":"^4.52.4","ts-jest":"^29.4.4","prettier":"^3.6.2","react-dom":"^18.3.1","@eslint/js":"^9.37.0","typescript":"^5.9.3","@babel/core":"^7.24.0","@types/jest":"^30.0.0","lint-staged":"^16.2.3","@types/react":"^18.3.26","@commitlint/cli":"^20.1.0","@types/react-dom":"^18.3.7","react-router-dom":"^6.30.1","@babel/preset-env":"^7.24.0","identity-obj-proxy":"^3.0.0","@babel/preset-react":"^7.24.0","eslint-plugin-react":"^7.37.5","@rollup/plugin-babel":"^6.0.4","@testing-library/react":"^16.3.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","jest-environment-jsdom":"^30.2.0","@rollup/plugin-commonjs":"^28.0.6","@babel/preset-typescript":"^7.24.0","@rollup/plugin-typescript":"^12.1.4","@testing-library/jest-dom":"^6.9.1","@typescript-eslint/parser":"^8.46.0","eslint-plugin-react-hooks":"^7.0.0","@rollup/plugin-node-resolve":"^16.0.2","@testing-library/user-event":"^14.6.1","@commitlint/config-conventional":"^20.0.0","@typescript-eslint/eslint-plugin":"^8.46.0","rollup-plugin-peer-deps-external":"^2.2.4"},"peerDependencies":{"react":">=16.8.0","react-dom":">=16.8.0","react-router-dom":">=6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/aio-experience-kit_1.0.3_1763528200907_0.1373774452004679","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@adobe-commerce/aio-experience-kit","version":"1.0.4","keywords":["typescript","aio","typescript-library","admin-ui","ui-components","typescript-react","react-spectrum","adobe-commerce","adobe-app-builder"],"author":{"name":"Hitarth Pattani","email":"hpattani@adobe.com"},"license":"SEE LICENSE IN LICENSE","_id":"@adobe-commerce/aio-experience-kit@1.0.4","maintainers":[{"name":"grahamcrackers","email":"gmrogers04@gmail.com"},{"name":"kaydenalthen","email":"althen@adobe.com"},{"name":"depatil","email":"depatil@adobe.com"},{"name":"r48patel","email":"r48patel@gmail.com"},{"name":"wbrandon_adobe","email":"wbrandon@adobe.com"},{"name":"adobe-commerce-ops","email":"adobe-commerce-ops@adobe.com"}],"dist":{"shasum":"6700a4a15e2a14b047fe0ae528dacabf7aacfc96","tarball":"https://registry.npmjs.org/@adobe-commerce/aio-experience-kit/-/aio-experience-kit-1.0.4.tgz","fileCount":216,"integrity":"sha512-KMQCPM43ik+gR6hxe4nfSL+SACpa+hezq7xatR6b0SUYKEe88pQC5U8Klur15fPl95jTFNMk4afCroNb7HuxiA==","signatures":[{"sig":"MEYCIQC9eMDrNmn7qr6atBKji2ZTbShgPLD5qZRYMqIsfWDeTQIhAP4qL5UhUKRuGi5XoWClRvY0layQiXY/yvN+zCe4oPUM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":725956},"main":"./dist/cjs/index.js","types":"./dist/esm/types/index.d.ts","module":"./dist/esm/index.js","engines":{"npm":">=7.0.0","node":">=16.0.0"},"exports":{".":{"types":"./dist/esm/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"}},"gitHead":"9625b486ea8037673d9d6e944d2a5a91684ebfa8","scripts":{"dev":"rollup -c -w","lint":"eslint src test","test":"jest","build":"rollup -c","clean":"rimraf dist","format":"prettier --write \"{src,test}/**/*.{ts,tsx}\"","prepack":"npm run clean && npm run build","prepare":"husky","test:ci":"jest --ci --coverage --watchAll=false","lint:fix":"eslint src test --fix","test:fast":"jest --passWithNoTests --silent","typecheck":"tsc --noEmit","test:watch":"jest --watch","type-check":"tsc --noEmit","build:watch":"rollup -c -w","format:check":"prettier --check \"{src,test}/**/*.{ts,tsx}\"","test:coverage":"jest --coverage","validate:push":"npm run format:check && npm run lint && npm run type-check && npm run test:ci && npm run build","prepublishOnly":"npm run clean && npm run build","validate:commit":"npm run type-check && npm run lint:fix && npm run format && npm run test:fast"},"_npmUser":{"name":"adobe-commerce-ops","email":"adobe-commerce-ops@adobe.com"},"_npmVersion":"10.8.2","description":"A comprehensive TypeScript toolkit for building Adobe Commerce Admin UI extensions with React Spectrum components. Provides production-ready components and utilities for Adobe I/O extensibility platform integration.","directories":{},"lint-staged":{"src/**/*.{ts,tsx}":["eslint --fix","prettier --write"],"test/**/*.{ts,tsx}":["eslint --fix","prettier --write"]},"_nodeVersion":"20.19.6","dependencies":{"@adobe/uix-guest":"^1.0.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","husky":"^9.1.7","react":"^18.3.1","tslib":"^2.8.1","eslint":"^9.37.0","rimraf":"^6.0.1","rollup":"^4.52.4","ts-jest":"^29.4.4","prettier":"^3.6.2","react-dom":"^18.3.1","@eslint/js":"^9.37.0","typescript":"^5.9.3","@babel/core":"^7.24.0","@types/jest":"^30.0.0","lint-staged":"^16.2.3","@types/react":"^18.3.26","@commitlint/cli":"^20.1.0","@types/react-dom":"^18.3.7","react-router-dom":"^6.30.1","@babel/preset-env":"^7.24.0","identity-obj-proxy":"^3.0.0","@babel/preset-react":"^7.24.0","eslint-plugin-react":"^7.37.5","@rollup/plugin-babel":"^6.0.4","@testing-library/react":"^16.3.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","jest-environment-jsdom":"^30.2.0","@rollup/plugin-commonjs":"^28.0.6","@babel/preset-typescript":"^7.24.0","@rollup/plugin-typescript":"^12.1.4","@testing-library/jest-dom":"^6.9.1","@typescript-eslint/parser":"^8.46.0","eslint-plugin-react-hooks":"^7.0.0","@rollup/plugin-node-resolve":"^16.0.2","@testing-library/user-event":"^14.6.1","@commitlint/config-conventional":"^20.0.0","@typescript-eslint/eslint-plugin":"^8.46.0","rollup-plugin-peer-deps-external":"^2.2.4"},"peerDependencies":{"react":">=16.8.0","react-dom":">=16.8.0","react-router-dom":">=6.0.0","@adobe/react-spectrum":">=3.4.0","@react-spectrum/provider":">=3.10.0","@react-spectrum/theme-default":">=3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/aio-experience-kit_1.0.4_1767363915934_0.19630993617613046","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@adobe-commerce/aio-experience-kit","version":"1.0.5","keywords":["typescript","aio","typescript-library","admin-ui","ui-components","typescript-react","react-spectrum","adobe-commerce","adobe-app-builder"],"author":{"name":"Hitarth Pattani","email":"hpattani@adobe.com"},"license":"SEE LICENSE IN LICENSE","_id":"@adobe-commerce/aio-experience-kit@1.0.5","maintainers":[{"name":"grahamcrackers","email":"gmrogers04@gmail.com"},{"name":"kaydenalthen","email":"althen@adobe.com"},{"name":"depatil","email":"depatil@adobe.com"},{"name":"r48patel","email":"r48patel@gmail.com"},{"name":"wbrandon_adobe","email":"wbrandon@adobe.com"},{"name":"adobe-commerce-ops","email":"adobe-commerce-ops@adobe.com"}],"dist":{"shasum":"efcdd373caef57a8484ea6c3b4e2e8ee4b2f08b4","tarball":"https://registry.npmjs.org/@adobe-commerce/aio-experience-kit/-/aio-experience-kit-1.0.5.tgz","fileCount":216,"integrity":"sha512-7YYnhL+zUZBFKZ49rYulhTujL6aYp7s74X4Xf7/eZNWNILFh2JEPPXgw1SdqrFznFF6eHschc7nOutHFlNvv4A==","signatures":[{"sig":"MEYCIQDhzaDVDXrM0xvdgQdI3fWxDXoR0PV5wCflQKMJHa+E9wIhAJLVIPolYoXdOByiWJ4tpCl3+POcxd2NtPoR4mAYrcAc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":751988},"main":"./dist/cjs/index.js","types":"./dist/esm/types/index.d.ts","module":"./dist/esm/index.js","engines":{"npm":">=7.0.0","node":">=16.0.0"},"exports":{".":{"types":"./dist/esm/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"}},"gitHead":"b68e5ef66b41df54b706177174b06c6f96872188","scripts":{"dev":"rollup -c -w","lint":"eslint src test","test":"jest","build":"rollup -c","clean":"rimraf dist","format":"prettier --write \"{src,test}/**/*.{ts,tsx}\"","prepack":"npm run clean && npm run build","prepare":"husky","test:ci":"jest --ci --coverage --watchAll=false","lint:fix":"eslint src test --fix","test:fast":"jest --passWithNoTests --silent","typecheck":"tsc --noEmit","test:watch":"jest --watch","type-check":"tsc --noEmit","build:watch":"rollup -c -w","format:check":"prettier --check \"{src,test}/**/*.{ts,tsx}\"","test:coverage":"jest --coverage","validate:push":"npm run format:check && npm run lint && npm run type-check && npm run test:ci && npm run build","prepublishOnly":"npm run clean && npm run build","validate:commit":"npm run type-check && npm run lint:fix && npm run format && npm run test:fast"},"_npmUser":{"name":"adobe-commerce-ops","email":"adobe-commerce-ops@adobe.com"},"_npmVersion":"10.8.2","description":"A comprehensive TypeScript toolkit for building Adobe Commerce Admin UI extensions with React Spectrum components. Provides production-ready components and utilities for Adobe I/O extensibility platform integration.","directories":{},"lint-staged":{"src/**/*.{ts,tsx}":["eslint --fix","prettier --write"],"test/**/*.{ts,tsx}":["eslint --fix","prettier --write"]},"_nodeVersion":"20.20.2","dependencies":{"@adobe/uix-guest":"^1.0.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","husky":"^9.1.7","react":"^18.3.1","tslib":"^2.8.1","eslint":"^9.37.0","rimraf":"^6.0.1","rollup":"^4.52.4","ts-jest":"^29.4.4","prettier":"^3.6.2","react-dom":"^18.3.1","@eslint/js":"^9.37.0","typescript":"^5.9.3","@babel/core":"^7.24.0","@types/jest":"^30.0.0","lint-staged":"^16.2.3","@types/react":"^18.3.26","@commitlint/cli":"^20.1.0","@types/react-dom":"^18.3.7","react-router-dom":"^6.30.1","@babel/preset-env":"^7.24.0","identity-obj-proxy":"^3.0.0","@babel/preset-react":"^7.24.0","eslint-plugin-react":"^7.37.5","@rollup/plugin-babel":"^6.0.4","@testing-library/react":"^16.3.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","jest-environment-jsdom":"^30.2.0","@rollup/plugin-commonjs":"^28.0.6","@babel/preset-typescript":"^7.24.0","@rollup/plugin-typescript":"^12.1.4","@testing-library/jest-dom":"^6.9.1","@typescript-eslint/parser":"^8.46.0","eslint-plugin-react-hooks":"^7.0.0","@rollup/plugin-node-resolve":"^16.0.2","@testing-library/user-event":"^14.6.1","@commitlint/config-conventional":"^20.0.0","@typescript-eslint/eslint-plugin":"^8.46.0","rollup-plugin-peer-deps-external":"^2.2.4"},"peerDependencies":{"react":">=16.8.0","react-dom":">=16.8.0","react-router-dom":">=6.0.0","@adobe/react-spectrum":">=3.4.0","@internationalized/date":">=3.10.0","@react-spectrum/provider":">=3.10.0","@react-spectrum/theme-default":">=3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/aio-experience-kit_1.0.5_1786485410015_0.003055618301085472","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@adobe-commerce/aio-experience-kit","version":"1.0.6","keywords":["typescript","aio","typescript-library","admin-ui","ui-components","typescript-react","react-spectrum","adobe-commerce","adobe-app-builder"],"author":{"name":"Hitarth Pattani","email":"hpattani@adobe.com"},"license":"SEE LICENSE IN LICENSE","_id":"@adobe-commerce/aio-experience-kit@1.0.6","maintainers":[{"name":"grahamcrackers","email":"gmrogers04@gmail.com"},{"name":"kaydenalthen","email":"althen@adobe.com"},{"name":"depatil","email":"depatil@adobe.com"},{"name":"r48patel","email":"r48patel@gmail.com"},{"name":"wbrandon_adobe","email":"wbrandon@adobe.com"},{"name":"adobe-commerce-ops","email":"adobe-commerce-ops@adobe.com"}],"dist":{"shasum":"38ff566d3a5b0b809a1151b0d65b550cf20cf2fd","tarball":"https://registry.npmjs.org/@adobe-commerce/aio-experience-kit/-/aio-experience-kit-1.0.6.tgz","fileCount":224,"integrity":"sha512-VpDav/Jr67B+tSp79pDxUE+Mq3OMFA7vjHIRyr1Q+w7jmw3gC9xmcK0x/LzBbaVMRHQB4ZmC5Lfc+0KSUXmb0g==","signatures":[{"sig":"MEQCIEf0A1kYYSL8OnP+lEy7jbye8fwMURaMWOP/FrEqVqCaAiB3tTJZooUrjSKtop0VSnvk66ta4RWlzDsOq0GPV9H6fg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":795500},"main":"./dist/cjs/index.js","types":"./dist/esm/types/index.d.ts","module":"./dist/esm/index.js","engines":{"npm":">=7.0.0","node":">=16.0.0"},"exports":{".":{"types":"./dist/esm/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"}},"gitHead":"b805e87614fefab233abf424489dd7e4a9e3db8a","scripts":{"dev":"rollup -c -w","lint":"eslint src test","test":"jest","build":"rollup -c","clean":"rimraf dist","format":"prettier --write \"{src,test}/**/*.{ts,tsx}\"","prepack":"npm run clean && npm run build","prepare":"husky","test:ci":"jest --ci --coverage --watchAll=false","lint:fix":"eslint src test --fix","test:fast":"jest --passWithNoTests --silent","typecheck":"tsc --noEmit","test:watch":"jest --watch","type-check":"tsc --noEmit","build:watch":"rollup -c -w","format:check":"prettier --check \"{src,test}/**/*.{ts,tsx}\"","test:coverage":"jest --coverage","validate:push":"npm run format:check && npm run lint && npm run type-check && npm run test:ci && npm run build","prepublishOnly":"npm run clean && npm run build","validate:commit":"npm run type-check && npm run lint:fix && npm run format && npm run test:fast"},"_npmUser":{"name":"adobe-commerce-ops","email":"adobe-commerce-ops@adobe.com"},"_npmVersion":"10.8.2","description":"A comprehensive TypeScript toolkit for building Adobe Commerce Admin UI extensions with React Spectrum components. Provides production-ready components and utilities for Adobe I/O extensibility platform integration.","directories":{},"lint-staged":{"src/**/*.{ts,tsx}":["eslint --fix","prettier --write"],"test/**/*.{ts,tsx}":["eslint --fix","prettier --write"]},"_nodeVersion":"20.20.2","dependencies":{"@adobe/uix-guest":"^1.0.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","husky":"^9.1.7","react":"^18.3.1","tslib":"^2.8.1","eslint":"^9.37.0","rimraf":"^6.0.1","rollup":"^4.52.4","ts-jest":"^29.4.4","prettier":"^3.6.2","react-dom":"^18.3.1","@eslint/js":"^9.37.0","typescript":"^5.9.3","@babel/core":"^7.24.0","@types/jest":"^30.0.0","lint-staged":"^16.2.3","@types/react":"^18.3.26","@commitlint/cli":"^20.1.0","@types/react-dom":"^18.3.7","react-router-dom":"^6.30.1","@babel/preset-env":"^7.24.0","identity-obj-proxy":"^3.0.0","@babel/preset-react":"^7.24.0","eslint-plugin-react":"^7.37.5","@rollup/plugin-babel":"^6.0.4","@testing-library/react":"^16.3.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","jest-environment-jsdom":"^30.2.0","@rollup/plugin-commonjs":"^28.0.6","@babel/preset-typescript":"^7.24.0","@rollup/plugin-typescript":"^12.1.4","@testing-library/jest-dom":"^6.9.1","@typescript-eslint/parser":"^8.46.0","eslint-plugin-react-hooks":"^7.0.0","@rollup/plugin-node-resolve":"^16.0.2","@testing-library/user-event":"^14.6.1","@commitlint/config-conventional":"^20.0.0","@typescript-eslint/eslint-plugin":"^8.46.0","rollup-plugin-peer-deps-external":"^2.2.4"},"peerDependencies":{"react":">=16.8.0","react-dom":">=16.8.0","react-router-dom":">=6.0.0","@adobe/react-spectrum":">=3.4.0","@internationalized/date":">=3.10.0","@react-spectrum/provider":">=3.10.0","@react-spectrum/theme-default":">=3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/aio-experience-kit_1.0.6_1786547663785_0.43474519036251635","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"@adobe-commerce/aio-experience-kit","version":"1.0.7","keywords":["typescript","aio","typescript-library","admin-ui","ui-components","typescript-react","react-spectrum","adobe-commerce","adobe-app-builder"],"author":{"name":"Hitarth Pattani","email":"hpattani@adobe.com"},"license":"SEE LICENSE IN LICENSE","_id":"@adobe-commerce/aio-experience-kit@1.0.7","maintainers":[{"name":"grahamcrackers","email":"gmrogers04@gmail.com"},{"name":"kaydenalthen","email":"althen@adobe.com"},{"name":"depatil","email":"depatil@adobe.com"},{"name":"r48patel","email":"r48patel@gmail.com"},{"name":"wbrandon_adobe","email":"wbrandon@adobe.com"},{"name":"adobe-commerce-ops","email":"adobe-commerce-ops@adobe.com"}],"dist":{"shasum":"840421e6fe679cf0bd0a6014b25d54bc5ad3061e","tarball":"https://registry.npmjs.org/@adobe-commerce/aio-experience-kit/-/aio-experience-kit-1.0.7.tgz","fileCount":224,"integrity":"sha512-el1oQOxVKa20v9gK77DwewlGu+EuIMvka4uKLJXs6YSxYQJs9D/MFEuSqEb2VBhBVAO/vEW/QcNZ0OFrYFUlGg==","signatures":[{"sig":"MEYCIQDt1EcSlh3Ld2M0+e3NOCx2PBjVK9jSSii+TXWqPAHapwIhAIMmip0z/U6IoDnVv40RXcpws/Gt/OvtwsuDRVbckJbp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":796641},"main":"./dist/cjs/index.js","types":"./dist/esm/types/index.d.ts","module":"./dist/esm/index.js","engines":{"npm":">=7.0.0","node":">=16.0.0"},"exports":{".":{"types":"./dist/esm/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"}},"gitHead":"7f82c9e98ff88c1ab2ec3bed6edee2f5c4052159","scripts":{"dev":"rollup -c -w","lint":"eslint src test","test":"jest","build":"rollup -c","clean":"rimraf dist","format":"prettier --write \"{src,test}/**/*.{ts,tsx}\"","prepack":"npm run clean && npm run build","prepare":"husky","test:ci":"jest --ci --coverage --watchAll=false","lint:fix":"eslint src test --fix","test:fast":"jest --passWithNoTests --silent","typecheck":"tsc --noEmit","test:watch":"jest --watch","type-check":"tsc --noEmit","build:watch":"rollup -c -w","format:check":"prettier --check \"{src,test}/**/*.{ts,tsx}\"","test:coverage":"jest --coverage","validate:push":"npm run format:check && npm run lint && npm run type-check && npm run test:ci && npm run build","prepublishOnly":"npm run clean && npm run build","validate:commit":"npm run type-check && npm run lint:fix && npm run format && npm run test:fast"},"_npmUser":{"name":"adobe-commerce-ops","email":"adobe-commerce-ops@adobe.com"},"_npmVersion":"10.8.2","description":"A comprehensive TypeScript toolkit for building Adobe Commerce Admin UI extensions with React Spectrum components. Provides production-ready components and utilities for Adobe I/O extensibility platform integration.","directories":{},"lint-staged":{"src/**/*.{ts,tsx}":["eslint --fix","prettier --write"],"test/**/*.{ts,tsx}":["eslint --fix","prettier --write"]},"_nodeVersion":"20.20.2","dependencies":{"@adobe/uix-guest":"^1.0.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","husky":"^9.1.7","react":"^18.3.1","tslib":"^2.8.1","eslint":"^9.37.0","rimraf":"^6.0.1","rollup":"^4.52.4","ts-jest":"^29.4.4","prettier":"^3.6.2","react-dom":"^18.3.1","@eslint/js":"^9.37.0","typescript":"^5.9.3","@babel/core":"^7.24.0","@types/jest":"^30.0.0","lint-staged":"^16.2.3","@types/react":"^18.3.26","@commitlint/cli":"^20.1.0","@types/react-dom":"^18.3.7","react-router-dom":"^6.30.1","@babel/preset-env":"^7.24.0","identity-obj-proxy":"^3.0.0","@babel/preset-react":"^7.24.0","eslint-plugin-react":"^7.37.5","@rollup/plugin-babel":"^6.0.4","@testing-library/react":"^16.3.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","jest-environment-jsdom":"^30.2.0","@rollup/plugin-commonjs":"^28.0.6","@babel/preset-typescript":"^7.24.0","@rollup/plugin-typescript":"^12.1.4","@testing-library/jest-dom":"^6.9.1","@typescript-eslint/parser":"^8.46.0","eslint-plugin-react-hooks":"^7.0.0","@rollup/plugin-node-resolve":"^16.0.2","@testing-library/user-event":"^14.6.1","@commitlint/config-conventional":"^20.0.0","@typescript-eslint/eslint-plugin":"^8.46.0","rollup-plugin-peer-deps-external":"^2.2.4"},"peerDependencies":{"react":">=16.8.0","react-dom":">=16.8.0","react-router-dom":">=6.0.0","@adobe/react-spectrum":">=3.4.0","@internationalized/date":">=3.10.0","@react-spectrum/provider":">=3.10.0","@react-spectrum/theme-default":">=3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/aio-experience-kit_1.0.7_1787102935502_0.27993962986875176","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"@adobe-commerce/aio-experience-kit","version":"1.0.8","keywords":["typescript","aio","typescript-library","admin-ui","ui-components","typescript-react","react-spectrum","adobe-commerce","adobe-app-builder"],"author":{"name":"Hitarth Pattani","email":"hpattani@adobe.com"},"license":"SEE LICENSE IN LICENSE","_id":"@adobe-commerce/aio-experience-kit@1.0.8","maintainers":[{"name":"grahamcrackers","email":"gmrogers04@gmail.com"},{"name":"kaydenalthen","email":"althen@adobe.com"},{"name":"depatil","email":"depatil@adobe.com"},{"name":"r48patel","email":"r48patel@gmail.com"},{"name":"wbrandon_adobe","email":"wbrandon@adobe.com"},{"name":"adobe-commerce-ops","email":"adobe-commerce-ops@adobe.com"}],"dist":{"shasum":"e132d67e0d616374c2cfe3461104c05f40ab719d","tarball":"https://registry.npmjs.org/@adobe-commerce/aio-experience-kit/-/aio-experience-kit-1.0.8.tgz","fileCount":224,"integrity":"sha512-Aw1AkdwJkuowVE51TWHm9dK0ByALWg89QgR4seHqnV6MhPv0OzW0bU/NdMTX80n8w/m6ncspuTlkpqfbtVkmoQ==","signatures":[{"sig":"MEYCIQCVifckaiz/5YyGwOwE2srUpoO+8OSesc1iHWbkAk+zrAIhAL+lxEQUL1Kp8CQzHYidO904J4aNuUG94LTK0bBtaPn5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":830438},"main":"./dist/cjs/index.js","types":"./dist/esm/types/index.d.ts","module":"./dist/esm/index.js","engines":{"npm":">=7.0.0","node":">=16.0.0"},"exports":{".":{"types":"./dist/esm/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"}},"gitHead":"1cae6b46c30d87bb5263fbe30f51c80bfc4dc2e1","scripts":{"dev":"rollup -c -w","lint":"eslint src test","test":"jest","build":"rollup -c","clean":"rimraf dist","format":"prettier --write \"{src,test}/**/*.{ts,tsx}\"","prepack":"npm run clean && npm run build","prepare":"husky","test:ci":"jest --ci --coverage --watchAll=false","lint:fix":"eslint src test --fix","test:fast":"jest --passWithNoTests --silent","typecheck":"tsc --noEmit","test:watch":"jest --watch","type-check":"tsc --noEmit","build:watch":"rollup -c -w","format:check":"prettier --check \"{src,test}/**/*.{ts,tsx}\"","test:coverage":"jest --coverage","validate:push":"npm run format:check && npm run lint && npm run type-check && npm run test:ci && npm run build","prepublishOnly":"npm run clean && npm run build","validate:commit":"npm run type-check && npm run lint:fix && npm run format && npm run test:fast"},"_npmUser":{"name":"adobe-commerce-ops","email":"adobe-commerce-ops@adobe.com"},"_npmVersion":"10.8.2","description":"A comprehensive TypeScript toolkit for building Adobe Commerce Admin UI extensions with React Spectrum components. Provides production-ready components and utilities for Adobe I/O extensibility platform integration.","directories":{},"lint-staged":{"src/**/*.{ts,tsx}":["eslint --fix","prettier --write"],"test/**/*.{ts,tsx}":["eslint --fix","prettier --write"]},"_nodeVersion":"20.20.2","dependencies":{"@adobe/uix-guest":"^1.0.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","husky":"^9.1.7","react":"^18.3.1","tslib":"^2.8.1","eslint":"^9.37.0","rimraf":"^6.0.1","rollup":"^4.52.4","ts-jest":"^29.4.4","prettier":"^3.6.2","react-dom":"^18.3.1","@eslint/js":"^9.37.0","typescript":"^5.9.3","@babel/core":"^7.24.0","@types/jest":"^30.0.0","lint-staged":"^16.2.3","@types/react":"^18.3.26","@commitlint/cli":"^20.1.0","@types/react-dom":"^18.3.7","react-router-dom":"^6.30.1","@babel/preset-env":"^7.24.0","identity-obj-proxy":"^3.0.0","@babel/preset-react":"^7.24.0","eslint-plugin-react":"^7.37.5","@rollup/plugin-babel":"^6.0.4","@testing-library/react":"^16.3.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","jest-environment-jsdom":"^30.2.0","@rollup/plugin-commonjs":"^28.0.6","@babel/preset-typescript":"^7.24.0","@rollup/plugin-typescript":"^12.1.4","@testing-library/jest-dom":"^6.9.1","@typescript-eslint/parser":"^8.46.0","eslint-plugin-react-hooks":"^7.0.0","@rollup/plugin-node-resolve":"^16.0.2","@testing-library/user-event":"^14.6.1","@commitlint/config-conventional":"^20.0.0","@typescript-eslint/eslint-plugin":"^8.46.0","rollup-plugin-peer-deps-external":"^2.2.4"},"peerDependencies":{"react":">=16.8.0","react-dom":">=16.8.0","react-router-dom":">=6.0.0","@adobe/react-spectrum":">=3.4.0","@internationalized/date":">=3.10.0","@react-spectrum/provider":">=3.10.0","@react-spectrum/theme-default":">=3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/aio-experience-kit_1.0.8_1787264107173_0.867046402147126","host":"s3://npm-registry-packages-npm-production"}},"1.0.9":{"name":"@adobe-commerce/aio-experience-kit","version":"1.0.9","description":"A comprehensive TypeScript toolkit for building Adobe Commerce Admin UI extensions with React Spectrum components. Provides production-ready components and utilities for Adobe I/O extensibility platform integration.","main":"./dist/cjs/index.js","module":"./dist/esm/index.js","types":"./dist/esm/types/index.d.ts","exports":{".":{"types":"./dist/esm/types/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"}},"scripts":{"build":"rollup -c","build:watch":"rollup -c -w","dev":"rollup -c -w","test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage","lint":"eslint src test","lint:fix":"eslint src test --fix","format":"prettier --write \"{src,test}/**/*.{ts,tsx}\"","format:check":"prettier --check \"{src,test}/**/*.{ts,tsx}\"","typecheck":"tsc --noEmit","type-check":"tsc --noEmit","test:fast":"jest --passWithNoTests --silent","test:ci":"jest --ci --coverage --watchAll=false","validate:commit":"npm run type-check && npm run lint:fix && npm run format && npm run test:fast","validate:push":"npm run format:check && npm run lint && npm run type-check && npm run test:ci && npm run build","prepare":"husky","clean":"rimraf dist","prepublishOnly":"npm run clean && npm run build","prepack":"npm run clean && npm run build"},"publishConfig":{"access":"public"},"keywords":["typescript","aio","typescript-library","admin-ui","ui-components","typescript-react","react-spectrum","adobe-commerce","adobe-app-builder"],"author":{"name":"Hitarth Pattani","email":"hpattani@adobe.com"},"peerDependencies":{"react":">=16.8.0","react-dom":">=16.8.0","react-router-dom":">=6.0.0","@adobe/react-spectrum":">=3.4.0","@internationalized/date":">=3.10.0","@react-spectrum/provider":">=3.10.0","@react-spectrum/theme-default":">=3.5.0"},"dependencies":{"@adobe/uix-guest":"^1.0.5"},"devDependencies":{"@babel/core":"^7.24.0","@babel/preset-env":"^7.24.0","@babel/preset-react":"^7.24.0","@babel/preset-typescript":"^7.24.0","@commitlint/cli":"^20.1.0","@commitlint/config-conventional":"^20.0.0","@eslint/js":"^9.37.0","@rollup/plugin-babel":"^6.0.4","@rollup/plugin-commonjs":"^28.0.6","@rollup/plugin-node-resolve":"^16.0.2","@rollup/plugin-typescript":"^12.1.4","@testing-library/jest-dom":"^6.9.1","@testing-library/react":"^16.3.0","@testing-library/user-event":"^14.6.1","@types/jest":"^30.0.0","@types/react":"^18.3.26","@types/react-dom":"^18.3.7","@typescript-eslint/eslint-plugin":"^8.46.0","@typescript-eslint/parser":"^8.46.0","eslint":"^9.37.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","eslint-plugin-react":"^7.37.5","eslint-plugin-react-hooks":"^7.0.0","husky":"^9.1.7","identity-obj-proxy":"^3.0.0","jest":"^30.2.0","jest-environment-jsdom":"^30.2.0","lint-staged":"^16.2.3","prettier":"^3.6.2","react":"^18.3.1","react-dom":"^18.3.1","react-router-dom":"^6.30.1","rimraf":"^6.0.1","rollup":"^4.52.4","rollup-plugin-peer-deps-external":"^2.2.4","ts-jest":"^29.4.4","tslib":"^2.8.1","typescript":"^5.9.3"},"lint-staged":{"src/**/*.{ts,tsx}":["eslint --fix","prettier --write"],"test/**/*.{ts,tsx}":["eslint --fix","prettier --write"]},"engines":{"node":">=16.0.0","npm":">=7.0.0"},"license":"SEE LICENSE IN LICENSE","_id":"@adobe-commerce/aio-experience-kit@1.0.9","gitHead":"eee0062b396cf3f14beb3e99a7f798db67c413d2","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-abOIwBMX0JB+h9zwjR2H2phMfVxSYZwV6pgM9iAIsFNt3JKBoR05BRl6ZNCckq8jX5MsGUFCSIad4Z6vBlTRow==","shasum":"557cafafe39c33fd93365d6635da34724417b71d","tarball":"https://registry.npmjs.org/@adobe-commerce/aio-experience-kit/-/aio-experience-kit-1.0.9.tgz","fileCount":224,"unpackedSize":834512,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFS+0WC9FrFCu/eAClajS5Tx9fHnxqipdFfy+Ho47ILXAiBROAlzBQDoPRqJz/cYrlOEAWIC6i6+ixAa/X3Ul7vh2w=="}]},"_npmUser":{"name":"adobe-commerce-ops","email":"adobe-commerce-ops@adobe.com"},"directories":{},"maintainers":[{"name":"grahamcrackers","email":"gmrogers04@gmail.com"},{"name":"kaydenalthen","email":"althen@adobe.com"},{"name":"depatil","email":"depatil@adobe.com"},{"name":"r48patel","email":"r48patel@gmail.com"},{"name":"wbrandon_adobe","email":"wbrandon@adobe.com"},{"name":"adobe-commerce-ops","email":"adobe-commerce-ops@adobe.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/aio-experience-kit_1.0.9_1787268973017_0.8106866585621306"},"_hasShrinkwrap":false}},"time":{"created":"2025-09-22T18:17:41.831Z","modified":"2026-08-20T23:36:13.346Z","1.0.0":"2025-09-22T18:17:42.209Z","1.0.1":"2025-10-14T14:36:48.984Z","1.0.2":"2025-11-16T03:58:15.789Z","1.0.3":"2025-11-19T04:56:41.104Z","1.0.4":"2026-01-02T14:25:16.149Z","1.0.5":"2026-08-11T21:56:50.197Z","1.0.6":"2026-08-12T15:14:23.928Z","1.0.7":"2026-08-19T01:28:55.660Z","1.0.8":"2026-08-20T22:15:07.346Z","1.0.9":"2026-08-20T23:36:13.170Z"},"author":{"name":"Hitarth Pattani","email":"hpattani@adobe.com"},"license":"SEE LICENSE IN LICENSE","keywords":["typescript","aio","typescript-library","admin-ui","ui-components","typescript-react","react-spectrum","adobe-commerce","adobe-app-builder"],"description":"A comprehensive TypeScript toolkit for building Adobe Commerce Admin UI extensions with React Spectrum components. Provides production-ready components and utilities for Adobe I/O extensibility platform integration.","maintainers":[{"name":"grahamcrackers","email":"gmrogers04@gmail.com"},{"name":"kaydenalthen","email":"althen@adobe.com"},{"name":"depatil","email":"depatil@adobe.com"},{"name":"r48patel","email":"r48patel@gmail.com"},{"name":"wbrandon_adobe","email":"wbrandon@adobe.com"},{"name":"adobe-commerce-ops","email":"adobe-commerce-ops@adobe.com"}],"readme":"# @adobe-commerce/aio-experience-kit\n\n## Overview\n\nA TypeScript toolkit for building Adobe Commerce Admin UI extensions with React Spectrum components. This library provides production-ready components and utilities that integrate seamlessly with Adobe's I/O extensibility platform.\n\n**Key Benefits:**\n- **Rapid Development**: Pre-built components reduce development time from weeks to days\n- **Adobe Design Consistency**: All components follow Adobe Spectrum design principles\n- **Enterprise Ready**: Built-in accessibility, internationalization, and performance optimizations\n- **Developer Experience**: Full TypeScript support with intelligent code completion\n- **Extensible Architecture**: Modular design allows for easy customization and extension\n- **Production Tested**: Battle-tested components used in real Adobe Commerce extensions\n\n## Installation\n\nInstall the TypeScript library with custom React components using React Spectrum:\n\n```bash\nnpm install @adobe-commerce/aio-experience-kit\n```\n\n## Usage\n\nThe toolkit is organized into two main modules:\n\n### ⚛️ React Components\n\nA collection of specialized React components built on Adobe React Spectrum, designed for creating consistent and accessible admin interfaces.\n\n#### `MainContainer`\n\nThe main layout component for Adobe Commerce admin extensions. Provides flexible layouts with integrated navigation, routing, and responsive design.\n\n```javascript\nimport { MainContainer, LayoutOptions, NavigationOptions } from '@adobe-commerce/aio-experience-kit';\nimport { Text } from '@adobe/react-spectrum';\nimport HomeIcon from \"@spectrum-icons/workflow/Home\"\nimport BookIcon from \"@spectrum-icons/workflow/Book\"\n\nconst LibraryApp = (props) => {\n  const navigationButtons = [\n    {\n      label: \"Home\",\n      path: \"/\",\n      icon: <HomeIcon size={\"S\"} gridArea=\"Home\" />\n    }, {\n      label: \"Books\",\n      path: \"/book/grid\",\n      icon: <BookIcon size={\"S\"} gridArea=\"Books\" />\n    }\n  ];\n\n  const appRoutes = [\n    {\n      paths: ['/'],\n      component: <Text>Home</Text>\n    }, {\n      paths: ['/book/:component/', '/book/:component/:id'],\n      component: <Text>Books</Text>\n    }\n  ];\n\n  return (\n    <MainContainer\n      title=\"Library Application\"\n      titleLevel={1}\n      buttons={navigationButtons}\n      routes={appRoutes}\n      navigation={NavigationOptions.NavigationButtons}\n      layout={LayoutOptions.OneColumn}\n    />\n  );\n};\n```\n\n**Features:**\n- **Flexible Layouts**: Choose between OneColumn for focused content or TwoColumnLeft for navigation-heavy interfaces\n- **Smart Navigation**: Integrated navigation system supporting both link-based and button-based patterns\n- **Routing Integration**: Seamless React Router integration with automatic route matching and component rendering\n- **Responsive Design**: Automatically adapts to different screen sizes while maintaining usability\n- **Customizable Spacing**: Fine-grained control over padding, margins, and component spacing\n- **Accessibility First**: Built-in keyboard navigation, screen reader support, and focus management\n\n#### `DataTable`\n\nA powerful data grid component for displaying and managing tabular data with advanced features like sorting, selection, and bulk operations.\n\n```javascript\nimport React, { useState } from 'react';\nimport { View, ActionButton, Text } from '@adobe/react-spectrum';\nimport { DataTable, useRouteParams } from '@adobe-commerce/aio-experience-kit';\nimport AddCircle from '@spectrum-icons/workflow/AddCircle';\n\nconst EntityGrid = ({ actionCallHeaders }) => {\n  const { getNavigate } = useRouteParams();\n  const navigate = getNavigate();\n\n  const [isProcessing, setProcessing] = useState(false);\n  const [gridData, setGridData] = useState([]);\n  \n  const entityModel = new EntityModel(actionCallHeaders);\n  const columns = entityModel.columns();\n\n  const buttons = [\n    <ActionButton\n      variant=\"primary\"\n      type=\"button\"\n      marginEnd=\"size-150\"\n      isDisabled={isProcessing}\n      onPress={() => {\n        navigate('/entity/form');\n      }}\n    >\n      <AddCircle gridArea=\"Create Entity\" />\n      <Text>Create Entity</Text>\n    </ActionButton>\n  ];\n\n  const gridActions = [\n    { key: 'edit', text: 'Edit' },\n    { key: 'delete', text: 'Delete' }\n  ];\n\n  const massActions = [\n    { key: 'delete', text: 'Delete' }\n  ];\n\n  return (\n    <DataTable\n      columns={columns}\n      data={gridData}\n      buttons={buttons}\n      gridActions={gridActions}\n      massActions={massActions}\n      isProcessing={isProcessing}\n      onMassActionPress={async (key, ids) => {\n        switch (key) {\n          case 'delete':\n            // Process mass delete\n            break;\n        }\n      }}\n      onGridActionPress={async (key, item) => {\n        switch (key) {\n          case 'edit':\n            navigate(`/entity/form/${item.id}`);\n            break;\n          case 'delete':\n            // Process single delete\n            break;\n        }\n      }}\n      onGridLoad={async () => {\n        setGridData(await entityModel.list());\n      }}\n    />\n  );\n};\n\n// Entity Model\nclass EntityModel {\n  constructor(actionCallHeaders) {\n    this.actionCallHeaders = actionCallHeaders;\n  }\n\n  async list() {\n    // Load data using API\n    return [];\n  }\n\n  columns() {\n    return [\n      { name: 'Name', uid: 'name' },\n      { name: 'Status', uid: 'status' },\n      { name: 'Created At', uid: 'created_at' },\n      { name: 'Updated At', uid: 'updated_at' },\n      { name: 'Actions', uid: 'actions' }\n    ];\n  }\n}\n```\n\n**Vertical Scrolling for Large Datasets (v1.0.3+):**\n\nControl table height with automatic scrolling:\n\n```javascript\n<DataTable\n  columns={columns}\n  data={largeDataset}\n  maxHeight=\"size-6000\" // Spectrum token (480px)\n  // or maxHeight=\"500px\"  // CSS value\n  // or maxHeight=\"60vh\"   // Viewport height\n  onGridLoad={async () => {\n    // Load large dataset\n  }}\n/>\n```\n\n**Search and Filtering Capabilities:**\n\nAdd built-in search functionality to enable users to quickly find and filter records within your DataTable. The search bar is configurable and supports both button-triggered and search-as-you-type modes.\n\n*Example 1: Basic Search (Button Click Mode)*\n\n```javascript\n<DataTable\n  columns={columns}\n  data={data}\n  searchConfig={{\n    enabled: true,\n    placeholder: \"Search products...\",\n    searchOnType: false, // Only search when button clicked or Enter pressed\n  }}\n  onSearch={async (searchText) => {\n    // Triggered only on button click or Enter key\n    await fetchFilteredData(searchText);\n  }}\n/>\n```\n\n*Example 2: Search-as-you-type with Debounce (Recommended for Client-Side Filtering)*\n\n```javascript\nconst [allData, setAllData] = useState(products);\nconst [filteredData, setFilteredData] = useState(products);\n\n<DataTable\n  columns={columns}\n  data={filteredData} // Show filtered results\n  searchConfig={{\n    enabled: true,\n    searchOnType: true, // Search while typing\n    debounceMs: 300, // Wait 300ms after user stops typing\n    showClearButton: true,\n    minCharacters: 2, // Only search if 2+ characters entered\n  }}\n  onSearch={async (searchText) => {\n    if (!searchText) {\n      setFilteredData(allData); // Show all if search is empty\n      return;\n    }\n    \n    // Client-side filtering\n    const filtered = allData.filter(item =>\n      Object.values(item).some(val =>\n        String(val).toLowerCase().includes(searchText.toLowerCase())\n      )\n    );\n    setFilteredData(filtered);\n  }}\n/>\n```\n\n*Example 3: Server-Side Search with Loading State*\n\n```javascript\nconst [isSearching, setSearching] = useState(false);\n\n<DataTable\n  columns={columns}\n  data={data}\n  searchConfig={{\n    enabled: true,\n    isSearching: isSearching, // Shows spinner in search button\n    placeholder: \"Search across 10,000+ records...\",\n    searchOnType: true,\n    debounceMs: 800, // Longer debounce for server calls\n  }}\n  onSearch={async (searchText) => {\n    setSearching(true);\n    try {\n      const results = await apiSearchCall(searchText);\n      setData(results);\n    } finally {\n      setSearching(false);\n    }\n  }}\n/>\n```\n\n*Example 4: Column-Specific Search*\n\n```javascript\n<DataTable\n  columns={columns}\n  data={data}\n  searchConfig={{\n    enabled: true,\n    searchableColumns: ['name', 'sku', 'email'], // Only search these columns\n    caseSensitive: false,\n  }}\n  onSearch={async (searchText, searchColumns) => {\n    // searchColumns will be ['name', 'sku', 'email']\n    await searchInColumns(searchText, searchColumns);\n  }}\n/>\n```\n\n**Search Configuration Options:**\n\n| Property | Type | Default | Description |\n|----------|------|---------|-------------|\n| `enabled` | boolean | `false` | Enable/disable search bar |\n| `placeholder` | string | `\"Search...\"` | Placeholder text for search input |\n| `searchButtonLabel` | string | `\"Search\"` | Label text displayed on search button (shown with icon) |\n| `clearButtonLabel` | string | `\"Clear search\"` | Accessible label for clear button |\n| `showClearButton` | boolean | `true` | Show clear button when text exists |\n| `searchOnType` | boolean | `false` | Search while typing vs. button click only |\n| `debounceMs` | number | `300` | Debounce time for search-as-you-type (ms) |\n| `caseSensitive` | boolean | `false` | Case-sensitive search |\n| `searchableColumns` | string[] | `[]` | Specific columns to search (empty = all columns) |\n| `minCharacters` | number | `1` | Minimum characters before search triggers |\n| `maxLength` | number | `100` | Maximum length of search input |\n| `showResultsCount` | boolean | `false` | Show count of filtered results |\n| `isSearching` | boolean | `false` | Show loading state in search button |\n| `ariaLabel` | string | `\"Search table\"` | ARIA label for search input |\n\n**Search Behavior Modes:**\n\n- **Button Mode** (`searchOnType: false`): Search only triggers when the search button is clicked or Enter key is pressed. Ideal for server-side searches with expensive operations.\n  \n- **Type Mode** (`searchOnType: true`): Search triggers as the user types (with debouncing). Perfect for client-side filtering or real-time search experiences.\n\n**Keyboard Shortcuts:**\n- **Enter**: Triggers search in both modes (bypasses debounce in type mode)\n- **Escape**: Clears search when `showClearButton` is enabled\n\n**Accessibility Features:**\n- Full keyboard navigation support\n- Customizable ARIA labels for screen readers\n- Loading state announcements\n- High contrast mode support\n\n**Features:**\n- **Advanced Data Management**: Sortable columns with intelligent data type handling and custom sort functions\n- **Flexible Selection**: Support for single-row selection or multi-row selection with visual feedback\n- **Bulk Operations**: Mass action system for performing operations on multiple selected items\n- **Contextual Actions**: Per-row actions with customizable button layouts, links, or dropdown menus\n- **State Management**: Built-in loading states, empty state handling, and error boundary support\n- **Performance Optimized**: Virtual scrolling for large datasets with efficient re-rendering\n- **Scrollable Tables**: Optional maxHeight prop for vertical scrolling with large datasets (v1.0.3+)\n- **Search & Filter**: Built-in search bar with button and type modes, column-specific filtering\n- **User Experience**: Intuitive interactions with hover states, keyboard navigation, and clear visual hierarchy\n\n#### `DataForm`\n\nA dynamic form builder that creates forms from configuration objects with built-in validation and multiple field types.\n\n```javascript\nimport React, { useState } from 'react';\nimport { DataForm, useRouteParams, FieldType } from '@adobe-commerce/aio-experience-kit';\nimport { ToastQueue } from '@react-spectrum/toast';\n\nconst EntityForm = ({ actionCallHeaders, id = undefined }) => {\n  const entityModel = new EntityModel(actionCallHeaders);\n  \n  const [formFields, setFormFields] = useState({});\n  const [editItem, setEditItem] = useState({});\n  \n  const { getNavigate } = useRouteParams();\n  const navigate = getNavigate();\n\n  return (\n    <DataForm\n      components={formFields}\n      editItem={editItem}\n      onFormLoad={async () => {\n        // Load edit item first\n        let editItem = {};\n        if (id !== undefined) {\n          editItem = await entityModel.load(id);\n          setEditItem(editItem);\n        }\n        // Then load form fields\n        const formFields = entityModel.fields(editItem);\n        setFormFields(formFields);\n      }}\n      onFormSubmit={async (values) => {\n        try {\n          await entityModel.save(values);\n          ToastQueue.positive('Entity saved successfully', { timeout: 5000 });\n        } catch (e) {\n          ToastQueue.negative(e.message, { timeout: 5000 });\n        }\n      }}\n      onPostFormSubmit={() => {\n        navigate('/entity/grid');\n      }}\n      onBackPress={() => {\n        navigate('/entity/grid');\n      }}\n    />\n  );\n};\n\n// Entity Model\nclass EntityModel {\n  constructor(actionCallHeaders) {\n    this.actionCallHeaders = actionCallHeaders;\n  }\n\n  async load(id) {\n    // Load entity using API\n    return {};\n  }\n\n  async save(formValues) {\n    // Save entity using API\n    return [];\n  }\n\n  fields(editItem) {\n    return {\n      groups: [\n        {\n          code: 'entity_settings',\n          label: 'Entity Settings',\n          fields: [\n            {\n              label: 'Name',\n              code: 'name',\n              db_field: 'name',\n              type: FieldType.TEXT,\n              required: true\n            },\n            {\n              label: 'Status',\n              code: 'status',\n              db_field: 'status',\n              type: FieldType.SELECT,\n              required: true,\n              options: [\n                {\n                  value: '1',\n                  label: 'Enabled'\n                },\n                {\n                  value: '0',\n                  label: 'Disabled'\n                }\n              ]\n            },\n            {\n              label: 'Categories',\n              code: 'categories',\n              db_field: 'categories',\n              type: FieldType.MULTISELECT,\n              required: false,\n              options: [\n                {\n                  value: 'electronics',\n                  label: 'Electronics'\n                },\n                {\n                  value: 'clothing',\n                  label: 'Clothing'\n                },\n                {\n                  value: 'books',\n                  label: 'Books'\n                },\n                {\n                  value: 'home',\n                  label: 'Home & Garden'\n                }\n              ]\n            },\n            {\n              label: 'Featured Product',\n              code: 'featured',\n              db_field: 'featured',\n              type: FieldType.TOGGLE,\n              required: false\n            },\n            {\n              label: 'Notifications',\n              code: 'notifications',\n              db_field: 'notifications',\n              type: FieldType.TOGGLE,\n              required: false,\n              use_env_var: true\n            }\n          ]\n        }\n      ]\n    };\n  }\n}\n```\n\n##### Field Types\n\nThe DataForm component supports various field types for different input scenarios:\n\n**Basic Input Fields:**\n- `FieldType.TEXT` - Standard text input\n- `FieldType.EMAIL` - Email input with validation\n- `FieldType.PASSWORD` - Password input with masking\n- `FieldType.NUMBER` - Numeric input with validation\n- `FieldType.URL` - URL input with validation\n- `FieldType.TEL` - Telephone number input\n- `FieldType.SEARCH` - Search input with appropriate styling\n\n**Selection Fields:**\n- `FieldType.SELECT` - Single selection dropdown with options\n- `FieldType.MULTISELECT` - Multiple selection with checkboxes in a scrollable container\n- `FieldType.MULTISELECT_SEARCH` - Searchable multiple selection combining a filterable `ComboBox` with removable `TagGroup` tags; supports a static `options` array or an async `loadOptions(searchTerm, signal)` callback for remote/debounced search-as-you-type\n- `FieldType.TOGGLE` - Boolean toggle switch with '1'/'0' values\n\n**Date Fields:**\n- `FieldType.DATE` - Calendar date picker (React Spectrum `DatePicker`) with a built-in reset button to clear the selected date\n\n**Display Fields:**\n- `FieldType.LABEL` - Read-only display field for showing values\n\n**Field Configuration Examples:**\n\n```javascript\n// MULTISELECT field with scrollable options\n{\n  label: 'Product Categories',\n  code: 'categories',\n  db_field: 'categories',\n  type: FieldType.MULTISELECT,\n  required: false,\n  options: [\n    { value: 'electronics', label: 'Electronics' },\n    { value: 'clothing', label: 'Clothing' },\n    { value: 'books', label: 'Books' },\n    { value: 'home', label: 'Home & Garden' },\n    // ... more options (automatically scrollable when many)\n  ]\n}\n\n// MULTISELECT_SEARCH field with search-as-you-type filtering (static options)\n{\n  label: 'Product Categories',\n  code: 'categories_search',\n  db_field: 'categories_search',\n  type: FieldType.MULTISELECT_SEARCH,\n  required: false,\n  options: [\n    { value: 'electronics', label: 'Electronics' },\n    { value: 'clothing', label: 'Clothing' },\n    { value: 'books', label: 'Books' },\n    { value: 'home', label: 'Home & Garden' },\n    // ... more options (filterable by typing in the combobox)\n  ]\n  // Selected options render as removable tags below the search input\n}\n\n// MULTISELECT_SEARCH field backed by a remote/async data source\n{\n  label: 'Customer',\n  code: 'customer_search',\n  db_field: 'customer_search',\n  type: FieldType.MULTISELECT_SEARCH,\n  required: false,\n  // Called once on mount with an empty search term to seed the dropdown, then again\n  // (debounced) once the typed text reaches minSearchLength. Receives an AbortSignal that\n  // the component uses to cancel a call made stale by a newer one.\n  loadOptions: async (searchTerm, signal) => {\n    const response = await fetch(`/api/customers?q=${encodeURIComponent(searchTerm)}`, { signal });\n    const customers = await response.json();\n    return customers.map(customer => ({ value: customer.id, label: customer.name }));\n  },\n  minSearchLength: 3, // minimum characters typed before a live search fires (default: 3)\n  debounceMs: 500 // debounce delay after typing stops, in ms (default: 500)\n  // `options` is not used to populate the dropdown when `loadOptions` is provided, but can still\n  // be passed alongside it to resolve labels for pre-selected values (e.g. on an edit form) that\n  // aren't part of the initial, unfiltered `loadOptions('')` result\n}\n\n// TOGGLE field with automatic default value\n{\n  label: 'Enable Feature',\n  code: 'feature_enabled',\n  db_field: 'feature_enabled',\n  type: FieldType.TOGGLE,\n  required: false\n  // Automatically defaults to '0' if no value provided\n  // Returns '1' when enabled, '0' when disabled\n}\n\n// Field with environment variable support\n{\n  label: 'API Endpoint',\n  code: 'api_endpoint',\n  db_field: 'api_endpoint',\n  type: FieldType.TEXT,\n  required: true,\n  use_env_var: true  // Adds checkbox to use as environment variable\n}\n\n// DATE field with a built-in reset button\n{\n  label: 'Launch Date',\n  code: 'launch_date',\n  db_field: 'launch_date',\n  type: FieldType.DATE,\n  required: false\n  // Stored/submitted as an ISO date string (e.g. '2026-08-11')\n  // Renders a Reset action button next to the picker to clear the value\n}\n```\n\n##### Dependent Field Visibility\n\nThe DataForm component supports conditional field visibility based on the values of other fields. This allows you to create dynamic forms that show or hide fields based on user selections.\n\n**Basic Example:**\n\n```javascript\n{\n  groups: [\n    {\n      code: 'settings',\n      label: 'Settings',\n      fields: [\n        {\n          label: 'Enable Feature',\n          code: 'feature_enabled',\n          db_field: 'feature_enabled',\n          type: FieldType.TOGGLE,\n          required: false\n        },\n        {\n          label: 'Feature Configuration',\n          code: 'feature_config',\n          db_field: 'feature_config',\n          type: FieldType.TEXT,\n          required: false,\n          // This field only shows when feature_enabled is truthy\n          dependsOn: {\n            field: 'feature_enabled',\n            condition: { type: 'truthy' }\n          }\n        }\n      ]\n    }\n  ]\n}\n```\n\n**Dependency Condition Types:**\n\n```javascript\n// Equals - Show field when value matches exactly\ndependsOn: {\n  field: 'status',\n  condition: { type: 'equals', value: 'active' }\n}\n\n// Not Equals - Show field when value doesn't match\ndependsOn: {\n  field: 'status',\n  condition: { type: 'notEquals', value: 'disabled' }\n}\n\n// In - Show field when value is in array\ndependsOn: {\n  field: 'status',\n  condition: { type: 'in', values: ['pending', 'processing'] }\n}\n\n// Not In - Show field when value is not in array\ndependsOn: {\n  field: 'status',\n  condition: { type: 'notIn', values: ['cancelled', 'completed'] }\n}\n\n// Greater Than - Show field when numeric value is greater\ndependsOn: {\n  field: 'quantity',\n  condition: { type: 'greaterThan', value: 10 }\n}\n\n// Less Than - Show field when numeric value is less\ndependsOn: {\n  field: 'stock_level',\n  condition: { type: 'lessThan', value: 5 }\n}\n\n// Truthy - Show field when value is truthy (handles '0' and 'false' as falsy)\ndependsOn: {\n  field: 'enable_feature',\n  condition: { type: 'truthy' }\n}\n\n// Falsy - Show field when value is falsy\ndependsOn: {\n  field: 'enable_feature',\n  condition: { type: 'falsy' }\n}\n\n// Custom - Show field based on custom validation function\ndependsOn: {\n  field: 'username',\n  condition: {\n    type: 'custom',\n    validator: (value, allFormValues) => {\n      return value && value.length > 3;\n    }\n  }\n}\n```\n\n**Advanced Example - Multi-Step Configuration:**\n\n```javascript\n{\n  groups: [\n    {\n      code: 'shipping',\n      label: 'Shipping Configuration',\n      fields: [\n        {\n          label: 'Shipping Method',\n          code: 'shipping_method',\n          db_field: 'shipping_method',\n          type: FieldType.SELECT,\n          required: true,\n          options: [\n            { value: 'standard', label: 'Standard Shipping' },\n            { value: 'express', label: 'Express Shipping' },\n            { value: 'pickup', label: 'Store Pickup' }\n          ]\n        },\n        {\n          label: 'Carrier',\n          code: 'carrier',\n          db_field: 'carrier',\n          type: FieldType.SELECT,\n          required: true,\n          options: [\n            { value: 'ups', label: 'UPS' },\n            { value: 'fedex', label: 'FedEx' },\n            { value: 'usps', label: 'USPS' }\n          ],\n          // Only show carrier selection for standard and express shipping\n          dependsOn: {\n            field: 'shipping_method',\n            condition: { type: 'in', values: ['standard', 'express'] }\n          }\n        },\n        {\n          label: 'Tracking Number',\n          code: 'tracking_number',\n          db_field: 'tracking_number',\n          type: FieldType.TEXT,\n          required: false,\n          // Only show tracking for shipped methods\n          dependsOn: {\n            field: 'shipping_method',\n            condition: { type: 'notEquals', value: 'pickup' }\n          }\n        },\n        {\n          label: 'Store Location',\n          code: 'store_location',\n          db_field: 'store_location',\n          type: FieldType.SELECT,\n          required: true,\n          options: [\n            { value: 'store1', label: 'Main Street Store' },\n            { value: 'store2', label: 'Downtown Store' }\n          ],\n          // Only show store location for pickup\n          dependsOn: {\n            field: 'shipping_method',\n            condition: { type: 'equals', value: 'pickup' }\n          }\n        }\n      ]\n    }\n  ]\n}\n```\n\n**Dependency Configuration:**\n\n```typescript\ninterface FieldDependency {\n  field: string;                    // The code of the field this depends on\n  condition: DependencyCondition;   // The condition to evaluate\n  clearValueOnHide?: boolean;       // Whether to clear field value when hidden (default: false)\n}\n```\n\n**Key Features:**\n- **Dynamic Visibility**: Fields automatically show/hide based on dependency conditions\n- **Multiple Conditions**: Support for equals, notEquals, in, notIn, greaterThan, lessThan, truthy, falsy, and custom validators\n- **Validation Integration**: Hidden fields are excluded from form validation\n- **Value Management**: Optional automatic clearing of hidden field values\n- **Performance Optimized**: Uses React memoization to prevent unnecessary re-renders\n- **Chain Dependencies**: Fields can depend on other dependent fields\n- **Form Submission**: Hidden field values are automatically excluded from submission\n\n**Features:**\n- **Dynamic Form Generation**: Create complex forms from simple configuration objects without manual field creation\n- **Rich Field Types**: Support for text, email, password, number, select, multiselect, searchable multiselect, toggle, date, and specialized input types\n- **Conditional Field Visibility**: Show/hide fields dynamically based on other field values with multiple condition types\n- **Multi-Selection Support**: MULTISELECT field type with React Spectrum CheckboxGroup for selecting multiple options with scrollable overflow and accessibility support\n- **Searchable Multi-Selection Support**: MULTISELECT_SEARCH field type combining a filterable `ComboBox` with removable `TagGroup` tags for selecting multiple options by typing, with an optional `loadOptions` callback for debounced, remote/async search-as-you-type\n- **Toggle Controls**: TOGGLE field type using React Spectrum Switch component with '1'/'0' value handling and automatic default value initialization\n- **Date Selection**: DATE field type using React Spectrum `DatePicker` with an adjacent icon-only Reset button to clear the selected date\n- **Environment Variable Support**: Built-in support for environment variable checkboxes on compatible field types (TEXT, SELECT, MULTISELECT, MULTISELECT_SEARCH, TOGGLE, DATE)\n- **Intelligent Validation**: Built-in validation with custom rules, real-time feedback, and error messaging\n- **Workflow Integration**: Loading states, processing indicators, and navigation controls for multi-step workflows\n- **Organized Layout**: Logical field grouping with collapsible sections and intuitive information hierarchy\n- **Developer Friendly**: Event-driven architecture with lifecycle hooks for custom business logic integration\n- **Configurable Buttons**: Full control over form action buttons with custom labels, icons, visibility, positioning, and alignment\n\n##### Button Configuration\n\nThe DataForm component provides extensive button customization through the `buttonConfig` prop:\n\n**Basic Usage:**\n\n```javascript\n<DataForm\n  components={formFields}\n  editItem={editItem}\n  onFormLoad={onFormLoad}\n  onFormSubmit={onFormSubmit}\n  onBackPress={onBackPress}\n  buttonConfig={{\n    submitButton: { label: 'Create Product' },\n    backButton: { label: 'Cancel' },\n  }}\n/>\n```\n\n**Button Configuration Options:**\n\n```typescript\ninterface FormButtonConfig {\n  submitButton?: {\n    label?: string;           // Button text (default: \"Save\")\n    icon?: ReactElement;      // Custom icon (default: SaveFloppy)\n    isHidden?: boolean;       // Hide button (default: false)\n    ariaLabel?: string;       // Custom ARIA label\n  };\n  \n  backButton?: {\n    label?: string;           // Button text (default: \"Back\")\n    icon?: ReactElement;      // Custom icon (default: Back)\n    isHidden?: boolean;       // Hide button (default: false)\n    ariaLabel?: string;       // Custom ARIA label\n  };\n  \n  secondaryButtons?: Array<{\n    key: string;              // Unique identifier\n    label: string;            // Button text\n    icon?: ReactElement;      // Optional icon\n    onPress: () => Promise<void>; // Click handler\n    variant?: 'primary' | 'secondary' | 'negative'; // Style variant\n    isDisabled?: boolean;     // Disable state\n    type?: 'button' | 'submit'; // Button type (default: 'button')\n    ariaLabel?: string;       // Custom ARIA label\n  }>;\n  \n  position?: 'before' | 'after';  // Button position relative to form (default: 'after')\n  alignment?: 'start' | 'center' | 'end'; // Horizontal alignment (default: 'start')\n  gap?: 'small' | 'medium' | 'large'; // Spacing between buttons (default: 'small')\n}\n```\n\n**Common Use Cases:**\n\n```javascript\n// Example 1: Create vs Edit Forms\n<DataForm\n  buttonConfig={{\n    submitButton: { \n      label: isEditMode ? 'Update Product' : 'Create Product' \n    },\n  }}\n/>\n\n// Example 2: Modal Forms (hide back button)\n<DataForm\n  buttonConfig={{\n    submitButton: { label: 'Save Changes' },\n    backButton: { isHidden: true },\n  }}\n/>\n\n// Example 3: Wizard Forms with Navigation\n<DataForm\n  buttonConfig={{\n    submitButton: { label: 'Next Step' },\n    backButton: { label: 'Previous Step' },\n  }}\n/>\n\n// Example 4: Draft Workflow with Secondary Action\n<DataForm\n  buttonConfig={{\n    submitButton: { label: 'Save Draft' },\n    secondaryButtons: [\n      {\n        key: 'publish',\n        label: 'Publish',\n        variant: 'primary',\n        onPress: async () => {\n          await handlePublish();\n        },\n      },\n    ],\n  }}\n/>\n\n// Example 5: Edit Form with Delete Action\n<DataForm\n  buttonConfig={{\n    submitButton: { label: 'Update' },\n    secondaryButtons: [\n      {\n        key: 'delete',\n        label: 'Delete',\n        variant: 'negative',\n        onPress: async () => {\n          const confirmed = await showConfirmDialog();\n          if (confirmed) {\n            await handleDelete();\n            navigate('/products');\n          }\n        },\n      },\n    ],\n  }}\n/>\n\n// Example 6: Top-Aligned Buttons for Long Forms\n<DataForm\n  buttonConfig={{\n    submitButton: { label: 'Save' },\n    position: 'before',\n    alignment: 'end',\n  }}\n/>\n\n// Example 7: Right-Aligned Buttons (Dialog Pattern)\n<DataForm\n  buttonConfig={{\n    submitButton: { label: 'Confirm' },\n    backButton: { label: 'Cancel' },\n    alignment: 'end',\n  }}\n/>\n\n// Example 8: Multi-Action Workflow\n<DataForm\n  buttonConfig={{\n    submitButton: { label: 'Save' },\n    secondaryButtons: [\n      {\n        key: 'save-continue',\n        label: 'Save & Continue',\n        onPress: async () => {\n          await handleSave();\n          navigateToNext();\n        },\n      },\n      {\n        key: 'save-new',\n        label: 'Save & Add New',\n        onPress: async () => {\n          await handleSave();\n          resetForm();\n        },\n      },\n    ],\n  }}\n/>\n\n// Example 9: Custom Icons and ARIA Labels\nimport SaveFloppy from '@spectrum-icons/workflow/SaveFloppy';\nimport CheckmarkCircle from '@spectrum-icons/workflow/CheckmarkCircle';\n\n<DataForm\n  buttonConfig={{\n    submitButton: {\n      label: 'Approve',\n      icon: <CheckmarkCircle />,\n      ariaLabel: 'Approve and save changes',\n    },\n  }}\n/>\n\n// Example 10: Centered Buttons with Custom Gap\n<DataForm\n  buttonConfig={{\n    submitButton: { label: 'Submit' },\n    backButton: { label: 'Cancel' },\n    alignment: 'center',\n    gap: 'large',\n  }}\n/>\n```\n\n**Button Order and States:**\n\n- **Button Order**: ProgressCircle → Submit → Back → Secondary buttons (in order)\n- **Disabled States**: All buttons are automatically disabled during form submission or when `isProcessing` is true\n- **Loading States**: ProgressCircle shows automatically during submission, secondary buttons can show individual loading states\n- **Accessibility**: All buttons have proper ARIA labels and keyboard navigation support\n\n**Migration Notes:**\n\nFor existing implementations without `buttonConfig`, the default behavior is preserved:\n- Submit button labeled \"Save\" with SaveFloppy icon\n- Back button labeled \"Back\" with Back icon\n- Buttons positioned after the form with start (left) alignment\n- No breaking changes to existing code\n\n#### `ConfirmationDialog`\n\nA modal dialog component for user confirmations with customizable actions and styling. Perfect for delete confirmations and critical user decisions.\n\n```javascript\nimport React, { useState } from 'react';\nimport { View, ActionButton, Text } from '@adobe/react-spectrum';\nimport { DataTable, useRouteParams, ConfirmationDialog } from '@adobe-commerce/aio-experience-kit';\n\nconst EntityGrid = ({ actionCallHeaders }) => {\n  const { getNavigate } = useRouteParams();\n  const navigate = getNavigate();\n  const [isProcessing, setProcessing] = useState(false);\n  const [gridData, setGridData] = useState([]);\n  const [deleteMessage, setDeleteMessage] = useState('');\n  const [deleteKeys, setDeleteKeys] = useState([]);\n  \n  const entityModel = new EntityModel(actionCallHeaders);\n\n  return (\n    <View>\n      <DataTable\n        // ... other DataTable props\n        onMassActionPress={async (key, ids) => {\n          switch (key) {\n            case 'delete':\n              setDeleteKeys(ids);\n              setDeleteMessage(`Are you sure you want to delete ${ids.length} selected items?`);\n              break;\n          }\n        }}\n        onGridActionPress={async (key, item) => {\n          switch (key) {\n            case 'delete':\n              setDeleteKeys([item.id]);\n              setDeleteMessage(`Are you sure you want to delete \"${item.name}\"?`);\n              break;\n          }\n        }}\n      />\n\n      <ConfirmationDialog\n        title=\"Delete Dialog\"\n        message={deleteMessage}\n        primaryButtonVariant=\"negative\"\n        onDismiss={() => {\n          setDeleteMessage('');\n        }}\n        onSecondaryPress={() => {\n          setDeleteMessage('');\n        }}\n        onPrimaryPress={async () => {\n          setDeleteMessage('');\n          setProcessing(true);\n          setGridData(await entityModel.delete(deleteKeys));\n          setProcessing(false);\n        }}\n      />\n    </View>\n  );\n};\n\n// Entity Model\nclass EntityModel {\n  constructor(actionCallHeaders) {\n    this.actionCallHeaders = actionCallHeaders;\n  }\n\n  async delete(itemIds = []) {\n    // Delete entity using API\n    return [];\n  }\n}\n```\n\n**Features:**\n- **Flexible Content**: Customizable title, message, and button text to match any confirmation scenario\n- **Action Variants**: Support for different button styles (primary, secondary, negative) to indicate action severity\n- **User Experience**: Intuitive keyboard navigation with escape key dismissal and tab order management\n- **Accessibility Excellence**: Full screen reader support, proper ARIA labels, and focus trap implementation\n- **Design Consistency**: Follows Adobe Spectrum design patterns for familiar user interactions\n\n#### `FileUpload`\n\nA flexible file upload component with file validation and automatic content reading. Built on React Spectrum's FileTrigger for consistent Adobe design patterns.\n\n```javascript\nimport React, { useState } from 'react';\nimport { View } from '@adobe/react-spectrum';\nimport { FileUpload } from '@adobe-commerce/aio-experience-kit';\nimport { ToastQueue } from '@react-spectrum/toast';\n\nconst DocumentUploader = () => {\n  const [isProcessing, setProcessing] = useState(false);\n\n  return (\n    <View>\n      <FileUpload\n        label=\"Upload Documents\"\n        isRequired={true}\n        acceptedFileTypes={['application/pdf', '.doc', '.docx']}\n        allowsMultiple={true}\n        isDisabled={isProcessing}\n        onSelect={async (files) => {\n          setProcessing(true);\n          try {\n            // Process each file\n          } catch (error) {\n            ToastQueue.negative(`Upload failed: ${error.message}`, { timeout: 5000 });\n          } finally {\n            setProcessing(false);\n          }\n        }}\n      />\n    </View>\n  );\n};\n```\n\n**Programmatic Control with Refs (v1.0.3+):**\n\nReset the component programmatically from parent components:\n\n```javascript\nimport React, { useRef } from 'react';\nimport { FileUpload, FileUploadHandle } from '@adobe-commerce/aio-experience-kit';\n\nconst MyForm = () => {\n  const fileUploadRef = useRef<FileUploadHandle>(null);\n  \n  const handleReset = () => {\n    fileUploadRef.current?.reset(); // Clear all files\n  };\n  \n  const handleGetFiles = () => {\n    const files = fileUploadRef.current?.getFiles(); // Get current files\n    console.log('Current files:', files);\n  };\n  \n  return (\n    <>\n      <FileUpload\n        ref={fileUploadRef}\n        label=\"Upload Files\"\n        onSelect={(files) => console.log('Selected:', files)}\n      />\n      <Button onPress={handleReset}>Reset</Button>\n      <Button onPress={handleGetFiles}>Get Files</Button>\n    </>\n  );\n};\n```\n\n**Features:**\n- **File Selection**: Click to browse files with support for single or multiple file selection\n- **Automatic Content Reading**: Automatically reads file content as text or base64 based on file type\n- **File Type Validation**: Built-in validation for accepted MIME types and file extensions\n- **Built-in Display**: Automatically displays selected files with name, size, and type information\n- **Clear Functionality**: Built-in \"Clear Files\" link to remove selected files and programmatic reset via ref\n- **Imperative Handle**: Access reset() and getFiles() methods via React refs for parent control\n- **Loading States**: Shows processing indicator while reading file contents\n- **Error Handling**: Comprehensive error messaging for file reading failures\n- **Accessibility**: Full keyboard navigation, screen reader support, and ARIA labels\n- **Type Safety**: Complete TypeScript support with FileInfo interface for processed files\n\n---\n\n### 🔧 Utils\n\nUtility functions and classes that simplify common tasks in Adobe Commerce extension development.\n\n#### `AdminUiSdk`\n\nA utility class for managing Adobe IMS credentials in Adobe Admin UI extensions. Provides secure access to authentication tokens and organization IDs for API calls.\n\n> **Note**: As of v1.0.2, registration methods have been removed. Use the Adobe UIX SDK directly for extension registration.\n\n##### Getting Adobe IMS Credentials\n\nRetrieve authentication credentials from the Adobe shared context:\n\n```typescript\nimport { AdminUiSdk } from '@adobe-commerce/aio-experience-kit';\n\ntry {\n  const sdk = new AdminUiSdk('my_admin_extension');\n\n  const credentials = await sdk.getCredentials();\n  \n  if (credentials.imsToken && credentials.imsOrgId) {\n    // Use credentials for API calls\n    const apiHeaders = {\n      'Authorization': `Bearer ${credentials.imsToken}`,\n      'x-gw-ims-org-id': credentials.imsOrgId\n    };\n    \n    // Make authenticated API requests\n  } else {\n    console.log('Credentials not available');\n  }\n} catch (error) {\n  console.error('Failed to get credentials:', error.message);\n}\n```\n\n**Features:**\n- **Credential Management**: Secure access to Adobe IMS authentication tokens and organization IDs\n- **Shared Context Access**: Retrieves credentials from Adobe's shared context using @adobe/uix-guest\n- **Error Handling**: Comprehensive error handling for credential retrieval failures\n- **Type Safety**: Full TypeScript support with intelligent code completion and compile-time validation\n- **Production Ready**: Battle-tested utility used in real Adobe Commerce extensions\n\n#### `useRouteParams`\n\nA React hook that provides a clean API for accessing React Router parameters and navigation functions.\n\n```typescript\nimport { useRouteParams } from '@adobe-commerce/aio-experience-kit';\n\nconst ProductDetail = () => {\n  const { getParam, getNavigate } = useRouteParams();\n  \n  const productId = getParam('id');\n  const navigate = getNavigate();\n  \n  const handleBack = () => {\n    navigate('/products');\n  };\n  \n  return (\n    <div>\n      <h1>Product {productId}</h1>\n      <button onClick={handleBack}>Back to Products</button>\n    </div>\n  );\n};\n```\n\n**Features:**\n- **Parameter Access**: Type-safe access to URL parameters with automatic type inference and null safety\n- **Navigation Control**: Wrapped navigation function with programmatic routing and history management\n- **Clean API**: Simplified interface that abstracts React Router complexity while maintaining full functionality\n- **Hook Integration**: Seamless integration with React component lifecycle and state management patterns\n- **Error Handling**: Built-in protection against navigation errors and invalid route parameters\n- **Performance Optimized**: Efficient parameter extraction and navigation with minimal re-renders\n\n## TypeScript Support\n\nThis library is built with TypeScript and provides comprehensive type definitions for all components and utilities. Import types as needed:\n\n```typescript\nimport type {\n  MainContainerProps,\n  DataTableProps,\n  DataFormProps,\n  ConfirmationDialogProps,\n  FileUploadProps,\n  FileUploadHandle,\n  FieldType,\n  AdminUiSdkInterface,\n  AdminUiSdkCredentials\n} from '@adobe-commerce/aio-experience-kit';\n\n// Deprecated types (for backward compatibility only)\n// These types are deprecated and will be removed in v2.0.0\n// import type { \n//   ShippingCarrierFormProps, \n//   SelectOption,\n//   AdminUiSdkRegistration,\n//   MenuItem\n// } from '@adobe-commerce/aio-experience-kit';\n```\n\n## License\n\nSee the LICENSE file (in package) for license rights and limitations.\n","readmeFilename":"README.md"}