Repository navigation
feat(advanced): add rich WYSIWYG features and AI SDK assistant - #1
Merged
Merged
Conversation
Extend the UEditor-based renderer with tables, task lists, alignment, colors, highlights, a link panel, find & replace, source mode, preview, an opt-in text bubble and an opt-in slash palette. Add an optional AI writing assistant built around a thin transport that targets a host AI SDK backend (UI message stream, text stream or JSON). Results stream into a detached panel and only reach the document after explicit acceptance; requests are abortable. No AI SDK or provider package is added, and AI stays inert unless ai.enabled is true.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Résumé
options.wysiwyg: true) en conservantUEditor+ Tiptap 3 : tableaux, listes de tâches, alignement, couleurs, surlignage, panneau de lien, rechercher/remplacer, mode source, aperçu, bulle de mise en forme et palette/optionnelles.ai/@ai-sdk/*.AbortController), Réessayer et Ignorer.Changements
Éditeur —
src/advanced/wysiwyg/features.ts,extensions.ts: capacités activables (options.features,falsepour tout retirer) ; une extension de l'hôte du même nom l'emporte sur l'extension intégrée.search.ts+WysiwygFindReplace.vue: rechercher/remplacer par décorations (rien n'est stocké dans le document).WysiwygLinkPanel.vue(refusejavascript:,data:…),WysiwygSourceEditor.vue+source.ts,styles.ts.handlers.ts,toolbar.ts,slash/commands.ts,colors.ts:kindintégrés (textColor,highlight,table,tableAction,findReplace,sourceMode,preview,ai), barre par défaut, bulles texte/tableau, palette/.wysiwyg.vue,wysiwygOptions.ts: câblage ; l'éditabilité (désactivé / lecture seule / aperçu) est désormais synchronisée avec l'instance Tiptap.IA —
src/advanced/wysiwyg/ai/types.ts:WysiwygAiOptions,WysiwygAiRequest,WysiwygAiTransport,WysiwygAiOperation…httpTransport.ts,stream.ts:createWysiwygAiHttpTransportlittoUIMessageStreamResponse()(partstext-delta,error,data-*),toTextStreamResponse()et JSON (Output.object()/generateObject()).context.ts: contexte borné parmaxContextCharacters; HTML/JSON du document seulement sur demande.useWysiwygAi.ts: état, streaming, abort, retry, acceptation ; refuse le remplacement si le texte ciblé a changé pendant la génération.operations.ts,sanitize.ts: texte inséré comme nœuds texte ; HTML optionnel filtré par liste blanche puis par le schéma.tools.ts: outils d'agent au formattool()d'AI SDK, séparés entre lecture et proposition (jamais de mutation sans approbation).actions.ts:DEFAULT_WYSIWYG_AI_ACTIONS, neutres vis-à-vis du fournisseur.Documentation et playground
guide/wysiwyg-ai.md(options, contrat de requête, backend Nuxt/Nitro avecstreamText, transport personnalisé, sécurité).string.md, liste d'exemples, API du playground.nuxt-wysiwyg-aiavec un transport de démonstration local, sans réseau.Dépendances
@tiptap/extension-table,-text-style,-highlight,-text-align,-list(^3.29.2, verrouillées à 3.29.2 pour rester alignées sur@tiptap/core), externalisées au build comme le reste de Tiptap.Vérification
yarn lint: OK.yarn typecheck: OK.yarn test: 51 fichiers, 611 tests OK (70 nouveaux ; transport mocké, éditeur Tiptap réel sous jsdom, aucune dépendance réseau).yarn test:coverage: seuils respectés ; nouveaux modules entre 82 et 100 % en branches.yarn test:scripts,yarn build(ESM, CJS,.d.ts),yarn docs:build: OK./ai→ arrêt avec résultat partiel conservé, rechercher/remplacer, tableau, mode source (<script>etonerrorretirés), aperçu, propagation des données JSON Forms ; exemplenuxt-wysiwygexistant inchangé.Ruptures
Aucune rupture de contrat :
{ wysiwyg: true }reste valide, l'IA reste inerte sansai.enabled === true, la bulle et la palette/sont désactivées par défaut. Changements visibles à relire :DEFAULT_TOOLBARest inchangé ; les boutons liste de tâches et alignement, déjà présents mais inopérants faute d'extension, fonctionnent désormais. Retour arrière :features: falseoutoolbarexplicite.prompt()de Nuxt UI ;features.linkEditor: falserétablit l'ancien comportement.Points d'attention
@tiptap/pmest importé sans être déclaré, comme@tiptap/coreet@tiptap/vue-3déjà : il provient de@nuxt/ui.changelog/X.Y.Z.md: à rédiger lors de la préparation de release (a priori 2.1.0).