@wix/agent-skills 1.15.0 → 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 +5 -1
- 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 +6 -4
- package/skills/wix-app/references/EDITOR_REACT_COMPONENT.md +28 -7
- package/skills/wix-app/references/SERVICE_PLUGIN.md +12 -10
- package/skills/wix-app/references/STORES_VERSIONING.md +9 -211
- package/skills/wix-app/references/app-tools/TOOLS.md +75 -0
- package/skills/wix-app/references/backend-event/COMMON-EVENTS.md +5 -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 +172 -0
- 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/COMPONENT-PREVIEW.md +57 -0
- package/skills/wix-app/references/editor-react-component/CSS-GUIDELINES.md +33 -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 +4 -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/CATEGORIES.md +22 -0
- package/skills/wix-app/references/stores/GET_PRODUCT.md +99 -0
- package/skills/wix-app/references/stores/INVENTORY.md +37 -0
- package/skills/wix-app/references/stores/QUERY.md +119 -0
- package/skills/wix-app/references/stores/WRITE.md +55 -0
- package/skills/wix-docs/SKILL.md +35 -3
- package/skills/wix-headless/SKILL.md +9 -2
- package/skills/wix-headless/entry/bootstrap.mjs +2 -2
- package/skills/wix-headless/entry/skill.md +0 -2
- package/skills/wix-headless/references/CAPABILITIES.md +6 -4
- 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 +25 -1
- package/skills/wix-headless/references/FEEDBACK.md +16 -5
- package/skills/wix-headless/references/IMAGE_GENERATION.md +10 -0
- package/skills/wix-headless/references/SDK_HANDOFF.md +2 -0
- package/skills/wix-headless/references/SEED.md +3 -1
- package/skills/wix-headless/references/SETUP.md +1 -1
- package/skills/wix-headless/references/inline-recipes/how-to-code-a-store.md +3 -2
- package/skills/wix-headless/references/inline-recipes/how-to-code-restaurant-reservations.md +42 -2
- package/skills/wix-headless/references/inline-recipes/setup-bookings.md +5 -1
- package/skills/wix-headless/references/inline-recipes/setup-forms.md +1 -1
- package/skills/wix-headless/references/inline-recipes/setup-online-store.md +33 -8
- package/skills/wix-headless/references/inline-recipes/setup-portfolio.md +3 -1
- package/skills/wix-headless/references/inline-recipes/setup-restaurant-experiences.md +73 -0
- package/skills/wix-headless/references/inline-recipes/setup-restaurant-orders.md +38 -2
- package/skills/wix-headless/references/inline-recipes/setup-restaurant-reservations.md +20 -1
- package/skills/wix-headless/references/inline-recipes/setup-restaurants.md +1 -1
- package/skills/wix-headless/references/managed/CONNECT.md +2 -2
- package/skills/wix-headless/references/managed/CREATE.md +15 -1
- package/skills/wix-headless/references/managed/DEPLOYMENT.md +47 -0
- package/skills/wix-headless/references/self-managed/DEPLOYMENT.md +8 -0
- package/skills/wix-headless/references/stripe/DEPLOYMENT.md +8 -0
- package/skills/wix-manage/SKILL.md +131 -12
- package/skills/wix-manage/references/analytics/analytics-dashboard-navigation.md +41 -0
- package/skills/wix-manage/references/analytics/query-site-analytics.md +66 -9
- package/skills/wix-manage/references/app-installation/app-installation-dashboard-navigation.md +28 -0
- package/skills/wix-manage/references/app-installation/install-wix-apps.md +3 -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/create-booking-service-from-prompt.md +6 -5
- package/skills/wix-manage/references/bookings/create-course-service.md +30 -5
- package/skills/wix-manage/references/bookings/diagnose-availability-issues.md +85 -42
- 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 +33 -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/get-paid/how-to-setup-wix-payments.md +30 -7
- 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/create-and-publish-social-post.md +225 -144
- package/skills/wix-manage/references/marketing/generate-and-publish-marketing-plan.md +19 -10
- 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 +243 -0
- 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/create-product-from-image.md +8 -6
- package/skills/wix-manage/references/stores/create-product-with-options-catalog-v3.md +16 -10
- 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 +54 -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 +26 -0
- package/skills/wix-vibe-headless/platforms/base44.md +177 -0
- package/skills/wix-vibe-headless/platforms/generic.md +122 -0
- 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 -145
- 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} +90 -12
- 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} +3 -2
- 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/{wix-portfolio.js → app/rest/wix-portfolio.js} +84 -55
- 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 -148
- 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} +25 -2
- 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/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
|
@@ -1,128 +1,239 @@
|
|
|
1
|
+
# Wix Blog — ready-made client
|
|
1
2
|
|
|
2
|
-
|
|
3
|
+
The blog reader is **shipped as real files**, not snippets to regenerate. It's a complete feed + post
|
|
4
|
+
detail + category/tag landing pages, styled with your app's design tokens (base44's `src/index.css` —
|
|
5
|
+
the shadcn palette the design phase already set). Copy it into the app and wire the routes — you
|
|
6
|
+
generate almost none of the reader code (post paging, slug routing, the category/tag id→label
|
|
7
|
+
resolution, the plain-text body split all ship and are correct).
|
|
3
8
|
|
|
4
|
-
|
|
9
|
+
Talks to Wix directly over the public `WIX_CLIENT_ID` (anonymous visitor tokens). The reader is
|
|
10
|
+
**read-only and visitor-facing** — it never creates, edits, or moderates content. Never mock posts;
|
|
11
|
+
never hand-build a post/category/tag URL — route by `slug` through the shipped helpers.
|
|
5
12
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
13
|
+
## Prerequisites
|
|
14
|
+
- The site's **Wix Blog** is the read target. It's installed and seeded separately (see **Seeding** below), in parallel with this build — so it may be empty at build time; the client renders the shipped empty state until posts land. Draft/unpublished posts are never returned.
|
|
15
|
+
- The public headless **`WIX_CLIENT_ID`** from your prompt (visitor-facing, safe to hardcode/commit).
|
|
9
16
|
|
|
10
|
-
##
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
Wix Blog with published posts.
|
|
17
|
+
## STEP 1 — The client is already in `src/`
|
|
18
|
+
The install step (base44.md STEP 1) deployed the whole blog UI client + REST scaffolds into `src/`
|
|
19
|
+
(imports use the `@/` alias → `src/`). Here's every file and what it is — **this is your map, so you
|
|
20
|
+
don't need to open them:**
|
|
15
21
|
|
|
16
|
-
|
|
17
|
-
|
|
22
|
+
| file | what it is |
|
|
23
|
+
|---|---|
|
|
24
|
+
| `context/TaxonomyContext.jsx` | `useTaxonomy()` provider: categories + tags fetched **once**, exposed as `catById` / `tagById` id→object maps |
|
|
25
|
+
| `hooks/usePostDetail.js` | post-detail data — load by slug, not-found state, resolved category/tag chips, body paragraphs |
|
|
26
|
+
| `components/PostCard.jsx`, `PostGrid.jsx` | post listing UI (grid + card, with cover image + empty state) |
|
|
27
|
+
| `components/PostChips.jsx` | category/tag chips for a post (resolves ids via the taxonomy, routes by slug) |
|
|
28
|
+
| `components/WixManageBanner.jsx` | preview-only manage banner — drop it into your Layout (STEP 4) |
|
|
29
|
+
| `pages/Blog.jsx` | the feed route (`/blog`) — lists posts, paginates, empty state |
|
|
30
|
+
| `pages/PostDetail.jsx` | the post route (`/blog/:slug`) |
|
|
31
|
+
| `pages/CategoryPage.jsx`, `TagPage.jsx` | the taxonomy landing routes (`/blog/category/:slug`, `/blog/tag/:slug`) |
|
|
32
|
+
| `rest/wix-config.js` | **you set the ids here** (STEP 2) |
|
|
33
|
+
| `rest/wix-client.js` + `rest/wix-blog.js` | REST transport + blog helpers (posts/categories/tags) |
|
|
18
34
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
`
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
- **
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
35
|
+
They're already in place — go **straight to theming + wiring**, nothing to verify first. **Don't
|
|
36
|
+
`read_file` the shipped page/component/hook source to inspect it** — the table above says what each is
|
|
37
|
+
and every field shape you need is in the snippets below. Read a shipped file's source **only** on a
|
|
38
|
+
real fallback — a runtime error, or a field the snippets don't cover (see "Fallback only" at the
|
|
39
|
+
end). (Files missing? the install's `deploy` result lists what it wrote; re-run install, or copy
|
|
40
|
+
`references/blog/app/` → `src/`.)
|
|
41
|
+
|
|
42
|
+
## STEP 2 — Credentials
|
|
43
|
+
Write `src/rest/wix-config.js` with your `WIX_CLIENT_ID` and `WIX_METASITE_ID` from the prompt — the
|
|
44
|
+
one place both ids live.
|
|
45
|
+
|
|
46
|
+
## STEP 3 — Theme (nothing to style on the shipped components)
|
|
47
|
+
The shipped components carry **no palette of their own** — they render from base44's design tokens in
|
|
48
|
+
`src/index.css` (`:root`/`.dark`: `--background`, `--foreground`, `--card`, `--primary`, `--muted`,
|
|
49
|
+
`--border`, `--radius`, `--font-*`) via shadcn Tailwind classes (`bg-card`, `text-foreground`,
|
|
50
|
+
`bg-primary`, `text-muted-foreground`, `border-border`, `rounded-lg`, `font-display`). Those tokens
|
|
51
|
+
are **already set to the brand by the design phase**, so the shipped pages are themed with zero work
|
|
52
|
+
here. To adjust the palette, edit `index.css` (`:root` **and** `.dark`) — the base44 way; **never add
|
|
53
|
+
a parallel theme file (e.g. a `theme.css`) or restyle the shipped JSX.** Build the Home/Header you add
|
|
54
|
+
(STEP 4) from the **same** base44 tokens/classes so it matches automatically. A dark brand is just
|
|
55
|
+
base44's dark palette in `index.css` — no per-component work.
|
|
56
|
+
|
|
57
|
+
## STEP 4 — Wire routes + provider (surgical `find_replace` on `src/App.jsx`, never a rewrite)
|
|
58
|
+
**No file reads needed to wire this.** Every shipped page and `WixManageBanner` is a default export that takes **no props** — wire them exactly as the snippet shows; nothing in those files needs looking up.
|
|
59
|
+
`App.jsx` carries required platform auth scaffolding (`AuthProvider`/`useAuth`) — edit it in, don't
|
|
60
|
+
replace it.
|
|
61
|
+
- Wrap the routed tree in `<TaxonomyProvider>` (from `@/context/TaxonomyContext`) so categories/tags
|
|
62
|
+
are fetched **once** and every card/chip reuses the shared map (never re-query per post).
|
|
63
|
+
- Put your **header + footer in a `Layout`** that renders `<Outlet/>` between them, and nest every
|
|
64
|
+
route under one pathless `<Route element={<Layout/>}>`. Your brand chrome then wraps **every** page
|
|
65
|
+
— including the shipped `Blog` / `PostDetail` / category / tag pages — so you **never edit the
|
|
66
|
+
shipped pages to add a header/footer** (they render inside `<Outlet/>` as-is).
|
|
67
|
+
- **Pin the top chrome as one fixed block.** Put `<WixManageBanner/>` (shipped, preview-only) **above**
|
|
68
|
+
your `<Header/>` inside a single `position:fixed` top region — the header itself is plain in-flow
|
|
69
|
+
markup, the region owns the fixing — so banner + header ride together (no scroll drift/gap). Pad
|
|
70
|
+
the content by the region's measured height so it clears the chrome and self-corrects when the
|
|
71
|
+
banner is dismissed.
|
|
72
|
+
- Routes under the Layout: `/blog` → `Blog`, `/blog/:slug` → `PostDetail`, `/blog/category/:slug` →
|
|
73
|
+
`CategoryPage`, `/blog/tag/:slug` → `TagPage` (all shipped, as-is). **You add `/` → your own Home** page.
|
|
74
|
+
|
|
75
|
+
```jsx
|
|
76
|
+
import { useRef, useState, useEffect } from "react";
|
|
77
|
+
import { Routes, Route, Outlet } from "react-router-dom";
|
|
78
|
+
import { TaxonomyProvider } from "@/context/TaxonomyContext";
|
|
79
|
+
import WixManageBanner from "@/components/WixManageBanner"; // shipped, preview-only · default export, no props
|
|
80
|
+
import Blog from "@/pages/Blog"; // shipped · default export, no props
|
|
81
|
+
import PostDetail from "@/pages/PostDetail"; // shipped · default export, no props
|
|
82
|
+
import CategoryPage from "@/pages/CategoryPage"; // shipped · default export, no props
|
|
83
|
+
import TagPage from "@/pages/TagPage"; // shipped · default export, no props
|
|
84
|
+
import Home from "@/pages/Home"; // YOU build
|
|
85
|
+
import Header from "@/components/Header"; // YOU build — plain in-flow markup, NOT position:fixed
|
|
86
|
+
import Footer from "@/components/Footer"; // YOU build
|
|
87
|
+
|
|
88
|
+
function Layout() {
|
|
89
|
+
const topRef = useRef(null);
|
|
90
|
+
const [offset, setOffset] = useState(0);
|
|
91
|
+
useEffect(() => { // measure the fixed region → pad content below it
|
|
92
|
+
const ro = new ResizeObserver(() => setOffset(topRef.current?.offsetHeight ?? 0));
|
|
93
|
+
if (topRef.current) ro.observe(topRef.current);
|
|
94
|
+
return () => ro.disconnect();
|
|
95
|
+
}, []);
|
|
96
|
+
return (<>
|
|
97
|
+
<div ref={topRef} style={{ position: "fixed", top: 0, left: 0, right: 0, zIndex: 50 }}>
|
|
98
|
+
<WixManageBanner /> {/* null on the published site / when dismissed */}
|
|
99
|
+
<Header /> {/* your brand header, in-flow inside this fixed block */}
|
|
100
|
+
</div>
|
|
101
|
+
<div style={{ paddingTop: offset }}> {/* clears the chrome; shrinks when the banner is dismissed */}
|
|
102
|
+
<Outlet /> {/* shipped Blog / PostDetail / Category / Tag render here, untouched */}
|
|
103
|
+
<Footer />
|
|
104
|
+
</div>
|
|
105
|
+
</>);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
<TaxonomyProvider>
|
|
109
|
+
<Routes>
|
|
110
|
+
<Route element={<Layout />}> {/* chrome wraps all */}
|
|
111
|
+
<Route path="/" element={<Home />} /> {/* yours */}
|
|
112
|
+
<Route path="/blog" element={<Blog />} /> {/* shipped, as-is */}
|
|
113
|
+
<Route path="/blog/:slug" element={<PostDetail />} /> {/* shipped, as-is */}
|
|
114
|
+
<Route path="/blog/category/:slug" element={<CategoryPage />} /> {/* shipped, as-is */}
|
|
115
|
+
<Route path="/blog/tag/:slug" element={<TagPage />} /> {/* shipped, as-is */}
|
|
116
|
+
</Route>
|
|
117
|
+
</Routes>
|
|
118
|
+
</TaxonomyProvider>
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## What you build (not shipped)
|
|
122
|
+
The **home / landing page**, the **`Header`** and a **`Footer`** — the two you drop into the `Layout`
|
|
123
|
+
(STEP 4) so they wrap every route — plus the overall brand story, styled with the same base44
|
|
124
|
+
tokens/classes. **Compose the shipped pieces** — a "latest posts" strip is just `queryPosts` + the shipped
|
|
125
|
+
`PostGrid`; a category nav is `useTaxonomy()` + links to `/blog/category/:slug`:
|
|
126
|
+
|
|
127
|
+
```jsx
|
|
128
|
+
import { useState, useEffect } from "react";
|
|
129
|
+
import { Link } from "react-router-dom";
|
|
130
|
+
import { queryPosts } from "@/rest/wix-blog";
|
|
131
|
+
import { useTaxonomy } from "@/context/TaxonomyContext";
|
|
132
|
+
import PostGrid from "@/components/PostGrid";
|
|
133
|
+
|
|
134
|
+
// Responsive header: choose ONE branch with a state flag (never a Tailwind `hidden md:*` toggle —
|
|
135
|
+
// these navs are inline-styled, and an inline `display` beats a Tailwind class, so `hidden` never
|
|
136
|
+
// applies and BOTH branches render). One branch = one nav.
|
|
137
|
+
export function Header() {
|
|
138
|
+
const [mobile, setMobile] = useState(() => window.innerWidth < 768);
|
|
139
|
+
useEffect(() => {
|
|
140
|
+
const onResize = () => setMobile(window.innerWidth < 768);
|
|
141
|
+
window.addEventListener("resize", onResize); // keep it reactive to viewport changes
|
|
142
|
+
return () => window.removeEventListener("resize", onResize);
|
|
143
|
+
}, []);
|
|
144
|
+
return (
|
|
145
|
+
<nav style={{ display: "flex", alignItems: "center", justifyContent: "space-between" }}>
|
|
146
|
+
{/* brand/logo */}
|
|
147
|
+
{mobile
|
|
148
|
+
? <YourMenu /> // your hamburger + links here
|
|
149
|
+
: <div style={{ display: "flex", gap: 24 }}><Link to="/">Home</Link><Link to="/blog">Blog</Link></div>}
|
|
150
|
+
</nav>
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
export function Latest() { // on your home page
|
|
154
|
+
const [posts, setPosts] = useState([]);
|
|
155
|
+
// NB: queryPosts returns { posts, nextCursor } — destructure the array.
|
|
156
|
+
useEffect(() => { queryPosts({ limit: 6 }).then(({ posts }) => setPosts(posts)); }, []);
|
|
157
|
+
return <PostGrid posts={posts} empty="Posts coming soon." />;
|
|
158
|
+
}
|
|
159
|
+
export function CategoryNav() { // a menu of the blog's categories
|
|
160
|
+
const { categories } = useTaxonomy(); // fetched once by the provider
|
|
161
|
+
return categories.filter((c) => c.postCount > 0) // hide empty categories if you want
|
|
162
|
+
.map((c) => <Link key={c.id} to={`/blog/category/${c.slug}`}>{c.label}</Link>);
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
Everything reads base44's design tokens (`index.css`), so your home/nav match the shipped pages automatically.
|
|
166
|
+
|
|
167
|
+
**Editing a component and the change doesn't show? It's the preview, not your code.** The dev preview
|
|
168
|
+
can serve a stale module after a write. Before diagnosing a visual bug you just "fixed", do a fresh
|
|
169
|
+
full navigate/reload of the preview and re-check — don't keep rewriting correct code against a stale
|
|
170
|
+
render.
|
|
171
|
+
|
|
172
|
+
## Using the client from your own UI
|
|
173
|
+
|
|
174
|
+
```jsx
|
|
175
|
+
// Every list helper returns an OBJECT, not a bare array — destructure first, or `.map` throws:
|
|
176
|
+
const { posts, nextCursor } = await queryPosts({ limit: 20 }); // pass nextCursor back as `cursor`
|
|
177
|
+
const { categories, total } = await queryCategories(); // display c.label · count c.postCount
|
|
178
|
+
const { tags } = await queryTags(); // display t.label · count t.publishedPostCount
|
|
179
|
+
const { posts: inCategory } = await queryPostsByCategory(categoryId, { limit: 20 });
|
|
180
|
+
const { posts: withTag } = await queryPostsByTag(tagId, { limit: 20 });
|
|
181
|
+
|
|
182
|
+
// Single-item lookups fail soft (null on miss) — show a not-found state, never invent an item:
|
|
183
|
+
const post = await getPostBySlug(slug); // null → 404 state
|
|
184
|
+
const cat = await getCategoryBySlug(slug);
|
|
185
|
+
const tag = await getTagBySlug(slug);
|
|
186
|
+
|
|
187
|
+
// Cover image: post cover and category cover are DIFFERENT paths.
|
|
188
|
+
const postCover = post.media?.wixMedia?.image?.url; // post/card cover (ready-to-use https)
|
|
189
|
+
const catCover = cat.coverImage?.url; // category landing cover
|
|
190
|
+
// No post cover? fall back to the first richContent IMAGE node, or a text-only card — never a stock image.
|
|
191
|
+
|
|
192
|
+
// Body: contentText is plain text (split on "\n" for paragraphs — the shipped hook does this).
|
|
193
|
+
// richContent is a Ricos document for a faithful render (images/embeds) — see "Extending".
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
**No author byline** — the reader helpers don't expose an author (`post.author` is undefined). Omit
|
|
197
|
+
the byline, or resolve it via the **members** vertical. **No engagement UI** — comments/likes/views
|
|
198
|
+
aren't exposed; leave them out.
|
|
199
|
+
|
|
200
|
+
## Extending the client
|
|
201
|
+
Building something beyond the shipped pages (faithful `richContent`, full-text search, related posts,
|
|
202
|
+
metrics, members-only posts)? Extend with `wixApiRequest`, but look up the exact endpoint/method/body
|
|
203
|
+
in the **official Wix API reference** first — never guess. Each helper in `wix-blog.js` links its
|
|
204
|
+
reference page inline.
|
|
96
205
|
- Blog API reference: https://dev.wix.com/docs/api-reference/business-solutions/blog.md
|
|
97
|
-
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
206
|
+
- Rendering `richContent` (Ricos document): https://dev.wix.com/docs/ricos/api-reference/ricos-document
|
|
207
|
+
- **Members-only posts** → the **members** vertical: once a member is logged in, the shipped read
|
|
208
|
+
helpers return the gated content with no extra code (member *writes* — comments, likes — are not
|
|
209
|
+
included; add them as an authenticated `wixApiRequest` call).
|
|
210
|
+
|
|
211
|
+
Fallback only — when you hit an error or need something not shown here: read the relevant shipped file
|
|
212
|
+
under `src/`, or look it up via the **`wix-docs`** skill.
|
|
213
|
+
|
|
214
|
+
## Hard rules
|
|
215
|
+
- Set `WIX_CLIENT_ID` (STEP 2) — not the placeholder.
|
|
216
|
+
- Style via base44 design tokens (`index.css` / shadcn Tailwind classes), never by rewriting the shipped components or adding a parallel theme file.
|
|
217
|
+
- Header/footer live in a `Layout` around `<Outlet/>` (STEP 4) — never edit the shipped `Blog`/`PostDetail`/category/tag pages to add chrome.
|
|
218
|
+
- The Layout's fixed top region owns positioning: `<WixManageBanner/>` above `<Header/>`; your `Header` is plain in-flow markup (not `position:fixed`).
|
|
219
|
+
- Route by `slug` through the shipped helpers — never hand-build a post/category/tag URL. Display categories/tags by `.label` (not `.name`).
|
|
220
|
+
- Render live Wix data or the shipped empty state — never mock posts, authors, comments, likes, or view counts; never use a stock/placeholder cover image.
|
|
110
221
|
|
|
111
222
|
## Point the user to their dashboard
|
|
112
|
-
|
|
113
|
-
- **Posts** — `https://manage.wix.com/dashboard/{metaSiteId}/blog/posts` (
|
|
114
|
-
- **Categories** — `https://manage.wix.com/dashboard/{metaSiteId}/blog/categories`
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
- [ ]
|
|
122
|
-
- [ ]
|
|
123
|
-
- [ ] `
|
|
124
|
-
- [ ]
|
|
125
|
-
- [ ]
|
|
126
|
-
- [ ]
|
|
127
|
-
- [ ]
|
|
128
|
-
- [ ]
|
|
223
|
+
Provide deep links so the owner can edit content (substitute the site's `metaSiteId`):
|
|
224
|
+
- **Posts** — `https://manage.wix.com/dashboard/{metaSiteId}/blog/posts` (write, edit, publish; only published posts appear in the app)
|
|
225
|
+
- **Categories** — `https://manage.wix.com/dashboard/{metaSiteId}/blog/categories`
|
|
226
|
+
|
|
227
|
+
## Seeding
|
|
228
|
+
Seed the blog per `seed/SEED.md` (the build-time module that creates posts/categories over the
|
|
229
|
+
connector) — separate from this client build; run in parallel.
|
|
230
|
+
|
|
231
|
+
## Verify (before declaring done)
|
|
232
|
+
- [ ] Client files copied into `src/`; `WIX_CLIENT_ID` set (not the placeholder).
|
|
233
|
+
- [ ] Brand palette lives in `index.css` (`:root`/`.dark`); no parallel theme file; shipped components/pages not restyled or rewritten.
|
|
234
|
+
- [ ] **Opened the vertical's data route(s)** (not just the home page) — `/blog` and a post detail page (plus a category/tag page) — and confirmed the shipped components render themed (surface, text, brand) with images.
|
|
235
|
+
- [ ] `Layout` (fixed `<WixManageBanner/>` + `<Header/>` region, then `<Outlet/>` + Footer) wraps all routes; shipped `Blog`/`PostDetail`/`CategoryPage`/`TagPage` untouched; content clears the fixed chrome; `<TaxonomyProvider>` wraps the tree.
|
|
236
|
+
- [ ] Feed lists live published posts (newest first) and paginates via `nextCursor`; post detail loads by `slug`; a bad slug shows the not-found state (no invented post).
|
|
237
|
+
- [ ] Category/tag pages list the right posts; chips display `.label` and route by `.slug`; taxonomy fetched once (no re-query per card).
|
|
238
|
+
- [ ] Cover images come from `post.media.wixMedia.image.url` (category cover from `category.coverImage.url`) — no stock placeholders; no author byline / engagement UI invented.
|
|
239
|
+
- [ ] Empty catalog shows the shipped empty state; no mock posts anywhere.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// Feed tile. Styled with base44 design tokens (shadcn Tailwind classes) — re-skin via those tokens, not this
|
|
2
|
+
// JSX. The cover-image path (post.media.wixMedia.image.url) and the text-only fallback are
|
|
3
|
+
// load-bearing: never substitute a stock/placeholder image. Routes to the detail page by slug.
|
|
4
|
+
import { Link } from "react-router-dom";
|
|
5
|
+
|
|
6
|
+
function coverImage(post) {
|
|
7
|
+
const url = post?.media?.wixMedia?.image?.url; // ready-to-use https url; //-fix is defensive
|
|
8
|
+
return url ? (url.startsWith("//") ? `https:${url}` : url) : null;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function formatDate(iso) {
|
|
12
|
+
if (!iso) return null;
|
|
13
|
+
try { return new Date(iso).toLocaleDateString(undefined, { year: "numeric", month: "short", day: "numeric" }); }
|
|
14
|
+
catch { return null; }
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export default function PostCard({ post }) {
|
|
18
|
+
const image = coverImage(post);
|
|
19
|
+
const date = formatDate(post?.firstPublishedDate);
|
|
20
|
+
|
|
21
|
+
return (
|
|
22
|
+
<Link to={`/blog/${post.slug}`}
|
|
23
|
+
className="flex flex-col no-underline text-foreground bg-card border border-border rounded-lg overflow-hidden shadow-sm">
|
|
24
|
+
{image && (
|
|
25
|
+
<div className="aspect-[16/9] bg-background">
|
|
26
|
+
<img src={image} alt={post.media?.wixMedia?.image?.altText || post.title} loading="lazy"
|
|
27
|
+
className="w-full h-full object-cover" />
|
|
28
|
+
</div>
|
|
29
|
+
)}
|
|
30
|
+
<div className="p-4 flex flex-col gap-2">
|
|
31
|
+
<h3 className="m-0 font-display text-lg font-semibold leading-[1.3]">{post.title}</h3>
|
|
32
|
+
{post.excerpt && (
|
|
33
|
+
<p className="m-0 text-muted-foreground text-sm leading-[1.5]">{post.excerpt}</p>
|
|
34
|
+
)}
|
|
35
|
+
<div className="flex gap-2 items-center text-muted-foreground text-[12px]">
|
|
36
|
+
{date && <span>{date}</span>}
|
|
37
|
+
{date && post.minutesToRead ? <span aria-hidden="true">·</span> : null}
|
|
38
|
+
{post.minutesToRead ? <span>{post.minutesToRead} min read</span> : null}
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
41
|
+
</Link>
|
|
42
|
+
);
|
|
43
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// Category + tag chips for a post. Resolves the post's categoryIds/tagIds against the SHARED
|
|
2
|
+
// taxonomy maps (fetched once by TaxonomyProvider — never re-query here), displays each by .label
|
|
3
|
+
// (NOT .name), and routes by .slug. Styled with base44 design tokens (shadcn Tailwind classes).
|
|
4
|
+
import { Link } from "react-router-dom";
|
|
5
|
+
import { useTaxonomy } from "@/context/TaxonomyContext";
|
|
6
|
+
|
|
7
|
+
const chip = "inline-flex items-center py-1 px-2.5 text-[12px] no-underline text-foreground bg-card border border-border rounded-full";
|
|
8
|
+
|
|
9
|
+
export default function PostChips({ post }) {
|
|
10
|
+
const { catById, tagById } = useTaxonomy();
|
|
11
|
+
const cats = (post.categoryIds || []).map((id) => catById.get(id)).filter(Boolean);
|
|
12
|
+
const tags = (post.tagIds || []).map((id) => tagById.get(id)).filter(Boolean);
|
|
13
|
+
if (!cats.length && !tags.length) return null;
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<div className="flex flex-wrap gap-2">
|
|
17
|
+
{cats.map((c) => (
|
|
18
|
+
<Link key={c.id} to={`/blog/category/${c.slug}`} className={`${chip} text-primary border-primary`}>{c.label}</Link>
|
|
19
|
+
))}
|
|
20
|
+
{tags.map((t) => (
|
|
21
|
+
<Link key={t.id} to={`/blog/tag/${t.slug}`} className={chip}>#{t.label}</Link>
|
|
22
|
+
))}
|
|
23
|
+
</div>
|
|
24
|
+
);
|
|
25
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// Responsive post grid + empty state. Styled with base44 design tokens (shadcn Tailwind classes).
|
|
2
|
+
import PostCard from "./PostCard";
|
|
3
|
+
|
|
4
|
+
export default function PostGrid({ posts, empty = "No posts yet." }) {
|
|
5
|
+
if (!posts?.length) {
|
|
6
|
+
return (
|
|
7
|
+
<p className="text-muted-foreground p-4 text-center">{empty}</p>
|
|
8
|
+
);
|
|
9
|
+
}
|
|
10
|
+
return (
|
|
11
|
+
<div className="grid [grid-template-columns:repeat(auto-fill,minmax(300px,1fr))] gap-6">
|
|
12
|
+
{posts.map((p) => <PostCard key={p.id} post={p} />)}
|
|
13
|
+
</div>
|
|
14
|
+
);
|
|
15
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// Taxonomy state — categories + tags fetched ONCE and shared across every page/card. Wrap the app
|
|
2
|
+
// in <TaxonomyProvider>; components read useTaxonomy(). Resolving a post's categoryIds/tagIds to
|
|
3
|
+
// chip labels runs on every post render, so this MUST be a single shared fetch — never re-query per
|
|
4
|
+
// card. Data wiring (destructuring, .label display, id→object maps) is correct as-is; don't re-derive.
|
|
5
|
+
import { createContext, useContext, useState, useEffect, useMemo } from "react";
|
|
6
|
+
import { queryCategories, queryTags } from "@/rest/wix-blog";
|
|
7
|
+
|
|
8
|
+
const TaxonomyContext = createContext(null);
|
|
9
|
+
|
|
10
|
+
export function TaxonomyProvider({ children }) {
|
|
11
|
+
const [categories, setCategories] = useState([]);
|
|
12
|
+
const [tags, setTags] = useState([]);
|
|
13
|
+
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
// NB: destructure — queryCategories → { categories, total }, queryTags → { tags, total }.
|
|
16
|
+
queryCategories().then(({ categories }) => setCategories(categories));
|
|
17
|
+
queryTags().then(({ tags }) => setTags(tags));
|
|
18
|
+
}, []);
|
|
19
|
+
|
|
20
|
+
// display c.label · count c.postCount / display t.label · count t.publishedPostCount
|
|
21
|
+
const catById = useMemo(() => new Map(categories.map((c) => [c.id, c])), [categories]);
|
|
22
|
+
const tagById = useMemo(() => new Map(tags.map((t) => [t.id, t])), [tags]);
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<TaxonomyContext.Provider value={{ categories, tags, catById, tagById }}>
|
|
26
|
+
{children}
|
|
27
|
+
</TaxonomyContext.Provider>
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function useTaxonomy() {
|
|
32
|
+
const ctx = useContext(TaxonomyContext);
|
|
33
|
+
if (!ctx) throw new Error("useTaxonomy must be used within <TaxonomyProvider>");
|
|
34
|
+
return ctx;
|
|
35
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// usePostDetail — all post-detail logic, no markup: load a post by slug, expose a not-found state,
|
|
2
|
+
// resolve its categoryIds/tagIds to full category/tag objects via the shared taxonomy, and split the
|
|
3
|
+
// plain-text body into paragraphs. The field paths (media cover, id→label resolution, contentText
|
|
4
|
+
// split) are the bug-prone part — keep them verbatim; the PostDetail page only renders what this
|
|
5
|
+
// returns. richContent is available on the loaded post for a richer render (see INSTRUCTIONS).
|
|
6
|
+
import { useState, useEffect, useMemo } from "react";
|
|
7
|
+
import { getPostBySlug } from "@/rest/wix-blog";
|
|
8
|
+
import { useTaxonomy } from "@/context/TaxonomyContext";
|
|
9
|
+
|
|
10
|
+
export function usePostDetail(slug) {
|
|
11
|
+
const { catById, tagById } = useTaxonomy();
|
|
12
|
+
const [post, setPost] = useState(null);
|
|
13
|
+
const [notFound, setNotFound] = useState(false);
|
|
14
|
+
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
setPost(null);
|
|
17
|
+
setNotFound(false);
|
|
18
|
+
getPostBySlug(slug).then((p) => (p ? setPost(p) : setNotFound(true)));
|
|
19
|
+
}, [slug]);
|
|
20
|
+
|
|
21
|
+
// Resolve ids → full objects; display .label, route by .slug (drop ids with no match).
|
|
22
|
+
const cats = useMemo(
|
|
23
|
+
() => (post?.categoryIds || []).map((id) => catById.get(id)).filter(Boolean),
|
|
24
|
+
[post, catById],
|
|
25
|
+
);
|
|
26
|
+
const tags = useMemo(
|
|
27
|
+
() => (post?.tagIds || []).map((id) => tagById.get(id)).filter(Boolean),
|
|
28
|
+
[post, tagById],
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
// contentText is plain text — split on "\n" for simple paragraphs (drop blank lines).
|
|
32
|
+
const paragraphs = useMemo(
|
|
33
|
+
() => (post?.contentText || "").split("\n").map((s) => s.trim()).filter(Boolean),
|
|
34
|
+
[post],
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
return { post, notFound, cats, tags, paragraphs };
|
|
38
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// Blog feed — lists published posts (newest first, pinned lead), paginates via nextCursor, and
|
|
2
|
+
// shows the shipped empty state when the blog has no posts. Styled with base44 design tokens (shadcn Tailwind classes).
|
|
3
|
+
import { useEffect, useState } from "react";
|
|
4
|
+
import { queryPosts, getTotalPosts } from "@/rest/wix-blog";
|
|
5
|
+
import PostGrid from "@/components/PostGrid";
|
|
6
|
+
|
|
7
|
+
export default function Blog() {
|
|
8
|
+
const [posts, setPosts] = useState(null);
|
|
9
|
+
const [cursor, setCursor] = useState(null);
|
|
10
|
+
const [total, setTotal] = useState(null);
|
|
11
|
+
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
getTotalPosts().then(setTotal);
|
|
14
|
+
// NB: destructure — queryPosts returns { posts, nextCursor }, not a bare array.
|
|
15
|
+
queryPosts({ limit: 20 }).then(({ posts, nextCursor }) => { setPosts(posts); setCursor(nextCursor); });
|
|
16
|
+
}, []);
|
|
17
|
+
|
|
18
|
+
const loadMore = () =>
|
|
19
|
+
queryPosts({ limit: 20, cursor }).then(({ posts: more, nextCursor }) => {
|
|
20
|
+
setPosts((p) => [...(p || []), ...more]);
|
|
21
|
+
setCursor(nextCursor);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<main className="max-w-[1100px] mx-auto p-4">
|
|
26
|
+
<h1 className="font-display mb-4">Blog</h1>
|
|
27
|
+
{posts === null
|
|
28
|
+
? <p className="text-muted-foreground">Loading…</p>
|
|
29
|
+
: <PostGrid posts={posts} empty={total === 0
|
|
30
|
+
? "No posts yet — publish posts from your Wix dashboard to see them here."
|
|
31
|
+
: "No posts to show."} />}
|
|
32
|
+
{cursor && (
|
|
33
|
+
<div className="text-center mt-8">
|
|
34
|
+
<button onClick={loadMore}
|
|
35
|
+
className="py-3 px-6 cursor-pointer text-[15px] font-semibold bg-primary text-primary-foreground border-none rounded-sm">Load more</button>
|
|
36
|
+
</div>
|
|
37
|
+
)}
|
|
38
|
+
</main>
|
|
39
|
+
);
|
|
40
|
+
}
|