From 96df209e283863938659a1177df97868e76528ec Mon Sep 17 00:00:00 2001 From: thejahid Date: Wed, 19 Nov 2025 18:43:56 +0600 Subject: [PATCH 1/4] feat(2487): ai-assistant docs --- allPlugins.json | 7 + .../configuration/_category_.json | 5 + .../configuration/integrations.mdx | 37 +++ craft-ai-assistant/configuration/prompts.mdx | 32 +++ craft-ai-assistant/configuration/settings.mdx | 34 +++ craft-ai-assistant/guides/_category_.json | 5 + craft-ai-assistant/guides/getting-started.mdx | 88 +++++++ craft-ai-assistant/intro.mdx | 247 ++++++++++++++++++ craft-ai-assistant/setup/_category_.json | 5 + craft-ai-assistant/setup/changelog.mdx | 24 ++ .../setup/installing-updating.mdx | 77 ++++++ docsTag.json | 6 + docusaurus.config.ts | 24 ++ src/pages/craft/index.tsx | 5 + src/pages/index.tsx | 5 + src/theme/Logo/index.tsx | 8 + static/icons/cards/ai-assistant.svg | 1 + static/icons/cards/calendar.svg | 2 +- static/icons/cards/freeform.svg | 2 +- static/icons/cards/index.ts | 1 + static/img/intro/aiassistant-dark.png | Bin 0 -> 8690 bytes static/img/intro/aiassistant-light.png | Bin 0 -> 8499 bytes static/logos/icons/ai.png | Bin 0 -> 3202 bytes vercel.json | 8 + versionsBadge.json | 4 + 25 files changed, 625 insertions(+), 2 deletions(-) create mode 100644 craft-ai-assistant/configuration/_category_.json create mode 100644 craft-ai-assistant/configuration/integrations.mdx create mode 100644 craft-ai-assistant/configuration/prompts.mdx create mode 100644 craft-ai-assistant/configuration/settings.mdx create mode 100644 craft-ai-assistant/guides/_category_.json create mode 100644 craft-ai-assistant/guides/getting-started.mdx create mode 100644 craft-ai-assistant/intro.mdx create mode 100644 craft-ai-assistant/setup/_category_.json create mode 100644 craft-ai-assistant/setup/changelog.mdx create mode 100644 craft-ai-assistant/setup/installing-updating.mdx create mode 100644 static/icons/cards/ai-assistant.svg create mode 100644 static/img/intro/aiassistant-dark.png create mode 100644 static/img/intro/aiassistant-light.png create mode 100644 static/logos/icons/ai.png diff --git a/allPlugins.json b/allPlugins.json index f217b4db..e03e9454 100644 --- a/allPlugins.json +++ b/allPlugins.json @@ -17,6 +17,13 @@ "metaImage": "img/social/calendar-craft.jpg", "metaDescription": "Calendar is an effective event management and calendaring plugin. Its user-friendly interface simplifies the creation of events with complex recurring rules and exclusions." }, + { + "name": "AI Assistant", + "slug": "/craft/ai-assistant", + "latestVersionSlug": "/craft/ai-assistant/v1", + "metaImage": "img/social/ai-assistant-craft.jpg", + "metaDescription": "AI Assistant is a plugin that helps you create content with AI. It's a tool that helps you create content with AI." + }, { "name": "Express Forms", "slug": "https://discontinued-docs.solspace.com/express-forms", diff --git a/craft-ai-assistant/configuration/_category_.json b/craft-ai-assistant/configuration/_category_.json new file mode 100644 index 00000000..d3571879 --- /dev/null +++ b/craft-ai-assistant/configuration/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Configuration", + "position": 3 +} + diff --git a/craft-ai-assistant/configuration/integrations.mdx b/craft-ai-assistant/configuration/integrations.mdx new file mode 100644 index 00000000..7a51e41f --- /dev/null +++ b/craft-ai-assistant/configuration/integrations.mdx @@ -0,0 +1,37 @@ +--- +sidebar_position: 2 +--- + +# Integrations + +AI Assistant supports multiple AI providers. Configure your integrations to enable AI-powered content generation. + +## Supported Providers + +- **OpenAI** - GPT models (GPT-4, GPT-3.5, etc.) +- **Google Gemini** - Gemini models +- **Anthropic** - Claude models +- **xAI** - Grok models +- **Replicate** - Various AI models + +## Setting Up an Integration + +1. Go to **AI Assistant → Integrations** +2. Click **New Integration** +3. Choose provider (OpenAI, Gemini, Anthropic, xAI, Replicate) +4. Set API key, model, and defaults +5. Save and test + +## Integration Settings + +Each integration can be configured with: + +- **Enable/Disable** - Toggle the integration on or off +- **API Key** - Your provider's API key +- **Model Selection** - Choose which model to use +- **Default Settings** - Set default parameters for the integration + +## Testing Integrations + +After configuring an integration, you can test it using the Quick AI Actions widget or by using the inline AI button on any enabled field. + diff --git a/craft-ai-assistant/configuration/prompts.mdx b/craft-ai-assistant/configuration/prompts.mdx new file mode 100644 index 00000000..54b2fa24 --- /dev/null +++ b/craft-ai-assistant/configuration/prompts.mdx @@ -0,0 +1,32 @@ +--- +sidebar_position: 3 +--- + +# Prompts + +Prompts are the instructions you give to the AI to generate content. AI Assistant includes built-in prompts and allows you to create custom prompts. + +## Built-in Prompts + +AI Assistant comes with several built-in prompts for common content generation tasks. These prompts are ready to use and can be customized. + +## Custom Prompts + +1. Go to **AI Assistant → Prompts** +2. Click **New Prompt** +3. Enter a name and prompt text +4. Optionally bind the prompt to a specific integration +5. Set sort order +6. Save + +## Prompt Binding + +You can bind a prompt to a specific integration. When a prompt is bound to an integration: + +- That integration will be used automatically when the prompt is selected +- The prompt will only appear when that integration is enabled + +## Sort Order + +Prompts can be ordered to appear in your preferred sequence. Set a sort order value (lower numbers appear first) to organize your prompts. + diff --git a/craft-ai-assistant/configuration/settings.mdx b/craft-ai-assistant/configuration/settings.mdx new file mode 100644 index 00000000..00449135 --- /dev/null +++ b/craft-ai-assistant/configuration/settings.mdx @@ -0,0 +1,34 @@ +--- +sidebar_position: 1 +--- + +# Settings + +AI Assistant settings allow you to configure which fields show the inline AI button and set up field-specific prompts. + +## Field Enablement + +1. Go to **AI Assistant → Settings** +2. Toggle which fields show the inline AI button +3. Save + +## Field-Specific Prompts + +You can preselect a prompt for each enabled field so the Generate modal opens with the right context: + +1. Go to **AI Assistant → Settings** +2. In the "Field Prompts" table, choose a prompt per field (or keep "Any") +3. Save Settings + +### Behavior on Entry Edit Pages + +- When you click the inline AI button, the modal will auto-select the field's prompt. +- This works for Craft fields (Plain Text, CKEditor, Redactor, TinyMCE, Assets) and for the built-in Title field (handle `title`). +- For Title specifically, the modal reads the selection from plugin settings, so it's honored even though Title isn't a custom Craft field. + +### Notes + +- Choosing "Any" means the modal won't preselect a specific prompt. +- If a prompt is bound to a particular integration, that integration is used automatically; otherwise the selected integration is used. +- Changes you make to the selected prompt inside an entry are not saved back to Settings; edit the mapping in **AI Assistant → Settings**. + diff --git a/craft-ai-assistant/guides/_category_.json b/craft-ai-assistant/guides/_category_.json new file mode 100644 index 00000000..1d5975db --- /dev/null +++ b/craft-ai-assistant/guides/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "User Guides", + "position": 4 +} + diff --git a/craft-ai-assistant/guides/getting-started.mdx b/craft-ai-assistant/guides/getting-started.mdx new file mode 100644 index 00000000..859f05d9 --- /dev/null +++ b/craft-ai-assistant/guides/getting-started.mdx @@ -0,0 +1,88 @@ +--- +sidebar_position: 1 +--- + +# Getting Started + +This guide will help you get started with AI Assistant for Craft CMS. + +## Installation + +1. Require the package: `composer require solspace/craft-aiassistant` +2. In Craft CP → Plugins, install "AI Assistant" +3. Configure providers in **AI Assistant → Integrations** +4. Enable fields in **AI Assistant → Settings** + +## Configuration + +### Setting Up Integrations + +1. Go to **AI Assistant → Integrations** +2. Click **New Integration** +3. Choose provider (OpenAI, Gemini, Anthropic, xAI, Replicate), set API key, model, and defaults +4. Save and test + +### Enabling Fields + +1. Go to **AI Assistant → Settings** +2. Toggle which fields show the inline AI button +3. Save + +### Configuring Prompts + +1. Go to **AI Assistant → Prompts** +2. Create custom prompts or view built-in prompts +3. Optionally bind a prompt to a specific integration + +### Field-Specific Prompts + +You can preselect a prompt for each enabled field so the Generate modal opens with the right context: + +1. Go to **AI Assistant → Settings** +2. In the "Field Prompts" table, choose a prompt per field (or keep "Any") +3. Save Settings + +## Usage + +### Using the Inline AI Button + +1. Open any entry with enabled fields; an inline AI button appears inside the input area +2. Click the button to open the modal +3. Pick a prompt, edit "Prompt Text" as needed +4. Optionally enable "Include input context" +5. Generate and review in the right column; Insert replaces the field's content + +### Quick AI Actions Widget + +- Add the "AI Assistant Quick Actions" widget on the dashboard +- Select a prompt, edit "Prompt Text," Generate, and Copy as needed + +## API Endpoints + +- `GET /admin/ai-assistant/api/integrations` +- `GET /admin/ai-assistant/api/prompts` +- `POST /admin/ai-assistant/api/generate-text` +- `POST /admin/ai-assistant/api/generate-image` (coming soon) + +## File Structure + +``` +aiassistant/ +├── src/ +│ ├── assets/ # JS/CSS + AssetBundle +│ ├── controllers/ # CP + API endpoints +│ ├── models/ # Integration, Prompt, Settings +│ ├── records/ # ActiveRecord for DB tables +│ ├── services/ # Business logic + helpers +│ ├── Integrations/ # Providers (OpenAI, Gemini, …) +│ ├── templates/ # Twig (modal, widget, CP screens) +│ ├── AiAssistant.php # Main plugin class +│ ├── icon-mask.svg +│ └── icon.svg +└── composer.json +``` + +## Support + +For issues and feature requests, please contact Solspace. + diff --git a/craft-ai-assistant/intro.mdx b/craft-ai-assistant/intro.mdx new file mode 100644 index 00000000..3d574980 --- /dev/null +++ b/craft-ai-assistant/intro.mdx @@ -0,0 +1,247 @@ +--- +sidebar_position: 1 +title: 'Overview' +slug: / +hide_table_of_contents: true +id: landing-page +--- + +import Player from 'react-player'; +import { FlexCards, Section } from '@site/src/components/docs'; +import SearchBar from '@theme/SearchBar'; +import NavbarSearch from '@theme/Navbar/Search'; + +import Icons from '@site/static/icons/cards'; +import OldIcons from '@site/static/icons/old'; +import { + Photo, + PrimaryButtonWithLink, + SimpleTextLink, + FlexButton, +} from '@site/src/components/utils'; + +# Overview + +
+
+
+ + for + +

+ AI-powered content assistance for Craft CMS with prompt management, multiple providers, and a rich in-field workflow. +

+
+ + + + + +
+ + + +
+
+
+ +
+
Docs
+
+ +
+
+ +
+ + + +## Key Features + +AI Assistant is loaded with features that make AI-powered content creation seamless and powerful. + + + +## Current Functionality + +AI Assistant provides a comprehensive set of features for AI-powered content creation: + +- [x] Inline AI button on supported fields (Title, Plain Text, CKEditor, Redactor, TinyMCE) +- [x] Two-column modal (Input Context left, Generated Text right) with rich HTML rendering +- [x] Lightswitch to include/exclude input context in the prompt +- [x] Correct HTML handling for CKEditor, TinyMCE, and Redactor when inserting back into the field +- [x] Prompt management (built-in and custom) with integration binding and sort order +- [x] Field-specific prompts per field with automatic modal preselection +- [x] Integration management for OpenAI, Google Gemini, Anthropic, xAI, and Replicate (enable/disable, API keys, model selection) +- [x] Quick AI Actions dashboard widget (select prompt, editable prompt text, generate, copy) +- [x] Craft-native UI components (lightswitch, notices), event-based widget registration +- [x] Responsive, larger modal with dynamic body height +- [x] Image generation for Assets fields + + +## Upcoming Features + +- [ ] Per-site settings and field rules +- [ ] Prompt variables and templating +- [ ] Batch content processing +- [ ] Analytics dashboard +- [ ] SEO content assistant +- [ ] Commerce integration +- [ ] Multi-language support + +## Package Information + +- **Package:** `solspace/craft-aiassistant` +- **Namespace:** `Solspace\AIAssistant` + +## Requirements + +- Craft CMS 5+ +- PHP 8.0+ +- Valid API key(s) for configured providers + +
+ +
+
+

Start exploring AI Assistant...

+

Check out these helpful links.

+
+ +
+
+ +
+ diff --git a/craft-ai-assistant/setup/_category_.json b/craft-ai-assistant/setup/_category_.json new file mode 100644 index 00000000..77a30a26 --- /dev/null +++ b/craft-ai-assistant/setup/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Installing & Updating", + "position": 2 +} + diff --git a/craft-ai-assistant/setup/changelog.mdx b/craft-ai-assistant/setup/changelog.mdx new file mode 100644 index 00000000..aa6f3198 --- /dev/null +++ b/craft-ai-assistant/setup/changelog.mdx @@ -0,0 +1,24 @@ +--- +sidebar_position: 2 +--- + +# Changelog + +All notable changes to AI Assistant will be documented here. + +## Version 1.0.0 + +### Added + +- Initial release +- Inline AI button on supported fields (Title, Plain Text, CKEditor, Redactor, TinyMCE) +- Two-column modal (Input Context left, Generated Text right) with rich HTML rendering +- Lightswitch to include/exclude input context in the prompt +- Correct HTML handling for CKEditor, TinyMCE, and Redactor when inserting back into the field +- Prompt management (built-in and custom) with integration binding and sort order +- Field-specific prompts per field with automatic modal preselection +- Integration management for OpenAI, Google Gemini, Anthropic, xAI, and Replicate (enable/disable, API keys, model selection) +- Quick AI Actions dashboard widget (select prompt, editable prompt text, generate, copy) +- Craft-native UI components (lightswitch, notices), event-based widget registration +- Responsive, larger modal with dynamic body height + diff --git a/craft-ai-assistant/setup/installing-updating.mdx b/craft-ai-assistant/setup/installing-updating.mdx new file mode 100644 index 00000000..6bbb8d4a --- /dev/null +++ b/craft-ai-assistant/setup/installing-updating.mdx @@ -0,0 +1,77 @@ +--- +sidebar_position: 1 +--- + +import { FlexCards } from '@site/src/components/docs'; +import Icons from '@site/static/icons/cards'; + +# Installing & Updating + + + +## Requirements + +AI Assistant requires: + +- **Craft CMS 5.0.0+** +- **PHP 8.0+** +- Valid API key(s) for configured providers (OpenAI, Google Gemini, Anthropic, xAI, or Replicate) + +## Installation + +AI Assistant can be installed one of two ways: + +### Via Composer + +1. Require the package: + + ```bash + composer require solspace/craft-aiassistant + ``` + +2. In Craft CP → Plugins, install "AI Assistant" + +3. Configure providers in **AI Assistant → Integrations** + +4. Enable fields in **AI Assistant → Settings** + +### Via Plugin Store + +1. Go to **Plugin Store** in your Craft control panel +2. Search for "AI Assistant" +3. Click **Install** +4. Configure providers in **AI Assistant → Integrations** +5. Enable fields in **AI Assistant → Settings** + +## Updating + +To update AI Assistant: + +1. Run `composer update solspace/craft-aiassistant` in your terminal +2. Or update via the Plugin Store in your Craft control panel + +After updating, clear your caches and check the changelog for any breaking changes. + diff --git a/docsTag.json b/docsTag.json index cd59b1c0..9246d8ff 100644 --- a/docsTag.json +++ b/docsTag.json @@ -43,6 +43,12 @@ "id": "docs-craft-calendar-v1" } ], + "/craft/ai-assistant": [ + { + "version": "v1", + "id": "docs-craft-ai-assistant-current" + } + ], "/expressionengine/freeform": [ { "version": "v3", diff --git a/docusaurus.config.ts b/docusaurus.config.ts index a3a4cbc3..c8f32590 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -225,6 +225,25 @@ const config: Config = { }, }, ], + [ + '@docusaurus/plugin-content-docs', + { + id: 'craft-ai-assistant', + path: 'craft-ai-assistant', + routeBasePath: '/craft/ai-assistant', + editUrl: 'https://github.com/solspace/documentation/edit/main', + sidebarPath: './sidebars.ts', + sidebarCollapsed: false, + lastVersion: 'current', + versions: { + current: { + label: '1.x', + path: 'v1', + badge: false, + }, + }, + }, + ], [ '@docusaurus/plugin-content-docs', { @@ -335,6 +354,11 @@ const config: Config = { docsPluginId: 'craft-calendar', position: 'left', }, + { + type: 'docsVersionDropdown', + docsPluginId: 'craft-ai-assistant', + position: 'left', + }, { type: 'docsVersionDropdown', docsPluginId: 'ee-freeform', diff --git a/src/pages/craft/index.tsx b/src/pages/craft/index.tsx index fe3d109f..1add8041 100644 --- a/src/pages/craft/index.tsx +++ b/src/pages/craft/index.tsx @@ -30,6 +30,11 @@ export default function Craft(): JSX.Element { icon: Icons.CalendarIcon, fullCardLink: '/craft/calendar/v5', }, + { + title: 'AI Assistant', + icon: Icons.AIIcon, + fullCardLink: '/craft/ai-assistant/v1', + }, { title: 'Express Forms', icon: Icons.ExpressFormsIcon, diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 2b56cfd1..af18320d 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -52,6 +52,11 @@ export default function Home(): JSX.Element { icon: Icons.CalendarIcon, fullCardLink: 'craft/calendar/v5', }, + { + title: 'AI Assistant', + icon: Icons.AIAssistantIcon, + fullCardLink: 'craft/ai-assistant/v1', + }, { title: 'Express Forms', icon: Icons.ExpressFormsIcon, diff --git a/src/theme/Logo/index.tsx b/src/theme/Logo/index.tsx index 2f73341e..155659f8 100644 --- a/src/theme/Logo/index.tsx +++ b/src/theme/Logo/index.tsx @@ -33,6 +33,14 @@ const logos: LogoItem[] = [ logoLineShort: null, src: 'logos/icons/calendar.png', }, + { + pathname: '/craft/ai-assistant', + latestVersionSlug: '/craft/ai-assistant/v1', + title: 'AI Assistant', + logoLine: 'for Craft', + logoLineShort: null, + src: 'logos/icons/ai.png', + }, { pathname: 'https://discontinued-docs.solspace.com/express-forms/', title: 'Express Forms', diff --git a/static/icons/cards/ai-assistant.svg b/static/icons/cards/ai-assistant.svg new file mode 100644 index 00000000..61f7f562 --- /dev/null +++ b/static/icons/cards/ai-assistant.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/icons/cards/calendar.svg b/static/icons/cards/calendar.svg index d4b43fff..263ee230 100644 --- a/static/icons/cards/calendar.svg +++ b/static/icons/cards/calendar.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/static/icons/cards/freeform.svg b/static/icons/cards/freeform.svg index ef03300c..c41a8c7e 100644 --- a/static/icons/cards/freeform.svg +++ b/static/icons/cards/freeform.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/static/icons/cards/index.ts b/static/icons/cards/index.ts index 1dd0a29c..4c37da09 100644 --- a/static/icons/cards/index.ts +++ b/static/icons/cards/index.ts @@ -1,4 +1,5 @@ export default { + AIAssistantIcon: 'ai-assistant', AIIcon: 'ai', AISpamIcon: 'ai-spam', AlarmIcon: 'alarm', diff --git a/static/img/intro/aiassistant-dark.png b/static/img/intro/aiassistant-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..89c26b59a352992e4f43c929264e942332e7f2bb GIT binary patch literal 8690 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 literal 0 HcmV?d00001 diff --git a/static/img/intro/aiassistant-light.png b/static/img/intro/aiassistant-light.png new file mode 100644 index 0000000000000000000000000000000000000000..08e2060c0dc2c8c2ec94f93ab36dfe130d5edbf3 GIT binary patch literal 8499 zcmeHt_ghn0*LDyGeUy>G0-?l=A|O&DAR(cQQY{3L4uN105s(rf)KEr8>4~TmX+aSK z2?RlUcO;boykZ3cMJa(m@qd9p8^EpjuOJX! z3k2eNfIx_B5J);GuhGT;7}$lqXkiN4Ng(yK0pIq7p0_gFGrRxLe#zbUb{)e4SkmWB z&)P+NS{V1Pzvh*3@^cOHLHY^(|LEL5{GWYAyU%{M`GXCWw)@_-MvaJ|D z^}O1lk4>!*5x|RoKmRiDF9ZLb0WB`|*&)!4+-9vcHL-EIIlJXO&(|+{_MUqk=isO_ zkOiyqe{O4_qDO@6KgKFQ8i2S60(tD6eAb{fmyNtPK67N$8L1se+51pp z40TYGul$#h=!5QuKd>L^>ypX(t+S?b6x&NB1e@>Gv+_!!F=9$`3b1x;u&=zEb|{4q zHt_Mxc}lirgHJ3n_OPpNepktWx5w$z2SwEaSWazW^EfNz(UbYuTa){Q6ZJ|5d=VrY zN`Lz`uM=WUW3;A3!{b?jh;gym!-tMzB!?MI*y{t4sR+P|CSc`Ia4)7@;V5kDm>{Fp7>ANbP-$Q&E5+&g=E zJF>xlKt<1#0xrzU3`}J)ct*wInMR_f;3ScPdrhgFJm&expob`!WrHL72$W=>+vhnr ztKIII+5sZXO}CeHK^}GM=7))fCX2jDTgI@JEAjvM7;!%x{QL3a!FO;Fks4q5iO}go zRuu3<0v;`wpp(z|I^Z48kVz6bx?JUiLl0ZE-YyDFJ{x(q#}{$u{8_Syl;;Vth@Oa} zV#Gv26XE(mskK)AE|B@%AE3eABlt0CYibi2@e3&RpaSfV4#5(^+*Ce8I~NtVYxXcm z>m1-;`T*zkQ4Ngx0l&suNl$G3?P4CEYG|327bz?UMkP192BI5d`3Aq0*@D_FVFyK5 z*0h35I|B5ZW)CVQqC`Ln3`_A#Q4Im}!^_9Jbln)H?^Hk@g8(taq|!Tykqlj8pNv%& zOeAz42n;jFdfe|mMO6Q53}Rs}g&j&X$)R6+_hZO#AO{61yxP=t{Z3*Cb&h|3r2IEL zn$R+PMeGsE^@_33xDp^ftwCblfG=TF zqD6hFiJH=TS`0&8a5tW%$dnwLwWG@-JLgAEpGmI4_BttE@9fEzB6Ymtd5j$i?_A(@ z2~5z^j*fBit7?O=>sEdpMwO29U{|K#aP{vMX{sEy0Ef2~ja-EEC;MYxI4L?1ongj{ zDaKt(>`#J7w7cP;LL#g2sV3BUJ| zwAp)@w_Nlu1(8KSVA)7)CLzdX@+0H*XmC`&ut#+(zN*WRR%tYUv>&k7&m-S4)f&9S_$>sg%8fBH|-M{*h>iL zX~1vC`5fOA2en@=h208xaWc3~77CUi#}jg7lU#>N8K+(Kt=}X>Z9k8*T11vPuY{Z^ z7(pln*mXnrT%!fNSHL*4EnmZ&omUW8Zg{|Wv5^oPz3~I?%|bF%gd8!ZMVTh2yf^0R z7iAJV7Ul*IH7z`-Tbt#?PRr=~fnR)OSsJ{@Um7gQ3|W5J%FNI=CM~jAsD*U69&~1; zRg1+Ewl=4O3lC{t-KF%Rfsv>U-7%*Af(wI1Esa&r-WPjXod0&`kaWkuro+^G-ZDDe z>BZOal0lfc8=3Sd1|1}XE3k&v)g+Q4E63|K%GnTJZ>YzqcDPK^pXXJ*r6d$xz!=wg zaw{5LMTH>_JPr#xMf)C+H#V~a8C97!+y)7>yxuq2lzOJV-G-r#wpT&l4zK8T>viZ? z221Rhmm)*{$N)XKl@88sK0svdlazLdi{(S9m@a#UE(!7`T6bZ7aFdfJT7u7qYYxjc zszvFY!mBAtq^(Qbm?fhqVe;=nokidM zjhag5kwmFsMFP|ip{Ew&yb@r?jkw?@*EuU1JwBNVFM`fIw3wXZn8dvK`fx1hkD6Vn zItnnY^Hb)Pj>jgq1;fSLlk*YP_1}0_jzfX|^L7F9WO>MVy`XPsE%jW#=qqXd5Hj`Gi)_m2->&^aDM{v*R2L~}g3ao-wheyrBW8kI^_l@BVY(YyTM-2z{zNkFI5gbh9P%Vq!5w_JyD6xI8q?#51f+YQWRH?66!X9e0VK6hN)%;#ae!g%nGQxejxz_0;>yq)%5*k9AoJbUf1=)$1~9}?zjb8rD#fU2BG9R zR~p&23SWP-QrueAdvWDbPHVU+G2C69~r~B&57jnm3b-P zpS9F9i67uirLVe{xV9LK~wg7 zs|NeW^i}>e`xNNh|qX@fu}DlEJ2PC^!h-ugIVwW#4G zT-$Hdatw&YQix;o^XXHz{4s1;pii_^io>kei2xgjWTg4kG*`c!x~DpcM%lky(vB)vfmiKEr|DxZtDi%W$c(u8`cGzVWz|bz7EvlVbB^{58@^3u!MoHni34^mVO-uPL;#&=dHCKxVFQ}ev>{y+<<6#CN7rMP{R z8C)}_y>qNB+i`Nh5A(vgvQB%S>Yz+gAm;mDvqTzD9BQU=7Jzjw&$N&>zHF37lOA$X zgr21HZ_ts%`A-0TwXG1tIMUynFE)|yaINxWmb*Dyiuu0NM%__!ZN}%$5pHS+lzY5r zG=+9#&-U7?OyPNjZ*F?=^oOL7jaaR2|TI^dmDX>XD=m-|j1`yqtf#$lb69$P)Fo!-L6D z4g{^(+~KLxhCmJDc(EFV{djRZRFYxx*@38u=}hh?jVE!K)URFl4rnE)Dx-fY=EHn8B#@Y}%ojML<#*hf@TeOlfM@ZO z)e&dq!3j)wTcmG)?p77;t822P(Wpo$1C!f+;{E`;1p7{(d3!2@YO(Ccdxjn1y+RzU zYqXU%HD}uEYh&w1)Q=y1qspnO*U=~qSZXj^c>N^2=!yk-^5KX^SV{|)^oayr-)^1a z7rjeqDgwh|e#;jDdF-D2Q};mQ$D(PM(P5{#baYdLR@QIhW0jx@g~)jFG3;!#RiICt_#4~TH)uOSE@*Qg$9=;`_WC#=*pUF==Hujyf{gC_fzLz#3 zA$yGrYFlk*y1ZgkLS5#iD4kHgw6O8R+*6m_pLthfQYjK0t6!0VWGC<@;5uh!uU7tI zNLe1HKj~J0f!qMW`k?E*Zl85Y$X!0CkIK6m@nEEBwyNv#R6g~z`yq+-%87i=AzVnT zO5M`*ldx+)igXb%FLQI!o8MUvGm^Go%(sqNFKlV>^4-kVmsv+ZUn0~!POBK_M90ay z?hJXGj>-5*c@jxbJ-3Kq7gi}(FA|$KF`VPw3Bz3~fbO8(^wB>H?N>GOA?40vl`bsl z#h4SV6xvsd4R_#_;=$S0!Y-4)I_JKiX(?*1LCr%!p{I^pAGMU)zr6gBF*0~pEeh#Q zGsKH8j!+0V_cQl4PHQ`=&$}79(`ZYYGZT!}f?+$d$lV8fD1W|rLhu;$xJ2^I(P+77 z@}ZPV=H$O;mUE-JJI4h0@qy~m`)1HH^67|zQ+oaT+22R-9&#(&ZfsdiZP!an;l(0O zKSapk;9_`lWiLtYnL_Q|Qd{O8cDzPgf^&Z(k3*OW`bWu}kF@-LdQI-DR12wOJO(*p zDgMqI(D%U+W@@aFiCjj3RTk^cW3C-O_9g@aX&>+P;V}ub|4inb7iJ2woJtdZiIpaw z>|8-S(fG=q4+Dv{19|s=m7)0eY)-C5+kTUwQtlA9WJII&)4EB*vyMj%!v6;Vi#(UQ zp1WSxsmIZ+bgnULE&`9v-5yxn*rn40VC-tJnjgEdYflzQ&o|-AyxnRpx5UYKI~+Yc zjCM%X6vs%l$YmgchXvQNveZ&p9W$P&n>OXPEoB=w@g}{rD4?&pkqrW(TDg$c%RFVQ;j0y>M;4258UmZ^P-Tj7PAV>)&n(>LM`na@Mrka$-fR z-4>lzo>~nu>9Z71ZO)Ud@I@rR>9f1J;BAz>qy19Z8B#fW0e9ZuQ^L)O)6GDTl*~oA z-n^o~1#~MhQJ30A+b-R((H+|SlX9f#+6ggmFhKB1i%w45&B(CDiO_wzsg@L~A5Fr( zi6M&%BAjY$;?z}-hqQd@dlLT2$$~Dmb6Gq}$4FMrVUNAHV>mwXR9c4^HvX~q2{Cib zfP|>=bue*6wiIO_?#L>2cl4K>>yqR(2$pc_rxo3G_5mKf=4KyKl|H_hB1+q_A9q0m zg;9&2+R>ia{c8?X`S@}6J9PQ%VT2qLWv}Px?Wk<$+Bv}aEC@nNN#OB9deKA1(^AgV z9kRE)i`!+t;t#5MKv!u}A%Mul9}B;EF;=LjO-v@~=9^k5Oq6mpdHDjAXh_9^hpFJA1lT{C z(P>5b_E$MyXhnJV^0)9)w6WjU`-Z1{BLCQ;Q6rfmyttIBs^X4PEq>L+4rvxMStQrwJsYO-(5y4#_q=4QP*ZO! z&2CD*@C@rAs$+#_am_ZNSznqs*%47)iNvK^e+vNK3Q`DWq3W=X zPwzE}#C?zHx)(kA$ZW~Q*xHjk)rBuJ-NP=5$AhEhF?(gcX{w4nHI5MjO9J8b zu;tWsDbH4S!w*?4s0!Fub!m&v9lu5uPgx?$i=f~zA2Gga zS8m+1H{a_}S8At3xy zf@Rh%$LNUT!JD5xs`->&MQT<=jyE(!8}Sy?@-q9oC8qP;7PpemS^3K+Z4P>aKrX6e z8;;TY+YP>~^%zXKL?%*mdE-COq=X7v=P56aKx^kUoUY$!vR(cfYopPU+M!NWIG)vQ z(N!5d9i8biv+9P94tFn@nUdhYZT3b-x3yfhm9tLgS&(v~)3 zVO8dKxj?#XMA^$&48mR) zJU@Jq4z9@iOjPT>7e?KP?J37+MK(`&Z8OV@3x8-E2PSVExA1MyX5k@jVh;qlgQ|T) zS@owR4OAG3rh)(kmdtJTUYE1a59fp}<<(Qn2YH7+k-X$Sq3pdoXnVo}m$%_18(#VC zKhUI@JWjoje6)d=9qlO5(L9Uw0W$D+gg>F#v*TgJRp{EI8!=q%_LIQAQcxaF-tznF z*Uwi!Cnj>Y1yO0wXC_0Gs+2wD7E$(?Sd;7)}(JjZMH77M2UK=TW2MoN+->9A~}B=DXs(&w8BaQ<{OC) z03Tt4Hioi$80v0IXQoRWVw4U*y$$zs1}bgwR;H#kTCFTt*c7}>Vk^gEYaZyB)bBS9 zMYT;o6Yc%dTN9j(?94bMaA$v696U%XBa`1IbgmXKmDOJdPE8v!KR8LXG-uUY;ngx< znMdNYkQ&RbyaxMii(z5ED?e={^766m4+m)u>k0z^{DH7H9iDWlDSFinW6CO8AKY3q2qQJzVx%inMKg`pU&N zBw)fWx?GjtPASt;T~a~UET0Y!HVBx94=2<+9Af!Kk~_o*9|=3xz{<& zg_=y?Y9eL6&Ai!&m~4d*8wX2w4zsKhyV248@;5y1%~hGE2B>}@C5b;fO&@pP9z&IAn| z?o?#Az*q4Ege-Y zErga9{EZ&)M}+@xf`8yOpX-tT_k{BgNp`@5lmBZW)W_c|B=o9((EmN>=%4hIA5Nb) LLz&XgdEELRrWdM1 literal 0 HcmV?d00001 diff --git a/static/logos/icons/ai.png b/static/logos/icons/ai.png new file mode 100644 index 0000000000000000000000000000000000000000..b63436624f5577cef9017ffce1e37d69b6b20b07 GIT binary patch literal 3202 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 literal 0 HcmV?d00001 diff --git a/vercel.json b/vercel.json index b7599bfb..259e5a49 100644 --- a/vercel.json +++ b/vercel.json @@ -41,6 +41,14 @@ { "destination": "/craft/freeform/v5/templates/caching/", "source": "/craft/freeform/v5/guides/guide/caching-forms/" + }, + { + "destination": "/craft/ai-assistant/v1/", + "source": "/craft/ai-assistant" + }, + { + "destination": "/craft/ai-assistant/v1/", + "source": "/craft/ai-assistant/" } ] } diff --git a/versionsBadge.json b/versionsBadge.json index edca884f..1a8d1df3 100644 --- a/versionsBadge.json +++ b/versionsBadge.json @@ -11,6 +11,10 @@ { "version": "v2", "badge": "Retired" }, { "version": "v1", "badge": "Retired" } ], + "/craft/ai-assistant": [ + { "version": "current", "badge": "Latest" }, + { "version": "v1", "badge": "Latest" } + ], "/craft/express-forms": [ { "version": "v2", "badge": "Discontinued" }, { "version": "v1", "badge": "Retired" } From 0bddcaa6433820e9429ee08820078279ea232ec6 Mon Sep 17 00:00:00 2001 From: thejahid Date: Wed, 19 Nov 2025 18:54:11 +0600 Subject: [PATCH 2/4] fix: update favicon.ico --- static/img/favicon.ico | Bin 15406 -> 15406 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/static/img/favicon.ico b/static/img/favicon.ico index d802c6c30e5b30a9d917b149a738ed00d7c12fe3..05ce25bf8914f02636bd7d520d51ab551f4d5176 100644 GIT binary patch literal 15406 zcmeI3dyHIF9mkI{_uknq#RUrWfwCBAz#3E0RD%SoNFX5?B7Z2DP>jz&5CkD$5mxJi zy1Vz@nQqaN0)-N-6>7k)WaB(KHxB8$fv!&{j-sU01s;-R?Y&pWm6e>76@wcIM9B zncc*lWRzN}lNjR4ozrLdCsMypOR~@EP2*Ql(c6JmpuDM?K|h|wQ61?5R=2!r*%I2*&6b) z%d}@-tbO~IvS+_q_N>v8m$^=BRFUu_yuq@aJ~Vi4PT1VMu6-*f?V){oK)pLjA9{^C zI^bXStwZ3knza`>k^cs%8&PjW@Rji$Y4|6Xrm!X^A@SM?yXM;`~F zr_uivT5Q_0mekPg^|}wUlCdfJ&KDW;73h5p`nb2`+ZzI+uQS8%&-8ckGyTvqNc_{> zr!@^68qA(@*tHk8M0xuoGWWDM?|r-7lX{Z+o;XC<=u?o)xmHQ$*CccR|MN=OwI3*X z&b0 z?|uN^QG=lp6AH}#;a2>5S`hV!vj{)2D};gAX8o$2_}DHcowL3c=Fj(1(RD6rx4)$A z^suu?c-CO>tv__b76j`=9DmQ+ukY#4CY7a~_tF3I8rj7bO@47~U5sz1|EbzYT*DW< zUB}j<`nbY{7kCDUP0KaD-@q;xyL-(U% zlhffZGL8=(eWK3WUuAy(8Xe0VueI@5{`TLspE zo*yWgT%~tmQr_fir;_KahS#1*t{U{+=vu({ZwK#9l0PQqi;l6OtKl1KLv^xO^61gB zZ*Rs9t~9Qz;n(b4SpyjJ`ua?L74!1W_`~6{{O21StntMR$T$jt&^aHxldO$AnTJlua22Ety1$PMiQU0 z5~I4c)<6#YZDPZ3r%4;hJ?|&CT}RBz(btc)=Uh$PzeKy%(gUm`i%gvu81Ua2im#!( zt0o6(^|{1DiHk*Of;#9w#7n8ecOcV!)Qw-#cPMs-()*AH+ytLz$qSNGrJmddz8C1@ zWv)A`c*nRuOrJsC5y)R82lxvy{rW>*wm*$EHB-aO+Uay?aAB|h8T%{LMU$@eNo?t2 z^nD|Bq}1q=OUifzGRU=veB1f`sxi-O$E7zQDfJ|Ij`0a2_TnklRQ4n1dU-D;wjJrF zGR8+OXI<)Fk#Uf*C?mth@w{SpboPGCc(~Rz;H_VO@vVd8h~@j#kWS{KRMC&D}A6HSkT(Nxd~&WibB8w|*0&`vCu# zc8@u3*5Y5&^Fgpj>-qq@T*qboVK(BI{D++AIxyDzpChqtRIly){z6jy$QpLZ&0G)m zF(|C>==bME&ZPZ!;(hV=|8>=IdMI-?ImGWwJ~TCU@jpN51eR9&GxJ`ztpv zW_DV*8ucT&jIj&yGU}Df!MvWFcqe#ezq=M!vwO*}sS(Im2jv`6Bc9WFE^GE$@?&Cq zk$MWe1K@qQ>}Pg^H<}l>j^8(XZQEp@b2l~YbTG!X#SdgBed|-;z73pzS)qi^T? zdeyx5r@0qnY=nA_TJlHuftTQw+?H$Q5Pw6QvR`LjZbsiL^pJC&9#RV!*F@*@8tFQC zZm{RAkHhb2D0)V&6?+K3Gl7m@mVLdV=Uiy^K&cNq8I!7K?4AI73qHEWzm&i_j*fTX zx1XZ^SXmg(oF%a~P1^|c9CsBy6`N^!PRiQIKcOdC=kaCV0_?vltd?zn~+~!+Q5!V;NPNI_ej!bx8IdoyEtrJ zjvVq|ikO&U#Q)T?qnX%F-&#Cb&fA@ZX8pu6w| z>slvb=#(>SlCx3oJ`UE`Ajv(+nN7Yb`STIk>c=ZOevy05WsP*{Tw4BA zNB);UzV|t^=D?mGa>@U literal 15406 zcmeHOcbHVw6@Q64v!EtcG*vNCL`@=^gcvljq!9D@*)`Gl8BL5p5{QUkkRT|Ez_K&5 zl%+SRu3$u@SpapHUZkoZCG^fV*fKNs@zkkMAgUjJ>pI<5D&b&H>1UnA2_MJ4L>>-d zJnQZL;lOcxtK@I2o77c^dbgvfb)!TbSOYxX#5_;S_74}!Reuqw8h({?e7$S@k&i?U zt`oJVRMg%jqL%kJ@D@HPs$z%S+(TqRpWD;N8~jIoOVg@WhD2?j4>~7`S~1YzacI5X zkAF;zOP{|NImZ)!vwpK5G_l3-K^nhgc5($ zo-#e=H&2wx!ald@Z@?~zhXU=B>& zCL^rVaqiYPoFn^r0`Gswv!~Bsv2{*766^zfmSP_AR4tykW6n5W)Zi?$Z7KRb$1|T% zAT*+Za;7<+oA6LR`7I^)S*O((2Cj)m^1H+%feFCtJv=yz!QFV1Co1ufKTZH|;$EY_ zO�N2Yn-fjrd*^4+q9eB)>D}yjpr&U(AMwMDl)$G0X9!&Q5agvadVF=)KGG=A4VA zD6fqd4zY0X0nm~<^SS5C1<$)3`wcmLw-W~$ntv&9tIC4A_gp87V<=Ew6K>Mn#sPaY zCMWEn=Zl*6sHhKmht7QU?t;v$Z-|1k26r3p1+^G!!}~G=9*~iL!`_d})UNB_!R3@FYDEF) zY9ean#iHgstnVQbKTuq0AJt&53d?&r$^?UPc$*DE}IcXtnSof?&#YByF z-L1*>z&U&qurkYd&VT%1YI=OD6@}10el2R~d7`G>=)T($Js06xtvH?1&5=EV~(A0-qJjTtXW*L|KG&c6i@VRri<9SC z?S{_H^9$Ho$Dh<%&o9uO)&5l}euzWP9NvV3|1aG>2dqN+ujx=B)rH{GbQtFMF~Dzl z{vccJq82}=b$0$%`9{29H@-M(QQ zLFl4p-EZ!F+Fl=Y*L-KUNo|D~e!w2n9-RE6BtP=by!&s zuk+mVUj1Y`*1m(NDQ!e5cZy)$wH~tLZP-8s)2*=eP~j`qS~ z1=i)=25Yl+gguS-n|sf78U8ig1LumG-d4*2TmEp6D*2f#dGTi&eoNRk2MTa*ZMyAu zBsd%Q-?#?#xUaOl_lBOTjn#rDmWf*SlIBr?JGk?I_LB0%NmB}N_Ah-mBw#%DSK zIsa>lMIFKU!hN2rsJYNn6R@WD{-bdH`*$CZth3u-Z`>gLtuNtsgXKb&+84I$df^V>!6$V0Pnn_eFu@?Hmu8GJhZ#H zM)V;#^#*>kj&1C72y%TZ-b*pZw0J1^OnoTOT1w!s{JgkUfPNCVXst)^G{#SY?#Y5Z z3(6p?S#2c$@>n?kR_s|P*j7al*HDf(p9*|e>c_|- z)=@7wZ2Iak7>hZ=fraQ-0(lX}(-D4^wlXBYg$%ULhrcS2M9Aj{c`aI)*9QF22Xnux zLevM~qspX{`r&iGeGCl1(!T4r!Kc09bN0=nGQ>I$GOQ3d?*-1}`_Ec#!MkItz|UT61U}CP?-c|0&)!#d@_Skf91Fe91or1a z;7&hmuKoPqwnqZTW8u^8bnZb_-!q%x{I6^@?$ld`!CyE2JJ1(kxA8sV>(CMDGxOAo zPZjNmNg02(K)l96!MlL}(MI7<9p}y88vBd(9^(g9dqwU30P!g3gp4Ch`-!2CzNu5Y zuZINkoO_^Ud^p%2veEyU<+?9;Li+}x95z&2X}i;pa~yg*>|GrfnROrR3iuID4J|m! zh$&E~fV{+B&ui5B(EmiAQ)3GCVcH+`4=v~no9()UujVY!1)>K#vdNg1vW}y({IY4rq=;?|33cWW{8iy z?nV5q{Tno9W(rby(sj@F$PFqm7leQo>CtUw9@gB#@tt9T8KKfC51=~ zejLU>d7g*BW`^%n`|WnUCvxI&s-Mp<9Sf%KBR388kUMukpYHCXZ)!gJ-yE@Ob@UU& z4q^Mb;6Zkh7Wm_mzCxe)^W3Y2U9cYDQ`eknd<8uTdfs2bN5iuAOP>S2dS_wWKu!3r zH!S+`;A3oT(eaMr3%uua;DcE10LY%#edA9avHgEZq;M7)@1gILbWlbTZ^}vfdA7zN^Ul8*mdQy6fBz`m}T7#rXM7AN@?M0XZtJLLV;UHSmdP zxwE8?$gcN|FA;ee0^e=6vJRogHo%?!+(*J9N9b~-|Nnz${N2-xh0~tPO{exRiBoP8 zu@eVPoI&&c_aJlNPbMwQT|j<@_Wv=TgmD7O__VU*W0BTf4F0V;iL9Vlt~ny=pSSy2 zd-Mrz2k!p-Lzt6uHz?#2t~KM5I~U?^hF^OsViTl==bdt7Y)izJ?=Z0z=B6b4x!a*0 z-TaKf|1#{s@VS^Bu@5!++y3x3c5QAOk+KBwZHYPJtBk84&ZBvs_&fcN=%jz!h@QTrm5{Hp;iFbsSOCk9D|Dffn8hbhRYmtncm%^Vsv}-zaJO8#r z!x)Db-J>oM#eH`c>iRgZYMO&rhJjbcU19i_ak;}Alf0sbQZCh3Y28)Jc=%~IA#89( zhZGOZc)p!K-Z6Ok^AEprW9EAZF?&_MRn)rC30}b+M&CB?ut8q}uUu>L%8;W)-ex|5 zQ^%{r@oC#DwFjNMPL-(6S@I>*D}3=!SeJ1oH~li`PE zjtJ@DIcCg^Ie(-lk+0BaS_=QR9XHATf{Xm_0r@BU`Q_P#O_(g?=j8>kJ#atT_%MeJ zdYtPFJ9&kSoMeOV~gQ*NL=D@KEaxhotm{wtn%a?9VPg!TVD0NE)CG z^~OCW_O^PkSx?3u7;{1lRu}50(C2jw%z1~ACfdrMyec|Rk^68g!d(LM`?F#o2|Pj#EhBapyTI4*t)qKah7mn&N;2N|-AN+f~OK6D```KzUfP z-PDj@rv22&dgeG#F0q|=*y^HWEI2V-qS3g7UagkP+bMky+|g;Z>?^o9g=eOmb7r-3ft-k3AP;q3 zpz)_J@o?vNa1VfgGw}xM;R~GvpYDi^eVAibzTJU*j!(!JwE}XVyiPv_mK4@QaS0B=?|ex0fXv&d5Xc@crBwEo#~ZG-kiU z#$)|>H>K$=Cqq*D7=@e+=Nk8XdUz85TRU!$Lj_-RwLAKj3-Xy|aFa_QgBVB6)DQLW z=TLvAoMi4Kau0RRx%LC4qN*z=#i2RZL`nuhEDyjwQC^nF)*vTr2t zk@RbF5o3I)dn;M*n9H+{XA=MSpnX=;e+3({Um}047U(vP7WyaD$mTBm_7+?s%(T>iW@_z?tC)3u{cA^(esN;RW zd(Ff5TsiPO{XYj;^ypZ;F!%!FNIHHI4&Dpg{n;|PXe2GPci?AK?{^oqX^QrFDcYFS zm1y@+HZj*aQ~qQw7>F~+BKf!3F{J7j&$tk0VD(9_eChZ%< znaVUSM?HL=OOT^|u8qHr!-N8lV!r?9*rTBr{}%zj^ZicT4gOYB{9nar&=5V@b@?xh ztAoBUcne~^>G*3JhBf^)bXwEzGB From 97042f8d84b8cde0630b886edc8969780cf04dd9 Mon Sep 17 00:00:00 2001 From: thejahid Date: Wed, 19 Nov 2025 19:03:27 +0600 Subject: [PATCH 3/4] fix: update Craft CMS compatibility requirements in installation guide --- craft-ai-assistant/setup/installing-updating.mdx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/craft-ai-assistant/setup/installing-updating.mdx b/craft-ai-assistant/setup/installing-updating.mdx index 6bbb8d4a..5da718d1 100644 --- a/craft-ai-assistant/setup/installing-updating.mdx +++ b/craft-ai-assistant/setup/installing-updating.mdx @@ -36,7 +36,9 @@ import Icons from '@site/static/icons/cards'; AI Assistant requires: -- **Craft CMS 5.0.0+** +**Craft CMS compatibility:** + +- **Craft CMS 4.x or 5.x (4.0.0+ / 5.0.0+)** - **PHP 8.0+** - Valid API key(s) for configured providers (OpenAI, Google Gemini, Anthropic, xAI, or Replicate) @@ -74,4 +76,3 @@ To update AI Assistant: 2. Or update via the Plugin Store in your Craft control panel After updating, clear your caches and check the changelog for any breaking changes. - From 77f602ed83efe4bf4057f271aaea53344f69f51c Mon Sep 17 00:00:00 2001 From: Kelsey Martens Date: Thu, 4 Dec 2025 13:20:07 -0600 Subject: [PATCH 4/4] ffc5: fixes to JS plugin docs --- craft-freeform/developer/js-plugin.mdx | 2 +- craft-freeform/templates/ajax.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/craft-freeform/developer/js-plugin.mdx b/craft-freeform/developer/js-plugin.mdx index 78945b08..3d1f1bb3 100644 --- a/craft-freeform/developer/js-plugin.mdx +++ b/craft-freeform/developer/js-plugin.mdx @@ -8,7 +8,7 @@ import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import { Badge } from '@site/src/components/utils'; -# Honeypot Plugin +# Javascript Plugin Freeform includes its own JS plugin that is at the center of handling all of Freeform's powerful convenience features like AJAX, conditional rules, date pickers, table fields, Captchas, Stripe payments, and more! diff --git a/craft-freeform/templates/ajax.mdx b/craft-freeform/templates/ajax.mdx index 4c892fcf..9d93aeef 100644 --- a/craft-freeform/templates/ajax.mdx +++ b/craft-freeform/templates/ajax.mdx @@ -25,7 +25,7 @@ The Freeform [javascript plugin](../developer/js-plugin.mdx) handles AJAX functi The built-in AJAX functionality lets you completely customize the way your forms work if you're not satisfied with anything in the provided defaults. :::info -Be sure to check out the [Honeypot plugin](../developer/js-plugin.mdx) documentation, to learn how to further extend Freeform's functionality. +Be sure to check out the [Javascript plugin](../developer/js-plugin.mdx) documentation, to learn how to further extend Freeform's functionality. ::: ### Customize Success & Error Messages