@wix/agent-skills 1.0.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/LICENSE +21 -0
- package/README.md +111 -0
- package/package.json +29 -0
- package/skills/wix-app/SKILL.md +344 -0
- package/skills/wix-app/references/APP_IDENTIFIERS.md +35 -0
- package/skills/wix-app/references/APP_MARKET_REVIEW.md +311 -0
- package/skills/wix-app/references/APP_VALIDATION.md +171 -0
- package/skills/wix-app/references/BACKEND_API.md +233 -0
- package/skills/wix-app/references/BACKEND_EVENT.md +116 -0
- package/skills/wix-app/references/CODE_QUALITY.md +33 -0
- package/skills/wix-app/references/CUSTOM_ELEMENT_WIDGET.md +587 -0
- package/skills/wix-app/references/DASHBOARD_MENU_PLUGIN.md +157 -0
- package/skills/wix-app/references/DASHBOARD_MODAL.md +283 -0
- package/skills/wix-app/references/DASHBOARD_PAGE.md +403 -0
- package/skills/wix-app/references/DASHBOARD_PLUGIN.md +205 -0
- package/skills/wix-app/references/DATA_COLLECTION.md +451 -0
- package/skills/wix-app/references/DOCUMENTATION.md +42 -0
- package/skills/wix-app/references/EDITOR_REACT_COMPONENT.md +65 -0
- package/skills/wix-app/references/EMBEDDED_SCRIPT.md +468 -0
- package/skills/wix-app/references/EXTENSION_REGISTRATION.md +96 -0
- package/skills/wix-app/references/SERVICE_PLUGIN.md +235 -0
- package/skills/wix-app/references/SITE_PLUGIN.md +436 -0
- package/skills/wix-app/references/STORES_VERSIONING.md +334 -0
- package/skills/wix-app/references/backend-event/COMMON-EVENTS.md +84 -0
- package/skills/wix-app/references/custom-element-widget/SETTINGS_PANEL.md +345 -0
- package/skills/wix-app/references/dashboard-menu-plugin/blog-slots.md +71 -0
- package/skills/wix-app/references/dashboard-menu-plugin/bookings-slots.md +58 -0
- package/skills/wix-app/references/dashboard-menu-plugin/crm-slots.md +8 -0
- package/skills/wix-app/references/dashboard-menu-plugin/ecommerce-slots.md +17 -0
- package/skills/wix-app/references/dashboard-menu-plugin/events-slots.md +29 -0
- package/skills/wix-app/references/dashboard-menu-plugin/restaurants-slots.md +27 -0
- package/skills/wix-app/references/dashboard-menu-plugin/stores-slots.md +35 -0
- package/skills/wix-app/references/dashboard-page/API_SPEC.md +138 -0
- package/skills/wix-app/references/dashboard-page/DASHBOARD_API.md +573 -0
- package/skills/wix-app/references/dashboard-page/DYNAMIC_PARAMETERS.md +269 -0
- package/skills/wix-app/references/dashboard-page/ECOM_NAVIGATION.md +164 -0
- package/skills/wix-app/references/dashboard-plugin/SLOTS.md +294 -0
- package/skills/wix-app/references/data-collection/WIX_DATA.md +270 -0
- package/skills/wix-app/references/data-collection/extension-template.ts +107 -0
- package/skills/wix-app/references/editor-react-component/ACCESSIBILITY.md +138 -0
- package/skills/wix-app/references/editor-react-component/COMPONENT-API.md +454 -0
- package/skills/wix-app/references/editor-react-component/COMPONENT-CONFIGURATION.md +165 -0
- package/skills/wix-app/references/editor-react-component/CSS-GUIDELINES.md +576 -0
- package/skills/wix-app/references/editor-react-component/DIRECTIONALITY.md +170 -0
- package/skills/wix-app/references/editor-react-component/EDIT-FLOW.md +6 -0
- package/skills/wix-app/references/editor-react-component/PARTS.md +25 -0
- package/skills/wix-app/references/editor-react-component/PROPS-VS-CSS.md +203 -0
- package/skills/wix-app/references/editor-react-component/REACT-GUIDELINES.md +167 -0
- package/skills/wix-app/references/editor-react-component/REACT-PATTERNS.md +137 -0
- package/skills/wix-app/references/service-plugin/ADDITIONAL-FEES.md +112 -0
- package/skills/wix-app/references/service-plugin/BOOKINGS-STAFF-SORTING.md +118 -0
- package/skills/wix-app/references/service-plugin/DISCOUNT-TRIGGERS.md +87 -0
- package/skills/wix-app/references/service-plugin/GIFT-CARDS.md +86 -0
- package/skills/wix-app/references/service-plugin/PAYMENT-SETTINGS.md +135 -0
- package/skills/wix-app/references/service-plugin/SHIPPING-RATES.md +79 -0
- package/skills/wix-app/references/service-plugin/VALIDATIONS.md +68 -0
- package/skills/wix-app/references/site-plugin/EXAMPLES.md +311 -0
- package/skills/wix-app/references/site-plugin/SLOTS.md +263 -0
- package/skills/wix-design-system/SKILL.md +129 -0
- package/skills/wix-design-system/references/file-structure.md +56 -0
- package/skills/wix-design-system/scripts/wds.cjs +531 -0
- package/skills/wix-headless/SKILL.md +418 -0
- package/skills/wix-headless/references/DISCOVERY.md +332 -0
- package/skills/wix-headless/references/ORCHESTRATION.md +269 -0
- package/skills/wix-headless/references/SETUP.md +154 -0
- package/skills/wix-headless/references/blog/BLOG_CONTENT.md +152 -0
- package/skills/wix-headless/references/blog/BLOG_PAGES.md +299 -0
- package/skills/wix-headless/references/blog/BLOG_SETUP.md +218 -0
- package/skills/wix-headless/references/blog/INSTRUCTIONS.md +32 -0
- package/skills/wix-headless/references/cms/CMS_FOUNDATIONS.md +373 -0
- package/skills/wix-headless/references/cms/FAQ_KNOWLEDGE_BASE.md +229 -0
- package/skills/wix-headless/references/cms/INSTRUCTIONS.md +40 -0
- package/skills/wix-headless/references/cms/PORTFOLIO.md +454 -0
- package/skills/wix-headless/references/cms/RESOURCE_LIBRARY.md +356 -0
- package/skills/wix-headless/references/cms/TEAM_DIRECTORY.md +299 -0
- package/skills/wix-headless/references/commands/install-app.md +42 -0
- package/skills/wix-headless/references/commands/known-apps.json +5 -0
- package/skills/wix-headless/references/commands/mcp-bootstrap.md +28 -0
- package/skills/wix-headless/references/designer/INSTRUCTIONS.md +828 -0
- package/skills/wix-headless/references/ecom/CART_PAGES.md +120 -0
- package/skills/wix-headless/references/ecom/CART_WIRING.md +103 -0
- package/skills/wix-headless/references/ecom/COMPONENTS_CSS.md +132 -0
- package/skills/wix-headless/references/ecom/INSTRUCTIONS.md +59 -0
- package/skills/wix-headless/references/forms/CONTACT_FORM.md +477 -0
- package/skills/wix-headless/references/forms/INSTRUCTIONS.md +43 -0
- package/skills/wix-headless/references/gift-cards/COMPONENTS.md +119 -0
- package/skills/wix-headless/references/gift-cards/INSTRUCTIONS.md +51 -0
- package/skills/wix-headless/references/gift-cards/PAGES.md +129 -0
- package/skills/wix-headless/references/images/INSTRUCTIONS.md +359 -0
- package/skills/wix-headless/references/shared/BUILD_NOISE.md +8 -0
- package/skills/wix-headless/references/shared/IMAGE_GENERATION.md +185 -0
- package/skills/wix-headless/references/shared/IMPLEMENTER.md +155 -0
- package/skills/wix-headless/references/shared/MCP_PREFIX.md +105 -0
- package/skills/wix-headless/references/shared/PRODUCTION_SHARP_EDGES.md +97 -0
- package/skills/wix-headless/references/shared/RETURN_CONTRACT.md +423 -0
- package/skills/wix-headless/references/shared/STYLING.md +117 -0
- package/skills/wix-headless/references/stores/BACK_IN_STOCK.md +178 -0
- package/skills/wix-headless/references/stores/CATEGORY_PAGES.md +86 -0
- package/skills/wix-headless/references/stores/COMPONENTS_CSS.md +129 -0
- package/skills/wix-headless/references/stores/HOME_AND_NAV.md +227 -0
- package/skills/wix-headless/references/stores/INSTRUCTIONS.md +96 -0
- package/skills/wix-headless/references/stores/PRODUCT_CATALOG_DATA.md +249 -0
- package/skills/wix-headless/references/stores/PRODUCT_PAGES.md +213 -0
- package/skills/wix-headless/references/stores/SHARED_WIRING.md +164 -0
- package/skills/wix-headless/references/verticals/_schema.json +160 -0
- package/skills/wix-headless/references/verticals/_schema.md +185 -0
- package/skills/wix-headless/references/verticals/blog.md +125 -0
- package/skills/wix-headless/references/verticals/cms.md +121 -0
- package/skills/wix-headless/references/verticals/ecom.md +96 -0
- package/skills/wix-headless/references/verticals/forms.md +106 -0
- package/skills/wix-headless/references/verticals/gift-cards.md +121 -0
- package/skills/wix-headless/references/verticals/stores.md +167 -0
- package/skills/wix-headless/scripts/check-manifest.mjs +198 -0
- package/skills/wix-headless/scripts/copy-utility-templates.mjs +153 -0
- package/skills/wix-headless/scripts/emit-design-tokens.mjs +77 -0
- package/skills/wix-headless/scripts/finalize-run-json.mjs +141 -0
- package/skills/wix-headless/scripts/init-site-json.mjs +63 -0
- package/skills/wix-headless/scripts/patch-decorative-slots.mjs +124 -0
- package/skills/wix-headless/scripts/plan-entity-image-waves.mjs +190 -0
- package/skills/wix-headless/scripts/preview.sh +45 -0
- package/skills/wix-headless/scripts/release.sh +73 -0
- package/skills/wix-headless/scripts/scaffold.sh +53 -0
- package/skills/wix-headless/scripts/seed-utilities.sh +55 -0
- package/skills/wix-headless/shared-utilities/analytics.ts +40 -0
- package/skills/wix-headless/shared-utilities/ricos.ts +179 -0
- package/skills/wix-headless/shared-utilities/wix-image.ts +72 -0
- package/skills/wix-headless/templates/ecom/CartBadge.tsx +84 -0
- package/skills/wix-headless/templates/ecom/CartView.tsx +543 -0
- package/skills/wix-headless/templates/ecom/cart.astro +13 -0
- package/skills/wix-headless/templates/ecom/components-ecom.css +215 -0
- package/skills/wix-headless/templates/ecom/discounts.ts +71 -0
- package/skills/wix-headless/templates/ecom/thank-you.astro +24 -0
- package/skills/wix-headless/templates/gift-cards/GiftCardPurchase.tsx +172 -0
- package/skills/wix-headless/templates/gift-cards/_home-teaser-snippet.astro +42 -0
- package/skills/wix-headless/templates/gift-cards/_nav-snippet.astro +11 -0
- package/skills/wix-headless/templates/gift-cards/components-gift-cards.css +219 -0
- package/skills/wix-headless/templates/gift-cards/gift-cards.astro +51 -0
- package/skills/wix-headless/templates/gift-cards/gift-cards.ts +75 -0
- package/skills/wix-headless/templates/stores/AddToCartButton.tsx +77 -0
- package/skills/wix-headless/templates/stores/BackInStockForm.tsx +176 -0
- package/skills/wix-headless/templates/stores/CategoryRail.astro +69 -0
- package/skills/wix-headless/templates/stores/ProductCard.astro +79 -0
- package/skills/wix-headless/templates/stores/ProductPurchase.tsx +397 -0
- package/skills/wix-headless/templates/stores/SeoTags.astro +21 -0
- package/skills/wix-headless/templates/stores/back-in-stock.ts +67 -0
- package/skills/wix-headless/templates/stores/categories.ts +155 -0
- package/skills/wix-headless/templates/stores/category/[slug].astro +130 -0
- package/skills/wix-headless/templates/stores/components-stores.css +295 -0
- package/skills/wix-headless/templates/stores/products/[slug].astro +128 -0
- package/skills/wix-headless/templates/stores/products/index.astro +101 -0
- package/skills/wix-manage/SKILL.md +280 -0
- package/skills/wix-manage/references/app-installation/install-wix-apps.md +155 -0
- package/skills/wix-manage/references/app-installation/list-installed-apps.md +124 -0
- package/skills/wix-manage/references/blog/how-to-create-blog-posts.md +226 -0
- package/skills/wix-manage/references/bookings/booking-service-policy-setup.md +95 -0
- package/skills/wix-manage/references/bookings/booking-system-integration-gaps.md +416 -0
- package/skills/wix-manage/references/bookings/bookings-staff-setup.md +255 -0
- package/skills/wix-manage/references/bookings/create-and-update-booking-services.md +462 -0
- package/skills/wix-manage/references/bookings/end-to-end-booking-flow.md +278 -0
- package/skills/wix-manage/references/bookings/external-calendar-integration.md +258 -0
- package/skills/wix-manage/references/bookings/multi-resource-service-creation.md +231 -0
- package/skills/wix-manage/references/calendar/configure-default-business-hours.md +226 -0
- package/skills/wix-manage/references/cms/cms-data-items-crud.md +422 -0
- package/skills/wix-manage/references/cms/cms-data-operations-extended.md +263 -0
- package/skills/wix-manage/references/cms/cms-ecommerce-catalog-integration.md +136 -0
- package/skills/wix-manage/references/cms/cms-references-and-relationships.md +160 -0
- package/skills/wix-manage/references/cms/cms-schema-management.md +143 -0
- package/skills/wix-manage/references/contacts/bulk-delete-contacts.md +73 -0
- package/skills/wix-manage/references/contacts/bulk-label-and-unlabel-contacts.md +67 -0
- package/skills/wix-manage/references/domains/domain-search-and-purchase.md +434 -0
- package/skills/wix-manage/references/ecommerce/api-recommendation-tracking.md +420 -0
- package/skills/wix-manage/references/ecommerce/flow-add-free-shipping.md +267 -0
- package/skills/wix-manage/references/ecommerce/flow-bundle-and-save.md +290 -0
- package/skills/wix-manage/references/ecommerce/flow-fix-coverage-gaps.md +300 -0
- package/skills/wix-manage/references/ecommerce/flow-optimize-shipping-rates.md +364 -0
- package/skills/wix-manage/references/ecommerce/flow-seasonal-promotion.md +315 -0
- package/skills/wix-manage/references/ecommerce/flow-stock-mover.md +308 -0
- package/skills/wix-manage/references/ecommerce/flow-upsell-boost.md +271 -0
- package/skills/wix-manage/references/ecommerce/goal-clear-inventory.md +118 -0
- package/skills/wix-manage/references/ecommerce/goal-drive-cross-sells.md +122 -0
- package/skills/wix-manage/references/ecommerce/goal-increase-aov.md +132 -0
- package/skills/wix-manage/references/ecommerce/goal-reduce-cart-abandonment.md +148 -0
- package/skills/wix-manage/references/ecommerce/goal-seasonal-revenue.md +146 -0
- package/skills/wix-manage/references/ecommerce/guardrail-discount-conflicts.md +118 -0
- package/skills/wix-manage/references/ecommerce/guardrail-margin-protection.md +88 -0
- package/skills/wix-manage/references/ecommerce/guardrail-rate-pricing-sanity.md +108 -0
- package/skills/wix-manage/references/ecommerce/guardrail-shipping-health.md +124 -0
- package/skills/wix-manage/references/ecommerce/recipe-apply-shipping-recommendations.md +299 -0
- package/skills/wix-manage/references/ecommerce/recommend-ecommerce-strategy.md +582 -0
- package/skills/wix-manage/references/ecommerce/setup-coupons.md +338 -0
- package/skills/wix-manage/references/ecommerce/setup-discount-rules.md +444 -0
- package/skills/wix-manage/references/ecommerce/setup-shipping-rates.md +86 -0
- package/skills/wix-manage/references/ecommerce/setup-shipping-regions.md +56 -0
- package/skills/wix-manage/references/ecommerce/setup-store-pickup-location.md +209 -0
- package/skills/wix-manage/references/ecommerce/skill-graph.md +139 -0
- package/skills/wix-manage/references/ecommerce/troubleshoot-checkout-delivery-dropoff.md +124 -0
- package/skills/wix-manage/references/ecommerce/troubleshoot-discount-not-applying.md +95 -0
- package/skills/wix-manage/references/events/list-events.md +203 -0
- package/skills/wix-manage/references/forms/create-form.md +260 -0
- package/skills/wix-manage/references/get-paid/create-payment-links.md +212 -0
- package/skills/wix-manage/references/get-paid/how-to-setup-wix-payments.md +57 -0
- package/skills/wix-manage/references/get-paid/payment-links-for-bookings.md +101 -0
- package/skills/wix-manage/references/media/upload-media-to-wix.md +216 -0
- package/skills/wix-manage/references/pricing-plans/create-and-update-pricing-plans.md +77 -0
- package/skills/wix-manage/references/pricing-plans/pricing-plans-bookings-integration.md +166 -0
- package/skills/wix-manage/references/restaurants/wix-restaurants-setup.md +336 -0
- package/skills/wix-manage/references/rich-content/ricos-converter-service.md +295 -0
- package/skills/wix-manage/references/site-properties/change-payment-currency-site-properties.md +59 -0
- package/skills/wix-manage/references/sites/create-site-from-template.md +183 -0
- package/skills/wix-manage/references/sites/query-sites.md +125 -0
- package/skills/wix-manage/references/stores/add-store-pages-to-site.md +57 -0
- package/skills/wix-manage/references/stores/bulk-create-products-with-options.md +1041 -0
- package/skills/wix-manage/references/stores/create-product-catalog-v1.md +125 -0
- package/skills/wix-manage/references/stores/create-product-from-image.md +824 -0
- package/skills/wix-manage/references/stores/create-product-with-options-catalog-v3.md +566 -0
- package/skills/wix-manage/references/stores/find-products-query-and-search-catalog-v3.md +194 -0
- package/skills/wix-manage/references/stores/query-products-catalog-v1.md +80 -0
- package/skills/wix-manage/references/stores/setup-online-store-catalog-v3.md +99 -0
- package/skills/wix-manage/references/stores/update-product-pre-order.md +213 -0
- package/skills/wix-manage/references/stores/update-product-with-options.md +318 -0
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
# Recipe: FAQ / Knowledge Base
|
|
2
|
+
|
|
3
|
+
Build a FAQ page using `@wix/data` — Q&A pairs organized by category with accordion UI and client-side search. Use for frequently asked questions, help centers, or knowledge bases.
|
|
4
|
+
|
|
5
|
+
> Read `CMS_FOUNDATIONS.md` first for shared patterns (service module, image resolution, elevation, MCP seeding).
|
|
6
|
+
|
|
7
|
+
## Collection Schema
|
|
8
|
+
|
|
9
|
+
Create a collection in the Wix dashboard → CMS with these fields:
|
|
10
|
+
|
|
11
|
+
| Field | Type | Purpose |
|
|
12
|
+
|-------|------|---------|
|
|
13
|
+
| `question` | Text | The question |
|
|
14
|
+
| `slug` | Text | URL-friendly identifier (for anchor links) |
|
|
15
|
+
| `answer` | Rich Text | The answer (HTML) |
|
|
16
|
+
| `category` | Text | FAQ category (e.g., "Shipping", "Returns") |
|
|
17
|
+
| `orderIndex` | Number | Manual sort order within category |
|
|
18
|
+
| `published` | Boolean | Publish status |
|
|
19
|
+
|
|
20
|
+
## Files to Create
|
|
21
|
+
|
|
22
|
+
| File | Purpose |
|
|
23
|
+
|------|---------|
|
|
24
|
+
| `src/lib/faq.ts` | Service module — queries, category grouping |
|
|
25
|
+
| `src/pages/faq/index.astro` | Single FAQ page with category sections |
|
|
26
|
+
| `src/components/FaqSection.tsx` | React island — accordion + search combined |
|
|
27
|
+
|
|
28
|
+
> FAQ is a single-page pattern — no detail pages needed.
|
|
29
|
+
|
|
30
|
+
## Implementation
|
|
31
|
+
|
|
32
|
+
### 1. FAQ Service Module (`src/lib/faq.ts`)
|
|
33
|
+
|
|
34
|
+
```typescript
|
|
35
|
+
import * as items from "@wix/wix-data-items-sdk";
|
|
36
|
+
import { auth } from "@wix/essentials";
|
|
37
|
+
|
|
38
|
+
const COLLECTION_ID = "FAQ";
|
|
39
|
+
|
|
40
|
+
export interface FaqItem {
|
|
41
|
+
_id: string;
|
|
42
|
+
question: string;
|
|
43
|
+
slug: string;
|
|
44
|
+
answer: string;
|
|
45
|
+
category: string;
|
|
46
|
+
orderIndex: number;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function mapFaqItem(item: Record<string, any>): FaqItem {
|
|
50
|
+
return {
|
|
51
|
+
_id: item._id,
|
|
52
|
+
question: item.question ?? "",
|
|
53
|
+
slug: item.slug ?? "",
|
|
54
|
+
answer: item.answer ?? "",
|
|
55
|
+
category: item.category ?? "General",
|
|
56
|
+
orderIndex: item.orderIndex ?? 0,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export async function queryFaqItems(): Promise<FaqItem[]> {
|
|
61
|
+
const elevatedQuery = auth.elevate(items.query);
|
|
62
|
+
const { items: results } = await elevatedQuery(COLLECTION_ID)
|
|
63
|
+
.eq("published", true)
|
|
64
|
+
.ascending("orderIndex")
|
|
65
|
+
.limit(200)
|
|
66
|
+
.find();
|
|
67
|
+
|
|
68
|
+
return results.map(mapFaqItem);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function groupByCategory(faqItems: FaqItem[]): Map<string, FaqItem[]> {
|
|
72
|
+
return faqItems.reduce((map, item) => {
|
|
73
|
+
const cat = item.category || "General";
|
|
74
|
+
if (!map.has(cat)) map.set(cat, []);
|
|
75
|
+
map.get(cat)!.push(item);
|
|
76
|
+
return map;
|
|
77
|
+
}, new Map<string, FaqItem[]>());
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Key details:
|
|
82
|
+
- No image resolution needed — FAQ items are text-only
|
|
83
|
+
- `published` filter ensures draft items don't appear
|
|
84
|
+
- Higher limit (200) since FAQ items are lightweight
|
|
85
|
+
- Update `COLLECTION_ID` to match the exact collection name from the Wix dashboard (no namespace prefix for native collections)
|
|
86
|
+
|
|
87
|
+
### 2. FAQ Section React Island (`src/components/FaqSection.tsx`)
|
|
88
|
+
|
|
89
|
+
```tsx
|
|
90
|
+
import { useState } from "react";
|
|
91
|
+
|
|
92
|
+
interface FaqItem {
|
|
93
|
+
_id: string;
|
|
94
|
+
question: string;
|
|
95
|
+
slug: string;
|
|
96
|
+
answer: string;
|
|
97
|
+
category: string;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
interface Props {
|
|
101
|
+
categories: Array<{ name: string; items: FaqItem[] }>;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export default function FaqSection({ categories }: Props) {
|
|
105
|
+
const [search, setSearch] = useState("");
|
|
106
|
+
const query = search.toLowerCase().trim();
|
|
107
|
+
|
|
108
|
+
const filtered = query
|
|
109
|
+
? categories
|
|
110
|
+
.map((cat) => ({
|
|
111
|
+
...cat,
|
|
112
|
+
items: cat.items.filter(
|
|
113
|
+
(item) =>
|
|
114
|
+
item.question.toLowerCase().includes(query) ||
|
|
115
|
+
item.answer.toLowerCase().includes(query)
|
|
116
|
+
),
|
|
117
|
+
}))
|
|
118
|
+
.filter((cat) => cat.items.length > 0)
|
|
119
|
+
: categories;
|
|
120
|
+
|
|
121
|
+
return (
|
|
122
|
+
<div>
|
|
123
|
+
<div>
|
|
124
|
+
<input
|
|
125
|
+
type="text"
|
|
126
|
+
placeholder="Search questions..."
|
|
127
|
+
value={search}
|
|
128
|
+
onChange={(e) => setSearch(e.target.value)}
|
|
129
|
+
className="faq-search"
|
|
130
|
+
/>
|
|
131
|
+
</div>
|
|
132
|
+
|
|
133
|
+
{filtered.length === 0 && (
|
|
134
|
+
<p>No matching questions found.</p>
|
|
135
|
+
)}
|
|
136
|
+
|
|
137
|
+
{filtered.map((cat) => (
|
|
138
|
+
<section key={cat.name} className="faq-section" id={cat.name.toLowerCase().replace(/\s+/g, "-")}>
|
|
139
|
+
<h2 className="faq-category">{cat.name}</h2>
|
|
140
|
+
<div>
|
|
141
|
+
{cat.items.map((item) => (
|
|
142
|
+
<details key={item._id} className="faq-item" id={item.slug}>
|
|
143
|
+
<summary className="faq-question">
|
|
144
|
+
<span>{item.question}</span>
|
|
145
|
+
<svg
|
|
146
|
+
className="faq-toggle"
|
|
147
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
148
|
+
viewBox="0 0 24 24"
|
|
149
|
+
fill="none"
|
|
150
|
+
stroke="currentColor"
|
|
151
|
+
strokeWidth="2"
|
|
152
|
+
strokeLinecap="round"
|
|
153
|
+
strokeLinejoin="round"
|
|
154
|
+
>
|
|
155
|
+
<polyline points="6 9 12 15 18 9" />
|
|
156
|
+
</svg>
|
|
157
|
+
</summary>
|
|
158
|
+
<div
|
|
159
|
+
className="faq-answer"
|
|
160
|
+
dangerouslySetInnerHTML={{ __html: item.answer }}
|
|
161
|
+
/>
|
|
162
|
+
</details>
|
|
163
|
+
))}
|
|
164
|
+
</div>
|
|
165
|
+
</section>
|
|
166
|
+
))}
|
|
167
|
+
</div>
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
> **Styling note:** Uses `.faq-search`, `.faq-section`, `.faq-category`, `.faq-item`, `.faq-question`, `.faq-toggle`, `.faq-answer` from the designed component's `<style is:global>` block. See `COMPONENT_PATTERNS.md` → FAQ Accordion.
|
|
173
|
+
|
|
174
|
+
Key details:
|
|
175
|
+
- `<details>/<summary>` for native accordion behavior — no JavaScript needed for open/close
|
|
176
|
+
- CSS transition on the chevron via the `.faq-toggle` class
|
|
177
|
+
- Client-side search filters across both question and answer text
|
|
178
|
+
- `dangerouslySetInnerHTML` for rich text answers (content is from the CMS, not user input)
|
|
179
|
+
- Anchor `id` on each category section and question for direct linking
|
|
180
|
+
|
|
181
|
+
### 3. FAQ Page (`src/pages/faq/index.astro`)
|
|
182
|
+
|
|
183
|
+
```astro
|
|
184
|
+
---
|
|
185
|
+
import Layout from "../../layouts/Layout.astro";
|
|
186
|
+
import FaqSection from "../../components/FaqSection";
|
|
187
|
+
import { queryFaqItems, groupByCategory } from "../../lib/faq";
|
|
188
|
+
|
|
189
|
+
const faqItems = await queryFaqItems();
|
|
190
|
+
const grouped = groupByCategory(faqItems);
|
|
191
|
+
const categories = [...grouped.entries()].map(([name, items]) => ({ name, items }));
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
<Layout title="FAQ">
|
|
195
|
+
<main>
|
|
196
|
+
<div>
|
|
197
|
+
<h1>Frequently Asked Questions</h1>
|
|
198
|
+
<p>Find answers to common questions below, or use the search to find what you need.</p>
|
|
199
|
+
|
|
200
|
+
{categories.length > 1 && (
|
|
201
|
+
<nav>
|
|
202
|
+
{categories.map((cat) => (
|
|
203
|
+
<a
|
|
204
|
+
href={`#${cat.name.toLowerCase().replace(/\s+/g, "-")}`}
|
|
205
|
+
>{cat.name}</a>
|
|
206
|
+
))}
|
|
207
|
+
</nav>
|
|
208
|
+
)}
|
|
209
|
+
|
|
210
|
+
<FaqSection client:only="react" categories={categories} />
|
|
211
|
+
</div>
|
|
212
|
+
</main>
|
|
213
|
+
</Layout>
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
Key details:
|
|
217
|
+
- Category jump links in the nav work because `FaqSection` renders matching `id` attributes
|
|
218
|
+
- `client:only="react"` — required for search state
|
|
219
|
+
- Data is fetched server-side and passed as props to the React island
|
|
220
|
+
|
|
221
|
+
## Testing
|
|
222
|
+
|
|
223
|
+
1. Create a "FAQ" collection in the Wix dashboard → CMS with the schema above
|
|
224
|
+
2. Add 6+ FAQ items across 2+ categories, all with `published: true`
|
|
225
|
+
3. Run `npx @wix/cli dev`
|
|
226
|
+
4. `/faq` — shows all questions grouped by category
|
|
227
|
+
5. Click a question — accordion opens with the answer
|
|
228
|
+
6. Type in search — filters questions in real-time
|
|
229
|
+
7. Click a category jump link — scrolls to that section
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cms-implementer
|
|
3
|
+
description: "Implements structured content pages (About, FAQ, portfolios, team directories, resource libraries) via Wix CMS and @wix/data. Scopes: seed, pages. Extends references/shared/IMPLEMENTER.md."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# CMS Implementer
|
|
7
|
+
|
|
8
|
+
Extends `references/shared/IMPLEMENTER.md`. Read that file first for phase routing, MCP prefix, site.json read pattern, return contract, style conventions, and common failure modes.
|
|
9
|
+
|
|
10
|
+
## Scope routing
|
|
11
|
+
|
|
12
|
+
| Scope | Phase | Reference |
|
|
13
|
+
|-------|-------|-----------|
|
|
14
|
+
| `seed` | Seed (create collections + seed items via MCP) | `./CMS_FOUNDATIONS.md` (§ seeding) + use-case ref |
|
|
15
|
+
| `pages` | Pages (About + FAQ pages read CMS via @wix/data inline) | `./CMS_FOUNDATIONS.md` (§ code patterns) + use-case ref |
|
|
16
|
+
|
|
17
|
+
No `components` scope — CMS pages SSR content inline via `@wix/data`; no React islands.
|
|
18
|
+
|
|
19
|
+
## Use-case references
|
|
20
|
+
|
|
21
|
+
Pick based on the business type (the orchestrator names one in your prompt):
|
|
22
|
+
|
|
23
|
+
- `./FAQ_KNOWLEDGE_BASE.md` — Q&A accordions, category sections, search
|
|
24
|
+
- `./PORTFOLIO.md` — project grid, category filter tabs, project detail
|
|
25
|
+
- `./TEAM_DIRECTORY.md` — department-grouped directory, staff cards
|
|
26
|
+
- `./RESOURCE_LIBRARY.md` — file listings, download buttons, file type badges
|
|
27
|
+
|
|
28
|
+
## Files this vertical creates / contributes
|
|
29
|
+
|
|
30
|
+
See `<SKILL_ROOT>/references/verticals/cms.md` frontmatter.
|
|
31
|
+
|
|
32
|
+
## CMS-specific failure modes
|
|
33
|
+
|
|
34
|
+
| Wrong | Right |
|
|
35
|
+
|---|---|
|
|
36
|
+
| `items.queryDataItems(...)` / `items.query({ dataCollectionId })` | `items.query("CollectionId").find()` — queryDataItems doesn't exist |
|
|
37
|
+
| React islands for static content pages | SSR inline with `@wix/data`; no islands needed |
|
|
38
|
+
| Return `status: "complete"` without re-querying the collection | Always run the verify-after-insert query (see CMS_FOUNDATIONS.md § "Verify inserts with a live query"); fail fast if any field is missing |
|
|
39
|
+
| Report `fields: [...]` guessed from the insert body | Report `storedFields: [...]` matching the actual keys in the query response's `data` object — pages agents compare against these |
|
|
40
|
+
| Assume text fields survive downstream image PATCHes | Seeder's job is to verify content is present; images agent must preserve via read-merge-PUT (images INSTRUCTIONS.md § "CMS Items") |
|