@wix/agent-skills 1.15.1 → 1.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -7
- package/package.json +1 -1
- package/skills/wix-app/SKILL.md +4 -1
- package/skills/wix-app/references/APP_TOOLS.md +134 -0
- package/skills/wix-app/references/CUSTOM_ELEMENT_WIDGET.md +1 -1
- package/skills/wix-app/references/DASHBOARD_PAGE.md +0 -10
- package/skills/wix-app/references/DATA_COLLECTION.md +1 -1
- package/skills/wix-app/references/EDITOR_REACT_COMPONENT.md +28 -9
- package/skills/wix-app/references/SERVICE_PLUGIN.md +12 -10
- package/skills/wix-app/references/app-tools/TOOLS.md +75 -0
- package/skills/wix-app/references/dashboard-page/DASHBOARD_API.md +2 -2
- package/skills/wix-app/references/editor-react-component/A11Y-REVIEW-REFERENCE.md +172 -0
- package/skills/wix-app/references/editor-react-component/A11Y-REVIEW.md +138 -0
- package/skills/wix-app/references/editor-react-component/ANIMATED-COMPONENTS.md +23 -2
- package/skills/wix-app/references/editor-react-component/BRANDED-COMPONENTS.md +29 -0
- package/skills/wix-app/references/editor-react-component/COMPONENT-API.md +1 -1
- package/skills/wix-app/references/editor-react-component/CSS-GUIDELINES.md +27 -2
- package/skills/wix-app/references/editor-react-component/DESIGN-STATES.md +5 -3
- package/skills/wix-app/references/editor-react-component/DIRECTIONALITY.md +18 -1
- package/skills/wix-app/references/editor-react-component/PARTS.md +15 -2
- package/skills/wix-app/references/editor-react-component/REACT-GUIDELINES.md +2 -3
- package/skills/wix-app/references/service-plugin/BOOKINGS-STAFF-SORTING.md +13 -9
- package/skills/wix-app/references/service-plugin/DISCOUNT-TRIGGERS.md +4 -0
- package/skills/wix-app/references/service-plugin/GIFT-CARDS.md +4 -0
- package/skills/wix-app/references/service-plugin/PAYMENT-SETTINGS.md +3 -1
- package/skills/wix-app/references/service-plugin/SHIPPING-RATES.md +4 -0
- package/skills/wix-app/references/service-plugin/TOOLS_PROVIDER.md +54 -0
- package/skills/wix-app/references/stores/QUERY.md +32 -0
- package/skills/wix-docs/SKILL.md +35 -3
- package/skills/wix-headless/SKILL.md +3 -1
- package/skills/wix-headless/references/CONTENT.md +36 -0
- package/skills/wix-headless/references/DESIGN.md +54 -0
- package/skills/wix-headless/references/DISCOVERY.md +24 -0
- package/skills/wix-headless/references/IMAGE_GENERATION.md +10 -0
- package/skills/wix-headless/references/inline-recipes/how-to-code-a-store.md +3 -2
- package/skills/wix-headless/references/inline-recipes/setup-online-store.md +32 -23
- package/skills/wix-headless/references/managed/CONNECT.md +1 -1
- package/skills/wix-headless/references/managed/CREATE.md +14 -0
- package/skills/wix-headless/references/managed/DEPLOYMENT.md +25 -0
- package/skills/wix-manage/SKILL.md +123 -7
- package/skills/wix-manage/references/analytics/analytics-dashboard-navigation.md +41 -0
- package/skills/wix-manage/references/app-installation/app-installation-dashboard-navigation.md +28 -0
- package/skills/wix-manage/references/blog/blog-dashboard-navigation.md +56 -0
- package/skills/wix-manage/references/blog/how-to-create-blog-posts.md +31 -6
- package/skills/wix-manage/references/bookings/booking-service-policy-setup.md +3 -1
- package/skills/wix-manage/references/bookings/bookings-dashboard-navigation.md +63 -0
- package/skills/wix-manage/references/bookings/diagnose-availability-issues.md +10 -1
- package/skills/wix-manage/references/cms/cms-dashboard-navigation.md +44 -0
- package/skills/wix-manage/references/cms/cms-data-items-crud.md +31 -3
- package/skills/wix-manage/references/cms/cms-publishing-flow.md +287 -0
- package/skills/wix-manage/references/cms/cms-schema-management.md +27 -1
- package/skills/wix-manage/references/contacts/contacts-dashboard-navigation.md +46 -0
- package/skills/wix-manage/references/contacts/create-a-contact.md +82 -0
- package/skills/wix-manage/references/contacts/update-a-contact.md +119 -0
- package/skills/wix-manage/references/dashboard-navigation/dashboard-navigation.md +82 -0
- package/skills/wix-manage/references/dashboard-navigation/routes.json +1733 -0
- package/skills/wix-manage/references/domains/domains-dashboard-navigation.md +32 -0
- package/skills/wix-manage/references/ecommerce/ecom-pricing.md +4 -4
- package/skills/wix-manage/references/ecommerce/ecom-shipping.md +1 -1
- package/skills/wix-manage/references/ecommerce/gift-cards/ecom-gift-cards-goal-sell-gift-cards.md +338 -0
- package/skills/wix-manage/references/ecommerce/pricing-promotions/ecom-pricing-create-discount-rule.md +42 -78
- package/skills/wix-manage/references/ecommerce/pricing-promotions/ecom-pricing-flow-bundle-and-save.md +1 -1
- package/skills/wix-manage/references/ecommerce/pricing-promotions/ecom-pricing-flow-stock-mover.md +1 -1
- package/skills/wix-manage/references/ecommerce/pricing-promotions/ecom-pricing-flow-upsell-boost.md +1 -1
- package/skills/wix-manage/references/ecommerce/recommend-ecommerce-strategy.md +90 -92
- package/skills/wix-manage/references/events/create-wix-event.md +176 -0
- package/skills/wix-manage/references/events/manage-wix-events.md +174 -0
- package/skills/wix-manage/references/forms/forms-dashboard-navigation.md +44 -0
- package/skills/wix-manage/references/get-paid/get-paid-dashboard-navigation.md +52 -0
- package/skills/wix-manage/references/google-ads/billing-and-payment.md +80 -0
- package/skills/wix-manage/references/google-ads/create-performance-max-campaign.md +212 -0
- package/skills/wix-manage/references/google-ads/get-campaign-suggestions.md +110 -0
- package/skills/wix-manage/references/google-ads/google-ads-dashboard-navigation.md +25 -0
- package/skills/wix-manage/references/google-ads/install-and-create-account.md +155 -0
- package/skills/wix-manage/references/google-ads/manage-campaign-lifecycle.md +63 -0
- package/skills/wix-manage/references/google-ads/query-campaign-analytics.md +155 -0
- package/skills/wix-manage/references/marketing/marketing-dashboard-navigation.md +52 -0
- package/skills/wix-manage/references/pricing-plans/create-and-update-pricing-plans.md +99 -1
- package/skills/wix-manage/references/pricing-plans/pricing-plans-dashboard-navigation.md +45 -0
- package/skills/wix-manage/references/restaurants/restaurants-dashboard-navigation.md +68 -0
- package/skills/wix-manage/references/restaurants/wix-restaurants-setup.md +94 -125
- package/skills/wix-manage/references/site-properties/change-payment-currency-site-properties.md +48 -9
- package/skills/wix-manage/references/site-properties/site-properties-dashboard-navigation.md +31 -0
- package/skills/wix-manage/references/sites/create-headless-site.md +52 -0
- package/skills/wix-manage/references/sites/create-site-from-template.md +2 -25
- package/skills/wix-manage/references/sites/site-import.md +163 -190
- package/skills/wix-manage/references/sites/sites-dashboard-navigation.md +29 -0
- package/skills/wix-manage/references/stores/add-store-pages-to-site.md +17 -1
- package/skills/wix-manage/references/stores/find-products-query-and-search-catalog-v3.md +26 -8
- package/skills/wix-manage/references/stores/stores-dashboard-navigation.md +65 -0
- package/skills/wix-manage/references/stores/update-product-with-options.md +39 -7
- package/skills/wix-replatform/.publish-manifest.json +8 -0
- package/skills/wix-replatform/SKILL.md +693 -0
- package/skills/wix-replatform/lib/artifact-freshness.js +215 -0
- package/skills/wix-replatform/lib/completion-report.js +200 -0
- package/skills/wix-replatform/lib/config-env.js +59 -0
- package/skills/wix-replatform/lib/execution-manifest.js +185 -0
- package/skills/wix-replatform/lib/execution-state.js +173 -0
- package/skills/wix-replatform/lib/import-recovery.js +313 -0
- package/skills/wix-replatform/lib/local-state.js +642 -0
- package/skills/wix-replatform/lib/orchestration-preflight.js +143 -0
- package/skills/wix-replatform/lib/orchestration-router.js +122 -0
- package/skills/wix-replatform/lib/orchestration-state.js +455 -0
- package/skills/wix-replatform/lib/progress-log.js +224 -0
- package/skills/wix-replatform/lib/progress-log.sh +140 -0
- package/skills/wix-replatform/lib/url-preservation-state.js +391 -0
- package/skills/wix-replatform/resources/rp-discovery/SKILL.md +184 -0
- package/skills/wix-replatform/resources/rp-execute-import/SKILL.md +529 -0
- package/skills/wix-replatform/resources/rp-execute-setup/SKILL.md +316 -0
- package/skills/wix-replatform/resources/rp-execute-setup/scripts/mint-token.sh +64 -0
- package/skills/wix-replatform/resources/rp-import-codegen/SKILL.md +1114 -0
- package/skills/wix-replatform/resources/rp-mapper/SKILL.md +430 -0
- package/skills/wix-replatform/resources/rp-mapper/lib/mapping-resolve.js +217 -0
- package/skills/wix-replatform/resources/rp-mapper/scripts/resolve-mapping.js +148 -0
- package/skills/wix-replatform/resources/rp-mapper/wix-business-solutions-taxonomy.md +378 -0
- package/skills/wix-replatform/resources/rp-setup-discovery/SKILL.md +183 -0
- package/skills/wix-replatform/resources/rp-source-csv/SKILL.md +478 -0
- package/skills/wix-replatform/resources/rp-source-csv/lib/canonical-record.js +136 -0
- package/skills/wix-replatform/resources/rp-source-csv/lib/csv-fileset.js +0 -0
- package/skills/wix-replatform/resources/rp-source-csv/lib/csv-fingerprint.js +310 -0
- package/skills/wix-replatform/resources/rp-source-csv/lib/csv-layout.js +1081 -0
- package/skills/wix-replatform/resources/rp-source-csv/lib/csv-parse.js +618 -0
- package/skills/wix-replatform/resources/rp-source-csv/scripts/csv-discovery.js +949 -0
- package/skills/wix-replatform/resources/rp-source-csv/source-schema.example.json +196 -0
- package/skills/wix-replatform/resources/rp-source-csv/vendors/bigcommerce.json +66 -0
- package/skills/wix-replatform/resources/rp-source-csv/vendors/magento.json +60 -0
- package/skills/wix-replatform/resources/rp-source-csv/vendors/shopify.json +95 -0
- package/skills/wix-replatform/resources/rp-source-csv/vendors/woocommerce.json +82 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/SKILL.md +256 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-http.js +249 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-route-classifier.js +444 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-discovery.js +774 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/source-schema.example.json +71 -0
- package/skills/wix-replatform/resources/rp-target-wix/SKILL.md +632 -0
- package/skills/wix-replatform/resources/rp-target-wix/SPEC-product-reviews-and-blog-authorship.md +330 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/README.md +21 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/domain.json +19 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/category.json +37 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/comment.json +37 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/post.json +39 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/tag.json +35 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/domain.json +14 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/collection.json +35 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/data-item.json +36 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/reference.json +35 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/domain.json +14 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/contact.json +131 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/email-subscription.json +37 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/label.json +37 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/domain.json +21 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item.json +37 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-refund.json +37 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order.json +97 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/index.json +528 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/domain.json +14 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-file.json +38 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-folder.json +37 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/domain.json +13 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/badge.json +37 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member.json +53 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/schema.json +84 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/domain.json +25 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/category.json +37 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/coupon.json +37 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/inventory-item.json +38 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-tag.json +37 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product.json +90 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/audit-summary.js +64 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/contract-ledger.js +141 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/domain-knowledge.js +384 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/ndjson.js +260 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/stores-verification.js +238 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-build.js +237 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-target-spec.js +238 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-writers.js +2219 -0
- package/skills/wix-replatform/resources/rp-target-wix/scripts/domain-knowledge-validate.js +31 -0
- package/skills/wix-replatform/resources/rp-target-wix/scripts/domain-knowledge.js +100 -0
- package/skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js +107 -0
- package/skills/wix-replatform/resources/rp-telemetry/SKILL.md +344 -0
- package/skills/wix-replatform/resources/rp-telemetry/lib/bi-sink.js +250 -0
- package/skills/wix-replatform/resources/rp-telemetry/lib/telemetry-recorder.js +1927 -0
- package/skills/wix-replatform/resources/rp-telemetry/scripts/meter-from-audit.js +83 -0
- package/skills/wix-replatform/resources/rp-telemetry/scripts/rp-telemetry.js +141 -0
- package/skills/wix-replatform/scripts/artifact-freshness.js +76 -0
- package/skills/wix-replatform/scripts/execution-manifest-validate.js +43 -0
- package/skills/wix-replatform/scripts/execution-state-prepare.js +128 -0
- package/skills/wix-replatform/scripts/orchestration-preflight.js +48 -0
- package/skills/wix-replatform/scripts/orchestration-route.js +46 -0
- package/skills/wix-replatform/scripts/orchestration-state.js +245 -0
- package/skills/wix-vibe-headless/SKILL.md +48 -25
- package/skills/wix-vibe-headless/install/deploy.cjs +95 -0
- package/skills/wix-vibe-headless/install/pin-agents-md.cjs +34 -0
- package/skills/wix-vibe-headless/platforms/README.md +8 -4
- package/skills/wix-vibe-headless/platforms/base44.md +133 -98
- package/skills/wix-vibe-headless/platforms/generic.md +99 -64
- package/skills/wix-vibe-headless/references/blog/INSTRUCTIONS.md +230 -119
- package/skills/wix-vibe-headless/references/blog/app/components/PostCard.jsx +43 -0
- package/skills/wix-vibe-headless/references/blog/app/components/PostChips.jsx +25 -0
- package/skills/wix-vibe-headless/references/blog/app/components/PostGrid.jsx +15 -0
- package/skills/wix-vibe-headless/references/blog/app/context/TaxonomyContext.jsx +35 -0
- package/skills/wix-vibe-headless/references/blog/app/hooks/usePostDetail.js +38 -0
- package/skills/wix-vibe-headless/references/blog/app/pages/Blog.jsx +40 -0
- package/skills/wix-vibe-headless/references/blog/app/pages/CategoryPage.jsx +54 -0
- package/skills/wix-vibe-headless/references/blog/app/pages/PostDetail.jsx +65 -0
- package/skills/wix-vibe-headless/references/blog/app/pages/TagPage.jsx +50 -0
- package/skills/wix-vibe-headless/references/blog/seed/SEED.md +103 -0
- package/skills/wix-vibe-headless/references/blog/seed/seed-blog.js +270 -0
- package/skills/wix-vibe-headless/references/bookings/INSTRUCTIONS.md +260 -149
- package/skills/wix-vibe-headless/references/bookings/app/components/BookingForm.jsx +65 -0
- package/skills/wix-vibe-headless/references/bookings/app/components/ServiceCard.jsx +47 -0
- package/skills/wix-vibe-headless/references/bookings/app/components/ServiceGrid.jsx +13 -0
- package/skills/wix-vibe-headless/references/bookings/app/components/SlotPicker.jsx +126 -0
- package/skills/wix-vibe-headless/references/bookings/app/hooks/useServiceDetail.js +108 -0
- package/skills/wix-vibe-headless/references/bookings/app/hooks/useServices.js +58 -0
- package/skills/wix-vibe-headless/references/bookings/app/lib/serviceFacts.js +95 -0
- package/skills/wix-vibe-headless/references/bookings/app/pages/ServiceDetail.jsx +94 -0
- package/skills/wix-vibe-headless/references/bookings/app/pages/Services.jsx +89 -0
- package/skills/wix-vibe-headless/references/bookings/{wix-bookings-checkout.js → app/rest/wix-bookings-checkout.js} +1 -1
- package/skills/wix-vibe-headless/references/bookings/{wix-bookings-services.js → app/rest/wix-bookings-services.js} +87 -11
- package/skills/wix-vibe-headless/references/bookings/seed/SEED.md +117 -0
- package/skills/wix-vibe-headless/references/bookings/seed/seed-bookings.js +333 -0
- package/skills/wix-vibe-headless/references/cms/INSTRUCTIONS.md +169 -147
- package/skills/wix-vibe-headless/references/cms/app/collection.config.js +31 -0
- package/skills/wix-vibe-headless/references/cms/app/lib/wixImage.js +18 -0
- package/skills/wix-vibe-headless/references/cms/{wix-cms.js → app/rest/wix-cms.js} +47 -2
- package/skills/wix-vibe-headless/references/cms/seed/SEED.md +145 -0
- package/skills/wix-vibe-headless/references/events/INSTRUCTIONS.md +228 -131
- package/skills/wix-vibe-headless/references/events/app/components/CategoryFilter.jsx +23 -0
- package/skills/wix-vibe-headless/references/events/app/components/EventCard.jsx +43 -0
- package/skills/wix-vibe-headless/references/events/app/components/EventGrid.jsx +13 -0
- package/skills/wix-vibe-headless/references/events/app/components/EventRegistration.jsx +29 -0
- package/skills/wix-vibe-headless/references/events/app/components/RsvpForm.jsx +57 -0
- package/skills/wix-vibe-headless/references/events/app/components/TicketPicker.jsx +78 -0
- package/skills/wix-vibe-headless/references/events/app/hooks/useEventDetail.js +27 -0
- package/skills/wix-vibe-headless/references/events/app/hooks/useEventsList.js +54 -0
- package/skills/wix-vibe-headless/references/events/app/hooks/useRsvpForm.js +40 -0
- package/skills/wix-vibe-headless/references/events/app/hooks/useTicketing.js +81 -0
- package/skills/wix-vibe-headless/references/events/app/pages/EventDetail.jsx +48 -0
- package/skills/wix-vibe-headless/references/events/app/pages/Events.jsx +36 -0
- package/skills/wix-vibe-headless/references/events/{wix-events-browse.js → app/rest/wix-events-browse.js} +1 -1
- package/skills/wix-vibe-headless/references/events/seed/SEED.md +107 -0
- package/skills/wix-vibe-headless/references/events/seed/seed-events.js +251 -0
- package/skills/wix-vibe-headless/references/members/INSTRUCTIONS.md +276 -188
- package/skills/wix-vibe-headless/references/members/app/components/LoginForm.jsx +101 -0
- package/skills/wix-vibe-headless/references/members/app/components/MemberMenu.jsx +33 -0
- package/skills/wix-vibe-headless/references/members/app/components/RequireAuth.jsx +21 -0
- package/skills/wix-vibe-headless/references/members/app/components/SocialButtons.jsx +29 -0
- package/skills/wix-vibe-headless/references/members/app/context/MemberContext.jsx +54 -0
- package/skills/wix-vibe-headless/references/members/app/hooks/useLoginForm.js +77 -0
- package/skills/wix-vibe-headless/references/members/app/pages/Account.jsx +36 -0
- package/skills/wix-vibe-headless/references/members/app/pages/Callback.jsx +32 -0
- package/skills/wix-vibe-headless/references/members/app/pages/Login.jsx +35 -0
- package/skills/wix-vibe-headless/references/members/{wix-members-auth.js → app/rest/wix-members-auth.js} +6 -3
- package/skills/wix-vibe-headless/references/members/install/Register.jsx +22 -0
- package/skills/wix-vibe-headless/references/members/seed/SEED.md +22 -0
- package/skills/wix-vibe-headless/references/portfolio/INSTRUCTIONS.md +233 -104
- package/skills/wix-vibe-headless/references/portfolio/app/components/CollectionCard.jsx +31 -0
- package/skills/wix-vibe-headless/references/portfolio/app/components/CollectionGrid.jsx +15 -0
- package/skills/wix-vibe-headless/references/portfolio/app/components/ProjectCard.jsx +39 -0
- package/skills/wix-vibe-headless/references/portfolio/app/components/ProjectGrid.jsx +15 -0
- package/skills/wix-vibe-headless/references/portfolio/app/components/ProjectMedia.jsx +29 -0
- package/skills/wix-vibe-headless/references/portfolio/app/hooks/useCollectionProjects.js +35 -0
- package/skills/wix-vibe-headless/references/portfolio/app/hooks/usePortfolioGallery.js +27 -0
- package/skills/wix-vibe-headless/references/portfolio/app/hooks/useProjectDetail.js +25 -0
- package/skills/wix-vibe-headless/references/portfolio/app/pages/CollectionPage.jsx +39 -0
- package/skills/wix-vibe-headless/references/portfolio/app/pages/Portfolio.jsx +27 -0
- package/skills/wix-vibe-headless/references/portfolio/app/pages/ProjectDetail.jsx +60 -0
- package/skills/wix-vibe-headless/references/portfolio/seed/SEED.md +94 -0
- package/skills/wix-vibe-headless/references/portfolio/seed/seed-portfolio.js +236 -0
- package/skills/wix-vibe-headless/references/pricing-plans/INSTRUCTIONS.md +240 -117
- package/skills/wix-vibe-headless/references/pricing-plans/app/components/OrderCard.jsx +35 -0
- package/skills/wix-vibe-headless/references/pricing-plans/app/components/PlanCard.jsx +48 -0
- package/skills/wix-vibe-headless/references/pricing-plans/app/components/PlanGrid.jsx +16 -0
- package/skills/wix-vibe-headless/references/pricing-plans/app/components/PlanPrice.jsx +35 -0
- package/skills/wix-vibe-headless/references/pricing-plans/app/hooks/useMyPlans.js +25 -0
- package/skills/wix-vibe-headless/references/pricing-plans/app/hooks/usePlanDetail.js +28 -0
- package/skills/wix-vibe-headless/references/pricing-plans/app/hooks/usePlans.js +30 -0
- package/skills/wix-vibe-headless/references/pricing-plans/app/pages/MyPlans.jsx +30 -0
- package/skills/wix-vibe-headless/references/pricing-plans/app/pages/PlanDetail.jsx +53 -0
- package/skills/wix-vibe-headless/references/pricing-plans/app/pages/Plans.jsx +28 -0
- package/skills/wix-vibe-headless/references/pricing-plans/seed/SEED.md +86 -0
- package/skills/wix-vibe-headless/references/pricing-plans/seed/seed-pricing-plans.js +251 -0
- package/skills/wix-vibe-headless/references/restaurants/INSTRUCTIONS.md +248 -124
- package/skills/wix-vibe-headless/references/restaurants/app/components/ItemDialog.jsx +81 -0
- package/skills/wix-vibe-headless/references/restaurants/app/components/MenuItemCard.jsx +71 -0
- package/skills/wix-vibe-headless/references/restaurants/app/components/MenuList.jsx +43 -0
- package/skills/wix-vibe-headless/references/restaurants/app/components/OrderCartButton.jsx +21 -0
- package/skills/wix-vibe-headless/references/restaurants/app/components/OrderCartDrawer.jsx +60 -0
- package/skills/wix-vibe-headless/references/restaurants/app/context/OrderCartContext.jsx +63 -0
- package/skills/wix-vibe-headless/references/restaurants/app/hooks/useItemOrder.js +32 -0
- package/skills/wix-vibe-headless/references/restaurants/app/hooks/useReservation.js +73 -0
- package/skills/wix-vibe-headless/references/restaurants/app/pages/Menu.jsx +28 -0
- package/skills/wix-vibe-headless/references/restaurants/app/pages/Reservations.jsx +102 -0
- package/skills/wix-vibe-headless/references/restaurants/seed/SEED.md +180 -0
- package/skills/wix-vibe-headless/references/restaurants/seed/seed-restaurants.js +452 -0
- package/skills/wix-vibe-headless/references/shared/app/components/WixManageBanner.jsx +56 -0
- package/skills/wix-vibe-headless/references/shared/{wix-client.js → app/rest/wix-client.js} +6 -8
- package/skills/wix-vibe-headless/references/shared/app/rest/wix-config.js +6 -0
- package/skills/wix-vibe-headless/references/storefront/INSTRUCTIONS.md +263 -157
- package/skills/wix-vibe-headless/references/storefront/app/components/CartButton.jsx +20 -0
- package/skills/wix-vibe-headless/references/storefront/app/components/CartDrawer.jsx +150 -0
- package/skills/wix-vibe-headless/references/storefront/app/components/ProductCard.jsx +167 -0
- package/skills/wix-vibe-headless/references/storefront/app/components/ProductGallery.jsx +51 -0
- package/skills/wix-vibe-headless/references/storefront/app/components/ProductGrid.jsx +54 -0
- package/skills/wix-vibe-headless/references/storefront/app/components/VariantPicker.jsx +119 -0
- package/skills/wix-vibe-headless/references/storefront/app/context/CartContext.jsx +71 -0
- package/skills/wix-vibe-headless/references/storefront/app/hooks/useProductDetail.js +109 -0
- package/skills/wix-vibe-headless/references/storefront/app/hooks/useShop.js +98 -0
- package/skills/wix-vibe-headless/references/storefront/app/lib/storeImage.js +27 -0
- package/skills/wix-vibe-headless/references/storefront/app/pages/ProductDetail.jsx +139 -0
- package/skills/wix-vibe-headless/references/storefront/app/pages/Shop.jsx +75 -0
- package/skills/wix-vibe-headless/references/storefront/{wix-store-cart.js → app/rest/wix-store-cart.js} +1 -1
- package/skills/wix-vibe-headless/references/storefront/{wix-store-catalog.js → app/rest/wix-store-catalog.js} +20 -1
- package/skills/wix-vibe-headless/references/storefront/seed/SEED.md +111 -0
- package/skills/wix-vibe-headless/references/storefront/seed/seed-store.js +299 -0
- /package/skills/wix-vibe-headless/references/blog/{wix-blog.js → app/rest/wix-blog.js} +0 -0
- /package/skills/wix-vibe-headless/references/events/{wix-events-registration.js → app/rest/wix-events-registration.js} +0 -0
- /package/skills/wix-vibe-headless/references/portfolio/{wix-portfolio.js → app/rest/wix-portfolio.js} +0 -0
- /package/skills/wix-vibe-headless/references/pricing-plans/{wix-pricing-plans.js → app/rest/wix-pricing-plans.js} +0 -0
- /package/skills/wix-vibe-headless/references/restaurants/{wix-restaurants-menu.js → app/rest/wix-restaurants-menu.js} +0 -0
- /package/skills/wix-vibe-headless/references/restaurants/{wix-restaurants-ordering.js → app/rest/wix-restaurants-ordering.js} +0 -0
- /package/skills/wix-vibe-headless/references/restaurants/{wix-restaurants-reservations.js → app/rest/wix-restaurants-reservations.js} +0 -0
package/README.md
CHANGED
|
@@ -10,7 +10,7 @@ Agent skills for building Wix app extensions, managing Wix business solutions, d
|
|
|
10
10
|
|
|
11
11
|
### Claude Code Plugin
|
|
12
12
|
|
|
13
|
-
In [Claude Code](https://docs.anthropic.com/en/docs/claude-code), run:
|
|
13
|
+
In [Claude Code](https://docs.anthropic.com/en/docs/claude-code), run:
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
16
|
/plugin marketplace add wix/skills
|
|
@@ -91,13 +91,9 @@ When a major bump is required (a breaking change in the underlying `wix-cli`), t
|
|
|
91
91
|
|
|
92
92
|
Run the [`release-bump`](.github/workflows/release-bump.yml) workflow from the **Actions** tab and pick a `version_strategy`. The rest is automatic — the bump PR auto-merges once checks pass and [`release.yml`](.github/workflows/release.yml) publishes to npm via Trusted Publishing.
|
|
93
93
|
|
|
94
|
-
## Serving
|
|
94
|
+
## Serving (`www.wix.com/skills`)
|
|
95
95
|
|
|
96
|
-
Besides the npm package, skills are served as raw markdown / `.tgz` at `https://www.wix.com/skills/<name>` (also `dev.wix.com/skills`)
|
|
97
|
-
|
|
98
|
-
Responses are cached at the Wix edge (Pepyaka, tag `skills`) plus a ~5-min per-pod tarball cache. A push to `main` touching `skills/**` **auto-invalidates** the edge tag (via `md-resolver`'s GitHub-push consumer), so a merge reflects within a few minutes. To force it immediately, hit the manual flush (`POST /api/v1/invalidate-ssr-cache/skills`, BO staff) or the Fire Console `invalidateCache` call.
|
|
99
|
-
|
|
100
|
-
Full details — endpoints, `wix-` prefix stripping, host-relative links, invalidation — are in the [docs-web-app skills README](https://github.com/wix-private/docs/blob/main/packages/docs-web-app/express/skills/README.md).
|
|
96
|
+
Besides the npm package, skills are served as raw markdown / `.tgz` at `https://www.wix.com/skills/<name>` (also `dev.wix.com/skills`), directly from this repo's `main` branch with no build step. Responses are cached, so a merge to `main` reflects there within a few minutes.
|
|
101
97
|
|
|
102
98
|
## Contributing
|
|
103
99
|
|
package/package.json
CHANGED
package/skills/wix-app/SKILL.md
CHANGED
|
@@ -77,12 +77,13 @@ Helps build extensions for Wix CLI applications. Covers all extension types: das
|
|
|
77
77
|
- Anywhere on site (with editor manifest) → Editor React component
|
|
78
78
|
- Wix business solution page → Site Plugin
|
|
79
79
|
- During business flow → Service Plugin
|
|
80
|
+
- Exposing tools to the Wix AI assistant → App Tools
|
|
80
81
|
- After event occurs → Backend Event Extension
|
|
81
82
|
|
|
82
83
|
## Decision Flow (Not sure?)
|
|
83
84
|
|
|
84
85
|
- **Admin:** Single-collection CRUD admin page? → **Auto Patterns Dashboard (DEFAULT)**. Custom React page (multi-collection / custom logic / embedded scripts / external APIs / explicit user request)? → Dashboard Page. Need popup/form? → Dashboard Modal. Extending Wix app dashboard with a visual widget? → Dashboard Plugin. Adding a menu item to a Wix app dashboard's more-actions or bulk-actions menu? → Dashboard Menu Plugin. **Modal constraint:** Dashboard Pages cannot use `<Modal />`; use a separate Dashboard Modal extension and `dashboard.openModal()`.
|
|
85
|
-
- **Backend:** During business flow (checkout/shipping/tax)? → Service Plugin. After event (webhooks/sync)? → Backend Event Extension. Custom HTTP endpoints? → Backend API. Need CMS collections for app data? → Data Collection.
|
|
86
|
+
- **Backend:** During business flow (checkout/shipping/tax)? → Service Plugin. Exposing tools to the Wix AI assistant? → App Tools (requires both `APP_TOOLS` declaration + `TOOLS_PROVIDER_CONFIG` handler — see [APP_TOOLS.md](references/APP_TOOLS.md)). After event (webhooks/sync)? → Backend Event Extension. Custom HTTP endpoints? → Backend API. Need CMS collections for app data? → Data Collection.
|
|
86
87
|
- **Site:** User places anywhere (standalone)? → custom element widget. Editor React component with editor manifest (styling, content, elements)? → Editor React component. Fixed slot on Wix app page? → Site Plugin. Scripts/analytics only? → Embedded Script.
|
|
87
88
|
|
|
88
89
|
---
|
|
@@ -96,6 +97,7 @@ Helps build extensions for Wix CLI applications. Covers all extension types: das
|
|
|
96
97
|
| Dashboard Plugin | Dashboard | `DASHBOARD_PLUGIN` | [DASHBOARD_PLUGIN.md](references/DASHBOARD_PLUGIN.md) |
|
|
97
98
|
| Dashboard Menu Plugin | Dashboard | `DASHBOARD_MENU_PLUGIN` | [DASHBOARD_MENU_PLUGIN.md](references/DASHBOARD_MENU_PLUGIN.md) |
|
|
98
99
|
| Service Plugin | Backend | `SERVICE_PLUGIN` | [SERVICE_PLUGIN.md](references/SERVICE_PLUGIN.md) |
|
|
100
|
+
| App Tools (AI assistant tools) | Backend | `APP_TOOLS`, then `SERVICE_PLUGIN` with `pluginType: TOOLS_PROVIDER_CONFIG` | [APP_TOOLS.md](references/APP_TOOLS.md) |
|
|
99
101
|
| Backend Event Extension | Backend | `EVENT` | [BACKEND_EVENT.md](references/BACKEND_EVENT.md) |
|
|
100
102
|
| Backend API | Backend | — (manual, see banner below) | [BACKEND_API.md](references/BACKEND_API.md) |
|
|
101
103
|
| Data Collection | Backend | `DATA_COLLECTION` | [DATA_COLLECTION.md](references/DATA_COLLECTION.md) |
|
|
@@ -215,6 +217,7 @@ Use the Extension Types Reference Table and decision content above. State extens
|
|
|
215
217
|
- Wix Data → `references/data-collection/WIX_DATA.md`
|
|
216
218
|
- Dashboard SDK → `references/dashboard-page/DASHBOARD_API.md`
|
|
217
219
|
- Service Plugin SPIs → read `references/SERVICE_PLUGIN.md` together with the matching `references/service-plugin/<NAME>.md` leaf
|
|
220
|
+
- App Tools (AI assistant tools) → read `references/APP_TOOLS.md`; it links to `references/app-tools/TOOLS.md` (declaration) and `references/service-plugin/TOOLS_PROVIDER.md` (handler)
|
|
218
221
|
4. **Verify the specific method/event exists** in references
|
|
219
222
|
5. **ONLY use MCP discovery if NOT found** in reference files
|
|
220
223
|
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# App Tools — Overview
|
|
2
|
+
|
|
3
|
+
App Tools lets your app expose custom tools that the Wix AI assistant can discover and invoke on behalf of site collaborators. It requires **two extensions working together**:
|
|
4
|
+
|
|
5
|
+
| Extension | What it does | Reference |
|
|
6
|
+
| --- | --- | --- |
|
|
7
|
+
| `APP_TOOLS` | Declares your tools (names, descriptions, schemas) so the AI assistant knows they exist | [app-tools/TOOLS.md](app-tools/TOOLS.md) |
|
|
8
|
+
| `TOOLS_PROVIDER_CONFIG` | The service plugin handler Wix calls at runtime when the AI assistant invokes a tool | [service-plugin/TOOLS_PROVIDER.md](service-plugin/TOOLS_PROVIDER.md) |
|
|
9
|
+
|
|
10
|
+
## How they connect
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
Developer declares tools in APP_TOOLS
|
|
14
|
+
↓
|
|
15
|
+
AI assistant reads declarations to understand available tools
|
|
16
|
+
↓
|
|
17
|
+
User interacts with Wix AI assistant
|
|
18
|
+
↓
|
|
19
|
+
AI assistant invokes your toolsProvider service plugin (runTool handler)
|
|
20
|
+
↓
|
|
21
|
+
Your handler routes on methodName, runs business logic, returns response
|
|
22
|
+
↓
|
|
23
|
+
AI assistant uses the response to answer the user
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
The `methodName` field is the **linking key**: it must match exactly between the `APP_TOOLS` declaration and the `switch` (or routing map) in your `runTool` handler.
|
|
27
|
+
|
|
28
|
+
## Quick Start
|
|
29
|
+
|
|
30
|
+
### Step 1: Scaffold both extensions via the CLI
|
|
31
|
+
|
|
32
|
+
> **Adding another tool to an existing setup?** Skip this step. Add the new tool entry to your existing `APP_TOOLS` `.extension.ts` file and add a matching `case` to your existing `runTool` handler — no new extensions needed.
|
|
33
|
+
|
|
34
|
+
Run these two commands once — the CLI generates all files and updates `src/extensions.ts` automatically:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
wix generate --params '{"extensionType":"APP_TOOLS","name":"my-tools"}'
|
|
38
|
+
wix generate --params '{"extensionType":"SERVICE_PLUGIN","pluginType":"TOOLS_PROVIDER_CONFIG","name":"my-tools-provider"}'
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Step 2: Declare your tools (`APP_TOOLS`)
|
|
42
|
+
|
|
43
|
+
Open the generated `src/extensions/backend/app-tools/my-tools/my-tools.extension.ts` and replace the stub tool with your own. Read [app-tools/TOOLS.md](app-tools/TOOLS.md) for the full field reference and constraints.
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
import { extensions } from '@wix/astro/builders';
|
|
47
|
+
|
|
48
|
+
export default extensions.appTools({
|
|
49
|
+
id: '<generated-uuid>',
|
|
50
|
+
name: 'my-tools',
|
|
51
|
+
tools: [
|
|
52
|
+
{
|
|
53
|
+
methodName: 'get-order-status',
|
|
54
|
+
description: 'Returns the current fulfillment status, shipping carrier, and tracking number for a customer order. Use this tool when a collaborator or customer asks where their order is, whether it has shipped, when it will arrive, or needs a tracking number. Requires a valid orderId.',
|
|
55
|
+
requestSchema: {
|
|
56
|
+
type: 'object',
|
|
57
|
+
properties: {
|
|
58
|
+
orderId: { type: 'string' }
|
|
59
|
+
},
|
|
60
|
+
required: ['orderId']
|
|
61
|
+
},
|
|
62
|
+
responseSchema: {
|
|
63
|
+
type: 'object',
|
|
64
|
+
properties: {
|
|
65
|
+
status: { type: 'string' }
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
activated: true
|
|
69
|
+
}
|
|
70
|
+
]
|
|
71
|
+
});
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Step 3: Implement the runtime handler (`TOOLS_PROVIDER_CONFIG`)
|
|
75
|
+
|
|
76
|
+
Open the generated `src/extensions/backend/service-plugins/my-tools-provider/my-tools-provider.ts` and implement the `runTool` logic. Read [service-plugin/TOOLS_PROVIDER.md](service-plugin/TOOLS_PROVIDER.md) for the full implementation guide.
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
import { toolsProvider } from '@wix/app-tools/service-plugins';
|
|
80
|
+
|
|
81
|
+
toolsProvider.provideHandlers({
|
|
82
|
+
runTool: async ({ request, metadata }) => {
|
|
83
|
+
const { methodName, payload } = request;
|
|
84
|
+
|
|
85
|
+
switch (methodName) {
|
|
86
|
+
case 'get-order-status': {
|
|
87
|
+
const orderId = payload?.['orderId'];
|
|
88
|
+
if (typeof orderId !== 'string' || !orderId) {
|
|
89
|
+
throw new Error('orderId is required');
|
|
90
|
+
}
|
|
91
|
+
// your logic here
|
|
92
|
+
return { response: { status: 'shipped' } };
|
|
93
|
+
}
|
|
94
|
+
default:
|
|
95
|
+
throw new Error(`Unknown tool: ${methodName}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Writing Good Descriptions
|
|
102
|
+
|
|
103
|
+
The `description` field is the primary signal the AI assistant uses to decide whether your tool is relevant to a user's request. A one-liner like `"Returns order status"` works technically but limits relevance matching.
|
|
104
|
+
|
|
105
|
+
Write descriptions as a short prompt — 2–4 sentences covering:
|
|
106
|
+
1. **What it does** — the action and data it returns.
|
|
107
|
+
2. **When to use it** — the user intents or phrases that should trigger it (e.g. "where is my order", "has this shipped", "tracking number").
|
|
108
|
+
3. **Key inputs** — mention required parameters so the AI knows what to ask for.
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
// narrow — easy to miss
|
|
112
|
+
'Returns order status.'
|
|
113
|
+
|
|
114
|
+
// wide — reliably matched
|
|
115
|
+
'Returns the current fulfillment status, shipping carrier, and tracking number for a customer order.
|
|
116
|
+
Use this tool when a collaborator or customer asks where their order is, whether it has shipped,
|
|
117
|
+
when it will arrive, or needs a tracking number. Requires a valid orderId.'
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Checklist
|
|
121
|
+
|
|
122
|
+
- [ ] Tool declarations filled in the generated `.extension.ts` (replace the stub `myMethod`)
|
|
123
|
+
- [ ] Set `activated: true` on every tool you want the AI assistant to invoke (`activated: false` tools are declared but never called)
|
|
124
|
+
- [ ] `runTool` handler covers every `methodName` that has `activated: true`
|
|
125
|
+
- [ ] Inputs validated defensively (schemas are advisory, not enforced by Wix)
|
|
126
|
+
- [ ] Wix API calls wrapped with `auth.elevate` from `@wix/essentials`
|
|
127
|
+
- [ ] App built (`wix build`) and released (`wix release`) — changes don't take effect until released
|
|
128
|
+
|
|
129
|
+
## Important Notes
|
|
130
|
+
|
|
131
|
+
- The `requestSchema` and `responseSchema` in `APP_TOOLS` are **advisory** — the AI assistant uses them for context. Wix does NOT validate the `payload` against the schema before calling your handler.
|
|
132
|
+
- Only tools with `activated: true` are invoked by the AI assistant.
|
|
133
|
+
- Both extensions must be registered and the app must be released before the feature is live.
|
|
134
|
+
- The `methodName` must be unique within an `APP_TOOLS` extension (1–30 characters).
|
|
@@ -102,7 +102,7 @@ The CLI scaffolds the builder file with sensible defaults — edit it only to cu
|
|
|
102
102
|
| Field | Type | Default | Purpose |
|
|
103
103
|
|---|---|---|---|
|
|
104
104
|
| `id` | UUID | generated | Extension ID. Don't change after scaffolding. |
|
|
105
|
-
| `name` | string | from scaffold param | Display name. |
|
|
105
|
+
| `name` | string | from scaffold param | Display name. **Maximum 30 characters** — longer names cause a platform validation error on deployment. |
|
|
106
106
|
| `tagName` | kebab-case | derived from `folder` | Custom-element tag the widget is registered under. Used by the Editor and by `customElements.define()`. |
|
|
107
107
|
| `width.defaultWidth` | number (px) | `450` | Initial width when the widget is added to a page. |
|
|
108
108
|
| `width.allowStretch` | boolean | `true` | Whether the site owner can stretch the widget to the page width. |
|
|
@@ -75,16 +75,6 @@ When building a dashboard page to configure an embedded script, see [Dynamic Par
|
|
|
75
75
|
- All parameters must be saved as strings (convert booleans/numbers to strings)
|
|
76
76
|
- Use `withProviders` wrapper when dynamic parameters are present
|
|
77
77
|
|
|
78
|
-
## Optional builder fields
|
|
79
|
-
|
|
80
|
-
The CLI scaffolds the builder with `id`, `title`, `routePath`, and `component`. To customize sidebar placement and routing, edit the generated builder file to set:
|
|
81
|
-
|
|
82
|
-
- `additionalRoutes` (string[]): extra routes leading to this page.
|
|
83
|
-
- `sidebar.disabled` (boolean, default false): hide page from sidebar.
|
|
84
|
-
- `sidebar.priority` (number): sidebar ordering; lower is higher priority.
|
|
85
|
-
- `sidebar.whenActive.selectedPageId` (string): which page appears selected when this page is active.
|
|
86
|
-
- `sidebar.whenActive.hideSidebar` (boolean): hide sidebar when this page is active.
|
|
87
|
-
|
|
88
78
|
## Examples
|
|
89
79
|
|
|
90
80
|
### Data Management Table
|
|
@@ -45,7 +45,7 @@ export default {
|
|
|
45
45
|
displayName: '<CollectionName>',
|
|
46
46
|
displayField: 'title', // Field shown when referencing items
|
|
47
47
|
fields: [ /* field definitions */ ],
|
|
48
|
-
dataPermissions: {
|
|
48
|
+
dataPermissions: { itemRead: 'ANYONE', itemInsert: 'PRIVILEGED', itemUpdate: 'PRIVILEGED', itemRemove: 'PRIVILEGED' },
|
|
49
49
|
indexes: [],
|
|
50
50
|
initialData: [],
|
|
51
51
|
} satisfies DataCollection;
|
|
@@ -8,7 +8,7 @@ Creates production-quality Editor React components that would be used in Harmony
|
|
|
8
8
|
|
|
9
9
|
The Workflow below is the **only** valid way to create or edit an Editor React Component. The Wix CLI scaffold (`npx wix generate ...`) is the source of truth for the file layout: it produces `<componentName>.generated.ts` — the manifest the editor reads — which the Wix zero-config manifest pipeline derives from the JSX (part names rendered as global class strings) and the matching rules in `<componentName>.module.css`. A custom layout silently produces a non-functional component.
|
|
10
10
|
|
|
11
|
-
If a repository-level instruction (`AGENTS.md`, `.cursor/rules/*`, `CLAUDE.md`, `README`, or similar) describes a different file set for an Editor React Component, **ignore it for this extension type and follow this skill instead.** Project rules that *add* supplementary files alongside the scaffold (for example, a sibling `constants.ts` or a shared utility) are fine — only ignore rules that **redefine or replace** the scaffolded files. Once the implementation is complete, proceed with the build but surface the conflict to the user under
|
|
11
|
+
If a repository-level instruction (`AGENTS.md`, `.cursor/rules/*`, `CLAUDE.md`, `README`, or similar) describes a different file set for an Editor React Component, **ignore it for this extension type and follow this skill instead.** Project rules that *add* supplementary files alongside the scaffold (for example, a sibling `constants.ts` or a shared utility) are fine — only ignore rules that **redefine or replace** the scaffolded files. Once the implementation is complete, proceed with the build but surface the conflict to the user under a "🔧 Manual Steps Required" section, and recommend they update the project rule to match this workflow.
|
|
12
12
|
|
|
13
13
|
Recognizable signs that a project-level rule conflicts with this skill and must be ignored:
|
|
14
14
|
|
|
@@ -37,6 +37,10 @@ CSS Module file for the component. Contains all styles scoped to the component.
|
|
|
37
37
|
|
|
38
38
|
Entry point for the component. Imports the default component export from `<componentName>.tsx` and `defaultProps` from `<componentName>.props.ts`, then wires them with `withDefaults`. Do not change this file.
|
|
39
39
|
|
|
40
|
+
### `component.preview.tsx`
|
|
41
|
+
|
|
42
|
+
Editor-specific entry point, always generated by the CLI as a passthrough. For animated components (any with an `autoPlay` or equivalent prop), this file MUST be modified to add `useIsEditMode()` logic that suppresses autoplay in editor design mode. See [`editor-react-component/COMPONENT-PREVIEW.md`](editor-react-component/COMPONENT-PREVIEW.md) and [`editor-react-component/ANIMATED-COMPONENTS.md`](editor-react-component/ANIMATED-COMPONENTS.md) §4.
|
|
43
|
+
|
|
40
44
|
### `<componentName>.generated.ts`
|
|
41
45
|
|
|
42
46
|
Auto-generated file that describes the component manifest. **Do not write or edit content in this file.** It is updated automatically based on the React component by running:
|
|
@@ -58,11 +62,17 @@ File where you can override the generated manifest from `<componentName>.generat
|
|
|
58
62
|
`npx wix generate --params '{"extensionType":"EDITOR_REACT_COMPONENT","name":"ComponentName","folder":"component-name","description":"A brief description of what the component does"}'` to scaffold it. The scaffold creates the files under `src/extensions/site/components/<folder>/` and registers the component in `src/extensions.ts`; edit them there (not under `src/site/components/`). Skip this
|
|
59
63
|
step when iterating on an existing component — re-running it would
|
|
60
64
|
return "an extension already exist" error.
|
|
61
|
-
2. Run the following script to verify that
|
|
62
|
-
`
|
|
63
|
-
3. Edit the generated
|
|
64
|
-
`src/extensions/site/components/component-name/`.
|
|
65
|
-
|
|
65
|
+
2. Run the following script to verify that all component creation and review dependencies are installed properly:
|
|
66
|
+
`node -e "const fs=require('fs'),path=require('path'),ps=['@wix/react-component-schema','@wix/react-component-utils','@wix/editor-react-types','@babel/parser','@babel/traverse','@babel/types','eslint','eslint-plugin-jsx-a11y','@typescript-eslint/parser','@types/eslint-plugin-jsx-a11y'];const missing=ps.filter(p=>!(require.resolve.paths(p)||[]).some(d=>fs.existsSync(path.join(d,p,'package.json'))));if(missing.length){console.error('Missing dependencies: '+missing.join(', '));process.exit(1)}" || { d="$PWD"; while [ "$d" != "/" ] && [ ! -f "$d/yarn.lock" ]; do d="${d%/*}"; done; if [ -f "$d/yarn.lock" ]; then yarn add @wix/react-component-schema @wix/react-component-utils @wix/editor-react-types && yarn add -D @babel/parser @babel/traverse @babel/types eslint eslint-plugin-jsx-a11y @typescript-eslint/parser @types/eslint-plugin-jsx-a11y; else npm install @wix/react-component-schema @wix/react-component-utils @wix/editor-react-types && npm install --save-dev @babel/parser @babel/traverse @babel/types eslint eslint-plugin-jsx-a11y @typescript-eslint/parser @types/eslint-plugin-jsx-a11y; fi; }`
|
|
67
|
+
3. Edit the generated React and CSS files in
|
|
68
|
+
`src/extensions/site/components/component-name/`. Apply
|
|
69
|
+
[`editor-react-component/DESIGN-STATES.md`](editor-react-component/DESIGN-STATES.md) while
|
|
70
|
+
authoring: every interactive named part must use interactive markup and
|
|
71
|
+
pair each native state selector with its prefixed global modifier (for
|
|
72
|
+
example, `.cta:global(.component-name-cta--hover), .cta:hover`). A
|
|
73
|
+
pseudo-class without the matching global modifier is incomplete.
|
|
74
|
+
4. **MANDATORY** — execute the full A11y Review on the edited component per [`editor-react-component/A11Y-REVIEW.md`](editor-react-component/A11Y-REVIEW.md). Run both scanners over the component's `.tsx`/`.jsx` files, complete the Phase 3 manual semantic review, fix confirmed findings, and re-run the scanners after fixes. Reading the reference without executing these steps is not a review. Do not proceed to the build or report completion until the review is complete.
|
|
75
|
+
5. Run `npx wix build && npx wix generate manifest` so the editor picks up
|
|
66
76
|
the new/updated prop schema. This command regenerates manifest
|
|
67
77
|
parts for all components. Design-states emission requires
|
|
68
78
|
`@wix/cli` ≥ 1.1.215 (native and class-triggered states work from
|
|
@@ -70,7 +80,13 @@ File where you can override the generated manifest from `<componentName>.generat
|
|
|
70
80
|
design state is missing from `<componentName>.generated.ts`, the installed
|
|
71
81
|
CLI is older than required — tell the user, and let them decide whether to
|
|
72
82
|
upgrade.
|
|
73
|
-
|
|
83
|
+
6. Update `Component.extensions.ts` file according to [`editor-react-component/COMPONENT-CONFIGURATION.md`](editor-react-component/COMPONENT-CONFIGURATION.md)
|
|
84
|
+
|
|
85
|
+
If the component's primary content is a **playable animation** (Lottie/JSON,
|
|
86
|
+
animated GIF/SVG, canvas/WebGL loop, video-like surface), or has an `autoPlay`
|
|
87
|
+
(or equivalent) prop, it MUST include an on-stage play/pause control **and** the
|
|
88
|
+
generated `component.preview.tsx` MUST be modified to suppress autoplay in the
|
|
89
|
+
editor — follow [`editor-react-component/ANIMATED-COMPONENTS.md`](editor-react-component/ANIMATED-COMPONENTS.md).
|
|
74
90
|
|
|
75
91
|
Reference: when modifying an _existing_ component, follow
|
|
76
92
|
[`editor-react-component/EDIT-FLOW.md`](editor-react-component/EDIT-FLOW.md).
|
|
@@ -82,15 +98,18 @@ Core rules and workflow: [`editor-react-component/REACT-GUIDELINES.md`](editor-r
|
|
|
82
98
|
Topic-focused references (rules + patterns + common mistakes in one place):
|
|
83
99
|
|
|
84
100
|
- [`editor-react-component/ACCESSIBILITY.md`](editor-react-component/ACCESSIBILITY.md) — ARIA/a11y rules and patterns
|
|
101
|
+
- [`editor-react-component/A11Y-REVIEW.md`](editor-react-component/A11Y-REVIEW.md) — Automated a11y scan + triage workflow to run after editing
|
|
85
102
|
- [`editor-react-component/DESIGN-STATES.md`](editor-react-component/DESIGN-STATES.md) — Which design states a part supports (heuristic) and how to author them
|
|
86
103
|
- [`editor-react-component/DIRECTIONALITY.md`](editor-react-component/DIRECTIONALITY.md) — RTL/LTR rules and patterns
|
|
87
104
|
- [`editor-react-component/PROPS-VS-CSS.md`](editor-react-component/PROPS-VS-CSS.md) — What should be a React prop vs CSS
|
|
88
105
|
- [`editor-react-component/COMPONENT-API.md`](editor-react-component/COMPONENT-API.md) — Props structure, elementProps, data types, file splitting, containers, array props
|
|
106
|
+
- [`editor-react-component/ANIMATED-COMPONENTS.md`](editor-react-component/ANIMATED-COMPONENTS.md) — Play/pause control and autoplay for animated/playable components
|
|
107
|
+
- [`editor-react-component/COMPONENT-PREVIEW.md`](editor-react-component/COMPONENT-PREVIEW.md) — Editor-specific entry point (`component.preview.tsx`), `useIsEditMode()`, when to modify
|
|
89
108
|
- [`editor-react-component/REACT-PATTERNS.md`](editor-react-component/REACT-PATTERNS.md) — SSR-safe patterns, CSS rules, remaining common mistakes
|
|
90
|
-
- [`editor-react-component/ANIMATED-COMPONENTS.md`](editor-react-component/ANIMATED-COMPONENTS.md) — Play/pause controls for animated components (Lottie, GIF, autoPlay props)
|
|
91
|
-
- [`editor-react-component/COMPONENT-PREVIEW.md`](editor-react-component/COMPONENT-PREVIEW.md) — `component.preview.tsx` patterns and `useIsEditMode()` usage
|
|
92
109
|
|
|
93
110
|
## CSS guidelines
|
|
94
111
|
|
|
95
112
|
Reference: [`editor-react-component/CSS-GUIDELINES.md`](editor-react-component/CSS-GUIDELINES.md).
|
|
96
113
|
|
|
114
|
+
For branded or themed components, also apply: [`editor-react-component/BRANDED-COMPONENTS.md`](editor-react-component/BRANDED-COMPONENTS.md).
|
|
115
|
+
|
|
@@ -7,16 +7,18 @@ Service plugins are a set of APIs defined by Wix that let you inject custom logi
|
|
|
7
7
|
|
|
8
8
|
Use `wix generate --params` with `extensionType: SERVICE_PLUGIN`. `pluginType` is one of:
|
|
9
9
|
|
|
10
|
-
| Value | SPI |
|
|
11
|
-
| --- | --- |
|
|
12
|
-
| `ECOM_ADDITIONAL_FEES` | Additional Fees |
|
|
13
|
-
| `ECOM_SHIPPING_RATES` | Shipping Rates |
|
|
14
|
-
| `ECOM_DISCOUNTS_TRIGGER` | Discount Triggers |
|
|
15
|
-
| `ECOM_VALIDATIONS` | Validations |
|
|
16
|
-
| `ECOM_PAYMENT_SETTINGS` | Payment Settings |
|
|
17
|
-
| `GIFT_CARDS_PROVIDER` | Gift Cards Provider |
|
|
18
|
-
| `STAFF_SORTING_PROVIDER` | Bookings Staff Sorting |
|
|
19
|
-
| `REALTIME_PERMISSIONS_PROVIDER` | Realtime Permissions Provider |
|
|
10
|
+
| Value | SPI | Singular |
|
|
11
|
+
| --- | --- | --- |
|
|
12
|
+
| `ECOM_ADDITIONAL_FEES` | Additional Fees | No |
|
|
13
|
+
| `ECOM_SHIPPING_RATES` | Shipping Rates | **Yes** |
|
|
14
|
+
| `ECOM_DISCOUNTS_TRIGGER` | Discount Triggers | **Yes** |
|
|
15
|
+
| `ECOM_VALIDATIONS` | Validations | No |
|
|
16
|
+
| `ECOM_PAYMENT_SETTINGS` | Payment Settings | No |
|
|
17
|
+
| `GIFT_CARDS_PROVIDER` | Gift Cards Provider | **Yes** |
|
|
18
|
+
| `STAFF_SORTING_PROVIDER` | Bookings Staff Sorting | No |
|
|
19
|
+
| `REALTIME_PERMISSIONS_PROVIDER` | Realtime Permissions Provider | No |
|
|
20
|
+
|
|
21
|
+
> **Singular types** — `ECOM_SHIPPING_RATES`, `ECOM_DISCOUNTS_TRIGGER`, and `GIFT_CARDS_PROVIDER` are **singular**: only one component of each type is allowed per app. Never scaffold or include two components of the same singular type in the same app payload.
|
|
20
22
|
|
|
21
23
|
`name` must be lowercase alphanumeric + hyphens, max 19 characters. The CLI generates the folder, `plugin.ts`, the builder file, the UUID, and the `src/extensions.ts` registration with the appropriate builder method for the SPI type. Some SPI types (e.g., `ECOM_SHIPPING_RATES`) get a `description` placeholder field in the generated builder — replace it with your real copy.
|
|
22
24
|
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# App Tools Extension Reference
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The `APP_TOOLS` extension declares the tools your app exposes to the Wix AI assistant. Each tool entry tells the AI assistant what the tool does, what it accepts, and what it returns — so the assistant can discover and invoke it at runtime.
|
|
6
|
+
|
|
7
|
+
The AI assistant does NOT call these tools directly. It uses the declarations here to understand the tool's purpose and invoke your **Tools Provider service plugin** at runtime. See [TOOLS_PROVIDER.md](../service-plugin/TOOLS_PROVIDER.md) for the runtime handler.
|
|
8
|
+
|
|
9
|
+
## Registration
|
|
10
|
+
|
|
11
|
+
Scaffold the extension with the CLI — it creates the `.extension.ts` file and registers it in `src/extensions.ts` automatically:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
wix generate --params '{"extensionType":"APP_TOOLS","name":"my-tools"}'
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
The generated file lives at `src/extensions/backend/app-tools/my-tools/my-tools.extension.ts`. Replace the stub tool with your own:
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
import { extensions } from '@wix/astro/builders';
|
|
21
|
+
|
|
22
|
+
export default extensions.appTools({
|
|
23
|
+
id: '<generated-uuid>',
|
|
24
|
+
name: 'my-tools',
|
|
25
|
+
tools: [
|
|
26
|
+
{
|
|
27
|
+
methodName: 'get-order-status',
|
|
28
|
+
description: 'Returns the current fulfillment status, shipping carrier, and tracking number for a customer order. Use this tool when a collaborator or customer asks where their order is, whether it has shipped, when it will arrive, or needs a tracking number. Requires a valid orderId.',
|
|
29
|
+
requestSchema: {
|
|
30
|
+
type: 'object',
|
|
31
|
+
properties: {
|
|
32
|
+
orderId: { type: 'string', description: 'The order ID to look up.' }
|
|
33
|
+
},
|
|
34
|
+
required: ['orderId']
|
|
35
|
+
},
|
|
36
|
+
responseSchema: {
|
|
37
|
+
type: 'object',
|
|
38
|
+
properties: {
|
|
39
|
+
status: { type: 'string' },
|
|
40
|
+
trackingNumber: { type: 'string' }
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
activated: true
|
|
44
|
+
}
|
|
45
|
+
]
|
|
46
|
+
});
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## `AppToolConfig` Fields
|
|
50
|
+
|
|
51
|
+
| Field | Type | Required | Description |
|
|
52
|
+
| --- | --- | --- | --- |
|
|
53
|
+
| `methodName` | `string` | Yes | Unique word identifying the tool. Used to route calls in the service plugin handler. 1–30 characters. |
|
|
54
|
+
| `description` | `string` | Yes | Natural-language description the AI assistant uses to decide when to invoke this tool. Write it like a prompt: state what the tool does, list the user intents or trigger phrases that should activate it, and describe what it returns. A narrow one-liner reduces relevance matching — prefer 2–4 sentences covering intent, triggers, and output. 10–1000 characters. |
|
|
55
|
+
| `requestSchema` | `Record<string, any>` | No | JSON Schema describing the tool's request payload. The AI assistant uses this for context — it is NOT validated by Wix at call time. |
|
|
56
|
+
| `responseSchema` | `Record<string, any>` | No | JSON Schema describing the tool's response payload. |
|
|
57
|
+
| `activated` | `boolean` | Yes | Only tools with `activated: true` are called by the AI assistant. |
|
|
58
|
+
|
|
59
|
+
## Important Constraints
|
|
60
|
+
|
|
61
|
+
- `tools` array: min 1, max 100 tools per extension.
|
|
62
|
+
- `methodName` must be unique across all tools in the extension — it is the routing key in the service plugin handler.
|
|
63
|
+
- Schemas are advisory for the AI assistant; your handler must still validate inputs defensively.
|
|
64
|
+
- Only `activated: true` tools are invoked. Use `activated: false` to temporarily disable a tool without removing it.
|
|
65
|
+
|
|
66
|
+
## Relationship to the Tools Provider
|
|
67
|
+
|
|
68
|
+
The `APP_TOOLS` extension is the **declaration** side. The **execution** side is the Tools Provider service plugin registered with `toolsProviderConfig`:
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
APP_TOOLS (declaration) → AI assistant discovers & selects a tool
|
|
72
|
+
toolsProviderConfig (SPI) → Wix calls your runTool handler at runtime
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Both extensions must be registered for the feature to work end-to-end. See [APP_TOOLS.md](../APP_TOOLS.md) for the full picture and [TOOLS_PROVIDER.md](../service-plugin/TOOLS_PROVIDER.md) for the handler implementation.
|
|
@@ -23,8 +23,8 @@ Host Module '@wix/dashboard' 'navigate()' method for navigating between dashboar
|
|
|
23
23
|
import { dashboard } from '@wix/dashboard';
|
|
24
24
|
// Navigate to your own app's page with some internal state
|
|
25
25
|
dashboard.navigate({pageId: <your-page-id>, relativeUrl: "/an/internal/state?param=value"})
|
|
26
|
-
// Navigate to a relative
|
|
27
|
-
dashboard.navigate({ relativeUrl: "/some/internal/route" });
|
|
26
|
+
// Navigate to a relative URL within a page (pageId required even for relative paths)
|
|
27
|
+
dashboard.navigate({ pageId: '<your-page-id>', relativeUrl: "/some/internal/route" });
|
|
28
28
|
// Navigate to the Products List page
|
|
29
29
|
dashboard.navigate({ pageId: "0845ada2-467f-4cab-ba40-2f07c812343d" });
|
|
30
30
|
// Add a button that navigates to the Products List page (React/TSX)
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# Editor React Component A11y Review Reference
|
|
2
|
+
|
|
3
|
+
Use this reference for decisions that require code inspection after running the scanners in [`A11Y-REVIEW.md`](A11Y-REVIEW.md). The scanner output owns rule-specific context: rule ID, location, message, resolution path, evidence, and confidence. Do not maintain a separate rule catalog here.
|
|
4
|
+
|
|
5
|
+
## Scanner Result Handling
|
|
6
|
+
|
|
7
|
+
Treat every scanner finding as a lead until the component implementation confirms how the flagged behavior reaches the rendered element.
|
|
8
|
+
|
|
9
|
+
1. Read the full finding, including evidence and confidence when present.
|
|
10
|
+
2. Trace the component topology through local wrappers, shared primitives, and package implementations.
|
|
11
|
+
3. Deduplicate findings that identify the same issue at the same location.
|
|
12
|
+
4. Assign a verdict: `confirmed`, `false-positive`, or `not-relevant`.
|
|
13
|
+
5. Fix confirmed issues inline, then re-run both scanners on changed JSX files.
|
|
14
|
+
|
|
15
|
+
When both scanners flag the same issue, keep the finding with the strongest semantic evidence. The scanners complement each other; a finding from one scanner is not automatically stronger because of its tier.
|
|
16
|
+
|
|
17
|
+
## Confidence Model
|
|
18
|
+
|
|
19
|
+
### High
|
|
20
|
+
|
|
21
|
+
Use high confidence when the code and scanner evidence unambiguously show the violation, for example:
|
|
22
|
+
|
|
23
|
+
- the flagged rendered element and static props establish the behavior directly
|
|
24
|
+
- the component implementation resolves to the flagged semantic element
|
|
25
|
+
- an explicit polymorphic prop establishes the rendered element
|
|
26
|
+
|
|
27
|
+
Fix high-confidence findings immediately.
|
|
28
|
+
|
|
29
|
+
### Medium
|
|
30
|
+
|
|
31
|
+
Use medium confidence when:
|
|
32
|
+
|
|
33
|
+
- props strongly imply the rendered semantics
|
|
34
|
+
- the implementation only partially resolves but preserves likely semantics
|
|
35
|
+
- the component name, props, and surrounding evidence strongly agree
|
|
36
|
+
|
|
37
|
+
Read the surrounding code. If it confirms the inference, fix the issue. If it contradicts the inference, discard the finding. If the implementation remains unresolved, treat it as low confidence.
|
|
38
|
+
|
|
39
|
+
### Low
|
|
40
|
+
|
|
41
|
+
Use low confidence when:
|
|
42
|
+
|
|
43
|
+
- only weak heuristics support the semantic guess
|
|
44
|
+
- the implementation cannot be resolved
|
|
45
|
+
- runtime props or spreads can materially change the rendered semantics
|
|
46
|
+
|
|
47
|
+
Continue tracing the code. Fix only after the issue is confirmed; otherwise leave the code unchanged.
|
|
48
|
+
|
|
49
|
+
### Confidence vs. Actionability
|
|
50
|
+
|
|
51
|
+
Confidence answers whether the issue is real. It does not decide whether a confirmed fix is safe.
|
|
52
|
+
|
|
53
|
+
- Confirmed + safe/local fix: fix now.
|
|
54
|
+
- Confirmed + risky behavior change or non-local refactor: leave unchanged.
|
|
55
|
+
- Unconfirmed or ambiguous: leave unchanged.
|
|
56
|
+
|
|
57
|
+
If the violation is visible in the code and has a localized, behavior-preserving fix, treat it as confirmed and apply the fix.
|
|
58
|
+
|
|
59
|
+
Valid reasons to leave code unchanged:
|
|
60
|
+
|
|
61
|
+
- semantics remain ambiguous after reading the available code
|
|
62
|
+
- product intent cannot be derived from the code
|
|
63
|
+
- the fix requires a risky behavior change or a non-local refactor
|
|
64
|
+
|
|
65
|
+
Do not leave a confirmed safe/local issue unchanged because it is low severity, secondary, shared, or outside the first file in scope.
|
|
66
|
+
|
|
67
|
+
## Semantic Resolution
|
|
68
|
+
|
|
69
|
+
Resolve the rendered behavior in this order:
|
|
70
|
+
|
|
71
|
+
1. The flagged JSX element and its static props
|
|
72
|
+
2. Explicit polymorphic props such as `as="a"` or `component="button"`
|
|
73
|
+
3. The local component implementation
|
|
74
|
+
4. Installed package source or declarations in `node_modules`
|
|
75
|
+
5. Prop evidence such as `href`, `to`, `src`, `alt`, and `role`
|
|
76
|
+
6. Component-name heuristics
|
|
77
|
+
|
|
78
|
+
For local imports, follow the exported component's rendered root. Continue through local or package components until the semantics resolve or the evidence becomes too weak.
|
|
79
|
+
|
|
80
|
+
For package imports, resolve the import from `node_modules` and inspect its exported entry point. If the package hides its rendered semantics, use prop and naming evidence without assigning more confidence than the evidence supports.
|
|
81
|
+
|
|
82
|
+
## Tier 2 Manual Review Checklist
|
|
83
|
+
|
|
84
|
+
Run this checklist after scanner findings are triaged. Tier 2 is required even when both scanners return zero findings.
|
|
85
|
+
|
|
86
|
+
### Semantic Targeting
|
|
87
|
+
|
|
88
|
+
- Do ARIA attributes land on the semantically correct element instead of a layout wrapper?
|
|
89
|
+
- Do labels, descriptions, and roles reach the actual interactive or landmark element?
|
|
90
|
+
- Do wrappers preserve the semantics exposed by their API?
|
|
91
|
+
|
|
92
|
+
### Icon-Only and Visual-Only States
|
|
93
|
+
|
|
94
|
+
- Do icon-only buttons, links, or controls have an accessible name?
|
|
95
|
+
- If visible text is hidden, is it visually hidden in an accessibility-safe way instead of removed from the accessibility tree?
|
|
96
|
+
- Do meaningful icons or images expose accessible text when needed?
|
|
97
|
+
|
|
98
|
+
### CSS and Hidden Content
|
|
99
|
+
|
|
100
|
+
- Does `display: none` remove content that should remain available to assistive technology?
|
|
101
|
+
- Are hidden or collapsed states consistent across visuals, focusability, and the accessibility tree?
|
|
102
|
+
- Do conditional classes or CSS variables create states where labels or instructions disappear from assistive technology?
|
|
103
|
+
|
|
104
|
+
### Decorative vs. Meaningful Content
|
|
105
|
+
|
|
106
|
+
- Are decorative separators, ornaments, and repeated icons hidden from assistive technology?
|
|
107
|
+
- Are meaningful visuals, status icons, or graphics named appropriately?
|
|
108
|
+
|
|
109
|
+
### Focus and Interaction Consistency
|
|
110
|
+
|
|
111
|
+
- Can hidden or collapsed items still receive focus?
|
|
112
|
+
- Do interactive-looking elements expose the correct role and keyboard behavior?
|
|
113
|
+
- Do disabled, inert, or collapsed states behave consistently for keyboard users and assistive technology?
|
|
114
|
+
- Search all in-scope files for `onClick` on elements without built-in interaction (`div`, `span`, `section`, `header`, `footer`, `li`, `td`, and similar tags). Include conditional patterns such as `{...(condition && { onClick: handler })}`. Verify that each match also has the required `role`, `tabIndex`, and keyboard handler (`onKeyDown` or `onKeyUp`). A missing combination is a high-confidence finding.
|
|
115
|
+
- Before fixing missing keyboard semantics, check for nested interactive children, existing focus management, and the condition that enables interaction. Use the [pre-fix checks](#pre-fix-checks-for-adding-button-semantics-to-a-non-interactive-element).
|
|
116
|
+
|
|
117
|
+
### Structural Semantics
|
|
118
|
+
|
|
119
|
+
- Are landmarks, headings, and list semantics preserved through wrappers and layout components?
|
|
120
|
+
- When the component implements breadcrumbs, tabs, menus, dialogs, or similar patterns, do the expected semantics reach the rendered structure?
|
|
121
|
+
|
|
122
|
+
### Editor React Component Contracts
|
|
123
|
+
|
|
124
|
+
- Are ARIA attributes routed through the typed `a11y` prop and converted at the correct element?
|
|
125
|
+
- Do icon-only labels come from `constants.ts` or user-configurable `a11y` instead of hardcoded strings?
|
|
126
|
+
- Does the component preserve direction support and isolate each `ReactNode` content prop with `dir="ltr"`?
|
|
127
|
+
- Do extension overrides preserve a11y-relevant manifest fields generated from JSX?
|
|
128
|
+
|
|
129
|
+
## Fix Principles
|
|
130
|
+
|
|
131
|
+
- Use the rule ID, message, and evidence emitted by the scanner as the rule-specific fix context.
|
|
132
|
+
- Read the surrounding code before editing.
|
|
133
|
+
- Preserve visual and runtime behavior.
|
|
134
|
+
- Prefer the smallest correct change and avoid unrelated refactors.
|
|
135
|
+
- Fix the semantic owner: the component root, the correct inner element, a shared base, or the call site that supplies the value.
|
|
136
|
+
- When a wrapper already accepts and forwards a required prop, fix the call site. When it does not, update the wrapper contract and forwarding before fixing the call site.
|
|
137
|
+
- Do not hardcode reusable accessibility values such as alternative text. Accept them through the component API when they depend on consumer content.
|
|
138
|
+
- Route Editor React Component ARIA through `a11y` and `convertA11yKeysToHtmlFormat(a11y)` according to [`ACCESSIBILITY.md`](ACCESSIBILITY.md).
|
|
139
|
+
|
|
140
|
+
## Pre-Fix Checks for Adding Button Semantics to a Non-Interactive Element
|
|
141
|
+
|
|
142
|
+
Before adding `role="button"`, `tabIndex`, and keyboard handlers to an element such as `<div>`, verify all four conditions below.
|
|
143
|
+
|
|
144
|
+
### 1. Interactive Children
|
|
145
|
+
|
|
146
|
+
Check whether the element conditionally or unconditionally contains `<a>`, `<button>`, `<input>`, `<Link>`, or a component that resolves to an interactive element. Button semantics on the parent would create nested interaction.
|
|
147
|
+
|
|
148
|
+
If interactive children are possible, either exclude that branch from the parent's interaction condition or use a separate control element.
|
|
149
|
+
|
|
150
|
+
### 2. Existing Focus Management
|
|
151
|
+
|
|
152
|
+
Check whether the element already receives `tabIndex` from another source, such as `getTabIndexAttribute`, an a11y prop spread, or an interactions framework. Determine the prop merge order and keep one source authoritative.
|
|
153
|
+
|
|
154
|
+
When an existing a11y spread should win, place the conditional interaction spread before it so `tabIndex: 0` only acts as a fallback.
|
|
155
|
+
|
|
156
|
+
### 3. Interaction Condition
|
|
157
|
+
|
|
158
|
+
Read the full boolean expression that enables interaction. Verify that it:
|
|
159
|
+
|
|
160
|
+
- excludes states that already render an interactive child
|
|
161
|
+
- excludes editor preview, externally controlled, disabled, or reduced-motion states when required
|
|
162
|
+
- uses explicit comparisons such as `=== undefined` or `=== true` when `true`, `false`, and `undefined` have different meanings
|
|
163
|
+
|
|
164
|
+
Fix a fragile condition as part of the accessibility change. Correct semantics attached to the wrong state are still incorrect behavior.
|
|
165
|
+
|
|
166
|
+
### 4. Accessible Name Scope
|
|
167
|
+
|
|
168
|
+
Decide whether an accessible label names the interaction or the component as a whole. Keep a component-level label outside the interaction condition so it persists in non-interactive states. Apply an action-specific label only while that action is available.
|
|
169
|
+
|
|
170
|
+
## After Fixing
|
|
171
|
+
|
|
172
|
+
Re-run both scanners on changed `.tsx` / `.jsx` files. Continue with `npx wix build`, `npx wix generate manifest`, and the project's TypeScript check as required by [`A11Y-REVIEW.md`](A11Y-REVIEW.md#phase-5-verify).
|