{"_id":"@civitas-cerebrum/element-interactions","_rev":"30-eb44d785f4001d5042e72d8cff6967ea","name":"@civitas-cerebrum/element-interactions","dist-tags":{"latest":"0.3.9"},"versions":{"0.1.1":{"name":"@civitas-cerebrum/element-interactions","version":"0.1.1","keywords":["playwright","automation","interactions","assertions","clean-code","facade-pattern","test-automation","steps-api"],"author":{"name":"Umut Ay Bora"},"license":"MIT","_id":"@civitas-cerebrum/element-interactions@0.1.1","maintainers":[{"name":"umutayb","email":"umutaybora@gmail.com"}],"homepage":"https://github.com/civitas-cerebrum/element-interactions#readme","bugs":{"url":"https://github.com/civitas-cerebrum/element-interactions/issues"},"dist":{"shasum":"86624f5c7425476f53e9432f09dd4a0f4c0a2f0c","tarball":"https://registry.npmjs.org/@civitas-cerebrum/element-interactions/-/element-interactions-0.1.1.tgz","fileCount":30,"integrity":"sha512-SRjTmjqBl4tbhq8kTVV+0yPnazi4L7WnmtfI36diiOndIyzPJbTn2Uzc0uUH4UFAlRD42JlzzGMpGIby/8HDmA==","signatures":[{"sig":"MEYCIQDfITpWKAcefQJjTyb7JoiU1Lpn3Bhwe4Ta8BG/BwYLzwIhAO3pVWiN5zoVs9BHXQczkn9Kv4RuxhTVBheUtU38OJip","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@civitas-cerebrum%2felement-interactions@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":231050},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"71cb7e7eee6586282ba7a5695fd7621b9b052d72","scripts":{"test":"npm run test:unit","build":"npm run clean && tsc","clean":"rm -rf dist","test:ui":"npx playwright test --headed","test:all":"npm run test:unit && npm run test:email","test:unit":"npx playwright test --grep-invert 'Email Integration Tests'","test:email":"npx playwright test --grep 'Email Integration Tests'","test:quiet":"TESTER_DEBUG=false npx playwright test","postinstall":"node scripts/postinstall.js","test:coverage":"npx test-coverage","prepublishOnly":"npm run build","test:with-coverage":"npx playwright test --grep-invert 'Email Integration Tests' && npx test-coverage --format github-plain"},"_npmUser":{"name":"umutayb","email":"umutaybora@gmail.com"},"repository":{"url":"git+https://github.com/civitas-cerebrum/element-interactions.git","type":"git"},"_npmVersion":"11.9.0","description":"A robust, readable interaction and assertion Facade for Playwright. Abstract away boilerplate into semantic, English-like methods, making your test automation framework cleaner, easier to maintain, and accessible to non-developers.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"debug":"^4.4.3","dotenv":"^17.3.1","@civitas-cerebrum/email-client":"^0.0.4","@civitas-cerebrum/context-store":"^0.0.2","@civitas-cerebrum/element-repository":"^0.0.6"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0","@types/debug":"^4.1.13","@playwright/test":"^1.58.2","@civitas-cerebrum/test-coverage":"^0.0.8"},"peerDependencies":{"@playwright/test":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/element-interactions_0.1.1_1774483325040_0.28638144514695796","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@civitas-cerebrum/element-interactions","version":"0.1.2","keywords":["playwright","automation","interactions","assertions","clean-code","facade-pattern","test-automation","steps-api"],"author":{"name":"Umut Ay Bora"},"license":"MIT","_id":"@civitas-cerebrum/element-interactions@0.1.2","maintainers":[{"name":"umutayb","email":"umutaybora@gmail.com"}],"homepage":"https://github.com/civitas-cerebrum/element-interactions#readme","bugs":{"url":"https://github.com/civitas-cerebrum/element-interactions/issues"},"dist":{"shasum":"8f5a5dc5d520029cc0de51761e161770cddfd2b7","tarball":"https://registry.npmjs.org/@civitas-cerebrum/element-interactions/-/element-interactions-0.1.2.tgz","fileCount":30,"integrity":"sha512-E+lbiKxLD1cg/VfYXgSdAmKJKbMv/grtQzsmaBn06a7jWfxu0IAxJv/OjOR1KuddpjKXchNN3Rjx7Kg5kZKAkg==","signatures":[{"sig":"MEYCIQD7UbTgMMK9hAePxLLsnoLIzv8SBWtyi01ThASW+VI+NQIhAKKd9KRPDNJKlYsbDqTU4xQ47J2Rr99HKz2yK0TXPU/C","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@civitas-cerebrum%2felement-interactions@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":243062},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"53eac6d685442d3bb138a257e0fb1feec5b22ef5","scripts":{"test":"npm run test:unit","build":"npm run clean && tsc","clean":"rm -rf dist","test:ui":"npx playwright test --headed","test:all":"npm run test:unit && npm run test:email","test:unit":"npx playwright test --grep-invert 'Email Integration Tests'","test:email":"npx playwright test --grep 'Email Integration Tests'","test:quiet":"TESTER_DEBUG=false npx playwright test","postinstall":"node scripts/postinstall.js","test:coverage":"npx test-coverage","prepublishOnly":"npm run build","test:with-coverage":"npx playwright test --grep-invert 'Email Integration Tests' && npx test-coverage --format github-plain"},"_npmUser":{"name":"umutayb","email":"umutaybora@gmail.com"},"repository":{"url":"git+https://github.com/civitas-cerebrum/element-interactions.git","type":"git"},"_npmVersion":"11.9.0","description":"A robust, readable interaction and assertion Facade for Playwright. Abstract away boilerplate into semantic, English-like methods, making your test automation framework cleaner, easier to maintain, and accessible to non-developers.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"debug":"^4.4.3","dotenv":"^17.3.1","@civitas-cerebrum/email-client":"^0.0.5","@civitas-cerebrum/context-store":"^0.0.2","@civitas-cerebrum/element-repository":"^0.1.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0","@types/debug":"^4.1.13","@playwright/test":"^1.58.2","@civitas-cerebrum/test-coverage":"^0.0.8"},"peerDependencies":{"@playwright/test":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/element-interactions_0.1.2_1774632098266_0.7360519260184948","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@civitas-cerebrum/element-interactions","version":"0.1.3","keywords":["playwright","automation","interactions","assertions","clean-code","facade-pattern","test-automation","steps-api"],"author":{"name":"Umut Ay Bora"},"license":"MIT","_id":"@civitas-cerebrum/element-interactions@0.1.3","maintainers":[{"name":"umutayb","email":"umutaybora@gmail.com"}],"homepage":"https://github.com/civitas-cerebrum/element-interactions#readme","bugs":{"url":"https://github.com/civitas-cerebrum/element-interactions/issues"},"dist":{"shasum":"9f6641d44282d877a1ff561bf49a3296b3eca7b5","tarball":"https://registry.npmjs.org/@civitas-cerebrum/element-interactions/-/element-interactions-0.1.3.tgz","fileCount":30,"integrity":"sha512-dM53CwxK7Ym4e04NxyCfLDVSlTsYMCZ3h6g/G4vOdlBAbLP30Yp/mgxUz9YGtoFiGmXaZWopXV7FyEK8zu2f2w==","signatures":[{"sig":"MEQCIAZqK7xkdr8fdoU9Ek2zblwowzhyIV31F42fypluS1u/AiBp+tevwTw1giutAP9WEf6a74sewI0/zg0+dOe+PEkGNA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@civitas-cerebrum%2felement-interactions@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":243062},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"97d9ce82e64b0b668a29579bb418712f04e727dd","scripts":{"test":"npm run test:unit","build":"npm run clean && tsc","clean":"rm -rf dist","test:ui":"npx playwright test --headed","test:all":"npm run test:unit && npm run test:email","test:unit":"npx playwright test --grep-invert 'Email Integration Tests'","test:email":"npx playwright test --grep 'Email Integration Tests'","test:quiet":"TESTER_DEBUG=false npx playwright test","postinstall":"node scripts/postinstall.js","test:coverage":"npx test-coverage","prepublishOnly":"npm run build","test:with-coverage":"npx playwright test --grep-invert 'Email Integration Tests' && npx test-coverage --format github-plain"},"_npmUser":{"name":"umutayb","email":"umutaybora@gmail.com"},"repository":{"url":"git+https://github.com/civitas-cerebrum/element-interactions.git","type":"git"},"_npmVersion":"11.9.0","description":"A robust, readable interaction and assertion Facade for Playwright. Abstract away boilerplate into semantic, English-like methods, making your test automation framework cleaner, easier to maintain, and accessible to non-developers.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"debug":"^4.4.3","dotenv":"^17.3.1","@civitas-cerebrum/email-client":"^0.0.6","@civitas-cerebrum/context-store":"^0.0.2","@civitas-cerebrum/element-repository":"^0.1.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0","@types/debug":"^4.1.13","@playwright/test":"^1.58.2","@civitas-cerebrum/test-coverage":"^0.0.8"},"peerDependencies":{"@playwright/test":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/element-interactions_0.1.3_1774638521399_0.8438806213744463","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@civitas-cerebrum/element-interactions","version":"0.1.4","keywords":["playwright","automation","interactions","assertions","clean-code","facade-pattern","test-automation","steps-api"],"author":{"name":"Umut Ay Bora"},"license":"MIT","_id":"@civitas-cerebrum/element-interactions@0.1.4","maintainers":[{"name":"umutayb","email":"umutaybora@gmail.com"}],"homepage":"https://github.com/civitas-cerebrum/element-interactions#readme","bugs":{"url":"https://github.com/civitas-cerebrum/element-interactions/issues"},"dist":{"shasum":"f0132ce455c6a71b51e103e820687560ce6ed98c","tarball":"https://registry.npmjs.org/@civitas-cerebrum/element-interactions/-/element-interactions-0.1.4.tgz","fileCount":30,"integrity":"sha512-WgPeEjwd+hng09Yc9JgowT33Gg9rI4oqi4WDQyiizbctK55U2sGS84LD/8u8wcoJvEohJNXdOVyZ4UV/eNTYGA==","signatures":[{"sig":"MEQCICk3Kv5gOqxJwaS4+R2eKXu7fDpnapHRwsw4FpUjycujAiATFneZu2nAoPHwpvtrnu2wwSOPgIKd5Z9LvAqTm1ckbw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@civitas-cerebrum%2felement-interactions@0.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":243062},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"2e34ca017d0c619ee409887cc65e17427f24e600","scripts":{"test":"npm run test:unit","build":"npm run clean && tsc","clean":"rm -rf dist","test:ui":"npx playwright test --headed","test:all":"npm run test:unit && npm run test:email","test:unit":"npx playwright test --grep-invert 'Email Integration Tests'","test:email":"npx playwright test --grep 'Email Integration Tests'","test:quiet":"TESTER_DEBUG=false npx playwright test","postinstall":"node scripts/postinstall.js","test:coverage":"npx test-coverage","prepublishOnly":"npm run build","test:with-coverage":"npx playwright test --grep-invert 'Email Integration Tests' && npx test-coverage --format github-plain"},"_npmUser":{"name":"umutayb","email":"umutaybora@gmail.com"},"repository":{"url":"git+https://github.com/civitas-cerebrum/element-interactions.git","type":"git"},"_npmVersion":"11.9.0","description":"A robust, readable interaction and assertion Facade for Playwright. Abstract away boilerplate into semantic, English-like methods, making your test automation framework cleaner, easier to maintain, and accessible to non-developers.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"debug":"^4.4.3","dotenv":"^17.3.1","@civitas-cerebrum/email-client":"^0.0.6","@civitas-cerebrum/context-store":"^0.0.2","@civitas-cerebrum/element-repository":"^0.1.1"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0","@types/debug":"^4.1.13","@playwright/test":"^1.58.2","@civitas-cerebrum/test-coverage":"^0.0.9"},"peerDependencies":{"@playwright/test":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/element-interactions_0.1.4_1774654574172_0.2348171390312941","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@civitas-cerebrum/element-interactions","version":"0.1.5","keywords":["playwright","automation","interactions","assertions","clean-code","facade-pattern","test-automation","steps-api"],"author":{"name":"Umut Ay Bora"},"license":"MIT","_id":"@civitas-cerebrum/element-interactions@0.1.5","maintainers":[{"name":"umutayb","email":"umutaybora@gmail.com"}],"homepage":"https://github.com/civitas-cerebrum/element-interactions#readme","bugs":{"url":"https://github.com/civitas-cerebrum/element-interactions/issues"},"dist":{"shasum":"d45e743b3b45a1a11314554c2878753def184ecc","tarball":"https://registry.npmjs.org/@civitas-cerebrum/element-interactions/-/element-interactions-0.1.5.tgz","fileCount":31,"integrity":"sha512-kAUqQsrYQXVOScyKzfEXczdNpcb48hK1HMhyc/uuHCvR96o8IBpilbf131RE4lY9NWhXnbUE/R2UM+SobuCa8g==","signatures":[{"sig":"MEUCIQC/qmhq8GO5r5M3JHzX56gDs3cedNbxqmySsFENxI4Y9AIgQGsCkL7Wey7nTpHCV249+z+3jhN4vGkhZr3Vsk15Fs4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@civitas-cerebrum%2felement-interactions@0.1.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":260457},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"e20c6da2032c25699e9e7fe76023e81f202c3213","scripts":{"test":"npm run test:unit","build":"npm run clean && tsc","clean":"rm -rf dist","test:ui":"npx playwright test --headed","test:all":"npm run test:unit && npm run test:email","test:unit":"npx playwright test --grep-invert 'Email Integration Tests'","test:email":"npx playwright test --grep 'Email Integration Tests'","test:quiet":"TESTER_DEBUG=false npx playwright test","postinstall":"node scripts/postinstall.js","test:coverage":"npx test-coverage","prepublishOnly":"npm run build","test:with-coverage":"npx playwright test --grep-invert 'Email Integration Tests' && npx test-coverage --format github-plain"},"_npmUser":{"name":"umutayb","email":"umutaybora@gmail.com"},"repository":{"url":"git+https://github.com/civitas-cerebrum/element-interactions.git","type":"git"},"_npmVersion":"11.9.0","description":"A robust, readable interaction and assertion Facade for Playwright. Abstract away boilerplate into semantic, English-like methods, making your test automation framework cleaner, easier to maintain, and accessible to non-developers.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"debug":"^4.4.3","dotenv":"^17.3.1","@civitas-cerebrum/email-client":"^0.0.6","@civitas-cerebrum/context-store":"^0.0.2","@civitas-cerebrum/element-repository":"^0.1.1"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0","@types/debug":"^4.1.13","@playwright/test":"^1.58.2","@civitas-cerebrum/test-coverage":"^0.0.9"},"peerDependencies":{"@playwright/test":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/element-interactions_0.1.5_1774877455537_0.5456575334176548","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@civitas-cerebrum/element-interactions","version":"0.1.6","keywords":["playwright","automation","interactions","assertions","clean-code","facade-pattern","test-automation","steps-api"],"author":{"name":"Umut Ay Bora"},"license":"MIT","_id":"@civitas-cerebrum/element-interactions@0.1.6","maintainers":[{"name":"umutayb","email":"umutaybora@gmail.com"}],"homepage":"https://github.com/civitas-cerebrum/element-interactions#readme","bugs":{"url":"https://github.com/civitas-cerebrum/element-interactions/issues"},"dist":{"shasum":"fcc7c22f9864fd4a5f12d6407cfa9a6ad0fa4c00","tarball":"https://registry.npmjs.org/@civitas-cerebrum/element-interactions/-/element-interactions-0.1.6.tgz","fileCount":33,"integrity":"sha512-IoihXrJUEuscrFfkqll8jOTftuMChpKc+IhtY3MSDZdrWSr0qjHXkeyFgaoIvUVENw4Of82iHUv8UWvfx083Kg==","signatures":[{"sig":"MEUCIHK0HMhRaW3nUcMf0iUi7/fbVTBUkKG6NSKixvoMMrLrAiEAmtESC+qAsvWpO0P6DD5JOzMF0chC5kRAjbnNEgmjXp8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@civitas-cerebrum%2felement-interactions@0.1.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":291287},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"17a8348fbc99ede5e38ba011976e90bc56854d19","scripts":{"test":"npm run test:unit","build":"npm run clean && tsc","clean":"rm -rf dist","test:ui":"npx playwright test --headed","test:all":"npm run test:unit && npm run test:email","test:unit":"npx playwright test --grep-invert 'Email Integration Tests'","test:email":"npx playwright test --grep 'Email Integration Tests'","test:quiet":"TESTER_DEBUG=false npx playwright test","postinstall":"node scripts/postinstall.js","test:coverage":"npx test-coverage","prepublishOnly":"npm run build","test:with-coverage":"npx playwright test --grep-invert 'Email Integration Tests' && npx test-coverage --format github-plain"},"_npmUser":{"name":"umutayb","email":"umutaybora@gmail.com"},"repository":{"url":"git+https://github.com/civitas-cerebrum/element-interactions.git","type":"git"},"_npmVersion":"11.9.0","description":"A robust, readable interaction and assertion Facade for Playwright. Abstract away boilerplate into semantic, English-like methods, making your test automation framework cleaner, easier to maintain, and accessible to non-developers.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"debug":"^4.4.3","dotenv":"^17.3.1","@civitas-cerebrum/email-client":"^0.0.6","@civitas-cerebrum/context-store":"^0.0.2","@civitas-cerebrum/element-repository":"^0.1.1"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0","@types/debug":"^4.1.13","@playwright/test":"^1.58.2","@civitas-cerebrum/test-coverage":"^0.0.9"},"peerDependencies":{"@playwright/test":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/element-interactions_0.1.6_1774960207670_0.45800113566123324","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@civitas-cerebrum/element-interactions","version":"0.1.7","keywords":["playwright","automation","interactions","assertions","clean-code","facade-pattern","test-automation","steps-api"],"author":{"name":"Umut Ay Bora"},"license":"MIT","_id":"@civitas-cerebrum/element-interactions@0.1.7","maintainers":[{"name":"umutayb","email":"umutaybora@gmail.com"}],"homepage":"https://github.com/civitas-cerebrum/element-interactions#readme","bugs":{"url":"https://github.com/civitas-cerebrum/element-interactions/issues"},"dist":{"shasum":"0b1a854c789c23acbacc221f142057cb625e277b","tarball":"https://registry.npmjs.org/@civitas-cerebrum/element-interactions/-/element-interactions-0.1.7.tgz","fileCount":33,"integrity":"sha512-Api8Z6Ki31kZGc9ET6alt1vqn6JnvGsQRg0QKBY3GFOT5oFxVulHSoW+DO6CfOBgAongiE7vsamGICzijq6wiQ==","signatures":[{"sig":"MEUCIGZksiEuSgmscCPYXgsFZCRrEvqLDQOqOPLt2ldd1sJlAiEA441AVHYv97y8zF7egd3+jzQQvJJW48Wg/uH0ACcqAcQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@civitas-cerebrum%2felement-interactions@0.1.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":298266},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"14f3d451c1d68eb8c98eeec8a1382645087fe4af","scripts":{"test":"npm run test:unit","build":"npm run clean && tsc","clean":"rm -rf dist","test:ui":"npx playwright test --headed","test:all":"npm run test:unit && npm run test:email","test:unit":"npx playwright test --grep-invert 'Email Integration Tests'","test:email":"npx playwright test --grep 'Email Integration Tests'","test:quiet":"TESTER_DEBUG=false npx playwright test","postinstall":"node scripts/postinstall.js","test:coverage":"npx test-coverage","prepublishOnly":"npm run build","test:with-coverage":"npx playwright test --grep-invert 'Email Integration Tests' && npx test-coverage --format github-plain"},"_npmUser":{"name":"umutayb","email":"umutaybora@gmail.com"},"repository":{"url":"git+https://github.com/civitas-cerebrum/element-interactions.git","type":"git"},"_npmVersion":"11.11.0","description":"A robust, readable interaction and assertion Facade for Playwright. Abstract away boilerplate into semantic, English-like methods, making your test automation framework cleaner, easier to maintain, and accessible to non-developers.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"debug":"^4.4.3","dotenv":"^17.3.1","@civitas-cerebrum/email-client":"^0.0.6","@civitas-cerebrum/context-store":"^0.0.2","@civitas-cerebrum/element-repository":"^0.1.1"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0","@types/debug":"^4.1.13","@playwright/test":"^1.58.2","@civitas-cerebrum/test-coverage":"^0.0.9"},"peerDependencies":{"@playwright/test":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/element-interactions_0.1.7_1775501156612_0.020277895296648696","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"@civitas-cerebrum/element-interactions","version":"0.1.9","keywords":["playwright","automation","interactions","assertions","clean-code","facade-pattern","test-automation","steps-api"],"author":{"name":"Umut Ay Bora"},"license":"MIT","_id":"@civitas-cerebrum/element-interactions@0.1.9","maintainers":[{"name":"umutayb","email":"umutaybora@gmail.com"}],"homepage":"https://github.com/civitas-cerebrum/element-interactions#readme","bugs":{"url":"https://github.com/civitas-cerebrum/element-interactions/issues"},"dist":{"shasum":"385337e31cec693fe497f9d8cbcbff8406d1a5e6","tarball":"https://registry.npmjs.org/@civitas-cerebrum/element-interactions/-/element-interactions-0.1.9.tgz","fileCount":35,"integrity":"sha512-D2yf47B4VOJtw6XumSL/pF8cFsXlABhws6mp1IuMPGAlDS/WAB4seJYaEWKq59NOR9UmiPCuk490VLkIJGLCRw==","signatures":[{"sig":"MEQCIG2FVjiyAULgwkC/5zq1AE5Cheog5qYy9zVAiTSgN1t7AiBswSpcTz/51Y+eCow29IwrEsIqpxR8oq1iZWLdM4if7w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@civitas-cerebrum%2felement-interactions@0.1.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":320589},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"56cdf256d99d0bd4f1d8d03bff9ec4bffc7dcfd8","scripts":{"test":"npm run test:unit","build":"npm run clean && tsc","clean":"rm -rf dist","test:ui":"npx playwright test --headed","test:all":"npm run test:unit && npm run test:email","test:unit":"npx playwright test --grep-invert 'Email Integration Tests'","test:email":"npx playwright test --grep 'Email Integration Tests'","test:quiet":"TESTER_DEBUG=false npx playwright test","postinstall":"node scripts/postinstall.js","test:coverage":"npx test-coverage","prepublishOnly":"npm run build","test:with-coverage":"npx playwright test --grep-invert 'Email Integration Tests' && npx test-coverage --format github-plain"},"_npmUser":{"name":"umutayb","email":"umutaybora@gmail.com"},"repository":{"url":"git+https://github.com/civitas-cerebrum/element-interactions.git","type":"git"},"_npmVersion":"11.11.0","description":"A robust, readable interaction and assertion Facade for Playwright. Abstract away boilerplate into semantic, English-like methods, making your test automation framework cleaner, easier to maintain, and accessible to non-developers.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"debug":"^4.4.3","dotenv":"^17.3.1","@civitas-cerebrum/email-client":"^0.0.6","@civitas-cerebrum/context-store":"^0.0.2","@civitas-cerebrum/element-repository":"^0.1.2"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0","@types/debug":"^4.1.13","@playwright/test":"^1.58.2","@civitas-cerebrum/test-coverage":"^0.0.9"},"peerDependencies":{"@playwright/test":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/element-interactions_0.1.9_1775806336296_0.50662503983318","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@civitas-cerebrum/element-interactions","version":"0.2.0","keywords":["playwright","automation","interactions","assertions","clean-code","facade-pattern","test-automation","steps-api"],"author":{"name":"Umut Ay Bora"},"license":"MIT","_id":"@civitas-cerebrum/element-interactions@0.2.0","maintainers":[{"name":"umutayb","email":"umutaybora@gmail.com"}],"homepage":"https://github.com/civitas-cerebrum/element-interactions#readme","bugs":{"url":"https://github.com/civitas-cerebrum/element-interactions/issues"},"dist":{"shasum":"b2cc3205578f18bf32eca5f99c923745a9805214","tarball":"https://registry.npmjs.org/@civitas-cerebrum/element-interactions/-/element-interactions-0.2.0.tgz","fileCount":35,"integrity":"sha512-+9Nn/U/DaVpx4epAWWXN7ud7qBleLwdKNijbeDZZOnrwIdZ7uPPeR4yC1bMAwPjETvQ+Htp+mTUFvK2Q0kXJ7g==","signatures":[{"sig":"MEUCIErGmx7B5FvF81JZz6tsrh6N4EtmVU8HOR4lrU3mYf/VAiEAmxhr/sND5YUEWn5Oz0tlDXdNqcycYMXp7t1DlXs35J8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@civitas-cerebrum%2felement-interactions@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":323574},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"be1a2c154249f59141af8902c9ddadc7a37bb606","scripts":{"test":"npm run test:unit","build":"npm run clean && tsc","clean":"rm -rf dist","test:ui":"npx playwright test --headed","test:all":"npm run test:unit && npm run test:email","test:unit":"npx playwright test --grep-invert 'Email Integration Tests'","test:email":"npx playwright test --grep 'Email Integration Tests'","test:quiet":"TESTER_DEBUG=false npx playwright test","postinstall":"node scripts/postinstall.js","test:coverage":"npx test-coverage","prepublishOnly":"npm run build","test:with-coverage":"npx playwright test --grep-invert 'Email Integration Tests' && npx test-coverage --format github-plain"},"_npmUser":{"name":"umutayb","email":"umutaybora@gmail.com"},"repository":{"url":"git+https://github.com/civitas-cerebrum/element-interactions.git","type":"git"},"_npmVersion":"11.11.0","description":"A robust, readable interaction and assertion Facade for Playwright. Abstract away boilerplate into semantic, English-like methods, making your test automation framework cleaner, easier to maintain, and accessible to non-developers.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"debug":"^4.4.3","dotenv":"^17.3.1","@civitas-cerebrum/email-client":"^0.0.6","@civitas-cerebrum/context-store":"^0.0.2","@civitas-cerebrum/element-repository":"^0.1.2"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0","@types/debug":"^4.1.13","@playwright/test":"^1.58.2","@civitas-cerebrum/test-coverage":"^0.0.9"},"peerDependencies":{"@playwright/test":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/element-interactions_0.2.0_1775845675786_0.9689883893113409","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@civitas-cerebrum/element-interactions","version":"0.2.1","keywords":["playwright","automation","interactions","assertions","clean-code","facade-pattern","test-automation","steps-api"],"author":{"name":"Umut Ay Bora"},"license":"MIT","_id":"@civitas-cerebrum/element-interactions@0.2.1","maintainers":[{"name":"umutayb","email":"umutaybora@gmail.com"}],"homepage":"https://github.com/civitas-cerebrum/element-interactions#readme","bugs":{"url":"https://github.com/civitas-cerebrum/element-interactions/issues"},"dist":{"shasum":"c04c6680abd34a2af56ba1cfcf34664179e0ec67","tarball":"https://registry.npmjs.org/@civitas-cerebrum/element-interactions/-/element-interactions-0.2.1.tgz","fileCount":36,"integrity":"sha512-4EVTRpu7VezivV2aQmTRgvp0XFnl/PbyXSxxgzwgutitBDlgbe82g1PMBhJ9a2Kgmn5hxnxs6b8kCBd2ItXlGw==","signatures":[{"sig":"MEYCIQDXKwbcjp9/ZJ3QzFeKso3z36Ir6O7/F2BHdlHUvnEszQIhAMx/XinoqgCDJpmrsYRlK6kXVmfJDaTo6dx7rHYYqtI+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@civitas-cerebrum%2felement-interactions@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":332480},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"ece76810af9964fd16ffdd52d9b98a61f2db3ba1","scripts":{"test":"npm run test:unit","build":"npm run clean && tsc","clean":"rm -rf dist","test:ui":"npx playwright test --headed","test:all":"npm run test:unit && npm run test:email","test:unit":"npx playwright test --grep-invert 'Email Integration Tests'","test:email":"npx playwright test --grep 'Email Integration Tests'","test:quiet":"TESTER_DEBUG=false npx playwright test","postinstall":"node scripts/postinstall.js","test:coverage":"npx test-coverage","prepublishOnly":"npm run build","test:with-coverage":"npx playwright test --grep-invert 'Email Integration Tests' && npx test-coverage --format github-plain"},"_npmUser":{"name":"umutayb","email":"umutaybora@gmail.com"},"repository":{"url":"git+https://github.com/civitas-cerebrum/element-interactions.git","type":"git"},"_npmVersion":"11.11.0","description":"A robust, readable interaction and assertion Facade for Playwright. Abstract away boilerplate into semantic, English-like methods, making your test automation framework cleaner, easier to maintain, and accessible to non-developers.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"debug":"^4.4.3","dotenv":"^17.3.1","@civitas-cerebrum/email-client":"^0.0.6","@civitas-cerebrum/context-store":"^0.0.2","@civitas-cerebrum/element-repository":"^0.1.2"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0","@types/debug":"^4.1.13","@playwright/test":"^1.58.2","@civitas-cerebrum/test-coverage":"^0.0.9"},"peerDependencies":{"@playwright/test":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/element-interactions_0.2.1_1775906529063_0.3431539139678279","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@civitas-cerebrum/element-interactions","version":"0.2.2","keywords":["playwright","automation","interactions","assertions","clean-code","facade-pattern","test-automation","steps-api"],"author":{"name":"Umut Ay Bora"},"license":"MIT","_id":"@civitas-cerebrum/element-interactions@0.2.2","maintainers":[{"name":"umutayb","email":"umutaybora@gmail.com"}],"homepage":"https://github.com/civitas-cerebrum/element-interactions#readme","bugs":{"url":"https://github.com/civitas-cerebrum/element-interactions/issues"},"dist":{"shasum":"3551e8bbb509dccced3fb211193fd9bce380384f","tarball":"https://registry.npmjs.org/@civitas-cerebrum/element-interactions/-/element-interactions-0.2.2.tgz","fileCount":38,"integrity":"sha512-cIP4B2IWIGu+RoQAvQgSd2cIIJ5TchenTW2X4q7zlYDmd+eSpsS7KLLdZwEs3wTNL80V/7LW8uiYsDT8wmYyWA==","signatures":[{"sig":"MEYCIQCJzIbbrNrZufSgCVgNwDvRnNO75mLAeIuRU7W7ymbxawIhAPVr0ly72ox0j7nXBbWaFXn4z8J/z1APWS2PAjJpItrK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@civitas-cerebrum%2felement-interactions@0.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":361754},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"b968346f651fad3e3ecd1e7d0ff1d3ec8261f509","scripts":{"test":"npm run test:unit","build":"npm run clean && tsc","clean":"rm -rf dist","test:ui":"npx playwright test --headed","test:all":"npm run test:unit && npm run test:email","test:unit":"npx playwright test --grep-invert 'Email Integration Tests'","test:email":"npx playwright test --grep 'Email Integration Tests'","test:quiet":"TESTER_DEBUG=false npx playwright test","postinstall":"node scripts/postinstall.js","test:coverage":"npx test-coverage","prepublishOnly":"npm run build","test:with-coverage":"npx playwright test --grep-invert 'Email Integration Tests' && npx test-coverage --format github-plain"},"_npmUser":{"name":"umutayb","email":"umutaybora@gmail.com"},"repository":{"url":"git+https://github.com/civitas-cerebrum/element-interactions.git","type":"git"},"_npmVersion":"11.11.0","description":"A robust, readable interaction and assertion Facade for Playwright. Abstract away boilerplate into semantic, English-like methods, making your test automation framework cleaner, easier to maintain, and accessible to non-developers.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"debug":"^4.4.3","dotenv":"^17.3.1","@civitas-cerebrum/email-client":"^0.0.6","@civitas-cerebrum/context-store":"^0.0.2","@civitas-cerebrum/element-repository":"^0.1.2"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0","@types/debug":"^4.1.13","@playwright/test":"^1.58.2","@civitas-cerebrum/test-coverage":"^0.0.9"},"peerDependencies":{"@playwright/test":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/element-interactions_0.2.2_1776158907302_0.6417134492377903","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@civitas-cerebrum/element-interactions","version":"0.2.3","keywords":["playwright","automation","interactions","assertions","clean-code","facade-pattern","test-automation","steps-api"],"author":{"name":"Umut Ay Bora"},"license":"MIT","_id":"@civitas-cerebrum/element-interactions@0.2.3","maintainers":[{"name":"umutayb","email":"umutaybora@gmail.com"}],"homepage":"https://github.com/civitas-cerebrum/element-interactions#readme","bugs":{"url":"https://github.com/civitas-cerebrum/element-interactions/issues"},"dist":{"shasum":"9b720fc651db60dc4a5852729f67314a0fb52e2c","tarball":"https://registry.npmjs.org/@civitas-cerebrum/element-interactions/-/element-interactions-0.2.3.tgz","fileCount":38,"integrity":"sha512-9BZvyq4czIF3TfKykvGQZpWj2nONxTrd9LBAsIGUWjBxsPEwW3bjljTnCbeC6JBX3maSiCFQ5ZUkEYf6OHnhMA==","signatures":[{"sig":"MEQCIHsBI/gSXRChPerTeP4TnHkN1VHkPE4fZdYZfC7EU+KyAiBkJLF4BPNz6oMzDMzB0vBnePlBO/FpwiAoPVjK3/T44Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@civitas-cerebrum%2felement-interactions@0.2.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":361754},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"60b36bf4cc65340b049b507e5bab95678da4a4f1","scripts":{"test":"npm run test:unit","build":"npm run clean && tsc","clean":"rm -rf dist","test:ui":"npx playwright test --headed","test:all":"npm run test:unit && npm run test:email","test:unit":"npx playwright test --grep-invert 'Email Integration Tests'","test:email":"npx playwright test --grep 'Email Integration Tests'","test:quiet":"TESTER_DEBUG=false npx playwright test","postinstall":"node scripts/postinstall.js","test:coverage":"npx test-coverage","prepublishOnly":"npm run build","test:with-coverage":"npx playwright test --grep-invert 'Email Integration Tests' && npx test-coverage --format github-plain"},"_npmUser":{"name":"umutayb","email":"umutaybora@gmail.com"},"repository":{"url":"git+https://github.com/civitas-cerebrum/element-interactions.git","type":"git"},"_npmVersion":"11.11.0","description":"A robust, readable interaction and assertion Facade for Playwright. Abstract away boilerplate into semantic, English-like methods, making your test automation framework cleaner, easier to maintain, and accessible to non-developers.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"debug":"^4.4.3","dotenv":"^17.3.1","@civitas-cerebrum/email-client":"^0.0.7","@civitas-cerebrum/context-store":"^0.0.2","@civitas-cerebrum/element-repository":"^0.1.2"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0","@types/debug":"^4.1.13","@playwright/test":"^1.58.2","@civitas-cerebrum/test-coverage":"^0.0.9"},"peerDependencies":{"@playwright/test":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/element-interactions_0.2.3_1776162410138_0.8892034632461006","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@civitas-cerebrum/element-interactions","version":"0.2.4","keywords":["playwright","automation","interactions","assertions","clean-code","facade-pattern","test-automation","steps-api"],"author":{"name":"Umut Ay Bora"},"license":"MIT","_id":"@civitas-cerebrum/element-interactions@0.2.4","maintainers":[{"name":"umutayb","email":"umutaybora@gmail.com"}],"homepage":"https://github.com/civitas-cerebrum/element-interactions#readme","bugs":{"url":"https://github.com/civitas-cerebrum/element-interactions/issues"},"dist":{"shasum":"15d6c66d39beb8f6ba503c964ca3a92ee23a38b6","tarball":"https://registry.npmjs.org/@civitas-cerebrum/element-interactions/-/element-interactions-0.2.4.tgz","fileCount":40,"integrity":"sha512-MG8bpYH7NI9uJFV6yE+Xv1LmOrC4hMM+hKMgjxLm+m+S42/6kXuVQOPA8TXBba4KoSIvSjWDmhtfcx4/QTLdXQ==","signatures":[{"sig":"MEYCIQCFvjbc89NsX9c3Nz46MtHbh7ImxvW1JmguqHLJkHeeZQIhAP39Lc2l4+vzv66Y0bzCQY6/1Bv3yza9blW1g8F9R2tB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@civitas-cerebrum%2felement-interactions@0.2.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":401546},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"e2fcda017dc53b2610df127cd2b85a2fab7f68ab","scripts":{"test":"npm run test:unit","build":"npm run clean && tsc","clean":"rm -rf dist","test:ui":"npx playwright test --headed","test:all":"npm run test:unit && npm run test:email","test:unit":"npx playwright test --grep-invert 'Email Integration Tests'","test:email":"npx playwright test --grep 'Email Integration Tests'","test:quiet":"TESTER_DEBUG=false npx playwright test","postinstall":"node scripts/postinstall.js","test:coverage":"npx test-coverage","prepublishOnly":"npm run build","test:with-coverage":"npx playwright test --grep-invert 'Email Integration Tests' && npx test-coverage --format github-plain"},"_npmUser":{"name":"umutayb","email":"umutaybora@gmail.com"},"repository":{"url":"git+https://github.com/civitas-cerebrum/element-interactions.git","type":"git"},"_npmVersion":"11.11.0","description":"A robust, readable interaction and assertion Facade for Playwright. Abstract away boilerplate into semantic, English-like methods, making your test automation framework cleaner, easier to maintain, and accessible to non-developers.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"debug":"^4.4.3","dotenv":"^17.3.1","@civitas-cerebrum/email-client":"^0.0.7","@civitas-cerebrum/context-store":"^0.0.2","@civitas-cerebrum/element-repository":"^0.1.3"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0","@types/debug":"^4.1.13","@playwright/test":"^1.59.1","@civitas-cerebrum/test-coverage":"^0.0.9"},"peerDependencies":{"@playwright/test":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/element-interactions_0.2.4_1776246215492_0.3366995177197123","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"@civitas-cerebrum/element-interactions","version":"0.2.5","keywords":["playwright","automation","interactions","assertions","clean-code","facade-pattern","test-automation","steps-api"],"author":{"name":"Umut Ay Bora"},"license":"MIT","_id":"@civitas-cerebrum/element-interactions@0.2.5","maintainers":[{"name":"umutayb","email":"umutaybora@gmail.com"}],"homepage":"https://github.com/civitas-cerebrum/element-interactions#readme","bugs":{"url":"https://github.com/civitas-cerebrum/element-interactions/issues"},"dist":{"shasum":"60e66911378d056230d0188360216248720fa5df","tarball":"https://registry.npmjs.org/@civitas-cerebrum/element-interactions/-/element-interactions-0.2.5.tgz","fileCount":43,"integrity":"sha512-LqjWC8or5Vg12Eg+qg/Eo+ueOIK9C3F0TiyX0R85e4j+HEyxByY2+ozHHd48zwCim+gt6D4PNNZ2aKYYumQQfg==","signatures":[{"sig":"MEUCIH0K4eGrqRBcDIO5Y1MeJBjZuE7BEA/6YsfcbYp2KCyWAiEAlO1DMxr7lsTUK/KAbA4KyVCynI2OXSXK4ktqbUD2PSc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@civitas-cerebrum%2felement-interactions@0.2.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":486829},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"d73b8f77b805da5d48673dc4ac064fff1c338534","scripts":{"test":"npm run test:unit","build":"npm run clean && tsc","clean":"rm -rf dist","test:ui":"npx playwright test --headed","test:all":"npm run test:unit && npm run test:email","test:unit":"npx playwright test --grep-invert 'Email Integration Tests'","test:email":"npx playwright test --grep 'Email Integration Tests'","test:quiet":"TESTER_DEBUG=false npx playwright test","postinstall":"node scripts/postinstall.js","test:coverage":"npx test-coverage","prepublishOnly":"npm run build","test:with-coverage":"npx playwright test --grep-invert 'Email Integration Tests' && npx test-coverage --format github-plain"},"_npmUser":{"name":"umutayb","email":"umutaybora@gmail.com"},"repository":{"url":"git+https://github.com/civitas-cerebrum/element-interactions.git","type":"git"},"_npmVersion":"11.11.0","description":"A robust, readable interaction and assertion Facade for Playwright. Abstract away boilerplate into semantic, English-like methods, making your test automation framework cleaner, easier to maintain, and accessible to non-developers.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"debug":"^4.4.3","dotenv":"^17.3.1","@civitas-cerebrum/email-client":"^0.0.7","@civitas-cerebrum/context-store":"^0.0.2","@civitas-cerebrum/element-repository":"^0.1.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0","@types/debug":"^4.1.13","@playwright/test":"^1.59.1","@civitas-cerebrum/test-coverage":"^0.1.0"},"peerDependencies":{"@playwright/test":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/element-interactions_0.2.5_1776490221295_0.9235459933218273","host":"s3://npm-registry-packages-npm-production"}},"0.2.6":{"name":"@civitas-cerebrum/element-interactions","version":"0.2.6","keywords":["playwright","automation","interactions","assertions","clean-code","facade-pattern","test-automation","steps-api"],"author":{"name":"Umut Ay Bora"},"license":"MIT","_id":"@civitas-cerebrum/element-interactions@0.2.6","maintainers":[{"name":"umutayb","email":"umutaybora@gmail.com"}],"homepage":"https://github.com/civitas-cerebrum/element-interactions#readme","bugs":{"url":"https://github.com/civitas-cerebrum/element-interactions/issues"},"dist":{"shasum":"c244e59f928608a89ace768e21c14a8b0c876c6f","tarball":"https://registry.npmjs.org/@civitas-cerebrum/element-interactions/-/element-interactions-0.2.6.tgz","fileCount":45,"integrity":"sha512-jSSbJpGL7qKxjcTlRhIJz5tIuG1v4YRN76lOPw34BYp7PvaOOxCgSez56/HJq42MJkkD/CJPIT0VTe4y4gtcDQ==","signatures":[{"sig":"MEQCIBzn/9rlUOt/0Vk9D46v0iLBT4FPU46+rVyVgrK31t9xAiB9bT7v0caVewt7DNj4C1XZjCYzoJt79X1XlLJc5BZBSQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@civitas-cerebrum%2felement-interactions@0.2.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":528818},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"3f443dc8154e08e1191bd192bea053d3ddeab389","scripts":{"test":"npm run test:unit","build":"npm run clean && tsc","clean":"rm -rf dist","test:ui":"npx playwright test --headed","test:all":"npm run test:unit && npm run test:email","test:unit":"npx playwright test --grep-invert 'Email Integration Tests'","test:email":"npx playwright test --grep 'Email Integration Tests'","test:quiet":"TESTER_DEBUG=false npx playwright test","postinstall":"node scripts/postinstall.js","test:coverage":"npx test-coverage","prepublishOnly":"npm run build","test:with-coverage":"npx playwright test --grep-invert 'Email Integration Tests' && npx test-coverage --format github-plain"},"_npmUser":{"name":"umutayb","email":"umutaybora@gmail.com"},"repository":{"url":"git+https://github.com/civitas-cerebrum/element-interactions.git","type":"git"},"_npmVersion":"11.11.0","description":"A robust, readable interaction and assertion Facade for Playwright. Abstract away boilerplate into semantic, English-like methods, making your test automation framework cleaner, easier to maintain, and accessible to non-developers.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"debug":"^4.4.3","dotenv":"^17.3.1","@civitas-cerebrum/email-client":"^0.0.7","@civitas-cerebrum/context-store":"^0.0.2","@civitas-cerebrum/element-repository":"^0.1.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0","@types/debug":"^4.1.13","@playwright/test":"^1.59.1","@civitas-cerebrum/test-coverage":"^0.1.0"},"peerDependencies":{"@playwright/test":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/element-interactions_0.2.6_1776518670957_0.17252864798684353","host":"s3://npm-registry-packages-npm-production"}},"0.2.7":{"name":"@civitas-cerebrum/element-interactions","version":"0.2.7","keywords":["playwright","automation","interactions","assertions","clean-code","facade-pattern","test-automation","steps-api"],"author":{"name":"Umut Ay Bora"},"license":"MIT","_id":"@civitas-cerebrum/element-interactions@0.2.7","maintainers":[{"name":"umutayb","email":"umutaybora@gmail.com"}],"homepage":"https://github.com/civitas-cerebrum/element-interactions#readme","bugs":{"url":"https://github.com/civitas-cerebrum/element-interactions/issues"},"dist":{"shasum":"d0371e60404e748361b0798f0aea084cf0e9dff4","tarball":"https://registry.npmjs.org/@civitas-cerebrum/element-interactions/-/element-interactions-0.2.7.tgz","fileCount":45,"integrity":"sha512-tVufBbzBCcfyJKGNyIrYSqVY1y3prxZSF3hAoFySAqY9ef6hDCu6sgA3A6ktF6zVenGJ+1PKo47YdS31oCEO2g==","signatures":[{"sig":"MEUCICdiwYcgynBMAuI8yMcng0uhv88OqHtUEzy2ayRhWH+oAiEAx12X+3wKqc2cHjfwLPoqjKY4B10JekeUs67qiUCsbo4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@civitas-cerebrum%2felement-interactions@0.2.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":530954},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"1a07cfa230f439aa6c3567e3b2826168d1f06ea0","scripts":{"test":"npm run test:unit","build":"npm run clean && tsc","clean":"rm -rf dist","test:ui":"npx playwright test --headed","test:all":"npm run test:unit && npm run test:email","test:unit":"npx playwright test --grep-invert 'Email Integration Tests'","test:email":"npx playwright test --grep 'Email Integration Tests'","test:quiet":"TESTER_DEBUG=false npx playwright test","postinstall":"node scripts/postinstall.js","test:coverage":"npx test-coverage","prepublishOnly":"npm run build","test:with-coverage":"npx playwright test --grep-invert 'Email Integration Tests' && npx test-coverage --format github-plain"},"_npmUser":{"name":"umutayb","email":"umutaybora@gmail.com"},"repository":{"url":"git+https://github.com/civitas-cerebrum/element-interactions.git","type":"git"},"_npmVersion":"11.11.0","description":"A robust, readable interaction and assertion Facade for Playwright. Abstract away boilerplate into semantic, English-like methods, making your test automation framework cleaner, easier to maintain, and accessible to non-developers.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"debug":"^4.4.3","dotenv":"^17.3.1","@civitas-cerebrum/email-client":"^0.0.7","@civitas-cerebrum/context-store":"^0.0.2","@civitas-cerebrum/element-repository":"^0.1.6"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0","@types/debug":"^4.1.13","@playwright/test":"^1.59.1","@civitas-cerebrum/test-coverage":"^0.1.0"},"peerDependencies":{"@playwright/test":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/element-interactions_0.2.7_1776539192754_0.9932166073843065","host":"s3://npm-registry-packages-npm-production"}},"0.2.8":{"name":"@civitas-cerebrum/element-interactions","version":"0.2.8","keywords":["playwright","automation","interactions","assertions","clean-code","facade-pattern","test-automation","steps-api"],"author":{"name":"Umut Ay Bora"},"license":"MIT","_id":"@civitas-cerebrum/element-interactions@0.2.8","maintainers":[{"name":"umutayb","email":"umutaybora@gmail.com"}],"homepage":"https://github.com/civitas-cerebrum/element-interactions#readme","bugs":{"url":"https://github.com/civitas-cerebrum/element-interactions/issues"},"dist":{"shasum":"c3ffea818f9366417aeddf5547e4c6fdf3156db8","tarball":"https://registry.npmjs.org/@civitas-cerebrum/element-interactions/-/element-interactions-0.2.8.tgz","fileCount":45,"integrity":"sha512-p+29BuDlQHqNJg4G82x+beujzXxZVU/mvQUKzO+/ry2OQFig6VEtHCHs0rQrYke5cgJGBTj0HKnN+3jjXqq6cQ==","signatures":[{"sig":"MEUCIFjxtBbx5oL0jMq7u6Fj5UzVZe8qIWCDfrlpZnoShp1fAiEA92caxEMHZ7rYxU4xcVUptfxnp25sUVVqzi5V7HyIgdQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@civitas-cerebrum%2felement-interactions@0.2.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":534473},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"e335aa67e93a134f0f43bf7f89adfc8871095150","scripts":{"test":"npm run test:unit","build":"npm run clean && tsc","clean":"rm -rf dist","test:ui":"npx playwright test --headed","test:all":"npm run test:unit && npm run test:email","test:unit":"npx playwright test --grep-invert 'Email Integration Tests'","test:email":"npx playwright test --grep 'Email Integration Tests'","test:quiet":"TESTER_DEBUG=false npx playwright test","postinstall":"node scripts/postinstall.js","test:coverage":"npx test-coverage","prepublishOnly":"npm run build","test:with-coverage":"npx playwright test --grep-invert 'Email Integration Tests' && npx test-coverage --format github-plain"},"_npmUser":{"name":"umutayb","email":"umutaybora@gmail.com"},"repository":{"url":"git+https://github.com/civitas-cerebrum/element-interactions.git","type":"git"},"_npmVersion":"11.11.0","description":"A robust, readable interaction and assertion Facade for Playwright. Abstract away boilerplate into semantic, English-like methods, making your test automation framework cleaner, easier to maintain, and accessible to non-developers.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"debug":"^4.4.3","dotenv":"^17.3.1","@civitas-cerebrum/email-client":"^0.0.7","@civitas-cerebrum/context-store":"^0.0.2","@civitas-cerebrum/element-repository":"^0.1.8"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0","@types/debug":"^4.1.13","@playwright/test":"^1.59.1","@civitas-cerebrum/test-coverage":"^0.1.0"},"peerDependencies":{"@playwright/test":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/element-interactions_0.2.8_1776763031637_0.8601874847814024","host":"s3://npm-registry-packages-npm-production"}},"0.2.9":{"name":"@civitas-cerebrum/element-interactions","version":"0.2.9","keywords":["playwright","automation","interactions","assertions","clean-code","facade-pattern","test-automation","steps-api"],"author":{"name":"Umut Ay Bora"},"license":"MIT","_id":"@civitas-cerebrum/element-interactions@0.2.9","maintainers":[{"name":"umutayb","email":"umutaybora@gmail.com"}],"homepage":"https://github.com/civitas-cerebrum/element-interactions#readme","bugs":{"url":"https://github.com/civitas-cerebrum/element-interactions/issues"},"dist":{"shasum":"687de679b609a296acdad467b0d591797584ec93","tarball":"https://registry.npmjs.org/@civitas-cerebrum/element-interactions/-/element-interactions-0.2.9.tgz","fileCount":48,"integrity":"sha512-aA+Zdx/yg6bWKVKKJl+QcPKX/qnXveAxPgqGlaTVn37knD3O2OTKE7jdou7cq+MtpQDuOBO8ZWCuiTcQ7T9oQg==","signatures":[{"sig":"MEQCIEhsTI1xjJntzXzUHSmMCTUHOK4i5pq5PlYiYtb4jdizAiBYRdJ2ggj7xpakOiJ5r9/F6e9rlakQERWpKUpEF20Ypw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@civitas-cerebrum%2felement-interactions@0.2.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":593808},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"cbfb95c9855731b304d494b60c02b11966a22af3","scripts":{"test":"npm run test:unit","build":"npm run clean && tsc","clean":"rm -rf dist","test:ui":"npx playwright test --headed","test:all":"npm run test:unit && npm run test:email","test:unit":"npx playwright test --grep-invert 'Email Integration Tests'","test:email":"npx playwright test --grep 'Email Integration Tests'","test:quiet":"TESTER_DEBUG=false npx playwright test","postinstall":"node scripts/postinstall.js","test:coverage":"npx test-coverage","prepublishOnly":"npm run build","test:with-coverage":"npx playwright test --grep-invert 'Email Integration Tests' && npx test-coverage --format github-plain"},"_npmUser":{"name":"umutayb","email":"umutaybora@gmail.com"},"repository":{"url":"git+https://github.com/civitas-cerebrum/element-interactions.git","type":"git"},"_npmVersion":"11.11.0","description":"A robust, readable interaction and assertion Facade for Playwright. Abstract away boilerplate into semantic, English-like methods, making your test automation framework cleaner, easier to maintain, and accessible to non-developers.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"debug":"^4.4.3","dotenv":"^17.3.1","@civitas-cerebrum/email-client":"^0.0.7","@civitas-cerebrum/context-store":"^0.0.2","@civitas-cerebrum/element-repository":"^0.1.8"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0","@types/debug":"^4.1.13","@playwright/test":"^1.59.1","@civitas-cerebrum/test-coverage":"^0.1.0"},"peerDependencies":{"@playwright/test":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/element-interactions_0.2.9_1776892517886_0.5453227293966008","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@civitas-cerebrum/element-interactions","version":"0.3.0","keywords":["playwright","automation","interactions","assertions","clean-code","facade-pattern","test-automation","steps-api"],"author":{"name":"Umut Ay Bora"},"license":"MIT","_id":"@civitas-cerebrum/element-interactions@0.3.0","maintainers":[{"name":"umutayb","email":"umutaybora@gmail.com"}],"homepage":"https://github.com/civitas-cerebrum/element-interactions#readme","bugs":{"url":"https://github.com/civitas-cerebrum/element-interactions/issues"},"dist":{"shasum":"6f746cb91914079c114233150d5ae3460346ed20","tarball":"https://registry.npmjs.org/@civitas-cerebrum/element-interactions/-/element-interactions-0.3.0.tgz","fileCount":51,"integrity":"sha512-sttvt8/2HeEpRv3kHPv1VEMu/BFVB4+SrLNdRHUQpbtvBKwWjQtls4wXBHIWnTQz08ZJyGRr6813/dcmNSIljQ==","signatures":[{"sig":"MEQCIG70DXXCjnX4gCu03FJ2OG+B7qFDdGSZMA8k5wajHu+RAiB4mm9NWwYmpWoPMTbLQ2ImkJ0Nf4kJyC6Jba/80vXDQQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@civitas-cerebrum%2felement-interactions@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":655961},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"8ef4359c0867d5071fc53e7fd8f37207ce7f0c7e","scripts":{"test":"npm run test:unit","build":"npm run clean && tsc","clean":"rm -rf dist","test:ui":"npx playwright test --headed","test:all":"npm run test:unit && npm run test:email","test:unit":"npx playwright test --grep-invert 'Email Integration Tests'","test:email":"npx playwright test --grep 'Email Integration Tests'","test:quiet":"TESTER_DEBUG=false npx playwright test","postinstall":"node scripts/postinstall.js","test:coverage":"npx test-coverage","prepublishOnly":"npm run build","test:with-coverage":"npx playwright test --grep-invert 'Email Integration Tests' && npx test-coverage --format github-plain"},"_npmUser":{"name":"umutayb","email":"umutaybora@gmail.com"},"repository":{"url":"git+https://github.com/civitas-cerebrum/element-interactions.git","type":"git"},"_npmVersion":"11.12.1","description":"A robust, readable interaction and assertion Facade for Playwright. Abstract away boilerplate into semantic, English-like methods, making your test automation framework cleaner, easier to maintain, and accessible to non-developers.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"debug":"^4.4.3","dotenv":"^17.3.1","@civitas-cerebrum/wasapi":"^0.0.3","@civitas-cerebrum/email-client":"^0.0.7","@civitas-cerebrum/context-store":"^0.0.2","@civitas-cerebrum/element-repository":"^0.1.8"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0","@types/debug":"^4.1.13","@playwright/test":"^1.59.1","@civitas-cerebrum/test-coverage":"^0.1.0"},"peerDependencies":{"@playwright/test":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/element-interactions_0.3.0_1776948195561_0.003984905537727457","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@civitas-cerebrum/element-interactions","version":"0.3.1","keywords":["playwright","automation","interactions","assertions","clean-code","facade-pattern","test-automation","steps-api"],"author":{"name":"Umut Ay Bora"},"license":"MIT","_id":"@civitas-cerebrum/element-interactions@0.3.1","maintainers":[{"name":"umutayb","email":"umutaybora@gmail.com"}],"homepage":"https://github.com/civitas-cerebrum/element-interactions#readme","bugs":{"url":"https://github.com/civitas-cerebrum/element-interactions/issues"},"dist":{"shasum":"3466c811886554141d380e4ae5ae7a9cca43da41","tarball":"https://registry.npmjs.org/@civitas-cerebrum/element-interactions/-/element-interactions-0.3.1.tgz","fileCount":57,"integrity":"sha512-BLHdw0Yp5SzNJP680USbsQRK/TepPEAMacihRxTI7DHvQeaJ2y0ocDIHaxf/opp2qCdMxj2TD7Hd3H0Dt4MYDg==","signatures":[{"sig":"MEUCIQCQNCTqv4TmOo2AF7nZwR7kj6/4lTGUdZ2I1aVan8tbrAIgH1l/vcS4SqbOjm9OJTuTdxqOu27uXfd157JWosAxNxU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@civitas-cerebrum%2felement-interactions@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":809477},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"356b60ed82a71bd18fff5919ea99cc802ceb3a7b","scripts":{"test":"npm run test:unit","build":"npm run clean && tsc","clean":"rm -rf dist","test:ui":"npx playwright test --headed","test:all":"npm run test:unit && npm run test:email","test:unit":"npx playwright test --grep-invert 'Email Integration Tests'","test:email":"npx playwright test --grep 'Email Integration Tests'","test:quiet":"TESTER_DEBUG=false npx playwright test","postinstall":"node scripts/postinstall.js","test:coverage":"npx test-coverage","prepublishOnly":"npm run build","test:with-coverage":"npx playwright test --grep-invert 'Email Integration Tests' && npx test-coverage --format github-plain"},"_npmUser":{"name":"umutayb","email":"umutaybora@gmail.com"},"repository":{"url":"git+https://github.com/civitas-cerebrum/element-interactions.git","type":"git"},"_npmVersion":"11.12.1","description":"A robust, readable interaction and assertion Facade for Playwright. Abstract away boilerplate into semantic, English-like methods, making your test automation framework cleaner, easier to maintain, and accessible to non-developers.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"debug":"^4.4.3","dotenv":"^17.3.1","@civitas-cerebrum/wasapi":"^0.0.3","@civitas-cerebrum/email-client":"^0.0.7","@civitas-cerebrum/context-store":"^0.0.2","@civitas-cerebrum/element-repository":"^0.1.8"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0","@types/debug":"^4.1.13","@playwright/test":"^1.59.1","@civitas-cerebrum/test-coverage":"^0.1.0"},"peerDependencies":{"@playwright/test":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/element-interactions_0.3.1_1777402189603_0.6071916218945677","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@civitas-cerebrum/element-interactions","version":"0.3.2","keywords":["playwright","automation","interactions","assertions","clean-code","facade-pattern","test-automation","steps-api"],"author":{"name":"Umut Ay Bora"},"license":"MIT","_id":"@civitas-cerebrum/element-interactions@0.3.2","maintainers":[{"name":"umutayb","email":"umutaybora@gmail.com"}],"homepage":"https://github.com/civitas-cerebrum/element-interactions#readme","bugs":{"url":"https://github.com/civitas-cerebrum/element-interactions/issues"},"dist":{"shasum":"07b6cb1092469cb8e7bddfb4bb07e848011a6537","tarball":"https://registry.npmjs.org/@civitas-cerebrum/element-interactions/-/element-interactions-0.3.2.tgz","fileCount":63,"integrity":"sha512-rzO9Qz/E1uyMRs/062iaZxZDYKaWoJsnIEzzcg4MIqT5HoxB9c2JZdC0ZoYQw9ALYMVb0hWtqQYbQdZ4Zq0IuA==","signatures":[{"sig":"MEUCIQCaHklRoq62TruU5eRQNfKdXM5ybjRJEtGOHMKxDjE8XQIgaAexq1mc4ld6rVKgWhiRAts5WclcU4Oq2fw7x7Ch79I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@civitas-cerebrum%2felement-interactions@0.3.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":958257},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"b0fb1ab5cdde0573c48e36fca493b537c6bf016b","scripts":{"test":"npm run test:unit","build":"npm run clean && tsc","clean":"rm -rf dist","test:ui":"npx playwright test --headed","test:all":"npm run test:unit && npm run test:email","test:unit":"npx playwright test --grep-invert 'Email Integration Tests'","test:email":"npx playwright test --grep 'Email Integration Tests'","test:quiet":"TESTER_DEBUG=false npx playwright test","postinstall":"node scripts/postinstall.js","test:coverage":"npx test-coverage","prepublishOnly":"npm run build","test:with-coverage":"npx playwright test --grep-invert 'Email Integration Tests' && npx test-coverage --format github-plain"},"_npmUser":{"name":"umutayb","email":"umutaybora@gmail.com"},"repository":{"url":"git+https://github.com/civitas-cerebrum/element-interactions.git","type":"git"},"_npmVersion":"11.11.0","description":"A robust, readable interaction and assertion Facade for Playwright. Abstract away boilerplate into semantic, English-like methods, making your test automation framework cleaner, easier to maintain, and accessible to non-developers.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"debug":"^4.4.3","dotenv":"^17.3.1","@civitas-cerebrum/wasapi":"^0.0.3","@civitas-cerebrum/email-client":"^0.0.7","@civitas-cerebrum/context-store":"^0.0.2","@civitas-cerebrum/element-repository":"^0.1.8"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0","@types/debug":"^4.1.13","@playwright/test":"^1.59.1","@civitas-cerebrum/test-coverage":"^0.1.0"},"peerDependencies":{"@playwright/test":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/element-interactions_0.3.2_1777541085489_0.27229590641331414","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@civitas-cerebrum/element-interactions","version":"0.3.3","keywords":["playwright","automation","interactions","assertions","clean-code","facade-pattern","test-automation","steps-api"],"author":{"name":"Umut Ay Bora"},"license":"MIT","_id":"@civitas-cerebrum/element-interactions@0.3.3","maintainers":[{"name":"umutayb","email":"umutaybora@gmail.com"}],"homepage":"https://github.com/civitas-cerebrum/element-interactions#readme","bugs":{"url":"https://github.com/civitas-cerebrum/element-interactions/issues"},"dist":{"shasum":"d793757c0de8553b2bbfb83b578f11d7497931f8","tarball":"https://registry.npmjs.org/@civitas-cerebrum/element-interactions/-/element-interactions-0.3.3.tgz","fileCount":64,"integrity":"sha512-7Gk7r4zTMuy8KUnDbrcPYEE/sOA4ltBn+kuN2bGDCF/naVkBXyRTfiQVI69llHsN/QUbOcfNePSz9Ho/AGDVwQ==","signatures":[{"sig":"MEYCIQDNk12vkEVbrC+1f6N0hzkzc+/r2WlDEiIlfG68HvRfBgIhANidTrrITeMERP46Gft0n1PMduNMLb9in7ksFHpCuqOK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@civitas-cerebrum%2felement-interactions@0.3.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1014757},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"84de42e9205881dccc14c52ede1a1842caba9da2","scripts":{"test":"npm run test:unit","build":"npm run clean && tsc","clean":"rm -rf dist","test:ui":"npx playwright test --headed","test:all":"npm run test:unit && npm run test:email","test:unit":"npx playwright test --grep-invert 'Email Integration Tests'","test:email":"npx playwright test --grep 'Email Integration Tests'","test:quiet":"TESTER_DEBUG=false npx playwright test","postinstall":"node scripts/postinstall.js","test:coverage":"npx test-coverage","prepublishOnly":"npm run build","test:with-coverage":"npx playwright test --grep-invert 'Email Integration Tests' && npx test-coverage --format github-plain"},"_npmUser":{"name":"umutayb","email":"umutaybora@gmail.com"},"repository":{"url":"git+https://github.com/civitas-cerebrum/element-interactions.git","type":"git"},"_npmVersion":"11.11.0","description":"A robust, readable interaction and assertion Facade for Playwright. Abstract away boilerplate into semantic, English-like methods, making your test automation framework cleaner, easier to maintain, and accessible to non-developers.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"debug":"^4.4.3","dotenv":"^17.3.1","@playwright/cli":"0.1.10","@civitas-cerebrum/wasapi":"^0.0.3","@civitas-cerebrum/email-client":"^0.0.7","@civitas-cerebrum/context-store":"^0.0.2","@civitas-cerebrum/element-repository":"^0.1.8"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0","@types/debug":"^4.1.13","@playwright/test":"^1.59.1","@civitas-cerebrum/test-coverage":"^0.1.0"},"peerDependencies":{"@playwright/test":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/element-interactions_0.3.3_1777634508924_0.9986004938411337","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"@civitas-cerebrum/element-interactions","version":"0.3.4","keywords":["playwright","automation","interactions","assertions","clean-code","facade-pattern","test-automation","steps-api"],"author":{"name":"Umut Ay Bora"},"license":"MIT","_id":"@civitas-cerebrum/element-interactions@0.3.4","maintainers":[{"name":"umutayb","email":"umutaybora@gmail.com"}],"homepage":"https://github.com/civitas-cerebrum/element-interactions#readme","bugs":{"url":"https://github.com/civitas-cerebrum/element-interactions/issues"},"dist":{"shasum":"251842e2ac536a6a2d8fdaa2f3eae210af7646d0","tarball":"https://registry.npmjs.org/@civitas-cerebrum/element-interactions/-/element-interactions-0.3.4.tgz","fileCount":90,"integrity":"sha512-uzCwEOACl2nQ7m1xS+ZMN5hmt2fuetCCO97WVzv7AewTnZBqN7F3GKnz5ufUL/dljdPDPcmTY4m8tCADUJW4UA==","signatures":[{"sig":"MEUCIQDSCWU+YbvRmqm4Wujc5twce0xOgx5vcGJoB6Zm1eadCgIgBUIX6UQei+Ktlip3I/lq4TSYlYItXTEA3dTxhkYTIKU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@civitas-cerebrum%2felement-interactions@0.3.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1213868},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"3739d8035f097dbb0b25d793c0a8dc293a3b5ff6","scripts":{"test":"npm run test:unit","build":"npm run clean && tsc","clean":"rm -rf dist","test:ui":"npx playwright test --headed","test:all":"npm run test:unit && npm run test:email","test:unit":"npx playwright test --grep-invert 'Email Integration Tests'","test:email":"npx playwright test --grep 'Email Integration Tests'","test:quiet":"TESTER_DEBUG=false npx playwright test","postinstall":"node scripts/postinstall.js","test:coverage":"npx test-coverage","prepublishOnly":"npm run build","test:with-coverage":"npx playwright test --grep-invert 'Email Integration Tests' && npx test-coverage --format github-plain"},"_npmUser":{"name":"umutayb","email":"umutaybora@gmail.com"},"repository":{"url":"git+https://github.com/civitas-cerebrum/element-interactions.git","type":"git"},"_npmVersion":"11.11.0","description":"A robust, readable interaction and assertion Facade for Playwright. Abstract away boilerplate into semantic, English-like methods, making your test automation framework cleaner, easier to maintain, and accessible to non-developers.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"debug":"^4.4.3","dotenv":"^17.3.1","@playwright/cli":"0.1.10","@civitas-cerebrum/wasapi":"^0.0.3","@civitas-cerebrum/email-client":"^0.0.7","@civitas-cerebrum/context-store":"^0.0.2","@civitas-cerebrum/element-repository":"^0.1.8"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0","@types/debug":"^4.1.13","@playwright/test":"^1.59.1","@civitas-cerebrum/test-coverage":"^0.1.0"},"peerDependencies":{"@playwright/test":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/element-interactions_0.3.4_1777673428911_0.3851490585260955","host":"s3://npm-registry-packages-npm-production"}},"0.3.5":{"name":"@civitas-cerebrum/element-interactions","version":"0.3.5","keywords":["playwright","automation","interactions","assertions","clean-code","facade-pattern","test-automation","steps-api"],"author":{"name":"Umut Ay Bora"},"license":"MIT","_id":"@civitas-cerebrum/element-interactions@0.3.5","maintainers":[{"name":"umutayb","email":"umutaybora@gmail.com"}],"homepage":"https://github.com/civitas-cerebrum/element-interactions#readme","bugs":{"url":"https://github.com/civitas-cerebrum/element-interactions/issues"},"dist":{"shasum":"76e1b5c1f53d650ab2d95c056bd5d84c2dfab34f","tarball":"https://registry.npmjs.org/@civitas-cerebrum/element-interactions/-/element-interactions-0.3.5.tgz","fileCount":98,"integrity":"sha512-6ixHHOPXpPB4oohlzwqj50o7fd+hzTuwjVTF42nugemyBy2alb06hSKrV1ct4Y56Q7d872JiDjoYPeOnICMdKQ==","signatures":[{"sig":"MEUCIQCB5Gr2hyntYOLeavcK4PXM3da8414/xdQMNxriRLp2EgIgTgslJV4fsciTxJ4HJNqT5nc7lAqQip6zvtRxcc+L16c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@civitas-cerebrum%2felement-interactions@0.3.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1520972},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"2d999f03491547d1bcc595a113ccbf5c04b9e508","scripts":{"test":"npm run test:unit","build":"npm run clean && tsc","clean":"rm -rf dist","test:ui":"npx playwright test --headed","test:all":"npm run test:unit && npm run test:email","test:unit":"npx playwright test --grep-invert 'Email Integration Tests'","test:email":"npx playwright test --grep 'Email Integration Tests'","test:quiet":"TESTER_DEBUG=false npx playwright test","postinstall":"node scripts/postinstall.js","test:coverage":"npx test-coverage","prepublishOnly":"npm run build","test:with-coverage":"npx playwright test --grep-invert 'Email Integration Tests' && npx test-coverage --format github-plain"},"_npmUser":{"name":"umutayb","email":"umutaybora@gmail.com"},"repository":{"url":"git+https://github.com/civitas-cerebrum/element-interactions.git","type":"git"},"_npmVersion":"11.11.0","description":"A robust, readable interaction and assertion Facade for Playwright. Abstract away boilerplate into semantic, English-like methods, making your test automation framework cleaner, easier to maintain, and accessible to non-developers.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"debug":"^4.4.3","dotenv":"^17.3.1","@playwright/cli":"0.1.10","@civitas-cerebrum/wasapi":"^0.0.3","@civitas-cerebrum/email-client":"^0.0.7","@civitas-cerebrum/context-store":"^0.0.2","@civitas-cerebrum/element-repository":"^0.1.8"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0","@types/debug":"^4.1.13","@playwright/test":"^1.59.1","@civitas-cerebrum/test-coverage":"^0.1.0"},"peerDependencies":{"@playwright/test":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/element-interactions_0.3.5_1777725008056_0.5210240366267822","host":"s3://npm-registry-packages-npm-production"}},"0.3.6":{"name":"@civitas-cerebrum/element-interactions","version":"0.3.6","keywords":["playwright","automation","interactions","assertions","clean-code","facade-pattern","test-automation","steps-api"],"author":{"name":"Umut Ay Bora"},"license":"MIT","_id":"@civitas-cerebrum/element-interactions@0.3.6","maintainers":[{"name":"umutayb","email":"umutaybora@gmail.com"}],"homepage":"https://github.com/civitas-cerebrum/element-interactions#readme","bugs":{"url":"https://github.com/civitas-cerebrum/element-interactions/issues"},"dist":{"shasum":"119852d94aefb9599bc0ea204364e4345286ab2a","tarball":"https://registry.npmjs.org/@civitas-cerebrum/element-interactions/-/element-interactions-0.3.6.tgz","fileCount":35,"integrity":"sha512-/gqCBxVdVMxOxA96Z7G4PNvi+3jB5fvWrCWmpMjIm2r5d4dCdrCLu78uBnrFYGyZ6K8oZp/vyXb1TX3K3OVWEA==","signatures":[{"sig":"MEYCIQDZIIiGzubp5keW6KM25p/PGLvRWE07nrUoVriRr4bRywIhAI7iVZQ0YEHROefcYsp6oS9RUb3kIxM8ZYByGcyy0tmN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@civitas-cerebrum%2felement-interactions@0.3.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":398867},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"cb3dc84ddb71cedf29f20b035854575dacab208f","scripts":{"test":"npm run test:unit","build":"npm run clean && tsc","clean":"rm -rf dist","test:ui":"npx playwright test --headed","test:all":"npm run test:unit && npm run test:email","test:unit":"npx playwright test --grep-invert 'Email Integration Tests'","test:email":"npx playwright test --grep 'Email Integration Tests'","test:quiet":"TESTER_DEBUG=false npx playwright test","test:coverage":"npx test-coverage","prepublishOnly":"npm run build","test:with-coverage":"npx playwright test --grep-invert 'Email Integration Tests' && npx test-coverage --format github-plain"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4ba965de-fdc9-4c72-8fcc-57b477527d93"}},"repository":{"url":"git+https://github.com/civitas-cerebrum/element-interactions.git","type":"git"},"_npmVersion":"11.12.1","description":"A robust, readable interaction and assertion Facade for Playwright. Abstract away boilerplate into semantic, English-like methods, making your test automation framework cleaner, easier to maintain, and accessible to non-developers.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"debug":"^4.4.3","dotenv":"^17.3.1","@civitas-cerebrum/wasapi":"^0.0.3","@civitas-cerebrum/email-client":"^0.0.7","@civitas-cerebrum/context-store":"^0.0.2","@civitas-cerebrum/element-repository":"^0.2.1"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/node":"^20.0.0","@types/debug":"^4.1.13","@playwright/test":"^1.59.1","@civitas-cerebrum/test-coverage":"^0.1.0"},"peerDependencies":{"@playwright/test":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/element-interactions_0.3.6_1779265529089_0.9707175695708998","host":"s3://npm-registry-packages-npm-production"}},"0.3.7":{"name":"@civitas-cerebrum/element-interactions","version":"0.3.7","keywords":["playwright","automation","interactions","assertions","clean-code","facade-pattern","test-automation","steps-api"],"author":{"name":"Umut Ay Bora"},"license":"MIT","_id":"@civitas-cerebrum/element-interactions@0.3.7","maintainers":[{"name":"umutayb","email":"umutaybora@gmail.com"}],"homepage":"https://github.com/civitas-cerebrum/element-interactions#readme","bugs":{"url":"https://github.com/civitas-cerebrum/element-interactions/issues"},"dist":{"shasum":"e22ac0e09268ec9db2255ce2ca507caf920f7f78","tarball":"https://registry.npmjs.org/@civitas-cerebrum/element-interactions/-/element-interactions-0.3.7.tgz","fileCount":35,"integrity":"sha512-O6LNHtTPNT87fSo3xP6Z9+KA6pfQJ3XqC4jg/qU9eIZ9q6q0eLhrKCVNyGn210o5OBEcRgmmfUcVhFxmqUvZPw==","signatures":[{"sig":"MEQCIGBlJNdRL7CGtAGvyrozt/DA8/yV5LEmsS6zS2U+XUSGAiB12j96tJlPFnLq3cIy3sR//zxxS7lPl7CihtWa42e9Ig==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@civitas-cerebrum%2felement-interactions@0.3.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":475667},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"607334612b4fa3ea3bf7a984ffc62b901d3c5527","scripts":{"test":"npm run test:unit","build":"npm run clean && tsc","clean":"rm -rf dist","test:ui":"npx playwright test --headed","test:all":"npm run test:unit && npm run test:email","test:unit":"npm run typecheck:tests && npx playwright test --grep-invert 'Email Integration Tests'","test:email":"npx playwright test --grep 'Email Integration Tests'","test:quiet":"TESTER_DEBUG=false npx playwright test","test:coverage":"npx test-coverage","prepublishOnly":"npm run check:publishable && npm run build","typecheck:tests":"tsc -p tsconfig.tests.json","check:publishable":"node -e \"const d={...require('./package.json').dependencies,...require('./package.json').devDependencies}; const bad=Object.entries(d).filter(([,v])=>/^(file|link):/.test(v)); if(bad.length){console.error('Unpublishable deps:',bad);process.exit(1)}\"","test:with-coverage":"npx playwright test --grep-invert 'Email Integration Tests' && npx test-coverage --format github-plain"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4ba965de-fdc9-4c72-8fcc-57b477527d93"}},"overrides":{"nodemailer":"^9.0.1"},"repository":{"url":"git+https://github.com/civitas-cerebrum/element-interactions.git","type":"git"},"_npmVersion":"11.13.0","description":"A robust, readable interaction and assertion Facade for Playwright. Abstract away boilerplate into semantic, English-like methods, making your test automation framework cleaner, easier to maintain, and accessible to non-developers.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"debug":"^4.4.3","dotenv":"^17.3.1","@civitas-cerebrum/wasapi":"^0.0.3","@civitas-cerebrum/sql-client":"^0.1.2","@civitas-cerebrum/email-client":"^0.0.8","@civitas-cerebrum/context-store":"^0.0.2","@civitas-cerebrum/element-repository":"^0.3.1"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.13.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/debug":"^4.1.13","@playwright/test":"^1.61.0","@civitas-cerebrum/test-coverage":"^0.1.0"},"peerDependencies":{"@playwright/test":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/element-interactions_0.3.7_1782116794422_0.4209881509726012","host":"s3://npm-registry-packages-npm-production"}},"0.3.8":{"name":"@civitas-cerebrum/element-interactions","version":"0.3.8","keywords":["playwright","automation","interactions","assertions","clean-code","facade-pattern","test-automation","steps-api"],"author":{"name":"Umut Ay Bora"},"license":"MIT","_id":"@civitas-cerebrum/element-interactions@0.3.8","maintainers":[{"name":"umutayb","email":"umutaybora@gmail.com"}],"homepage":"https://github.com/civitas-cerebrum/element-interactions#readme","bugs":{"url":"https://github.com/civitas-cerebrum/element-interactions/issues"},"dist":{"shasum":"a7e9927733d7295384b69273aa1dd84c4d064dbf","tarball":"https://registry.npmjs.org/@civitas-cerebrum/element-interactions/-/element-interactions-0.3.8.tgz","fileCount":37,"integrity":"sha512-PcL6aijZWTZS0b/UG/9PgBbwzH9J5BODZzlYsRtJ+TxijQ5OjV0Fq70BbF4PdNj1JPKgCx6MKoMhkdj1dIEaSg==","signatures":[{"sig":"MEYCIQCkFSbFqhbgUulEa5IanNU5xW1IDS0wTKGF5acL1DQrpQIhAONQcvIbbJeBijwd5GRYqFExPfE4D95yr1R4ZKrIZQh+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@civitas-cerebrum%2felement-interactions@0.3.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":569438},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"fd18d687f68fd0619da56f50498e45f059df927b","scripts":{"test":"npm run test:unit","build":"npm run clean && tsc","clean":"rm -rf dist","test:ui":"npx playwright test --headed","test:all":"npm run test:unit && npm run test:email","test:unit":"npm run typecheck:tests && npx playwright test --grep-invert 'Email Integration Tests'","test:email":"npx playwright test --grep 'Email Integration Tests'","test:quiet":"TESTER_DEBUG=false npx playwright test","test:coverage":"npx test-coverage","prepublishOnly":"npm run check:publishable && npm run build","typecheck:tests":"tsc -p tsconfig.tests.json","check:publishable":"node -e \"const d={...require('./package.json').dependencies,...require('./package.json').devDependencies}; const bad=Object.entries(d).filter(([,v])=>/^(file|link):/.test(v)); if(bad.length){console.error('Unpublishable deps:',bad);process.exit(1)}\"","test:with-coverage":"npx playwright test --grep-invert 'Email Integration Tests' && npx test-coverage --format github-plain"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4ba965de-fdc9-4c72-8fcc-57b477527d93"}},"overrides":{"nodemailer":"^9.0.1","@civitas-cerebrum/test-coverage":{"glob":"^13.0.6"}},"repository":{"url":"git+https://github.com/civitas-cerebrum/element-interactions.git","type":"git"},"_npmVersion":"11.16.0","description":"A robust, readable interaction and assertion Facade for Playwright. Abstract away boilerplate into semantic, English-like methods, making your test automation framework cleaner, easier to maintain, and accessible to non-developers.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"debug":"^4.4.3","dotenv":"^17.3.1","@civitas-cerebrum/wasapi":"^0.0.3","@civitas-cerebrum/sql-client":"^0.1.2","@civitas-cerebrum/email-client":"^0.0.8","@civitas-cerebrum/context-store":"^0.0.2","@civitas-cerebrum/element-repository":"^0.3.1"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.13.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/debug":"^4.1.13","@playwright/test":"^1.61.0","@civitas-cerebrum/test-coverage":"^0.1.0"},"peerDependencies":{"@playwright/test":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/element-interactions_0.3.8_1785237829255_0.4647476478895818","host":"s3://npm-registry-packages-npm-production"}},"0.3.9":{"name":"@civitas-cerebrum/element-interactions","version":"0.3.9","description":"A robust, readable interaction and assertion Facade for Playwright. Abstract away boilerplate into semantic, English-like methods, making your test automation framework cleaner, easier to maintain, and accessible to non-developers.","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"clean":"rm -rf dist","build":"npm run clean && tsc","test":"npm run test:unit","test:all":"npm run test:unit && npm run test:email","typecheck:tests":"tsc -p tsconfig.tests.json","test:unit":"npm run typecheck:tests && npx playwright test --grep-invert 'Email Integration Tests'","test:email":"npx playwright test --grep 'Email Integration Tests'","test:ui":"npx playwright test --headed","check:publishable":"node -e \"const d={...require('./package.json').dependencies,...require('./package.json').devDependencies}; const bad=Object.entries(d).filter(([,v])=>/^(file|link):/.test(v)); if(bad.length){console.error('Unpublishable deps:',bad);process.exit(1)}\"","prepublishOnly":"npm run check:publishable && npm run build","test:quiet":"TESTER_DEBUG=false npx playwright test","test:coverage":"npx test-coverage","test:with-coverage":"npx playwright test --grep-invert 'Email Integration Tests' && npx test-coverage --format github-plain"},"peerDependencies":{"@playwright/test":">=1.0.0"},"devDependencies":{"@civitas-cerebrum/test-coverage":"^0.1.0","@playwright/test":"^1.61.0","@types/debug":"^4.1.13","@types/node":"^20.0.0","pg":"^8.13.0","typescript":"^5.0.0"},"keywords":["playwright","automation","interactions","assertions","clean-code","facade-pattern","test-automation","steps-api"],"publishConfig":{"access":"public","provenance":true},"repository":{"type":"git","url":"git+https://github.com/civitas-cerebrum/element-interactions.git"},"author":{"name":"Umut Ay Bora"},"license":"MIT","dependencies":{"@civitas-cerebrum/context-store":"^0.0.2","@civitas-cerebrum/element-repository":"^0.3.1","@civitas-cerebrum/email-client":"^0.0.9","@civitas-cerebrum/sql-client":"^0.1.2","@civitas-cerebrum/wasapi":"^0.0.3","debug":"^4.4.3","dotenv":"^17.3.1"},"overrides":{"nodemailer":"^9.0.1","@civitas-cerebrum/test-coverage":{"glob":"^13.0.6"}},"gitHead":"ff2bc19a62bd6b273dc9f256729e6eb35ae681ca","_id":"@civitas-cerebrum/element-interactions@0.3.9","bugs":{"url":"https://github.com/civitas-cerebrum/element-interactions/issues"},"homepage":"https://github.com/civitas-cerebrum/element-interactions#readme","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-pQhloV3iXQ5przts3MaebVNWCC0et2ZfSrNAGzdx3R15snlS3ty45qk+0NqVJZLDpur+9p7W6ahBgmYR+F/VXQ==","shasum":"3c766b65f6e045bc40d6583fc7f7e6f517b6dee0","tarball":"https://registry.npmjs.org/@civitas-cerebrum/element-interactions/-/element-interactions-0.3.9.tgz","fileCount":37,"unpackedSize":576490,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@civitas-cerebrum%2felement-interactions@0.3.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDCUqxQQySm9ky2JRhak8kkVys8ihqRtzocLwdfAw+XlAIhAPc/s0RXk5Bz1AjihnxDqdy577ST3GVjYmBq+FUlV3og"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4ba965de-fdc9-4c72-8fcc-57b477527d93"}},"directories":{},"maintainers":[{"name":"umutayb","email":"umutaybora@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/element-interactions_0.3.9_1786529853250_0.04536348957728986"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-26T00:02:04.903Z","modified":"2026-08-12T10:17:34.243Z","0.1.1":"2026-03-26T00:02:05.179Z","0.1.2":"2026-03-27T17:21:38.438Z","0.1.3":"2026-03-27T19:08:41.564Z","0.1.4":"2026-03-27T23:36:14.315Z","0.1.5":"2026-03-30T13:30:55.689Z","0.1.6":"2026-03-31T12:30:07.813Z","0.1.8":"2026-04-03T16:57:54.118Z","0.1.7":"2026-04-06T18:45:56.776Z","0.1.9":"2026-04-10T07:32:16.426Z","0.2.0":"2026-04-10T18:27:55.922Z","0.2.1":"2026-04-11T11:22:09.213Z","0.2.2":"2026-04-14T09:28:27.439Z","0.2.3":"2026-04-14T10:26:50.284Z","0.2.4":"2026-04-15T09:43:35.693Z","0.2.5":"2026-04-18T05:30:21.450Z","0.2.6":"2026-04-18T13:24:31.095Z","0.2.7":"2026-04-18T19:06:32.999Z","0.2.8":"2026-04-21T09:17:11.901Z","0.2.9":"2026-04-22T21:15:18.030Z","0.3.0":"2026-04-23T12:43:15.723Z","0.3.1":"2026-04-28T18:49:49.754Z","0.3.2":"2026-04-30T09:24:45.662Z","0.3.3":"2026-05-01T11:21:49.092Z","0.3.4":"2026-05-01T22:10:29.086Z","0.3.5":"2026-05-02T12:30:08.243Z","0.3.6":"2026-05-20T08:25:29.228Z","0.3.7":"2026-06-22T08:26:34.559Z","0.3.8":"2026-07-28T11:23:49.421Z","0.3.9":"2026-08-12T10:17:33.388Z"},"bugs":{"url":"https://github.com/civitas-cerebrum/element-interactions/issues"},"author":{"name":"Umut Ay Bora"},"license":"MIT","homepage":"https://github.com/civitas-cerebrum/element-interactions#readme","keywords":["playwright","automation","interactions","assertions","clean-code","facade-pattern","test-automation","steps-api"],"repository":{"type":"git","url":"git+https://github.com/civitas-cerebrum/element-interactions.git"},"description":"A robust, readable interaction and assertion Facade for Playwright. Abstract away boilerplate into semantic, English-like methods, making your test automation framework cleaner, easier to maintain, and accessible to non-developers.","maintainers":[{"name":"umutayb","email":"umutaybora@gmail.com"}],"readme":"# Playwright Element Interactions\n\n[![NPM Version](https://img.shields.io/npm/v/@civitas-cerebrum/element-interactions?color=rgb(88%2C%20171%2C%2070))](https://www.npmjs.com/package/@civitas-cerebrum/element-interactions)\n\nA robust, readable interaction-and-assertion facade for Playwright. The `Steps` API and `ElementRepository` decouple element acquisition from interaction, so raw selectors never appear in test code — and tests stay tight, semantic, and resistant to DOM churn.\n\nThis package is the **framework** layer: a programmatic Playwright facade for humans + LLM agents to write against. If you want the **methodology** layer — agent skills, harness hooks, return-shape schemas, and the postinstall plumbing that drives Claude Code through an end-to-end autonomous QA pipeline — install [`@civitas-cerebrum/achilles`](https://www.npmjs.com/package/@civitas-cerebrum/achilles) alongside this package. Achilles depends on element-interactions and orchestrates it through eight documented phases.\n\n---\n\n## 🏗️ The Test-Authoring Framework\n\nA `page-repository.json` file is the single source of truth for selectors. Tests reference elements by plain strings (`'CheckoutPage'`, `'submitButton'`); the framework handles resolution, waiting, logging, and overlay-retry on every interaction.\n\n**Before (Raw Playwright):**\n\n```ts\n// Hardcode or manage raw locators inside your test\nconst submitBtn = page.locator('button[data-test=\"submit-order\"]');\n\n// Explicitly wait for DOM stability and visibility\nawait submitBtn.waitFor({ state: 'visible', timeout: 30000 });\n\n// Log what's happening so failures are debuggable\nconsole.log('Clicking on \"submitButton\" in \"CheckoutPage\"');\n\n// Perform the interaction — and hand-roll a fallback for overlays\n// that intercept pointer events (cookie banners, sticky headers, etc.)\ntry {\n  await submitBtn.click({ timeout: 5000 });\n} catch (error) {\n  if (error instanceof Error && error.message.includes('intercepts pointer events')) {\n    await submitBtn.dispatchEvent('click');\n  } else {\n    throw error;\n  }\n}\n```\n\n**After (@civitas-cerebrum/element-interactions):**\n\n```ts\n// Resolve from the page repository, log the action, wait, click,\n// and auto-retry past pointer interception — one line.\nawait steps.click('submitButton', 'CheckoutPage');\n```\n\n---\n\n## 📦 Installation\n\n```bash\nnpm i @civitas-cerebrum/element-interactions\n```\n\n**Peer dependencies:** `@playwright/test` is required.\n\nIf you don't have a Playwright project yet:\n\n```bash\nnpm init playwright@latest playwright-project\ncd playwright-project\nnpm i @civitas-cerebrum/element-interactions\n```\n\n> **Tip:** Set `reporter: 'html'` in `playwright.config.ts` so failure screenshots are captured and viewable in the HTML report — `baseFixture` attaches them there, and the [`@civitas-cerebrum/achilles`](https://www.npmjs.com/package/@civitas-cerebrum/achilles) failure-diagnosis skill reads from the same report when you run that package.\n\n---\n\n## ✨ Features\n\n* **Zero locator boilerplate** — The `Steps` API fetches elements and interacts with them in a single call.\n* **Automatic failure screenshots** — `baseFixture` captures a full-page screenshot on every failed test and attaches it to the HTML report.\n* **Standardized waiting** — Built-in methods wait for elements to reach specific DOM states (visible, hidden, attached, detached).\n* **Advanced image verification** — `verifyImages` evaluates actual browser decoding and `naturalWidth`, not just DOM presence.\n* **Visual regression with dynamic-data masking** — `verifyVisualMatch` is a thin facade over Playwright's `toHaveScreenshot` with masks referenced by `{ elementName, pageName }`. Cover clocks / generated ids / live counters / \"updated N minutes ago\" badges so the pixel diff stays stable across runs without dropping into raw Playwright locators.\n* **Smart dropdowns** — Select by value, index, or randomly, with automatic skipping of disabled and empty options.\n* **Flexible assertions** — Verify exact text, non-empty text, URL substrings, or dynamic element counts (greater than, less than, exact).\n* **Smart interactions** — Drag to other elements, type sequentially, wait for specific element state, verify images and more!\n* **Force click with auto-retry** — Clicks automatically retry with a native DOM event when pointer interception is detected, and a click that times out *after* its input was dispatched is never clicked again — so toggles and overlay-openers can't double-fire on slow environments. No configuration needed.\n* **Unified visibility API** — `isVisible()` is a dual-behavior chain. `await steps.isVisible('banner', 'Page')` resolves to a boolean (probe, never throws). `steps.isVisible('banner', 'Page').click()` silently skips the action when hidden (gate). Both forms accept `{ timeout, containsText }`. Replaces `ifVisible()` and the old boolean `isVisible()` probe.\n* **Chain-style expect matchers** — `steps.expect('price', 'Page').text.toMatch(/^\\$/).count.toBe(1).attributes.get('data-status').toBe('ready')` chains as many verifications as you need on a single element; awaiting flushes the queue and short-circuits on the first failure. `.not` is one-shot, `.throws('msg')` overrides messages, `.timeout(ms)` scopes wait time per call.\n* **Predicate escape hatch** — `steps.expect('price', 'Page').satisfy(el => parseFloat(el.text.slice(1)) > 10).throws('price must be above $10')` for assertions the matcher tree doesn't cover. Predicates run against a snapshot of plain element data — no async access required inside the lambda.\n* **Role + accessible name selectors** — `{ \"role\": \"button\", \"name\": \"Log in\" }` resolves via `page.getByRole()` with regex support.\n* **Regex text selectors** — `{ \"text\": { \"regex\": \"pattern\", \"flags\": \"i\" } }` for matching dynamic content.\n* **Iframe-scoped pages** — Elements inside iframes are resolved transparently via `frame` property on page definitions.\n* **Cross-platform** — Enhanced selectors resolve natively on Android (UiSelector) and iOS (predicate strings).\n\n---\n\n## 🗂️ Defining Locators\n\nAll selectors live in a page repository JSON file — the single source of truth for element locations. No raw selectors should appear in test code.\n\n```json\n{\n  \"pages\": [\n    {\n      \"name\": \"HomePage\",\n      \"elements\": [\n        {\n          \"elementName\": \"submitButton\",\n          \"selector\": {\n            \"css\": \"button[data-test='submit']\"\n          }\n        }\n      ]\n    }\n  ]\n}\n```\n\nEach selector object supports `css`, `xpath`, `id`, or `text` as the locator strategy.\n\n**Enhanced selectors** — the following advanced selector types are also supported:\n\n```json\n{ \"role\": \"button\", \"name\": \"Log in\" }\n{ \"role\": \"button\", \"name\": { \"regex\": \"Log in|Sign in\", \"flags\": \"i\" } }\n{ \"text\": { \"regex\": \"Total.*\\\\$\\\\d+\", \"flags\": \"i\" } }\n```\n\n**Iframe-scoped pages** — add a `frame` property to scope elements inside an iframe:\n\n```json\n{\n  \"name\": \"PaymentIframe\",\n  \"frame\": { \"css\": \"iframe[title*='card number' i]\" },\n  \"elements\": [{ \"elementName\": \"cardInput\", \"selector\": { \"css\": \"#card\" } }]\n}\n```\n\nSupports `frameIndex` (`\"first\"`, `\"last\"`, or zero-based number) and nested frames (array of frame selectors).\nCross-platform: role and regex selectors resolve via UiSelector on Android and predicate strings on iOS.\n\n**Naming conventions:**\n- `name` — PascalCase page identifier, e.g. `CheckoutPage`, `ProductDetailsPage`\n- `elementName` — camelCase element identifier, e.g. `submitButton`, `galleryImages`\n\n---\n\n## 💻 Usage: The `Steps` API (Recommended)\n\nInitialize `Steps` by passing your `ElementRepository` instance (which already holds the driver/page):\n\n```ts\nimport { test } from '@playwright/test';\nimport { ElementRepository } from '@civitas-cerebrum/element-repository';\nimport { Steps, DropdownSelectType } from '@civitas-cerebrum/element-interactions';\n\ntest('Add random product and verify image gallery', async ({ page }) => {\n  const repo = new ElementRepository(page, 'tests/data/locators.json');\n  const steps = new Steps(repo);\n\n  await steps.navigateTo('/');\n  await steps.click('category-accessories', 'HomePage');\n\n  // Use StepOptions to control element selection and interaction modifiers\n  await steps.click('product-cards', 'AccessoriesPage', { strategy: 'random' });\n  await steps.verifyUrlContains('/product/');\n\n  const selectedSize = await steps.selectDropdown('size-selector', 'ProductDetailsPage', {\n    type: DropdownSelectType.RANDOM,\n  });\n\n  await steps.verifyCount('gallery-images', 'ProductDetailsPage', { greaterThan: 0 });\n  await steps.verifyText('product-title', 'ProductDetailsPage');  // no args = asserts not empty\n  await steps.verifyImages('gallery-images', 'ProductDetailsPage');\n});\n```\n\n### Fluent API: `steps.on()`\n\nFor a chainable alternative, use `steps.on(elementName, pageName)`:\n\n```ts\ntest('Fluent checkout flow', async ({ steps }) => {\n  await steps.on('category-accessories', 'HomePage').click();\n  await steps.on('product-cards', 'AccessoriesPage').random().click();\n  await steps.on('product-title', 'ProductDetailsPage').verifyPresence();\n  \n  const price = await steps.on('price', 'ProductDetailsPage').getText();\n  await steps.on('add-to-cart', 'ProductDetailsPage').click({ withoutScrolling: true });\n  await steps.on('cart-count', 'Header').verifyText('1');\n\n  // Gate — skip action if not visible (replaces deprecated ifVisible())\n  await steps.on('promoBanner', 'ProductDetailsPage').isVisible().click();\n\n  // Probe — returns boolean, never throws\n  const hasDiscount = await steps.on('discountBadge', 'ProductDetailsPage').isVisible();\n\n  // Gate with text filter — only click when the banner shows \"50% off\"\n  await steps.isVisible('promo', 'ProductDetailsPage', { containsText: '50% off' }).click();\n\n  // Strategy selector: pick the VISIBLE duplicate among responsive copies, then\n  // compose terminals like .first() does. Throws if none visible (unlike the\n  // skip-if-hidden .ifVisible()/.isVisible() gates). Resolves via repo.getVisible().\n  await steps.on('navMenu', 'HomePage').visible().click();\n  await steps.on('cta', 'HomePage').visible().verifyState('visible');\n});\n```\n\n> **`.visible()` vs `.visible` vs `.isVisible()`.** `steps.on(el, page).visible()` (a **call**) is the *visible-selection strategy*: among duplicate matches it resolves the visible one via `repo.getVisible(...)` and **throws if none is visible** — use it to disambiguate responsive desktop/mobile duplicate elements. `steps.on(el, page).visible` (no call) is the *matcher-tree boolean field* (`.visible.toBeTrue()`). Both coexist on the same chain. Distinct again from `.ifVisible()` / `.isVisible()`, which *conditionally skip* when the element is hidden rather than selecting and proceeding.\n#### Scoped child queries: `findByRole` / `findByText` / `findBySelector`\n\nQuery \"X within a named element\" without ever exposing the parent `Locator` to your test. Each resolves the parent (`steps.on(name, page)`) and returns a **scoped `ElementAction`** querying inside it — composing with every existing terminal (`.count`, `.verifyState`, `.click`, `.getText`, `.first()` / `.nth()`, the matcher tree, …). They mirror Playwright's `getByRole` / `getByText` / `locator`, but as an explicit within-parent sub-query distinguished from top-level repository resolution.\n\n* **`findByRole(role, options?: { name?: string | RegExp; exact?: boolean })`** — scopes `parent.getByRole(role, options)`.\n* **`findByText(text: string | RegExp, options?: { exact?: boolean })`** — scopes `parent.getByText(text, options)`.\n* **`findBySelector(css: string)`** — scopes `parent.locator(css)`.\n\n```ts\n// Count the buttons inside a named dialog — no parent selector in the test.\nawait steps.on('cookieDialog', 'CookieBanner').findByRole('button').count.toBe(2);\nawait steps.on('cookieDialog', 'CookieBanner').findByRole('button', { name: /preferences|manage/i }).count.toBe(0);\n\n// Assert text that lives inside a named drawer is visible.\nawait steps.on('cartPanel', 'CartPage').findByText('Your cart is empty').verifyState('visible');\n\n// Fill an input scoped to a named panel; .first() / .nth() narrowing composes.\nawait steps.on('panel', 'Page').findBySelector(\"input[name='email']\").fill('a@b.com');\nawait steps.on('table', 'TablePage').findByRole('row').nth(1).getText();\n```\n\n`.first()` / `.nth(i)` narrow the scoped match the same way they narrow a repo-resolved element; count / order terminals see the whole scoped set.\n\n### Expect Matcher Tree\n\nA chain-style assertion API for the common case where you want to verify multiple things about a single element. Available at both `steps.expect(el, page)` (top-level) and as field getters on `steps.on(el, page)` (fluent). Each matcher call queues an assertion; awaiting flushes the queue and short-circuits on the first failure.\n\n```ts\ntest('Submit button readiness', async ({ steps }) => {\n  // Chain multiple verifications in one expression\n  await steps.on('submit-button', 'CheckoutPage')\n    .text.toBe('Place Order')\n    .visible.toBeTrue()\n    .enabled.toBeTrue()\n    .attributes.get('data-variant').toBe('primary')\n    .not.attributes.toHaveKey('disabled')\n    .css('cursor').toMatch(/pointer|default|auto/);\n});\n\ntest('Top-level matcher tree', async ({ steps }) => {\n  await steps.expect('price', 'ProductPage').text.toBe('$19.99');\n  await steps.expect('price', 'ProductPage').text.toMatch(/^\\$\\d+\\.\\d{2}$/);\n  await steps.expect('items', 'ListPage').count.toBeGreaterThan(3);\n  await steps.expect('error', 'Page').not.text.toContain('Crash');\n});\n\ntest('Predicate escape hatch + custom message', async ({ steps }) => {\n  await steps.expect('price', 'ProductPage')\n    .satisfy(el => parseFloat(el.text.slice(1)) > 10)\n    .throws('price must be above $10');\n});\n\ntest('Per-call timeout override', async ({ steps }) => {\n  await steps.on('slow-widget', 'Page').timeout(5000).text.toBe('Ready');\n  await steps.on('items', 'Page').count.timeout(500).toBeGreaterThan(0);\n});\n```\n\n**Field matchers:** `text`, `value`, `count`, `visible`, `enabled`, `attributes`, `css(prop)`, `html`, `outerHtml`. Each carries `.not` for negation. Snapshot fields available in predicates: `text`, `value`, `attributes`, `visible`, `enabled`, `count`. See the [API reference](https://github.com/civitas-cerebrum/achilles/blob/main/skills/element-interactions/references/api-reference.md#expect-matcher-tree) for the full surface.\n\n### StepOptions\n\nAll Steps methods accept an optional last parameter for element selection and interaction modifiers:\n\n```ts\n// Select by strategy\nawait steps.click('element', 'Page', { strategy: 'random' });\nawait steps.click('element', 'Page', { strategy: 'index', index: 2 });\nawait steps.click('element', 'Page', { strategy: 'text', text: 'Submit' });\n\n// Interaction modifiers\nawait steps.click('element', 'Page', { withoutScrolling: true });  // dispatches a DOM 'click' event without scrolling into view (alias semantics of force)\nawait steps.click('element', 'Page', { ifPresent: true });         // skip if not visible\nawait steps.click('element', 'Page', { force: true });             // dispatches a DOM 'click' event directly — NOT Playwright's force: true\n                                                                   // (no pointer simulation, no actionability checks; rename pending in a future major)\n\n// Combine both\nawait steps.click('element', 'Page', { strategy: 'random', withoutScrolling: true });\n```\n\n---\n\n## 🔧 Fixtures: Zero-Setup Tests (Recommended)\n\nFor larger projects, manually initializing `repo` and `steps` in every test becomes repetitive. `baseFixture` injects all core dependencies automatically via Playwright's fixture system.\n\n### Included fixtures\n\n| Fixture | Type | Description |\n|---|---|---|\n| `steps` | `Steps` | The full Steps API, ready to use |\n| `repo` | `ElementRepository` | Direct repository access for advanced locator queries |\n| `interactions` | `ElementInteractions` | Raw interactions API for custom locators |\n| `contextStore` | `ContextStore` | Shared in-memory store for passing data between steps |\n\n`baseFixture` also attaches a full-page `failure-screenshot` to the Playwright HTML report on every failed test.\n\n> **Note:** `reporter: 'html'` must be set in `playwright.config.ts` for screenshots to appear. Run `npx playwright show-report` after a failed run to inspect them.\n\n### 1. Playwright Config\n\n```ts\n// playwright.config.ts\nimport { defineConfig } from '@playwright/test';\n\nexport default defineConfig({\n  testDir: './tests',\n  reporter: 'html',\n  use: {\n    baseURL: 'https://your-project-url.com',\n    headless: true,\n  },\n});\n```\n\n### 2. Create your fixture file\n\n```ts\n// tests/fixtures/base.ts\nimport { test as base, expect } from '@playwright/test';\nimport { baseFixture } from '@civitas-cerebrum/element-interactions';\n\nexport const test = baseFixture(base, 'tests/data/page-repository.json', {\n  timeout: 60000,                   // element timeout for Steps/Interactions (default: 30000)\n  repoTimeout: 15000,               // element resolution timeout for repo (default: 15000)\n  interceptionRetry: true,          // intercepted clicks fall back to a dispatched DOM click event (default: true);\n                                    // set false so genuine overlay bugs (stuck modals, cookie walls) fail the\n                                    // click — recommended for adversarial/bug-discovery suites\n  blockedOrigins: /(analytics\\.com|tracking\\.io)/,  // auto-abort matching routes\n  screenshotOnFailure: true,        // auto-capture on test failure (default: true)\n  // screenshotOnFailure: { fullPage: false },  // viewport-only screenshots\n  // screenshotOnFailure: false,                 // disable screenshots\n});\nexport { expect };\n```\n\n### 3. Use fixtures in your tests\n\n```ts\n// tests/checkout.spec.ts\nimport { test, expect } from '../fixtures/base';\nimport { DropdownSelectType } from '@civitas-cerebrum/element-interactions';\n\ntest('Complete checkout flow', async ({ steps }) => {\n  await steps.navigateTo('/');\n  await steps.click('category-accessories', 'HomePage');\n  await steps.clickRandom('product-cards', 'AccessoriesPage');\n  await steps.verifyUrlContains('/product/');\n\n  const selectedSize = await steps.selectDropdown('size-selector', 'ProductDetailsPage', {\n    type: DropdownSelectType.RANDOM,\n  });\n\n  await steps.verifyImages('gallery-images', 'ProductDetailsPage');\n  await steps.click('add-to-cart-button', 'ProductDetailsPage');\n  await steps.waitForState('confirmation-modal', 'CheckoutPage', 'visible');\n});\n```\n\n### 4. Access `repo` directly when needed\n\nRepository methods return `Element` wrappers (not raw Playwright `Locator` objects). For most use cases, the `Steps` API handles this transparently. When using `repo` directly, the `Element` interface provides common methods like `click()`, `fill()`, `textContent()`, etc. To access the underlying Playwright `Locator` (e.g. for Playwright-specific assertions), cast to `WebElement`:\n\n```ts\nimport { WebElement } from '@civitas-cerebrum/element-interactions';\n\ntest('Navigate to Forms category', async ({ repo, steps }) => {\n  await steps.navigateTo('/');\n\n  const formsLink = await repo.getByText('categories', 'HomePage', 'Forms');\n  await formsLink?.click();\n\n  await steps.verifyAbsence('categories', 'HomePage');\n});\n\ntest('Use underlying Locator for advanced assertions', async ({ repo }) => {\n  const element = await repo.get('elementName', 'PageName');\n  const locator = (element as WebElement).locator;\n  await expect(locator).toHaveCSS('color', 'rgb(255, 0, 0)');\n});\n\ntest('Use fluent action chain', async ({ repo }) => {\n  const element = await repo.get('submitButton', 'LoginPage');\n  await element.action(5000).waitForState('visible').click();\n});\n```\n\n**Full Repository API** (note: `(elementName, pageName)` order, no driver arg):\n\n```ts\nawait repo.get('elementName', 'PageName');                         // single Element (first match)\nawait repo.get('elementName', 'PageName', { strategy: SelectionStrategy.RANDOM }); // with options\nawait repo.getAll('elementName', 'PageName');                      // array of Elements\nawait repo.getRandom('elementName', 'PageName');                   // random from matches\nawait repo.getByText('elementName', 'PageName', 'Text');           // filter by visible text\nawait repo.getByAttribute('elementName', 'PageName', 'data-status', 'active'); // filter by attribute\nawait repo.getByIndex('elementName', 'PageName', 2);               // zero-based index\nawait repo.getByRole('elementName', 'PageName', 'button');          // filter by role\nawait repo.getVisible('elementName', 'PageName');                   // first visible match\nrepo.getSelector('elementName', 'PageName');                        // sync, selector string\nrepo.getSelectorRaw('elementName', 'PageName');                     // sync, { strategy, value }\nrepo.driver;                                                        // the bound Page/Browser\n```\n\n### 5. Extend with your own fixtures\n\nBecause `baseFixture` returns a standard Playwright `test` object, you can layer your own fixtures on top:\n\n```ts\n// tests/fixtures/base.ts\nimport { test as base } from '@playwright/test';\nimport { baseFixture } from '@civitas-cerebrum/element-interactions';\nimport { AuthService } from '../services/AuthService';\n\ntype MyFixtures = {\n  authService: AuthService;\n};\n\nconst testWithBase = baseFixture(base, 'tests/data/page-repository.json');\n\nexport const test = testWithBase.extend<MyFixtures>({\n  authService: async ({ page }, use) => {\n    await use(new AuthService(page));\n  },\n});\n\nexport { expect } from '@playwright/test';\n```\n\n```ts\ntest('Authenticated flow', async ({ steps, authService }) => {\n  await authService.login('user@test.com', 'secret');\n  await steps.verifyUrlContains('/dashboard');\n});\n```\n\n---\n\n## 🛠️ API Reference: `Steps`\n\nEvery method below automatically fetches the Playwright `Locator` using your `pageName` and `elementName` keys from the repository.\n\n### 🧭 Navigation\n\n* **`navigateTo(url: string, options?: { query?: Record<string, string>; waitUntil?: WaitUntilState })`** — Navigates the browser to the specified absolute or relative URL. `query` appends key-value pairs as query parameters. `waitUntil` chooses the page lifecycle state to wait for before resolving — `'load'` (default, unchanged), `'domcontentloaded'`, `'networkidle'`, or `'commit'`. Pass `'domcontentloaded'` for SPA navigations that stall a cold WebKit/Safari on the full `load` event. **Returns the navigation `Response`** (the last redirect's response), or `null` when navigation triggered no network request (same-document hash nav). Read `res.status()` to assert 404 / redirect contracts without dropping to raw `page.goto`; callers that ignore the return value are unaffected.\n* **`getUrl()`** — Returns the current page URL (the full href) synchronously. The value-returning companion to `verifyUrlContains` — use it when a test needs the live URL to compute a path, diff against a start URL, or build a pattern.\n* **`getCurrentPath()`** — Returns the `pathname` of the current page URL (no origin, query, or hash). Convenience over `new URL(steps.getUrl()).pathname`.\n* **`waitForUrl(url: string | RegExp | ((url: URL) => boolean), action?: () => Promise<unknown>, options?: { timeout?: number; waitUntil?: WaitUntilState })`** — Waits until the page URL matches `url`. A string is a glob pattern, a RegExp is a contains-style match, and a predicate receives the live `URL`. Pass `action` to arm the wait **before** the navigation-triggering action runs (issued concurrently via `Promise.all`) so a fast client-side route change cannot complete in the gap between acting and waiting — the race-safe form for rapid navigations. The `action`'s return value is ignored, so a value-returning call (e.g. `() => steps.navigateTo('/x')`, which resolves a `Response | null`) is accepted without a `void`-assignability error.\n* **`refresh()`** — Reloads the current page.\n* **`backOrForward(direction: 'back' | 'forward')`** — Navigates the browser history stack in the given direction.\n* **`setViewport(width: number, height: number)`** — Resizes the browser viewport to the specified pixel dimensions.\n* **`switchToNewTab(action: () => Promise<void>)`** — Executes an action that opens a new tab (e.g. clicking a link with `target=\"_blank\"`), waits for the new tab, and returns the new `Page` object.\n* **`closeTab(targetPage?: Page)`** — Closes the specified tab (or the current one) and returns the remaining active page.\n* **`getTabCount()`** — Returns the number of currently open tabs/pages in the browser context.\n\n### 🖱️ Interaction\n\n* **`click(elementName, pageName, options?: StepOptions)`** — Clicks an element. Supports `{ strategy, withoutScrolling, ifPresent, force }`. On pointer interception it falls back to a dispatched DOM `'click'` event, logs a warning, and pushes a report-visible `interception-fallback` test annotation naming `PageName.elementName`; set `interceptionRetry: false` on the fixture to rethrow the original error instead (that opt-out is scoped to the interception fallback). A click that fails is never blind-retried — what happens depends on how it failed:\n\n  | The click failed… | Behaviour |\n  |---|---|\n  | with a pointer interception | Falls back to `dispatchEvent('click')` (above). |\n  | by timing out *after* its input was dispatched | Treated as delivered: logs a warning, pushes a `deadline-click` annotation, and does **not** click again. Your next verification is the gate that it landed. |\n  | by timing out while still waiting for actionability | Continues on the *remaining* budget, so total elapsed stays within your `timeout`. |\n  | any other way (page closed, strict-mode violation) | Rethrown. |\n\n  Note: `force` dispatches a DOM `'click'` event directly (no pointer simulation, no actionability checks — NOT Playwright's `force: true`); `withoutScrolling` has alias semantics of `force` (no scroll into view). Rename pending in a future major.\n* **`clickIfPresent(elementName, pageName)`** — Clicks only if visible; skips silently. Returns `boolean`.\n* **`clickRandom(elementName, pageName, options?: StepOptions)`** — Clicks a random element from all matches. Supports `{ withoutScrolling }`.\n* **`rightClick(elementName, pageName)`** — Right-clicks an element to trigger a context menu.\n* **`doubleClick(elementName, pageName)`** — Double-clicks an element.\n* **`check(elementName, pageName)`** — Checks a checkbox or radio button. No-op if already checked.\n* **`uncheck(elementName, pageName)`** — Unchecks a checkbox. No-op if already unchecked.\n* **`hover(elementName, pageName)`** — Hovers over an element to trigger dropdowns or tooltips.\n* **`scrollIntoView(elementName, pageName)`** — Smoothly scrolls an element into the viewport.\n* **`dragAndDrop(elementName, pageName, options: DragAndDropOptions)`** — Drags an element to a target element (`{ target: Locator | Element }`), by coordinate offset (`{ xOffset, yOffset }`), or both.\n* **`dragAndDropListedElement(elementName, pageName, elementText, options: DragAndDropOptions)`** — Finds a specific element by its text from a list, then drags it to a destination.\n* **`fill(elementName, pageName, text: string)`** — Clears and fills an input field with the provided text.\n* **`uploadFile(elementName, pageName, filePath: string | string[])`** — Uploads one or more files to an `<input type=\"file\">` element. Pass a string array to attach multiple files in a single call.\n* **`dropFiles(elementName, pageName, filenames: string[], options?: { mimeType?: string })`** — Simulates dropping files onto a drop-zone by dispatching `dragenter`, `dragover`, and `drop` events with a populated `DataTransfer`. Filenames are basenames only — no real file is read from disk.\n* **`selectDropdown(elementName, pageName, options?: DropdownSelectOptions)`** — Selects an option from a `<select>` element and returns its `value`. Defaults to `{ type: DropdownSelectType.RANDOM }`. Also supports `VALUE` (exact match) and `INDEX` (zero-based).\n* **`setSliderValue(elementName, pageName, value: number)`** — Sets a range input (`<input type=\"range\">`) to the specified numeric value.\n* **`pressKey(key: string)`** — Presses a keyboard key at the page level (e.g. `'Enter'`, `'Escape'`, `'Tab'`).\n* **`pressKeys(keys: string[])`** — Presses a multi-key chord at the page level; parts are joined with `+`, so `['Control', 'A']` presses `Control+A`. The intent-revealing companion to `pressKey` for shortcuts where listing the modifiers reads clearer. Throws on an empty array.\n* **`dispatchEvent(elementName, pageName, type: string, eventInit?)`** — Dispatches a synthetic DOM event on a named element WITHOUT actionability checks (custom events, firing `input`/`change` on widgets that swallow synthetic typing). Prefer `click`/`fill`/`pressKey` for real user input — this is the controlled escape for driving handlers directly. Example: `await steps.dispatchEvent('searchInput', 'HomePage', 'input')`.\n* **`typeSequentially(elementName, pageName, text: string, delay?: number)`** — Types text character by character with a configurable delay (default `100ms`). Ideal for OTP inputs or fields with `keyup` listeners.\n\n### 📊 Data Extraction\n\n* **`getText(elementName, pageName)`** — Returns the trimmed text content of an element, or `null` when the element has no text content.\n* **`getAttribute(elementName, pageName, attributeName: string)`** — Returns the value of an HTML attribute (e.g. `href`, `aria-pressed`), or `null` if it doesn't exist.\n* **`getLocalStorage(key: string)`** — Reads `window.localStorage[key]`. Returns the stored string or `null` if the key is absent (matches the native `getItem` contract). Use for state the framework cannot reach through the DOM — persisted theme, dismissed-banner flag, feature toggles, auth tokens.\n* **`getSessionStorage(key: string)`** — Same shape, against `window.sessionStorage`.\n* **`getLocalStorageKeys()`** — Returns every key currently set in `window.localStorage` as a `string[]`. The enumerating companion to `getLocalStorage` — use when the test needs to know *which* keys exist (e.g. asserting a logout cleared all persisted state) rather than reading one known key.\n* **`getSessionStorageKeys()`** — Same shape, against `window.sessionStorage`.\n* **`setLocalStorage(key: string, value: string)`** — Writes `window.localStorage[key]` (matches the native `setItem` contract; value coerced to string). The mutating companion to `getLocalStorage`. Use to seed persisted state a test depends on, or to drive resilience checks with deliberately malformed values (e.g. corrupt JSON the app must tolerate).\n* **`setSessionStorage(key: string, value: string)`** — Same shape, against `window.sessionStorage`.\n* **`removeLocalStorage(key: string)`** — Removes a single key from `window.localStorage` (no-op when absent — native `removeItem` contract). The mutating companion to `getLocalStorage`; clears one piece of persisted state without disturbing the rest.\n* **`removeSessionStorage(key: string)`** — Same shape, against `window.sessionStorage`.\n* **`clearLocalStorage()`** — Removes every key from `window.localStorage` (native `clear` contract). Reset persisted state between phases of a test.\n* **`clearSessionStorage()`** — Same shape, against `window.sessionStorage`.\n* **`getWindowProperty<T>(path: string)`** — Reads a `window`-level value by dotted path — e.g. `'__XSS_FIRED'`, `'dataLayer.length'`, `'document.title'`. Walks the path key-by-key and returns `undefined` for any missing segment (never throws on a missing path). Use to assert window-state the DOM doesn't surface: analytics layers, injected sentinels, feature flags.\n* **`setWindowProperty(path: string, value: unknown)`** — Sets a `window`-level value by dotted path, creating intermediate objects as needed. The mutating companion to `getWindowProperty`; use to seed window-level state a test depends on.\n* **`evaluateScript<T>(fn, arg?)`** — The **single labelled escape hatch** for arbitrary in-page JavaScript: `page.evaluate(fn, arg)`, typed and logged. This is the **last resort** — prefer the targeted steps (`getWindowProperty`, `verifyWindowProperty`, the matcher tree, scoped queries), which stay named, retrying, and grep-able. Reach here only when no targeted step expresses the read. Example: `await steps.evaluateScript<number>(() => document.querySelectorAll('a').length)`.\n\n### ✅ Verification\n\n* **`verifyPresence(elementName, pageName)`** — Asserts that an element is attached to the DOM and visible.\n* **`verifyAllPresent(targets: Array<{ elementName, pageName, options? }>)`** — Asserts presence of multiple independent elements in parallel via `Promise.all`. Equivalent to sequential `verifyPresence` calls but resolves all assertions concurrently — useful when a page has many content blocks to assert at once. Example: `await steps.verifyAllPresent([{ elementName: 'title', pageName: 'PDP' }, { elementName: 'price', pageName: 'PDP' }])`.\n* **`verifyAbsence(elementName, pageName)`** — Asserts that an element is hidden or detached from the DOM.\n* **`verifyText(elementName, pageName, expectedText?)`** — Asserts element text. Provide `expectedText` for an exact match, or call with no args to assert not empty.\n* **`verifyCount(elementName, pageName, options: CountVerifyOptions)`** — Asserts element count. Accepts `{ exactly: number }`, `{ greaterThan: number }`, `{ lessThan: number }` (combinable with `greaterThan` for a range), `{ greaterThanOrEqual: number }`, or `{ lessThanOrEqual: number }` (combinable with `greaterThanOrEqual` for an inclusive range).\n* **`verifyImages(elementName, pageName, scroll?: boolean, options?: StepOptions & { verifyDecoded?: boolean })`** — Verifies image rendering: checks visibility, valid `src`, and `naturalWidth > 0`. Pass `{ verifyDecoded: true }` in `options` to also run the browser's native `decode()` round-trip (more thorough, adds a CDP round-trip per image; off by default). Scrolls into view by default.\n* **`verifyTextContains(elementName, pageName, expectedText: string)`** — Asserts that an element's text contains the expected substring.\n* **`verifyState(elementName, pageName, state)`** — Asserts the state of an element. Supported states: `'enabled'`, `'disabled'`, `'editable'`, `'checked'`, `'focused'`, `'visible'`, `'hidden'`, `'attached'`, `'inViewport'`.\n* **`verifyAttribute(elementName, pageName, attributeName: string, expectedValue: string)`** — Asserts that an element has a specific HTML attribute with an exact value.\n* **`verifyUrlContains(text: string)`** — Asserts that the current URL contains the expected substring.\n* **`verifyPageContainsText(text: string | RegExp, options?: { timeout?: number; errorMessage?: string })`** — Page-level mirror of `verifyTextContains`. Asserts the document body contains `text` (substring or RegExp), with web-first retry. Use for page-wide copy where no single element is the natural scope. Example: `await steps.verifyPageContainsText(/404|niet gevonden/i)`.\n* **`verifyPageNotContainsText(text: string | RegExp, options?: { timeout?: number; errorMessage?: string })`** — Negated companion. Asserts the body does **not** contain `text`. Use for \"not a 404\" / no-error-copy body checks. Text-level: raw markup never appears in rendered text — for markup-level assertions use `verifyPageHtmlContains(html, { negated: true })`. Example: `await steps.verifyPageNotContainsText(/server error/i)`.\n* **`verifyPageTitle(title: string | RegExp, options?: { timeout?: number; errorMessage?: string })`** — Asserts the page `<title>` equals the string or matches the RegExp. Wraps `expect(page).toHaveTitle`.\n* **`verifyInputValue(elementName, pageName, expectedValue: string)`** — Asserts that an input, textarea, or select element has the expected value.\n* **`verifyTabCount(expectedCount: number)`** — Asserts the number of currently open tabs/pages in the browser context.\n* **`verifyLocalStorage(key: string, options: StorageVerifyOptions)`** — Asserts a property of `localStorage[key]`. Pick exactly one matcher in the options: `{ equals: string }` (exact match), `{ contains: string }` (substring), `{ matches: RegExp }`, or `{ present: boolean }` (existence). All four forms also accept `negated`, `timeout`, and `errorMessage`. Polls until the predicate holds or the timeout expires, so it survives the race between a UI action firing and its persistence side-effect landing.\n* **`verifySessionStorage(key: string, options: StorageVerifyOptions)`** — Same shape, against `window.sessionStorage`.\n* **`verifyWindowProperty(path: string, options: WindowVerifyOptions)`** — Retrying assertion over a `window`-level value read by dotted path. Pick exactly one matcher: `{ equals }`, `{ contains }` (substring / array membership), `{ matches: RegExp }`, `{ present: boolean }`, `{ truthy: boolean }`, `{ greaterThan: number }`, or `{ lessThan: number }`. All forms also accept `negated`, `timeout`, and `errorMessage`. Polls until the predicate holds (or its negation) or the timeout expires.\n* **`expectNoRequest(urlPattern: string | RegExp, action, options?: { timeout?: number; methods?: ('GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS')[]; redactQuery?: boolean })`** — Negative companion to `waitForResponse`. Asserts that **no** request matching `urlPattern` fires during `action` (and an observation window after, default `1000`ms). Use to prove a client-side block — HTML5 `required`, native `type=email` validation, custom JS guards — short-circuits before the XHR is issued. Strings are Playwright globs (same semantics as `waitForResponse`); reach for a RegExp for contains-style matches. Throws with the offending `method url` lines when a matching request did fire. **Secret-leak surface**: the offender URL is included verbatim in the thrown error (which flows into runner output and Playwright traces) — pass `{ redactQuery: true }` when your URLs may carry tokens or API keys in query parameters.\n\n```ts\n// Examples\nawait steps.verifyLocalStorage('theme', { equals: 'dark' });\nawait steps.verifyLocalStorage('flag', { contains: 'enabled' });\nawait steps.verifyLocalStorage('build', { matches: /^v\\d+$/ });\nawait steps.verifyLocalStorage('seen', { present: true });\nawait steps.verifyLocalStorage('temp', { present: false });                  // absence\nawait steps.verifyLocalStorage('theme', { equals: 'light', negated: true }); // not equal\n\n// Window-level state (analytics layers, injected flags, XSS sentinels)\nawait steps.verifyWindowProperty('dataLayer.length', { greaterThan: 0 });\nawait steps.verifyWindowProperty('__test.flag', { equals: true });\nawait steps.verifyWindowProperty('__XSS_FIRED', { present: false });          // sentinel never fired\nawait steps.verifyWindowProperty('document.title', { matches: /Wishlist/i });\n```\n\n### 🌐 Session-aware HTTP requests\n\nBacked by Playwright's `page.request` (`APIRequestContext`), which **shares the browser context's cookies/session** — the right tool for authenticated redirect / protected-route contract checks (e.g. \"hitting `/account` while logged out 30x-redirects to `/login`\"). Distinct from the wasapi `api*` external-service client. Each verb returns a typed `BrowserResponse`; `failOnStatusCode` defaults to `false` so status assertions work on 4xx/5xx responses.\n\n```ts\nimport { BrowserResponse, BrowserRequestOptions } from '@civitas-cerebrum/element-interactions';\n```\n\n* **`requestGet(url, opts?)`** / **`requestPost`** / **`requestPut`** / **`requestPatch`** / **`requestDelete`** / **`requestHead`** — Thin wrappers over `page.request.<verb>`. `opts: { maxRedirects?, headers?, params?, data?, form?, failOnStatusCode?, timeout? }` pass through to Playwright's request options. Return a `BrowserResponse`: `{ status, ok, url, headers, statusText, json<T>(), text(), body() }`.\n* **`verifyRequestStatus(res: BrowserResponse, code: number)`** — Asserts the response status equals `code` (simple throw helper; the response is already resolved).\n* **`verifyRequestHeader(res: BrowserResponse, name: string, value?: string | RegExp)`** — Asserts a header is present (name match is case-insensitive). Omit `value` for presence only; a string asserts exact equality (values are case-sensitive, matching `verifyApiHeader` — use a `RegExp` with `/i` for case-insensitive matching); a `RegExp` asserts a match.\n* **`verifyRequestOk(res: BrowserResponse)`** — Asserts the response is a 2xx success.\n\n```ts\nconst res = await steps.requestGet('/account', { maxRedirects: 0 });   // uses the logged-in session\nawait steps.verifyRequestStatus(res, 307);\nawait steps.verifyRequestHeader(res, 'location', /\\/login/);\nexpect(await res.text()).toContain('Sign in');\n```\n\n### 🔍 Visibility — Probe + Gate\n\n* **`isVisible(elementName, pageName, options?)`** — Dual-behavior entry point. Returns a `VisibleChain` that is both:\n  - **awaitable as `Promise<boolean>`** — the probe, never throws. `await steps.isVisible(...)` resolves to `true` / `false`.\n  - **chainable with action methods and the matcher tree** — the gate, silently skips when hidden.\n  Options: `{ timeout?: number (default 2000), containsText?: string }`.\n* **`isPresent(elementName, pageName)`** — Boolean presence check with the default element timeout. Equivalent to `await element.isVisible()` on the resolved element.\n\n```ts\n// Probe — boolean\nconst ok = await steps.isVisible('banner', 'Page', { timeout: 500 });\n\n// Gate — click only if visible (no throw)\nawait steps.isVisible('cookieBanner', 'Page').click();\n\n// Gate with text filter\nawait steps.isVisible('promo', 'Page', { containsText: '50% off' }).click();\n\n// Matcher tree — silently skipped when hidden\nawait steps.isVisible('banner', 'Page').text.toBe('Hello');\n```\n\nEvery probe and gate decision is logged under the `tester:visible` debug channel with a `[probe]` or `[gate]` tag so silently-skipped actions stay debuggable.\n\n> **`ifVisible()` is deprecated** in favor of `isVisible()`. It remains available as a backwards-compatible alias on `ElementAction`.\n\n### 📋 Listed Elements\n\nOperate on a specific element within a list (table rows, cards, list items) by matching its visible text or an HTML attribute. Optionally drill into a child element within the matched item.\n\n```ts\nimport { ListedElementMatch, VerifyListedOptions, GetListedDataOptions } from '@civitas-cerebrum/element-interactions';\n```\n\n* **`clickListedElement(elementName, pageName, options: ListedElementMatch)`** — Finds and clicks a specific element from a list. Identify the target by `{ text }` or `{ attribute: { name, value } }`, and optionally drill into a child with `{ child: 'css-selector' }` or `{ child: { pageName, elementName } }`.\n* **`verifyListedElement(elementName, pageName, options: VerifyListedOptions)`** — Finds a listed element and asserts against it. Use `{ expectedText }` to verify text, `{ expected: { name, value } }` to verify an attribute, or omit both to assert visibility.\n* **`getListedElementData(elementName, pageName, options: GetListedDataOptions)`** — Extracts data from a listed element. Returns the element's text content by default, or an attribute value when `{ extractAttribute: 'attrName' }` is specified.\n\n```ts\n// Click the row containing \"John\"\nawait steps.clickListedElement('tableRows', 'UsersPage', { text: 'John' });\n\n// Click a child button inside the row matching an attribute\nawait steps.clickListedElement('tableRows', 'UsersPage', {\n  attribute: { name: 'data-id', value: '5' },\n  child: 'button.edit'\n});\n\n// Verify text of a child cell in the row containing \"Name\"\nawait steps.verifyListedElement('submissionEntries', 'FormsPage', {\n  text: 'Name',\n  child: 'td:nth-child(2)',\n  expectedText: 'John Doe'\n});\n\n// Verify an attribute on a listed element\nawait steps.verifyListedElement('tableRows', 'UsersPage', {\n  attribute: { name: 'data-id', value: '5' },\n  expected: { name: 'class', value: 'active' }\n});\n\n// Extract an href from a child link inside a listed element\nconst href = await steps.getListedElementData('tableRows', 'UsersPage', {\n  text: 'John',\n  child: 'a.profile-link',\n  extractAttribute: 'href'\n});\n\n// Regex text match — pick any row whose text matches the pattern\nawait steps.clickListedElement('tableRows', 'Users', {\n  text: { regex: 'Alice|Bob|Carol', flags: 'i' }\n});\n\n// withDescendant — match only rows that contain a specific descendant element\nawait steps.clickListedElement('tableRows', 'Users', {\n  text: 'John',\n  withDescendant: { pageName: 'Users', elementName: 'activeBadge' }\n});\n```\n\n### ⏳ Wait\n\n* **`waitForState(elementName, pageName, state?: 'visible' | 'attached' | 'hidden' | 'detached', options?)`** — Waits for an element to reach a specific DOM state. Defaults to `'visible'`. Returns `Promise<boolean>`. **Throws on timeout as of 0.3.7**; pass `{ optional: true }` to probe without failing (resolves `false` instead). `{ timeout: ms }` overrides the instance timeout per call.\n\n  ```ts\n  await steps.waitForState('confirmationModal', 'CheckoutPage', 'visible');                        // throws on timeout (0.3.7+)\n  const open = await steps.waitForState('promoBanner', 'HomePage', 'visible', { optional: true }); // probe — false on timeout\n  ```\n\n* **`waitForNetworkIdle(options?: { timeout?: number; optional?: boolean })`** — Waits until there are no in-flight network requests for at least 500ms. `timeout` sets a per-call bound (without it, Playwright's default timeout applies — configurable via `page.setDefaultTimeout` / the test config). `optional: true` resolves quietly on a `TimeoutError` instead of throwing, for best-effort settling where lingering traffic should not fail the test (real failures still throw). With no options, behaviour is unchanged.\n* **`waitForLoadState(state: LoadState, options?: { timeout?: number })`** — Waits for the page to reach the given lifecycle `state` (`'load'`, `'domcontentloaded'`, or `'networkidle'`). The general-purpose lifecycle-wait companion to `waitForNetworkIdle` (which is fixed to `'networkidle'`): use it for a standalone wait **after an action** that does not navigate — e.g. waiting for `'domcontentloaded'` once a client-side view swap finishes. `options.timeout` bounds the wait.\n* **`pace(ms: number)`** — A deliberate pause, named `pace` (NOT `wait`) to signal intentional timing control — settling a debounce, spacing rapid-fire actions — never a substitute for a wait-for-state (prefer `waitForState` / `waitForUrl` / a web-first assertion when you are actually waiting for the app to reach a condition). Throws on a negative or non-finite duration. Mirrored on `Utils.pace`.\n* **`repeat(action, times, options?: { intervalMs? })`** — Runs `action` `times` times in sequence (passing the zero-based index) and returns every result in order; with `intervalMs`, paces BETWEEN iterations (never before the first or after the last). The intent-revealing form of \"do X rapidly N times\". Throws unless `times` is a non-negative integer. Example: `await steps.repeat(i => steps.on('swatch', 'PDP').nth(i).click(), 3, { intervalMs: 120 })`. Mirrored on `Utils.repeat`.\n* **`waitForResponse(urlPattern: string | RegExp, action: () => Promise<void>)`** — Executes an action and waits for a matching network response. Returns the `Response` object. For the negative companion (asserting **no** matching request fires), see `expectNoRequest` in the Verification section.\n* **`waitAndClick(elementName, pageName, state?: string, options?)`** — Waits for an element to reach a state (default `'visible'`), then clicks it. Throws when the element never reaches the state — `optional` softness is deliberately not inherited here.\n\n### 🧩 Composite / Workflow\n\n* **`fillForm(pageName, fields: Record<string, FillFormValue>)`** — Fills multiple form fields in one call. String values fill text inputs; `DropdownSelectOptions` values trigger dropdown selection.\n* **`retryUntil(action, verification, maxRetries?, delayMs?)`** — Retries an action until a verification passes, or until the max attempts (default `3`) are reached.\n* **`clearInput(elementName, pageName)`** — Clears the value of an input or textarea without filling new text.\n* **`selectMultiple(elementName, pageName, values: string[])`** — Selects multiple options from a `<select multiple>` element by their value attributes.\n* **`clickNth(elementName, pageName, index: number)`** — Clicks the element at a specific zero-based index from all matches.\n\n### 📊 Additional Data Extraction\n\n* **`getAll(elementName, pageName, options?: GetAllOptions)`** — Extracts text (or attributes) from all matching elements. Supports `{ child }` and `{ extractAttribute }`.\n* **`getCount(elementName, pageName)`** — Returns the number of DOM elements matching the locator.\n* **`getInputValue(elementName, pageName)`** — Returns the current `value` property of an input, textarea, or select element.\n* **`getCssProperty(elementName, pageName, property: string)`** — Returns a computed CSS property value (e.g. `'rgb(255, 0, 0)'`).\n* **`getBoundingBox(elementName, pageName, options?)`** — Returns the element's bounding box `{ x, y, width, height }` (CSS pixels, main-frame relative), or `null` when the element is not rendered (short-circuits on zero matches instead of blocking on `boundingBox()`'s auto-wait). Use for layout/geometry assertions the DOM doesn't otherwise surface: overlap, off-screen positioning, collapsed `0×0` regions. Mirrored on `Extractions.getBoundingBox`.\n* **`getPageText()`** — Returns the rendered text of the current page (`document.body.innerText`). The page-level text companion to `getPageHtml` — use for page-level text assertions where no single element is the natural scope (e.g. confirming a 404 body renders known copy).\n\n### ✅ Additional Verification\n\n* **`verifyOrder(elementName, pageName, expectedTexts: string[])`** — Asserts that elements' text contents appear in the exact order specified.\n* **`verifyCssProperty(elementName, pageName, property: string, expectedValue: string)`** — Asserts that a computed CSS property matches the expected value.\n* **`verifyListOrder(elementName, pageName, direction: 'asc' | 'desc')`** — Asserts that elements' text contents are sorted in the specified direction.\n\n### 📸 Screenshot\n\n* **`screenshot()`** — Captures a page screenshot. Pass `{ fullPage: true }` for scrollable capture, `{ path: 'file.png' }` to save to disk.\n* **`screenshot(elementName, pageName, options?)`** — Captures a screenshot of a specific element.\n\n### 🎯 Visual Regression — `verifyVisualMatch`\n\nVisual regression tests are great until your UI has dynamic data. A clock that ticks every second, a generated transaction id, or an \"updated 3 minutes ago\" badge is enough to break a baseline snapshot — your test fails on the first run, then again, then again, you give up and disable it.\n\nYou don't have to. Playwright has a `mask` option built right into `toHaveScreenshot`: pass a list of locators and Playwright paints a solid box over those regions before the snapshot is captured, so the rest of the page stays pixel-perfect for comparison.\n\n`verifyVisualMatch` is the framework's facade over that capability — masks are referenced by `{ elementName, pageName }` (the same shape every other step uses), so you don't have to drop into raw Playwright locators.\n\n```ts\n// Page-level. The dashboard has a `currentTime` and a `transactionId` that\n// change every run. Both get masked. The snapshot stays stable.\nawait steps.verifyVisualMatch('dashboard.png', {\n  mask: [\n    { elementName: 'currentTime',   pageName: 'DashboardPage' },\n    { elementName: 'transactionId', pageName: 'DashboardPage' },\n  ],\n});\n\n// Element-level. Scope the snapshot to the header; mask sub-regions inside it.\nawait steps.verifyVisualMatch('header.png', {\n  elementName: 'header',\n  pageName:    'DashboardPage',\n  mask: [{ elementName: 'liveCounter', pageName: 'DashboardPage' }],\n});\n\n// Raw selector escape hatch — for regions that don't warrant a repo entry.\nawait steps.verifyVisualMatch('dashboard.png', {\n  mask: [{ selector: '[data-testid=\"current-time\"]' }],\n});\n```\n\n**When to use it.** Any UI that has live counters, charts, timestamps, randomly-generated ids, user avatars, or \"updated N minutes ago\" badges. Mask the dynamic regions once and sleep at night like a baby. The pattern is part of every recommended test-composition flow in the framework's skill suite — coverage-expansion composers, happy-path tests, and adversarial probes all benefit when the surface they're locking down has any content-level dynamism.\n\n**What you don't have to worry about.** CSS animations are disabled by default during the snapshot (Playwright's own `animations: 'disabled'`). You only need `mask` for content-level dynamism — no need for animation-freezing CSS hacks.\n\n**Baselines.** The first run writes the baseline; subsequent runs diff. Use `npx playwright test --update-snapshots` to refresh baselines intentionally. Playwright fingerprints baselines per OS / browser channel, so generate them in the same environment your CI runs.\n\n**Full options surface.** `mask`, `maskColor`, `fullPage`, `maxDiffPixelRatio`, `maxDiffPixels`, `timeout`, `errorMessage`. See [`VisualMatchOptions`](./src/enum/Options.ts).\n\n---\n\n## 🧱 Advanced: Raw Interactions API\n\nTo bypass the `Steps` facade, use `ElementInteractions` directly. All methods take a `WebElement` — the element type the repository resolves. Raw Playwright `Locator`s are not accepted; wrap one in `new WebElement(locator)` at the seam if you must bridge:\n\n```ts\nimport { ElementInteractions } from '@civitas-cerebrum/element-interactions';\nimport { WebElement } from '@civitas-cerebrum/element-repository';\n\nconst interactions = new ElementInteractions(page);\n\n// Elements come from the repository (the `repo` fixture)\nconst element = await repo.get('submitButton', 'LoginPage') as WebElement;\nawait interactions.interact.click(element, { withoutScrolling: true });\nawait interactions.verify.presence(element);\n\n// Bridging a hand-built locator (one-off escape hatch — prefer a repository entry)\nconst custom = new WebElement(page.locator('button.dynamic-class'));\nawait interactions.verify.count(custom, { greaterThan: 2 });\n```\n\nAll `interact`, `verify`, `extract`, and `navigate` methods are available on `ElementInteractions`.\n\n**Sanctioned escape hatches.** When the facade genuinely doesn't cover what you need:\n\n- **Element-level** — `(element as WebElement).locator` exposes the underlying Playwright `Locator` of a repository-resolved element, e.g. for a raw Playwright expectation: `expect((element as WebElement).locator).toHaveScreenshot()`.\n- **Page-level** — use the `page` fixture directly for page-scoped Playwright APIs the facade doesn't wrap (dialogs, downloads, `page.on(...)` events).\n\nIf you reach for either of these more than once for the same need, that's an API gap — file an issue so the capability can land in the framework properly.\n\n---\n\n## 📧 Email API\n\nSend and receive emails in your tests. Supports plain text, inline HTML, and HTML file templates for full customisation.\n\n### Setup\n\nPass email credentials to `baseFixture` via the options parameter. Configure `smtp`, `imap`, or both depending on which features you need:\n\n```ts\n// tests/fixtures/base.ts\nimport { test as base, expect } from '@playwright/test';\nimport { baseFixture } from '@civitas-cerebrum/element-interactions';\n\nexport const test = baseFixture(base, 'tests/data/page-repository.json', {\n  emailCredentials: {\n    smtp: {\n      email: process.env.SENDER_EMAIL!,\n      password: process.env.SENDER_PASSWORD!,\n      host: process.env.SENDER_SMTP_HOST!,\n    },\n    imap: {\n      email: process.env.RECEIVER_EMAIL!,\n      password: process.env.RECEIVER_PASSWORD!,\n    },\n  }\n});\nexport { expect };\n```\n\nOnly need to send? Provide `smtp` only. Only need to receive? Provide `imap` only. The client will throw a clear error if you call a method that requires the missing credential.\n\n### Sending Emails\n\n```ts\n// Plain text\nawait steps.sendEmail({\n  to: 'user@example.com',\n  subject: 'Test Email',\n  text: 'Hello from Playwright!'\n});\n\n// Inline HTML\nawait steps.sendEmail({\n  to: 'user@example.com',\n  subject: 'HTML Email',\n  html: '<h1>Hello</h1><p>Inline HTML content</p>'\n});\n\n// HTML file from project directory — great for branded templates\nawait steps.sendEmail({\n  to: 'user@example.com',\n  subject: 'Monthly Report',\n  htmlFile: 'emails/report-template.html'\n});\n```\n\n### Receiving Emails\n\nUse composable filters to search the inbox. Combine as many filters as needed — all are applied with AND logic. Filtering tries exact match first, then falls back to partial case-insensitive match (with a warning log).\n\n```ts\nimport { EmailFilterType } from '@civitas-cerebrum/element-interactions';\n// Note: EmailFilterType and other email types can also be imported from '@civitas-cerebrum/email-client'\n\n// Single filter — get the latest matching email\nconst email = await steps.receiveEmail({\n  filters: [{ type: EmailFilterType.SUBJECT, value: 'Your OTP Code' }]\n});\n\n// Open the downloaded HTML in the browser\nawait steps.navigateTo('file://' + email.filePath);\n\n// Now interact with the email content like any web page\nconst otpCode = await steps.getText('otpCode', 'EmailPage');\n\n// Combine multiple filters\nconst email2 = await steps.receiveEmail({\n  filters: [\n    { type: EmailFilterType.SUBJECT, value: 'Verification' },\n    { type: EmailFilterType.FROM, value: 'noreply@example.com' },\n    { type: EmailFilterType.CONTENT, value: 'verification code' },\n  ]\n});\n\n// Get ALL matching emails\nconst allEmails = await steps.receiveAllEmails({\n  filters: [\n    { type: EmailFilterType.FROM, value: 'alerts@example.com' },\n    { type: EmailFilterType.SINCE, value: new Date('2025-01-01') },\n  ]\n});\n```\n\n### Marking Emails\n\nMark emails as read, unread, flagged, unflagged, or archived:\n\n```ts\nimport { EmailMarkAction } from '@civitas-cerebrum/element-interactions';\n\n// Mark matching emails as read\nawait steps.markEmail(EmailMarkAction.READ, {\n  filters: [{ type: EmailFilterType.SUBJECT, value: 'OTP' }]\n});\n\n// Flag all emails from a sender\nawait steps.markEmail(EmailMarkAction.FLAGGED, {\n  filters: [{ type: EmailFilterType.FROM, value: 'noreply@example.com' }]\n});\n\n// Archive emails\nawait steps.markEmail(EmailMarkAction.ARCHIVED, {\n  filters: [{ type: EmailFilterType.SUBJECT, value: 'Report' }]\n});\n\n// Mark all emails in folder\nawait steps.markEmail(EmailMarkAction.UNREAD);\n```\n\n### Cleaning the Inbox\n\nDelete emails matching filters, or clean the entire inbox:\n\n```ts\n// Delete emails from a specific sender\nawait steps.cleanEmails({\n  filters: [{ type: EmailFilterType.FROM, value: 'noreply@example.com' }]\n});\n\n// Delete all emails in the inbox\nawait steps.cleanEmails();\n```\n\n**Filter types (`EmailFilterType`):**\n\n| Type | Value Type | Description |\n|---|---|---|\n| `SUBJECT` | `string` | Filter by email subject |\n| `FROM` | `string` | Filter by sender address |\n| `TO` | `string` | Filter by recipient address |\n| `CONTENT` | `string` | Filter by email body (HTML or plain text) |\n| `SINCE` | `Date` | Only include emails received after this date |\n\n**`receiveEmail()` / `receiveAllEmails()` options:**\n\n| Option | Type | Default | Description |\n|---|---|---|---|\n| `filters` | `EmailFilter[]` | — | **Required.** Composable filters (AND logic) |\n| `folder` | `string` | `'INBOX'` | IMAP folder to search |\n| `waitTimeout` | `number` | `30000` | Max time (ms) to wait for a match |\n| `pollInterval` | `number` | `3000` | How often (ms) to poll the inbox |\n| `expectedCount` | `number` | — | Specific number of expected results |\n| `maxFetchLimit` | `number` | `50` | Max emails to fetch per polling cycle |\n| `downloadDir` | `string` | `os.tmpdir()/pw-emails` | Where to save the downloaded HTML |\n\n**`ReceivedEmail` return type:**\n\n| Property | Type | Description |\n|---|---|---|\n| `filePath` | `string` | Absolute path to the downloaded HTML file |\n| `subject` | `string` | Email subject line |\n| `from` | `string` | Sender address |\n| `date` | `Date` | When the email was sent |\n| `html` | `string` | Raw HTML content |\n| `text` | `string` | Plain text content |\n\n---\n\n## SQL Database Steps\n\nQuery a SQL database directly in your tests — the natural oracle for verifying that a UI or API\nmutation actually persisted. Backed by `@civitas-cerebrum/sql-client`, which speaks\nPostgres, MySQL/MariaDB, SQLite, SQL Server, and Oracle. All values are parametrised; never\ninterpolate values into SQL.\n\n### Install the engine driver\n\nelement-interactions does **not** bundle SQL drivers — install the one for the engine you target,\nalongside this package:\n\n```sh\nnpm install pg              # Postgres\nnpm install mysql2          # MySQL / MariaDB\nnpm install better-sqlite3  # SQLite\nnpm install mssql           # SQL Server\nnpm install oracledb        # Oracle\n```\n\nDrivers load lazily: a `steps.sql*` call against an engine whose driver isn't installed throws a\nclear `UnsupportedEngineException` naming the package to install — at the first DB step, not at\nfixture setup. Tests that never touch SQL need no driver at all.\n\n### Fixture configuration\n\n```ts\nexport const test = baseFixture(base, 'tests/data/page-repository.json', {\n  dbUrl: process.env.DB_URL,            // default connection\n  dbProviders: {                        // optional named connections\n    analytics: process.env.ANALYTICS_DB_URL,\n  },\n});\n```\n\nPools open lazily on first use and are closed automatically when the test finishes.\n\n### Reading (SELECT)\n\n```ts\nconst res = await steps.sqlQuery<{ title: string }>(\n  'SELECT title FROM books WHERE genre = $1 ORDER BY title', ['Fiction']);\nawait steps.verifySqlRowCount(res, 5);\nawait steps.verifySqlValue(res, 0, 'title', '1984');\n```\n\n### Writing (INSERT/UPDATE/DELETE)\n\n```ts\nconst ins = await steps.sqlExecute(\n  'INSERT INTO cart_items (cart_item_id,user_id,book_id,quantity,added_at) VALUES ($1,$2,$3,$4,$5)',\n  ['cart-1','user-1','book-1',2,'2026-01-01T00:00:00Z']);\n// ins.rowCount === 1\n```\n\n### Fluent builder\n\n```ts\nconst top = await steps.sqlSelect('books')\n  .columns('title', 'price')\n  .where('price < ?', 15)\n  .orderBy('price', 'desc')\n  .limit(5)\n  .run();\n\nawait steps.sqlInsert('cart_items').values({ cart_item_id: 'c1', user_id: 'u1', book_id: 'b1', quantity: 1, added_at: '2026-01-01T00:00:00Z' }).run();\nawait steps.sqlUpdate('books').set({ stock: 14 }).where('book_id = ?', 'book-001').run();\nawait steps.sqlDelete('cart_items').where('cart_item_id = ?', 'c1').run();\n```\n\n### Transactions\n\n```ts\nawait steps.sqlTransaction(async (tx) => {\n  await tx.execute('UPDATE books SET stock = stock - 1 WHERE book_id = $1', ['book-001']);\n  await tx.execute('INSERT INTO orders (...) VALUES (...)');\n}); // auto-COMMIT, or auto-ROLLBACK if the callback throws\n```\n\n### Verification matchers\n\n| Method | Asserts |\n|---|---|\n| `verifySqlRowCount(res, n \\| {min,max})` | exact or bounded row count |\n| `verifySqlValue(res, rowIndex, column, expected)` | a single cell's value |\n| `verifySqlContains(res, partialRow)` | ≥1 row matches a column subset |\n| `verifySqlColumn(res, column, expectedOrdered[])` | a column's ordered values (ORDER BY) |\n| `verifySqlEmpty(res)` / `verifySqlNotEmpty(res)` | zero / ≥1 rows |\n\n### Running the bookhive Postgres fixture\n\n```bash\ndocker compose -f docker-compose.sql.yml up -d --wait\nnpx playwright test tests/sql-steps.spec.ts\ndocker compose -f docker-compose.sql.yml down -v\n```\n\n---\n\n## 🤝 Contributing\n\nContributions are welcome! Please read the guidelines below before opening a PR.\n\n### 🧪 Testing locally\n\nVerify your changes end-to-end in a real consumer project using [`yalc`](https://github.com/wclr/yalc):\n\n```bash\n# Install yalc globally (one-time)\nnpm i -g yalc\n\n# In the element-interactions repo folder\nyalc publish\n\n# In your consumer project\nyalc add @civitas-cerebrum/element-interactions\n```\n\nPush updates without re-adding:\n\n```bash\nyalc publish --push\n```\n\nRestore the original npm version when done:\n\n```bash\nyalc remove @civitas-cerebrum/element-interactions\nnpm install\n```\n\n### 📋 PR guidelines\n\n**Architecture.** Every new capability must follow this order:\n\n1. Implement the core method in the appropriate domain class (`interact`, `verify`, `navigate`, etc.).\n2. Expose it via a `Steps` wrapper.\n\nPRs that skip step 1 will not be merged.\n\n**Logging.** Core interaction methods must not contain any logs. `Steps` wrappers are responsible for logging what action is being performed.\n\n**Unit tests.** Every new method must include a unit test. Tests run against the [Vue test app](https://github.com/civitas-cerebrum/vue-test-app), which is built from its Docker image during CI. If the component you need doesn't exist in the test app, open a PR there first and wait for it to merge before updating this repository.\n\n**Coverage.** CI gates on the report produced by `@civitas-cerebrum/test-coverage` (`npm run test:coverage` writes `test-coverage-report.txt`; `test:with-coverage` prints the CI-friendly variant). Note what that number means: it is **API (method-invocation) coverage** — every public method on `Steps`, `ElementAction`, the matcher classes, and the interaction layers is exercised by at least one test — **not** line/branch coverage.\n\n**Documentation.** Every new `Steps` method must be added to the [API Reference](#️-api-reference-steps) section of this README, following the existing format. PRs without documentation will not be merged.\n","readmeFilename":"README.md"}