artisanpack-ui/accessibility
Laravel package adding accessibility-focused UI helpers for ArtisanPack apps—components, utilities, and sensible defaults to improve keyboard navigation, ARIA labels, focus states, and screen reader support with minimal setup.
This release joins the cross-package hooks standardization initiative. artisanpack-ui/hooks (^1.3) is now a hard dependency, and the color-contrast pipeline fires three filter hooks that let applications override the WCAG threshold, extend the Tailwind color map, and take a final say on the generated text color.
ap.accessibility.contrastThreshold — (float $ratio, string $context). Fires inside WcagValidator::checkContrast() right before the ratio comparison, with the default WCAG threshold and a context string (aa, aa-large, aaa, aaa-large, non-text). Return a different float to bump every check globally (e.g. force AAA) without touching call sites.ap.accessibility.contrastColorMap — (array $map). Fires the first time AccessibleColorGenerator loads its Tailwind name → hex map, allowing apps to register custom palette entries or replace the map entirely.ap.accessibility.textColorGenerated — (string $color, string $bg, bool $tinted). Fires at every return path of AccessibleColorGenerator::generateAccessibleTextColor() (including cached results), giving apps an escape hatch to override the algorithm for specific backgrounds.artisanpack-ui/hooks: ^1.3 as a required dependency.This release introduces AI-powered accessibility tooling on top of artisanpack-ui/ai v1.0. The three new agents — content-level issue analysis, ARIA attribute suggestion, and plain-language contrast-failure explanation — are delivered with framework surfaces for Livewire, React, and Vue that ship inside this package, so extending framework support does not require any changes to [@artisanpack-ui](https://github.com/artisanpack-ui)/react or [@artisanpack-ui](https://github.com/artisanpack-ui)/vue.
^8.2 to ^8.3 to match the artisanpack-ui/ai foundation dependency. Users staying on PHP 8.2 should pin to ^2.1.2.illuminate/support constraint is now ^12.0|^13.0. All Laravel 11 versions (v11.0.0–v11.54.0) are currently blocked by published security advisories with no unblocked release available, so the matrix cannot be honestly claimed to support Laravel 11. Users staying on Laravel 11 should pin to ^2.1.2.artisanpack-ui/ai v1.0:
ContentAccessibilityAgent (a11y.content_analysis) — finds content-level issues (ambiguous link text, vague headings, undefined jargon) that static rules miss. Default model claude-sonnet-4-6.AriaSuggestionAgent (a11y.aria_suggestion) — suggests ARIA roles, states, and properties for custom components from their markup and behavior description. Default model claude-sonnet-4-6.ColorContrastExplanationAgent (a11y.contrast_explanation) — explains contrast failures in plain language and proposes accessible alternatives that preserve brand intent. Contrast math is computed locally; the model only reasons about the explanation and suggestions. Default model claude-haiku-4-5.[@artisanpack-ui](https://github.com/artisanpack-ui)/react or [@artisanpack-ui](https://github.com/artisanpack-ui)/vue:
a11y-ai-content-analysis, a11y-ai-aria-suggestion, a11y-ai-contrast-explanation).resources/js/react/ with a barrel export in resources/js/react/index.ts.resources/js/vue/./api/v1/a11y/ai/{content-analysis,aria-suggestion,contrast-explanation} for framework-agnostic callers.A11yServiceProvider::aiFeatures() and honors its own toggle through artisanpack-ui/ai's FeatureRegistry — trigger UIs surface FeatureDisabledException as a friendly message when the toggle is off.This release adds Laravel 13 support alongside the existing Laravel 11 and 12 compatibility, and modernizes the release pipeline so tagged versions publish to Packagist automatically.
illuminate/support framework constraint now resolves against ^11.44.1|^12.0|^13.0. The Laravel 11 lower bound is 11.44.1 to exclude versions covered by published security advisories on the framework; users staying on Laravel 11 should already be on 11.44.1 or later. Laravel 13 is only selectable on PHP 8.3+ via Laravel's own constraint — no PHP-floor bump is required..github/workflows/release.yml that triggers on v* tag pushes, runs the pre-release test suite, creates the GitHub Release with notes extracted from this changelog, and notifies the Packagist update-package API so the new version publishes without manual intervention.illuminate/support from suggest to a hard require so the multi-version framework constraint is enforced at install time. The Laravel integration layer (service provider, facade, HTTP/API controllers) has always required illuminate/support at runtime.orchestra/testbench to ^9.0|^10.2|^11.0, pestphp/pest to ^3.8|^4.0, and pestphp/pest-plugin-laravel to ^3.1|^4.0. The lock file still resolves to the Laravel 12 toolchain for local development; the CI matrix overrides per-row to exercise the other framework versions.README.md and docs/guides/getting-started.md to reflect Laravel 11/12/13.docs/guides/getting-started.md (auto-discovery is automatic on every supported Laravel version) and corrected the documented service-provider and facade class names to match the actual namespaces. The new manual-registration example uses AliasLoader::getInstance()->alias() from a service provider's register() method, which is the idiomatic approach in the streamlined Laravel 11+ app structure..github/workflows/ci.yml and dropped its tag trigger; ci.yml now only fires on pushes to main and pull requests targeting main.This is a major release with a redesigned core, an expanded plugin system, first‑class reporting, theming and palette generation features, and a new HTTP/Laravel integration layer. It includes breaking changes for plugin authors and anyone consuming internal classes that were reorganized.\n### Breaking changes\n- Plugin API overhauled: new contracts introduced under src/Plugins/Contracts (e.g., PluginInterface, PluginMetadata, Capability, Context, Report, ResultSet, AccessibilityRulePluginInterface, AnalysisToolPluginInterface, ColorFormatPluginInterface). Existing plugins must be updated to the new interfaces and the new ResultSet shape.\n- PluginManager refactored. Registration/lookup behavior has been unified and example plugins have been updated accordingly.\n- Core namespaces reorganized. Core functionality now lives under src/Core; Laravel-specific integration under src/Laravel. Update any imports that referenced moved classes.\n- Configuration structure updated. New config files config/accessibility.php and config/plugins.php were added; review and publish them if you use Laravel.\n### Added\n- Core analysis modules: AccessibilityScorer, PerceptualAnalyzer, ColorBlindnessSimulator, ReportGenerator, WcagValidator, constants and helpers.\n- Caching subsystem: ArrayCache, FileCache, NullCache, and CacheManager.\n- Palette generation suite: PaletteGenerator, ColorHarmony, and export formats (CssExporter, JsonExporter, ScssExporter, TailwindExporter) plus resources/tailwind-colors.php.\n- Theming utilities: ThemeGenerator, ThemeValidator, CssVariableParser.\n- Reporting platform: A11y report writers (HtmlWriter, JsonWriter, MarkdownWriter), ComplianceReporter, ComplianceMonitor, TrendAnalyzer, AccessManager, Dashboard, TeamManager, CertificateGenerator, AuditTrail model and services.\n- HTTP API and Laravel integration: routes (routes/api.php), controller (A11yApiController), form requests, Laravel service provider/facade, and a Blade view for certificates.\n- Events and listeners for auditing and cache instrumentation.\n- CLI commands: audit:colors and palette:generate (see docs/commands.md).\n- Plugin examples: ContrastRulePlugin, updated ColorFormatHexPlugin, and LinksAnalysisTool with plugin.json manifests.\n- Database: new enterprise tables migration (2025_11_09_000000_create_enterprise_tables.php) and model factories.\n- Documentation: extensive guides and reference under docs/ (API, plugins, palette generation, theming, performance, WCAG compliance, framework‑agnostic usage, etc.).\n- Tests: large expansion of unit/feature/performance tests to cover the new surface area.\n### Changed\n- Composer configuration updated; autoloading and package metadata refined.\n- CI configuration updated (.gitlab-ci.yml).\n- Example plugins and reporting components refined and stabilized.\n### Fixed\n- Minor fixes and refinements across example plugins and reporting (e.g., Dashboard/Team management flows).\n### Migration notes\n- Update custom plugins to implement the new contracts and return the new ResultSet structure.\n- If you referenced classes that moved into src/Core or src/Laravel, update imports accordingly.\n- For Laravel users: publish the new config files, register the package service provider if necessary, and run the new database migration.\n- Review the updated docs under docs/ for details and examples.\n## 1.1.1 - July 1, 2025\n- Added in a method to set the correct text color based on background for color contrast.\n## 1.0.3 - May 14, 2025\n- Fixed issue with the renaming process.\n## 1.0.2 - May 14, 2025\n- Changed the vendor name to ArtisanPack UI.\n## 1.0.1 - April 20, 2025\n- Removed unnecessary files from the published package.\n## 1.0 - April 16, 2025\n- Initial release
Release v2.1. Refer to CHANGELOG.md for detailed changes.
This release integrates the package with the core ArtisanPack UI package for a unified configuration structure.\n### Changed\n- Updated configuration namespace from accessibility.* to artisanpack.accessibility.* to align with the ArtisanPack UI ecosystem\n- Published config file path changed from config/accessibility.php to config/artisanpack/accessibility.php\n- Changed config publish tag from config to artisanpack-package-config\n### Added\n- Added mergeConfiguration() method in service provider to properly merge package defaults with user customizations\n### Migration notes\n- Update any references to config('accessibility.*') to use config('artisanpack.accessibility.*') instead\n- If you have a published config file at config/accessibility.php, move it to config/artisanpack/accessibility.php
How can I help you explore Laravel packages today?