@strapi/content-type-builder 5.25.0 → 5.27.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/dist/admin/components/AIChat/Chat.js +435 -0
- package/dist/admin/components/AIChat/Chat.js.map +1 -0
- package/dist/admin/components/AIChat/Chat.mjs +433 -0
- package/dist/admin/components/AIChat/Chat.mjs.map +1 -0
- package/dist/admin/components/AIChat/FeedbackModal.js +237 -0
- package/dist/admin/components/AIChat/FeedbackModal.js.map +1 -0
- package/dist/admin/components/AIChat/FeedbackModal.mjs +233 -0
- package/dist/admin/components/AIChat/FeedbackModal.mjs.map +1 -0
- package/dist/admin/components/AIChat/UploadCodeModal.js +427 -0
- package/dist/admin/components/AIChat/UploadCodeModal.js.map +1 -0
- package/dist/admin/components/AIChat/UploadCodeModal.mjs +423 -0
- package/dist/admin/components/AIChat/UploadCodeModal.mjs.map +1 -0
- package/dist/admin/components/AIChat/UploadFigmaModal.js +377 -0
- package/dist/admin/components/AIChat/UploadFigmaModal.js.map +1 -0
- package/dist/admin/components/AIChat/UploadFigmaModal.mjs +373 -0
- package/dist/admin/components/AIChat/UploadFigmaModal.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Alert.js +46 -0
- package/dist/admin/components/AIChat/components/Alert.js.map +1 -0
- package/dist/admin/components/AIChat/components/Alert.mjs +44 -0
- package/dist/admin/components/AIChat/components/Alert.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/AnimatedBox.js +34 -0
- package/dist/admin/components/AIChat/components/AnimatedBox.js.map +1 -0
- package/dist/admin/components/AIChat/components/AnimatedBox.mjs +32 -0
- package/dist/admin/components/AIChat/components/AnimatedBox.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.js +92 -0
- package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.js.map +1 -0
- package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.mjs +90 -0
- package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Attachments/components/Attachment.js +100 -0
- package/dist/admin/components/AIChat/components/Attachments/components/Attachment.js.map +1 -0
- package/dist/admin/components/AIChat/components/Attachments/components/Attachment.mjs +97 -0
- package/dist/admin/components/AIChat/components/Attachments/components/Attachment.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Base64Image.js +127 -0
- package/dist/admin/components/AIChat/components/Base64Image.js.map +1 -0
- package/dist/admin/components/AIChat/components/Base64Image.mjs +125 -0
- package/dist/admin/components/AIChat/components/Base64Image.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Collapsible.js +71 -0
- package/dist/admin/components/AIChat/components/Collapsible.js.map +1 -0
- package/dist/admin/components/AIChat/components/Collapsible.mjs +66 -0
- package/dist/admin/components/AIChat/components/Collapsible.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Dropzone.js +172 -0
- package/dist/admin/components/AIChat/components/Dropzone.js.map +1 -0
- package/dist/admin/components/AIChat/components/Dropzone.mjs +167 -0
- package/dist/admin/components/AIChat/components/Dropzone.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/FloatingPanel.js +166 -0
- package/dist/admin/components/AIChat/components/FloatingPanel.js.map +1 -0
- package/dist/admin/components/AIChat/components/FloatingPanel.mjs +163 -0
- package/dist/admin/components/AIChat/components/FloatingPanel.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/FullScreenImage.js +190 -0
- package/dist/admin/components/AIChat/components/FullScreenImage.js.map +1 -0
- package/dist/admin/components/AIChat/components/FullScreenImage.mjs +187 -0
- package/dist/admin/components/AIChat/components/FullScreenImage.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/ImagePreview.js +87 -0
- package/dist/admin/components/AIChat/components/ImagePreview.js.map +1 -0
- package/dist/admin/components/AIChat/components/ImagePreview.mjs +85 -0
- package/dist/admin/components/AIChat/components/ImagePreview.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Input.js +126 -0
- package/dist/admin/components/AIChat/components/Input.js.map +1 -0
- package/dist/admin/components/AIChat/components/Input.mjs +121 -0
- package/dist/admin/components/AIChat/components/Input.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Messages/Marker.js +138 -0
- package/dist/admin/components/AIChat/components/Messages/Marker.js.map +1 -0
- package/dist/admin/components/AIChat/components/Messages/Marker.mjs +136 -0
- package/dist/admin/components/AIChat/components/Messages/Marker.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Messages/Message.js +214 -0
- package/dist/admin/components/AIChat/components/Messages/Message.js.map +1 -0
- package/dist/admin/components/AIChat/components/Messages/Message.mjs +212 -0
- package/dist/admin/components/AIChat/components/Messages/Message.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/ResizableTextArea.js +78 -0
- package/dist/admin/components/AIChat/components/ResizableTextArea.js.map +1 -0
- package/dist/admin/components/AIChat/components/ResizableTextArea.mjs +76 -0
- package/dist/admin/components/AIChat/components/ResizableTextArea.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/SimpleMenu.js +60 -0
- package/dist/admin/components/AIChat/components/SimpleMenu.js.map +1 -0
- package/dist/admin/components/AIChat/components/SimpleMenu.mjs +35 -0
- package/dist/admin/components/AIChat/components/SimpleMenu.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/StepModal.js +175 -0
- package/dist/admin/components/AIChat/components/StepModal.js.map +1 -0
- package/dist/admin/components/AIChat/components/StepModal.mjs +171 -0
- package/dist/admin/components/AIChat/components/StepModal.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/animations.js +67 -0
- package/dist/admin/components/AIChat/components/animations.js.map +1 -0
- package/dist/admin/components/AIChat/components/animations.mjs +65 -0
- package/dist/admin/components/AIChat/components/animations.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/icons/FigmaIcon.js +50 -0
- package/dist/admin/components/AIChat/components/icons/FigmaIcon.js.map +1 -0
- package/dist/admin/components/AIChat/components/icons/FigmaIcon.mjs +48 -0
- package/dist/admin/components/AIChat/components/icons/FigmaIcon.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/icons/StopIcon.js +25 -0
- package/dist/admin/components/AIChat/components/icons/StopIcon.js.map +1 -0
- package/dist/admin/components/AIChat/components/icons/StopIcon.mjs +23 -0
- package/dist/admin/components/AIChat/components/icons/StopIcon.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useAIFetch.js +107 -0
- package/dist/admin/components/AIChat/hooks/useAIFetch.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useAIFetch.mjs +96 -0
- package/dist/admin/components/AIChat/hooks/useAIFetch.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useAttachments.js +152 -0
- package/dist/admin/components/AIChat/hooks/useAttachments.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useAttachments.mjs +150 -0
- package/dist/admin/components/AIChat/hooks/useAttachments.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useChatTitle.js +47 -0
- package/dist/admin/components/AIChat/hooks/useChatTitle.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useChatTitle.mjs +45 -0
- package/dist/admin/components/AIChat/hooks/useChatTitle.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useCodeUpload.js +212 -0
- package/dist/admin/components/AIChat/hooks/useCodeUpload.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useCodeUpload.mjs +207 -0
- package/dist/admin/components/AIChat/hooks/useCodeUpload.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useFeedback.js +76 -0
- package/dist/admin/components/AIChat/hooks/useFeedback.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useFeedback.mjs +74 -0
- package/dist/admin/components/AIChat/hooks/useFeedback.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useFigmaUpload.js +206 -0
- package/dist/admin/components/AIChat/hooks/useFigmaUpload.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useFigmaUpload.mjs +200 -0
- package/dist/admin/components/AIChat/hooks/useFigmaUpload.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.js +115 -0
- package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.mjs +113 -0
- package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useTranslations.js +19 -0
- package/dist/admin/components/AIChat/hooks/useTranslations.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useTranslations.mjs +17 -0
- package/dist/admin/components/AIChat/hooks/useTranslations.mjs.map +1 -0
- package/dist/admin/components/AIChat/lib/aiClient.js +168 -0
- package/dist/admin/components/AIChat/lib/aiClient.js.map +1 -0
- package/dist/admin/components/AIChat/lib/aiClient.mjs +161 -0
- package/dist/admin/components/AIChat/lib/aiClient.mjs.map +1 -0
- package/dist/admin/components/AIChat/lib/constants.js +16 -0
- package/dist/admin/components/AIChat/lib/constants.js.map +1 -0
- package/dist/admin/components/AIChat/lib/constants.mjs +10 -0
- package/dist/admin/components/AIChat/lib/constants.mjs.map +1 -0
- package/dist/admin/components/AIChat/lib/misc.js +8 -0
- package/dist/admin/components/AIChat/lib/misc.js.map +1 -0
- package/dist/admin/components/AIChat/lib/misc.mjs +6 -0
- package/dist/admin/components/AIChat/lib/misc.mjs.map +1 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.js +46 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.js.map +1 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.mjs +44 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.mjs.map +1 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js +151 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js.map +1 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.mjs +148 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.mjs.map +1 -0
- package/dist/admin/components/AIChat/providers/ChatProvider.js +191 -0
- package/dist/admin/components/AIChat/providers/ChatProvider.js.map +1 -0
- package/dist/admin/components/AIChat/providers/ChatProvider.mjs +187 -0
- package/dist/admin/components/AIChat/providers/ChatProvider.mjs.map +1 -0
- package/dist/admin/components/AIChat/providers/SchemaProvider.js +90 -0
- package/dist/admin/components/AIChat/providers/SchemaProvider.js.map +1 -0
- package/dist/admin/components/AIChat/providers/SchemaProvider.mjs +88 -0
- package/dist/admin/components/AIChat/providers/SchemaProvider.mjs.map +1 -0
- package/dist/admin/components/ComponentList.js +1 -0
- package/dist/admin/components/ComponentList.js.map +1 -1
- package/dist/admin/components/ComponentList.mjs +1 -0
- package/dist/admin/components/ComponentList.mjs.map +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.js +165 -161
- package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.js.map +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.mjs +165 -161
- package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.mjs.map +1 -1
- package/dist/admin/components/DataManager/DataManagerContext.js.map +1 -1
- package/dist/admin/components/DataManager/DataManagerContext.mjs.map +1 -1
- package/dist/admin/components/DataManager/reducer.js +48 -6
- package/dist/admin/components/DataManager/reducer.js.map +1 -1
- package/dist/admin/components/DataManager/reducer.mjs +48 -6
- package/dist/admin/components/DataManager/reducer.mjs.map +1 -1
- package/dist/admin/components/FormModal/utils/canEditContentType.js.map +1 -1
- package/dist/admin/components/FormModal/utils/canEditContentType.mjs.map +1 -1
- package/dist/admin/pages/App/index.js +60 -29
- package/dist/admin/pages/App/index.js.map +1 -1
- package/dist/admin/pages/App/index.mjs +62 -31
- package/dist/admin/pages/App/index.mjs.map +1 -1
- package/dist/admin/pages/ListView/EmptyState.js +75 -9
- package/dist/admin/pages/ListView/EmptyState.js.map +1 -1
- package/dist/admin/pages/ListView/EmptyState.mjs +77 -11
- package/dist/admin/pages/ListView/EmptyState.mjs.map +1 -1
- package/dist/admin/src/components/AIChat/Chat.d.ts +2 -0
- package/dist/admin/src/components/AIChat/FeedbackModal.d.ts +13 -0
- package/dist/admin/src/components/AIChat/UploadCodeModal.d.ts +12 -0
- package/dist/admin/src/components/AIChat/UploadFigmaModal.d.ts +12 -0
- package/dist/admin/src/components/AIChat/components/Alert.d.ts +6 -0
- package/dist/admin/src/components/AIChat/components/AnimatedBox.d.ts +13 -0
- package/dist/admin/src/components/AIChat/components/Attachments/AttachmentPreview.d.ts +9 -0
- package/dist/admin/src/components/AIChat/components/Attachments/components/Attachment.d.ts +27 -0
- package/dist/admin/src/components/AIChat/components/Base64Image.d.ts +9 -0
- package/dist/admin/src/components/AIChat/components/Collapsible.d.ts +18 -0
- package/dist/admin/src/components/AIChat/components/Dropzone.d.ts +35 -0
- package/dist/admin/src/components/AIChat/components/FloatingPanel.d.ts +34 -0
- package/dist/admin/src/components/AIChat/components/FullScreenImage.d.ts +20 -0
- package/dist/admin/src/components/AIChat/components/ImagePreview.d.ts +8 -0
- package/dist/admin/src/components/AIChat/components/ImagePreviewGroup.d.ts +7 -0
- package/dist/admin/src/components/AIChat/components/Input.d.ts +43 -0
- package/dist/admin/src/components/AIChat/components/Messages/Marker.d.ts +2 -0
- package/dist/admin/src/components/AIChat/components/Messages/Message.d.ts +5 -0
- package/dist/admin/src/components/AIChat/components/ResizableTextArea.d.ts +9 -0
- package/dist/admin/src/components/AIChat/components/SimpleMenu.d.ts +32 -0
- package/dist/admin/src/components/AIChat/components/StepModal.d.ts +37 -0
- package/dist/admin/src/components/AIChat/components/animations.d.ts +8 -0
- package/dist/admin/src/components/AIChat/components/icons/FigmaIcon.d.ts +5 -0
- package/dist/admin/src/components/AIChat/components/icons/StopIcon.d.ts +5 -0
- package/dist/admin/src/components/AIChat/hooks/useAIFetch.d.ts +147 -0
- package/dist/admin/src/components/AIChat/hooks/useAttachments.d.ts +8 -0
- package/dist/admin/src/components/AIChat/hooks/useChatTitle.d.ts +13 -0
- package/dist/admin/src/components/AIChat/hooks/useCodeUpload.d.ts +31 -0
- package/dist/admin/src/components/AIChat/hooks/useFeedback.d.ts +7 -0
- package/dist/admin/src/components/AIChat/hooks/useFigmaUpload.d.ts +61 -0
- package/dist/admin/src/components/AIChat/hooks/useLastSeenSchemas.d.ts +10 -0
- package/dist/admin/src/components/AIChat/hooks/useTranslations.d.ts +3 -0
- package/dist/admin/src/components/AIChat/lib/aiClient.d.ts +32 -0
- package/dist/admin/src/components/AIChat/lib/constants.d.ts +12 -0
- package/dist/admin/src/components/AIChat/lib/fileToAttachment.d.ts +2 -0
- package/dist/admin/src/components/AIChat/lib/misc.d.ts +1 -0
- package/dist/admin/src/components/AIChat/lib/transforms/schemas/fromCTB.d.ts +3 -0
- package/dist/admin/src/components/AIChat/lib/transforms/schemas/toCTB.d.ts +16 -0
- package/dist/admin/src/components/AIChat/lib/types/annotations.d.ts +19 -0
- package/dist/admin/src/components/AIChat/lib/types/attachments.d.ts +15 -0
- package/dist/admin/src/components/AIChat/lib/types/feedback.d.ts +1 -0
- package/dist/admin/src/components/AIChat/lib/types/messages.d.ts +26 -0
- package/dist/admin/src/components/AIChat/lib/types/schema.d.ts +20 -0
- package/dist/admin/src/components/AIChat/providers/ChatProvider.d.ts +30 -0
- package/dist/admin/src/components/AIChat/providers/SchemaProvider.d.ts +10 -0
- package/dist/admin/src/components/ComponentList.d.ts +1 -1
- package/dist/admin/src/components/DataManager/DataManagerContext.d.ts +1 -1
- package/dist/admin/translations/ar.json.js +187 -2
- package/dist/admin/translations/ar.json.js.map +1 -1
- package/dist/admin/translations/ar.json.mjs +187 -3
- package/dist/admin/translations/ar.json.mjs.map +1 -1
- package/dist/admin/translations/de.json.js +42 -7
- package/dist/admin/translations/de.json.js.map +1 -1
- package/dist/admin/translations/de.json.mjs +42 -7
- package/dist/admin/translations/de.json.mjs.map +1 -1
- package/dist/admin/translations/en.json.js +53 -2
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +53 -2
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/translations/es.json.js +37 -15
- package/dist/admin/translations/es.json.js.map +1 -1
- package/dist/admin/translations/es.json.mjs +37 -15
- package/dist/admin/translations/es.json.mjs.map +1 -1
- package/dist/admin/translations/fr.json.js +165 -3
- package/dist/admin/translations/fr.json.js.map +1 -1
- package/dist/admin/translations/fr.json.mjs +165 -4
- package/dist/admin/translations/fr.json.mjs.map +1 -1
- package/dist/admin/translations/id.json.js +93 -23
- package/dist/admin/translations/id.json.js.map +1 -1
- package/dist/admin/translations/id.json.mjs +93 -23
- package/dist/admin/translations/id.json.mjs.map +1 -1
- package/dist/admin/translations/it.json.js +75 -6
- package/dist/admin/translations/it.json.js.map +1 -1
- package/dist/admin/translations/it.json.mjs +75 -6
- package/dist/admin/translations/it.json.mjs.map +1 -1
- package/dist/admin/translations/ja.json.js +191 -5
- package/dist/admin/translations/ja.json.js.map +1 -1
- package/dist/admin/translations/ja.json.mjs +191 -6
- package/dist/admin/translations/ja.json.mjs.map +1 -1
- package/dist/admin/translations/ko.json.js +70 -16
- package/dist/admin/translations/ko.json.js.map +1 -1
- package/dist/admin/translations/ko.json.mjs +70 -16
- package/dist/admin/translations/ko.json.mjs.map +1 -1
- package/dist/admin/translations/ms.json.js +104 -31
- package/dist/admin/translations/ms.json.js.map +1 -1
- package/dist/admin/translations/ms.json.mjs +104 -31
- package/dist/admin/translations/ms.json.mjs.map +1 -1
- package/dist/admin/translations/nl.json.js +95 -15
- package/dist/admin/translations/nl.json.js.map +1 -1
- package/dist/admin/translations/nl.json.mjs +95 -15
- package/dist/admin/translations/nl.json.mjs.map +1 -1
- package/dist/admin/translations/pl.json.js +55 -11
- package/dist/admin/translations/pl.json.js.map +1 -1
- package/dist/admin/translations/pl.json.mjs +55 -11
- package/dist/admin/translations/pl.json.mjs.map +1 -1
- package/dist/admin/translations/pt-BR.json.js +54 -10
- package/dist/admin/translations/pt-BR.json.js.map +1 -1
- package/dist/admin/translations/pt-BR.json.mjs +54 -10
- package/dist/admin/translations/pt-BR.json.mjs.map +1 -1
- package/dist/admin/translations/pt.json.js +187 -2
- package/dist/admin/translations/pt.json.js.map +1 -1
- package/dist/admin/translations/pt.json.mjs +187 -3
- package/dist/admin/translations/pt.json.mjs.map +1 -1
- package/dist/admin/translations/ru.json.js +26 -1
- package/dist/admin/translations/ru.json.js.map +1 -1
- package/dist/admin/translations/ru.json.mjs +26 -1
- package/dist/admin/translations/ru.json.mjs.map +1 -1
- package/dist/admin/translations/sk.json.js +21 -1
- package/dist/admin/translations/sk.json.js.map +1 -1
- package/dist/admin/translations/sk.json.mjs +21 -1
- package/dist/admin/translations/sk.json.mjs.map +1 -1
- package/dist/admin/translations/sv.json.js +21 -1
- package/dist/admin/translations/sv.json.js.map +1 -1
- package/dist/admin/translations/sv.json.mjs +21 -1
- package/dist/admin/translations/sv.json.mjs.map +1 -1
- package/dist/admin/translations/th.json.js +21 -1
- package/dist/admin/translations/th.json.js.map +1 -1
- package/dist/admin/translations/th.json.mjs +21 -1
- package/dist/admin/translations/th.json.mjs.map +1 -1
- package/dist/admin/translations/tr.json.js +21 -1
- package/dist/admin/translations/tr.json.js.map +1 -1
- package/dist/admin/translations/tr.json.mjs +21 -1
- package/dist/admin/translations/tr.json.mjs.map +1 -1
- package/dist/admin/translations/uk.json.js +21 -2
- package/dist/admin/translations/uk.json.js.map +1 -1
- package/dist/admin/translations/uk.json.mjs +21 -2
- package/dist/admin/translations/uk.json.mjs.map +1 -1
- package/dist/admin/translations/zh-Hans.json.js +222 -133
- package/dist/admin/translations/zh-Hans.json.js.map +1 -1
- package/dist/admin/translations/zh-Hans.json.mjs +222 -133
- package/dist/admin/translations/zh-Hans.json.mjs.map +1 -1
- package/dist/admin/translations/zh.json.js +21 -1
- package/dist/admin/translations/zh.json.js.map +1 -1
- package/dist/admin/translations/zh.json.mjs +21 -1
- package/dist/admin/translations/zh.json.mjs.map +1 -1
- package/dist/server/index.js +2 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +2 -0
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/register.js +98 -0
- package/dist/server/register.js.map +1 -0
- package/dist/server/register.mjs +96 -0
- package/dist/server/register.mjs.map +1 -0
- package/dist/server/src/controllers/ai/auth.d.ts +1 -0
- package/dist/server/src/controllers/ai/auth.d.ts.map +1 -0
- package/dist/server/src/controllers/ai/index.d.ts +1 -0
- package/dist/server/src/controllers/ai/index.d.ts.map +1 -0
- package/dist/server/src/index.d.ts +1 -0
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/register.d.ts +11 -0
- package/dist/server/src/register.d.ts.map +1 -0
- package/package.json +12 -5
- package/dist/admin/components/DataManager/utils/formatSchemas.js +0 -21
- package/dist/admin/components/DataManager/utils/formatSchemas.js.map +0 -1
- package/dist/admin/components/DataManager/utils/formatSchemas.mjs +0 -18
- package/dist/admin/components/DataManager/utils/formatSchemas.mjs.map +0 -1
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var designSystem = require('@strapi/design-system');
|
|
5
|
+
var Icons = require('@strapi/icons');
|
|
6
|
+
var Markdown = require('react-markdown');
|
|
7
|
+
var styledComponents = require('styled-components');
|
|
8
|
+
var FeedbackModal = require('../../FeedbackModal.js');
|
|
9
|
+
var useFeedback = require('../../hooks/useFeedback.js');
|
|
10
|
+
var AnimatedBox = require('../AnimatedBox.js');
|
|
11
|
+
var AttachmentPreview = require('../Attachments/AttachmentPreview.js');
|
|
12
|
+
var Marker = require('./Marker.js');
|
|
13
|
+
|
|
14
|
+
const MarkdownStyles = styledComponents.styled(designSystem.Typography)`
|
|
15
|
+
max-width: 65ch;
|
|
16
|
+
margin: 0 auto;
|
|
17
|
+
|
|
18
|
+
h1,
|
|
19
|
+
h2,
|
|
20
|
+
h3,
|
|
21
|
+
h4,
|
|
22
|
+
h5,
|
|
23
|
+
h6 {
|
|
24
|
+
margin-top: 1.25em;
|
|
25
|
+
margin-bottom: 0.5em;
|
|
26
|
+
font-weight: bold;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
p {
|
|
30
|
+
margin-bottom: 1em;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
ul,
|
|
34
|
+
ol {
|
|
35
|
+
padding-left: 1.5em; /* indentation for bullet points */
|
|
36
|
+
margin-bottom: 1em;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
li {
|
|
40
|
+
margin-bottom: 0.5em;
|
|
41
|
+
list-style-type: disc; /* or whatever style you prefer */
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
strong {
|
|
45
|
+
font-weight: bold;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/* code blocks, blockquotes, etc. */
|
|
49
|
+
code {
|
|
50
|
+
background-color: ${({ theme })=>theme.colors.neutral100};
|
|
51
|
+
padding: 0.2em 0.4em;
|
|
52
|
+
border-radius: ${({ theme })=>theme.borderRadius};
|
|
53
|
+
border-color: ${({ theme })=>theme.colors.neutral150};
|
|
54
|
+
border-style: solid;
|
|
55
|
+
font-family: 'SF Mono', SFMono-Regular, ui-monospace, 'DejaVu Sans Mono', Menlo, Consolas,
|
|
56
|
+
monospace;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* links */
|
|
60
|
+
a {
|
|
61
|
+
color: ${({ theme })=>theme.colors.primary500};
|
|
62
|
+
background-color: ${({ theme })=>theme.colors.neutral100};
|
|
63
|
+
padding: 0.2em 0.4em;
|
|
64
|
+
border-radius: ${({ theme })=>theme.borderRadius};
|
|
65
|
+
border-color: ${({ theme })=>theme.colors.neutral150};
|
|
66
|
+
border-style: solid;
|
|
67
|
+
text-decoration: none;
|
|
68
|
+
|
|
69
|
+
&:hover {
|
|
70
|
+
text-decoration: underline;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
`;
|
|
74
|
+
const isSchemaToolPart = (part)=>part && typeof part === 'object' && part.type === 'tool-schemaGenerationTool';
|
|
75
|
+
const capitalize = (s)=>s ? s.charAt(0).toUpperCase() + s.slice(1) : '';
|
|
76
|
+
const getSchemaLink = (schema)=>{
|
|
77
|
+
const isComponent = (schema.kind ?? schema.modelType) === 'component';
|
|
78
|
+
if (!schema.uid) return undefined;
|
|
79
|
+
return isComponent ? `/plugins/content-type-builder/component-categories/${schema.category ?? ''}/${schema.uid}` : `/plugins/content-type-builder/content-types/${schema.uid}`;
|
|
80
|
+
};
|
|
81
|
+
const toMarkerFromSchemaTool = (part)=>{
|
|
82
|
+
const outSchemas = part.output?.schemas ?? [];
|
|
83
|
+
const inSchemas = part.input?.schemas ?? [];
|
|
84
|
+
const schemas = outSchemas.length ? outSchemas : inSchemas;
|
|
85
|
+
const numSchemas = schemas.length;
|
|
86
|
+
const state = part.output ? part.output.error ? 'error' : 'success' : 'loading';
|
|
87
|
+
const steps = schemas.map((schema, index)=>({
|
|
88
|
+
id: `${part.toolCallId ?? 'schemaGenerationTool'}-${schema.uid ?? schema.name ?? index}`,
|
|
89
|
+
description: capitalize(schema.name ?? schema.uid ?? 'Schema'),
|
|
90
|
+
status: schema.action === 'create' || schema.action === 'update' || schema.action === 'remove' ? schema.action : 'update',
|
|
91
|
+
link: getSchemaLink(schema)
|
|
92
|
+
}));
|
|
93
|
+
const title = state === 'success' ? `Updated ${numSchemas} schema${numSchemas === 1 ? '' : 's'}` : state === 'error' ? `Failed to update schema${numSchemas === 1 ? '' : 's'}` : 'Updating schemas';
|
|
94
|
+
return {
|
|
95
|
+
type: 'marker',
|
|
96
|
+
title,
|
|
97
|
+
state,
|
|
98
|
+
steps
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
const MessageContent = ({ part })=>{
|
|
102
|
+
if (part.type === 'text') {
|
|
103
|
+
return /*#__PURE__*/ jsxRuntime.jsx(MarkdownStyles, {
|
|
104
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(Markdown, {
|
|
105
|
+
components: {
|
|
106
|
+
a: ({ node, ...props })=>/*#__PURE__*/ jsxRuntime.jsx("a", {
|
|
107
|
+
target: "_blank",
|
|
108
|
+
rel: "noopener noreferrer",
|
|
109
|
+
...props
|
|
110
|
+
})
|
|
111
|
+
},
|
|
112
|
+
children: part.text
|
|
113
|
+
})
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
if (isSchemaToolPart(part)) {
|
|
117
|
+
const marker = toMarkerFromSchemaTool(part);
|
|
118
|
+
return /*#__PURE__*/ jsxRuntime.jsx(Marker.Marker, {
|
|
119
|
+
...marker
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
return null;
|
|
123
|
+
};
|
|
124
|
+
const UserMessage = ({ message })=>{
|
|
125
|
+
const hasText = message.parts.some((content)=>content.type === 'text' && content.text.trim() !== '');
|
|
126
|
+
const attachments = message.parts.filter((content)=>content.type === 'file');
|
|
127
|
+
return /*#__PURE__*/ jsxRuntime.jsxs(AnimatedBox.AnimatedBox, {
|
|
128
|
+
as: designSystem.Flex,
|
|
129
|
+
direction: "column",
|
|
130
|
+
alignItems: "flex-end",
|
|
131
|
+
style: {
|
|
132
|
+
alignSelf: 'flex-end'
|
|
133
|
+
},
|
|
134
|
+
gap: 2,
|
|
135
|
+
maxWidth: "80%",
|
|
136
|
+
children: [
|
|
137
|
+
hasText ? /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
|
|
138
|
+
background: "neutral150",
|
|
139
|
+
borderStyle: "none",
|
|
140
|
+
padding: [
|
|
141
|
+
'10px',
|
|
142
|
+
'16px'
|
|
143
|
+
],
|
|
144
|
+
hasRadius: true,
|
|
145
|
+
children: message.parts.map((content, index)=>{
|
|
146
|
+
if (content.type !== 'text') return null;
|
|
147
|
+
return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
|
|
148
|
+
children: content.text
|
|
149
|
+
}, index);
|
|
150
|
+
})
|
|
151
|
+
}) : null,
|
|
152
|
+
attachments.map((attachment, idx)=>/*#__PURE__*/ jsxRuntime.jsx(AttachmentPreview.AttachmentPreview, {
|
|
153
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
154
|
+
attachment: {
|
|
155
|
+
...attachment,
|
|
156
|
+
status: 'ready'
|
|
157
|
+
}
|
|
158
|
+
}, `${attachment.type === 'file' ? attachment.filename : attachment.type}-${idx}`))
|
|
159
|
+
]
|
|
160
|
+
});
|
|
161
|
+
};
|
|
162
|
+
const AssistantMessage = ({ message, isLoading })=>{
|
|
163
|
+
const { upvoteMessage } = useFeedback.useFeedback();
|
|
164
|
+
const { openFeedbackModal } = FeedbackModal.useFeedbackModal();
|
|
165
|
+
return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Box, {
|
|
166
|
+
style: {
|
|
167
|
+
alignSelf: 'flex-start'
|
|
168
|
+
},
|
|
169
|
+
maxWidth: "90%",
|
|
170
|
+
children: [
|
|
171
|
+
message.parts.map((content, index)=>/*#__PURE__*/ jsxRuntime.jsx(MessageContent, {
|
|
172
|
+
part: content
|
|
173
|
+
}, index)),
|
|
174
|
+
isLoading ? /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
|
|
175
|
+
gap: 1,
|
|
176
|
+
children: [
|
|
177
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
|
|
178
|
+
label: "Upvote",
|
|
179
|
+
size: "XS",
|
|
180
|
+
variant: "ghost",
|
|
181
|
+
onClick: ()=>upvoteMessage(message.id),
|
|
182
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(Icons.ThumbUp, {})
|
|
183
|
+
}),
|
|
184
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
|
|
185
|
+
label: "Downvote",
|
|
186
|
+
size: "XS",
|
|
187
|
+
variant: "ghost",
|
|
188
|
+
// For downvoting, user must provide specific feedback
|
|
189
|
+
onClick: ()=>openFeedbackModal(message.id),
|
|
190
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(Icons.ThumbDown, {})
|
|
191
|
+
})
|
|
192
|
+
]
|
|
193
|
+
}) : null
|
|
194
|
+
]
|
|
195
|
+
});
|
|
196
|
+
};
|
|
197
|
+
const ChatMessage = ({ message, isLoading })=>{
|
|
198
|
+
/**
|
|
199
|
+
* IMPORTANT: Messages are rendered using react-markdown (heavy compute)
|
|
200
|
+
* Component re-renders on each message update, but AI SDK v5 provides
|
|
201
|
+
* throttling (experimental_throttle: 100ms) which batches updates and reduces
|
|
202
|
+
* re-render frequency during streaming.
|
|
203
|
+
*/ if (message.role === 'user') {
|
|
204
|
+
return /*#__PURE__*/ jsxRuntime.jsx(UserMessage, {
|
|
205
|
+
message: message
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
return /*#__PURE__*/ jsxRuntime.jsx(AssistantMessage, {
|
|
209
|
+
message: message
|
|
210
|
+
});
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
exports.ChatMessage = ChatMessage;
|
|
214
|
+
//# sourceMappingURL=Message.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Message.js","sources":["../../../../../../admin/src/components/AIChat/components/Messages/Message.tsx"],"sourcesContent":["import { Typography, Box, IconButton, Flex } from '@strapi/design-system';\nimport { ThumbUp, ThumbDown } from '@strapi/icons';\nimport Markdown from 'react-markdown';\nimport { styled } from 'styled-components';\n\nimport { useFeedbackModal } from '../../FeedbackModal';\nimport { useFeedback } from '../../hooks/useFeedback';\nimport {\n AIMessage,\n type UserMessage as UserMessageType,\n AssistantMessage as AssistantMessageType,\n type MarkerContent as MarkerContentType,\n} from '../../lib/types/messages';\nimport { AnimatedBox } from '../AnimatedBox';\nimport { AttachmentPreview } from '../Attachments/AttachmentPreview';\n\nimport { Marker } from './Marker';\n\nconst MarkdownStyles = styled(Typography)`\n max-width: 65ch;\n margin: 0 auto;\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n margin-top: 1.25em;\n margin-bottom: 0.5em;\n font-weight: bold;\n }\n\n p {\n margin-bottom: 1em;\n }\n\n ul,\n ol {\n padding-left: 1.5em; /* indentation for bullet points */\n margin-bottom: 1em;\n }\n\n li {\n margin-bottom: 0.5em;\n list-style-type: disc; /* or whatever style you prefer */\n }\n\n strong {\n font-weight: bold;\n }\n\n /* code blocks, blockquotes, etc. */\n code {\n background-color: ${({ theme }) => theme.colors.neutral100};\n padding: 0.2em 0.4em;\n border-radius: ${({ theme }) => theme.borderRadius};\n border-color: ${({ theme }) => theme.colors.neutral150};\n border-style: solid;\n font-family: 'SF Mono', SFMono-Regular, ui-monospace, 'DejaVu Sans Mono', Menlo, Consolas,\n monospace;\n }\n\n /* links */\n a {\n color: ${({ theme }) => theme.colors.primary500};\n background-color: ${({ theme }) => theme.colors.neutral100};\n padding: 0.2em 0.4em;\n border-radius: ${({ theme }) => theme.borderRadius};\n border-color: ${({ theme }) => theme.colors.neutral150};\n border-style: solid;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n`;\n\n// ---------------------------\n// Tool: schemaGenerationTool helpers\n// ---------------------------\n\ntype SchemaToolSchema = {\n action?: 'create' | 'update' | 'remove';\n uid?: string;\n name?: string;\n category?: string;\n kind?: 'collectionType' | 'singleType' | 'component';\n modelType?: 'component' | 'collectionType' | 'singleType';\n};\n\ntype SchemaToolPart = {\n type: 'tool-schemaGenerationTool';\n input?: { schemas?: SchemaToolSchema[] };\n output?: { schemas?: SchemaToolSchema[]; error?: unknown };\n toolCallId?: string;\n};\n\nconst isSchemaToolPart = (part: any): part is SchemaToolPart =>\n part && typeof part === 'object' && part.type === 'tool-schemaGenerationTool';\n\nconst capitalize = (s?: string) => (s ? s.charAt(0).toUpperCase() + s.slice(1) : '');\n\nconst getSchemaLink = (schema: SchemaToolSchema): string | undefined => {\n const isComponent = (schema.kind ?? schema.modelType) === 'component';\n if (!schema.uid) return undefined;\n return isComponent\n ? `/plugins/content-type-builder/component-categories/${schema.category ?? ''}/${schema.uid}`\n : `/plugins/content-type-builder/content-types/${schema.uid}`;\n};\n\nconst toMarkerFromSchemaTool = (part: SchemaToolPart): MarkerContentType => {\n const outSchemas = part.output?.schemas ?? [];\n const inSchemas = part.input?.schemas ?? [];\n\n const schemas = (outSchemas.length ? outSchemas : inSchemas) as SchemaToolSchema[];\n const numSchemas = schemas.length;\n\n const state: 'loading' | 'success' | 'error' = part.output\n ? part.output.error\n ? 'error'\n : 'success'\n : 'loading';\n\n const steps = schemas.map((schema, index) => ({\n id: `${part.toolCallId ?? 'schemaGenerationTool'}-${schema.uid ?? schema.name ?? index}`,\n description: capitalize(schema.name ?? schema.uid ?? 'Schema'),\n status:\n schema.action === 'create' || schema.action === 'update' || schema.action === 'remove'\n ? schema.action\n : ('update' as const),\n link: getSchemaLink(schema),\n }));\n\n const title =\n state === 'success'\n ? `Updated ${numSchemas} schema${numSchemas === 1 ? '' : 's'}`\n : state === 'error'\n ? `Failed to update schema${numSchemas === 1 ? '' : 's'}`\n : 'Updating schemas';\n\n return {\n type: 'marker',\n title,\n state,\n steps,\n };\n};\n\nconst MessageContent = ({\n part,\n}: {\n part: AIMessage['parts'][number];\n status?: 'loading' | 'success' | 'error';\n}) => {\n if (part.type === 'text') {\n return (\n <MarkdownStyles>\n <Markdown\n components={{\n a: ({ node, ...props }) => <a target=\"_blank\" rel=\"noopener noreferrer\" {...props} />,\n }}\n >\n {part.text}\n </Markdown>\n </MarkdownStyles>\n );\n }\n\n if (isSchemaToolPart(part)) {\n const marker = toMarkerFromSchemaTool(part);\n return <Marker {...marker} />;\n }\n\n return null;\n};\n\nconst UserMessage = ({ message }: { message: UserMessageType }) => {\n const hasText = message.parts.some(\n (content) => content.type === 'text' && content.text.trim() !== ''\n );\n const attachments = message.parts.filter((content) => content.type === 'file');\n\n return (\n <AnimatedBox\n as={Flex}\n direction=\"column\"\n alignItems=\"flex-end\"\n style={{ alignSelf: 'flex-end' }}\n gap={2}\n maxWidth=\"80%\"\n >\n {hasText ? (\n <Box background=\"neutral150\" borderStyle=\"none\" padding={['10px', '16px']} hasRadius>\n {message.parts.map((content, index) => {\n if (content.type !== 'text') return null;\n return <Typography key={index}>{content.text}</Typography>;\n })}\n </Box>\n ) : null}\n\n {/* Attachments */}\n {attachments.map((attachment, idx) => (\n <AttachmentPreview\n key={`${attachment.type === 'file' ? attachment.filename : attachment.type}-${idx}`}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n attachment={{ ...attachment, status: 'ready' } as any}\n />\n ))}\n </AnimatedBox>\n );\n};\n\nconst AssistantMessage = ({\n message,\n isLoading,\n}: {\n message: AssistantMessageType;\n isLoading?: boolean;\n}) => {\n const { upvoteMessage } = useFeedback();\n const { openFeedbackModal } = useFeedbackModal();\n\n return (\n <Box style={{ alignSelf: 'flex-start' }} maxWidth=\"90%\">\n {message.parts.map((content, index) => (\n <MessageContent key={index} part={content} />\n ))}\n {isLoading ? (\n <Flex gap={1}>\n <IconButton\n label=\"Upvote\"\n size=\"XS\"\n variant=\"ghost\"\n onClick={() => upvoteMessage(message.id)}\n >\n <ThumbUp />\n </IconButton>\n <IconButton\n label=\"Downvote\"\n size=\"XS\"\n variant=\"ghost\"\n // For downvoting, user must provide specific feedback\n onClick={() => openFeedbackModal(message.id)}\n >\n <ThumbDown />\n </IconButton>\n </Flex>\n ) : null}\n </Box>\n );\n};\n\nexport const ChatMessage = ({\n message,\n isLoading,\n}: {\n message: AIMessage;\n isLoading?: boolean;\n}) => {\n /**\n * IMPORTANT: Messages are rendered using react-markdown (heavy compute)\n * Component re-renders on each message update, but AI SDK v5 provides\n * throttling (experimental_throttle: 100ms) which batches updates and reduces\n * re-render frequency during streaming.\n */\n if (message.role === 'user') {\n return <UserMessage message={message as UserMessageType} />;\n }\n return <AssistantMessage message={message as AssistantMessageType} />;\n};\n"],"names":["MarkdownStyles","styled","Typography","theme","colors","neutral100","borderRadius","neutral150","primary500","isSchemaToolPart","part","type","capitalize","s","charAt","toUpperCase","slice","getSchemaLink","schema","isComponent","kind","modelType","uid","undefined","category","toMarkerFromSchemaTool","outSchemas","output","schemas","inSchemas","input","length","numSchemas","state","error","steps","map","index","id","toolCallId","name","description","status","action","link","title","MessageContent","_jsx","Markdown","components","a","node","props","target","rel","text","marker","Marker","UserMessage","message","hasText","parts","some","content","trim","attachments","filter","_jsxs","AnimatedBox","as","Flex","direction","alignItems","style","alignSelf","gap","maxWidth","Box","background","borderStyle","padding","hasRadius","attachment","idx","AttachmentPreview","filename","AssistantMessage","isLoading","upvoteMessage","useFeedback","openFeedbackModal","useFeedbackModal","IconButton","label","size","variant","onClick","ThumbUp","ThumbDown","ChatMessage","role"],"mappings":"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"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { Typography, Flex, Box, IconButton } from '@strapi/design-system';
|
|
3
|
+
import { ThumbUp, ThumbDown } from '@strapi/icons';
|
|
4
|
+
import Markdown from 'react-markdown';
|
|
5
|
+
import { styled } from 'styled-components';
|
|
6
|
+
import { useFeedbackModal } from '../../FeedbackModal.mjs';
|
|
7
|
+
import { useFeedback } from '../../hooks/useFeedback.mjs';
|
|
8
|
+
import { AnimatedBox } from '../AnimatedBox.mjs';
|
|
9
|
+
import { AttachmentPreview } from '../Attachments/AttachmentPreview.mjs';
|
|
10
|
+
import { Marker } from './Marker.mjs';
|
|
11
|
+
|
|
12
|
+
const MarkdownStyles = styled(Typography)`
|
|
13
|
+
max-width: 65ch;
|
|
14
|
+
margin: 0 auto;
|
|
15
|
+
|
|
16
|
+
h1,
|
|
17
|
+
h2,
|
|
18
|
+
h3,
|
|
19
|
+
h4,
|
|
20
|
+
h5,
|
|
21
|
+
h6 {
|
|
22
|
+
margin-top: 1.25em;
|
|
23
|
+
margin-bottom: 0.5em;
|
|
24
|
+
font-weight: bold;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
p {
|
|
28
|
+
margin-bottom: 1em;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
ul,
|
|
32
|
+
ol {
|
|
33
|
+
padding-left: 1.5em; /* indentation for bullet points */
|
|
34
|
+
margin-bottom: 1em;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
li {
|
|
38
|
+
margin-bottom: 0.5em;
|
|
39
|
+
list-style-type: disc; /* or whatever style you prefer */
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
strong {
|
|
43
|
+
font-weight: bold;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/* code blocks, blockquotes, etc. */
|
|
47
|
+
code {
|
|
48
|
+
background-color: ${({ theme })=>theme.colors.neutral100};
|
|
49
|
+
padding: 0.2em 0.4em;
|
|
50
|
+
border-radius: ${({ theme })=>theme.borderRadius};
|
|
51
|
+
border-color: ${({ theme })=>theme.colors.neutral150};
|
|
52
|
+
border-style: solid;
|
|
53
|
+
font-family: 'SF Mono', SFMono-Regular, ui-monospace, 'DejaVu Sans Mono', Menlo, Consolas,
|
|
54
|
+
monospace;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/* links */
|
|
58
|
+
a {
|
|
59
|
+
color: ${({ theme })=>theme.colors.primary500};
|
|
60
|
+
background-color: ${({ theme })=>theme.colors.neutral100};
|
|
61
|
+
padding: 0.2em 0.4em;
|
|
62
|
+
border-radius: ${({ theme })=>theme.borderRadius};
|
|
63
|
+
border-color: ${({ theme })=>theme.colors.neutral150};
|
|
64
|
+
border-style: solid;
|
|
65
|
+
text-decoration: none;
|
|
66
|
+
|
|
67
|
+
&:hover {
|
|
68
|
+
text-decoration: underline;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
`;
|
|
72
|
+
const isSchemaToolPart = (part)=>part && typeof part === 'object' && part.type === 'tool-schemaGenerationTool';
|
|
73
|
+
const capitalize = (s)=>s ? s.charAt(0).toUpperCase() + s.slice(1) : '';
|
|
74
|
+
const getSchemaLink = (schema)=>{
|
|
75
|
+
const isComponent = (schema.kind ?? schema.modelType) === 'component';
|
|
76
|
+
if (!schema.uid) return undefined;
|
|
77
|
+
return isComponent ? `/plugins/content-type-builder/component-categories/${schema.category ?? ''}/${schema.uid}` : `/plugins/content-type-builder/content-types/${schema.uid}`;
|
|
78
|
+
};
|
|
79
|
+
const toMarkerFromSchemaTool = (part)=>{
|
|
80
|
+
const outSchemas = part.output?.schemas ?? [];
|
|
81
|
+
const inSchemas = part.input?.schemas ?? [];
|
|
82
|
+
const schemas = outSchemas.length ? outSchemas : inSchemas;
|
|
83
|
+
const numSchemas = schemas.length;
|
|
84
|
+
const state = part.output ? part.output.error ? 'error' : 'success' : 'loading';
|
|
85
|
+
const steps = schemas.map((schema, index)=>({
|
|
86
|
+
id: `${part.toolCallId ?? 'schemaGenerationTool'}-${schema.uid ?? schema.name ?? index}`,
|
|
87
|
+
description: capitalize(schema.name ?? schema.uid ?? 'Schema'),
|
|
88
|
+
status: schema.action === 'create' || schema.action === 'update' || schema.action === 'remove' ? schema.action : 'update',
|
|
89
|
+
link: getSchemaLink(schema)
|
|
90
|
+
}));
|
|
91
|
+
const title = state === 'success' ? `Updated ${numSchemas} schema${numSchemas === 1 ? '' : 's'}` : state === 'error' ? `Failed to update schema${numSchemas === 1 ? '' : 's'}` : 'Updating schemas';
|
|
92
|
+
return {
|
|
93
|
+
type: 'marker',
|
|
94
|
+
title,
|
|
95
|
+
state,
|
|
96
|
+
steps
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
const MessageContent = ({ part })=>{
|
|
100
|
+
if (part.type === 'text') {
|
|
101
|
+
return /*#__PURE__*/ jsx(MarkdownStyles, {
|
|
102
|
+
children: /*#__PURE__*/ jsx(Markdown, {
|
|
103
|
+
components: {
|
|
104
|
+
a: ({ node, ...props })=>/*#__PURE__*/ jsx("a", {
|
|
105
|
+
target: "_blank",
|
|
106
|
+
rel: "noopener noreferrer",
|
|
107
|
+
...props
|
|
108
|
+
})
|
|
109
|
+
},
|
|
110
|
+
children: part.text
|
|
111
|
+
})
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
if (isSchemaToolPart(part)) {
|
|
115
|
+
const marker = toMarkerFromSchemaTool(part);
|
|
116
|
+
return /*#__PURE__*/ jsx(Marker, {
|
|
117
|
+
...marker
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
};
|
|
122
|
+
const UserMessage = ({ message })=>{
|
|
123
|
+
const hasText = message.parts.some((content)=>content.type === 'text' && content.text.trim() !== '');
|
|
124
|
+
const attachments = message.parts.filter((content)=>content.type === 'file');
|
|
125
|
+
return /*#__PURE__*/ jsxs(AnimatedBox, {
|
|
126
|
+
as: Flex,
|
|
127
|
+
direction: "column",
|
|
128
|
+
alignItems: "flex-end",
|
|
129
|
+
style: {
|
|
130
|
+
alignSelf: 'flex-end'
|
|
131
|
+
},
|
|
132
|
+
gap: 2,
|
|
133
|
+
maxWidth: "80%",
|
|
134
|
+
children: [
|
|
135
|
+
hasText ? /*#__PURE__*/ jsx(Box, {
|
|
136
|
+
background: "neutral150",
|
|
137
|
+
borderStyle: "none",
|
|
138
|
+
padding: [
|
|
139
|
+
'10px',
|
|
140
|
+
'16px'
|
|
141
|
+
],
|
|
142
|
+
hasRadius: true,
|
|
143
|
+
children: message.parts.map((content, index)=>{
|
|
144
|
+
if (content.type !== 'text') return null;
|
|
145
|
+
return /*#__PURE__*/ jsx(Typography, {
|
|
146
|
+
children: content.text
|
|
147
|
+
}, index);
|
|
148
|
+
})
|
|
149
|
+
}) : null,
|
|
150
|
+
attachments.map((attachment, idx)=>/*#__PURE__*/ jsx(AttachmentPreview, {
|
|
151
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
152
|
+
attachment: {
|
|
153
|
+
...attachment,
|
|
154
|
+
status: 'ready'
|
|
155
|
+
}
|
|
156
|
+
}, `${attachment.type === 'file' ? attachment.filename : attachment.type}-${idx}`))
|
|
157
|
+
]
|
|
158
|
+
});
|
|
159
|
+
};
|
|
160
|
+
const AssistantMessage = ({ message, isLoading })=>{
|
|
161
|
+
const { upvoteMessage } = useFeedback();
|
|
162
|
+
const { openFeedbackModal } = useFeedbackModal();
|
|
163
|
+
return /*#__PURE__*/ jsxs(Box, {
|
|
164
|
+
style: {
|
|
165
|
+
alignSelf: 'flex-start'
|
|
166
|
+
},
|
|
167
|
+
maxWidth: "90%",
|
|
168
|
+
children: [
|
|
169
|
+
message.parts.map((content, index)=>/*#__PURE__*/ jsx(MessageContent, {
|
|
170
|
+
part: content
|
|
171
|
+
}, index)),
|
|
172
|
+
isLoading ? /*#__PURE__*/ jsxs(Flex, {
|
|
173
|
+
gap: 1,
|
|
174
|
+
children: [
|
|
175
|
+
/*#__PURE__*/ jsx(IconButton, {
|
|
176
|
+
label: "Upvote",
|
|
177
|
+
size: "XS",
|
|
178
|
+
variant: "ghost",
|
|
179
|
+
onClick: ()=>upvoteMessage(message.id),
|
|
180
|
+
children: /*#__PURE__*/ jsx(ThumbUp, {})
|
|
181
|
+
}),
|
|
182
|
+
/*#__PURE__*/ jsx(IconButton, {
|
|
183
|
+
label: "Downvote",
|
|
184
|
+
size: "XS",
|
|
185
|
+
variant: "ghost",
|
|
186
|
+
// For downvoting, user must provide specific feedback
|
|
187
|
+
onClick: ()=>openFeedbackModal(message.id),
|
|
188
|
+
children: /*#__PURE__*/ jsx(ThumbDown, {})
|
|
189
|
+
})
|
|
190
|
+
]
|
|
191
|
+
}) : null
|
|
192
|
+
]
|
|
193
|
+
});
|
|
194
|
+
};
|
|
195
|
+
const ChatMessage = ({ message, isLoading })=>{
|
|
196
|
+
/**
|
|
197
|
+
* IMPORTANT: Messages are rendered using react-markdown (heavy compute)
|
|
198
|
+
* Component re-renders on each message update, but AI SDK v5 provides
|
|
199
|
+
* throttling (experimental_throttle: 100ms) which batches updates and reduces
|
|
200
|
+
* re-render frequency during streaming.
|
|
201
|
+
*/ if (message.role === 'user') {
|
|
202
|
+
return /*#__PURE__*/ jsx(UserMessage, {
|
|
203
|
+
message: message
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
return /*#__PURE__*/ jsx(AssistantMessage, {
|
|
207
|
+
message: message
|
|
208
|
+
});
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
export { ChatMessage };
|
|
212
|
+
//# sourceMappingURL=Message.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Message.mjs","sources":["../../../../../../admin/src/components/AIChat/components/Messages/Message.tsx"],"sourcesContent":["import { Typography, Box, IconButton, Flex } from '@strapi/design-system';\nimport { ThumbUp, ThumbDown } from '@strapi/icons';\nimport Markdown from 'react-markdown';\nimport { styled } from 'styled-components';\n\nimport { useFeedbackModal } from '../../FeedbackModal';\nimport { useFeedback } from '../../hooks/useFeedback';\nimport {\n AIMessage,\n type UserMessage as UserMessageType,\n AssistantMessage as AssistantMessageType,\n type MarkerContent as MarkerContentType,\n} from '../../lib/types/messages';\nimport { AnimatedBox } from '../AnimatedBox';\nimport { AttachmentPreview } from '../Attachments/AttachmentPreview';\n\nimport { Marker } from './Marker';\n\nconst MarkdownStyles = styled(Typography)`\n max-width: 65ch;\n margin: 0 auto;\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n margin-top: 1.25em;\n margin-bottom: 0.5em;\n font-weight: bold;\n }\n\n p {\n margin-bottom: 1em;\n }\n\n ul,\n ol {\n padding-left: 1.5em; /* indentation for bullet points */\n margin-bottom: 1em;\n }\n\n li {\n margin-bottom: 0.5em;\n list-style-type: disc; /* or whatever style you prefer */\n }\n\n strong {\n font-weight: bold;\n }\n\n /* code blocks, blockquotes, etc. */\n code {\n background-color: ${({ theme }) => theme.colors.neutral100};\n padding: 0.2em 0.4em;\n border-radius: ${({ theme }) => theme.borderRadius};\n border-color: ${({ theme }) => theme.colors.neutral150};\n border-style: solid;\n font-family: 'SF Mono', SFMono-Regular, ui-monospace, 'DejaVu Sans Mono', Menlo, Consolas,\n monospace;\n }\n\n /* links */\n a {\n color: ${({ theme }) => theme.colors.primary500};\n background-color: ${({ theme }) => theme.colors.neutral100};\n padding: 0.2em 0.4em;\n border-radius: ${({ theme }) => theme.borderRadius};\n border-color: ${({ theme }) => theme.colors.neutral150};\n border-style: solid;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n`;\n\n// ---------------------------\n// Tool: schemaGenerationTool helpers\n// ---------------------------\n\ntype SchemaToolSchema = {\n action?: 'create' | 'update' | 'remove';\n uid?: string;\n name?: string;\n category?: string;\n kind?: 'collectionType' | 'singleType' | 'component';\n modelType?: 'component' | 'collectionType' | 'singleType';\n};\n\ntype SchemaToolPart = {\n type: 'tool-schemaGenerationTool';\n input?: { schemas?: SchemaToolSchema[] };\n output?: { schemas?: SchemaToolSchema[]; error?: unknown };\n toolCallId?: string;\n};\n\nconst isSchemaToolPart = (part: any): part is SchemaToolPart =>\n part && typeof part === 'object' && part.type === 'tool-schemaGenerationTool';\n\nconst capitalize = (s?: string) => (s ? s.charAt(0).toUpperCase() + s.slice(1) : '');\n\nconst getSchemaLink = (schema: SchemaToolSchema): string | undefined => {\n const isComponent = (schema.kind ?? schema.modelType) === 'component';\n if (!schema.uid) return undefined;\n return isComponent\n ? `/plugins/content-type-builder/component-categories/${schema.category ?? ''}/${schema.uid}`\n : `/plugins/content-type-builder/content-types/${schema.uid}`;\n};\n\nconst toMarkerFromSchemaTool = (part: SchemaToolPart): MarkerContentType => {\n const outSchemas = part.output?.schemas ?? [];\n const inSchemas = part.input?.schemas ?? [];\n\n const schemas = (outSchemas.length ? outSchemas : inSchemas) as SchemaToolSchema[];\n const numSchemas = schemas.length;\n\n const state: 'loading' | 'success' | 'error' = part.output\n ? part.output.error\n ? 'error'\n : 'success'\n : 'loading';\n\n const steps = schemas.map((schema, index) => ({\n id: `${part.toolCallId ?? 'schemaGenerationTool'}-${schema.uid ?? schema.name ?? index}`,\n description: capitalize(schema.name ?? schema.uid ?? 'Schema'),\n status:\n schema.action === 'create' || schema.action === 'update' || schema.action === 'remove'\n ? schema.action\n : ('update' as const),\n link: getSchemaLink(schema),\n }));\n\n const title =\n state === 'success'\n ? `Updated ${numSchemas} schema${numSchemas === 1 ? '' : 's'}`\n : state === 'error'\n ? `Failed to update schema${numSchemas === 1 ? '' : 's'}`\n : 'Updating schemas';\n\n return {\n type: 'marker',\n title,\n state,\n steps,\n };\n};\n\nconst MessageContent = ({\n part,\n}: {\n part: AIMessage['parts'][number];\n status?: 'loading' | 'success' | 'error';\n}) => {\n if (part.type === 'text') {\n return (\n <MarkdownStyles>\n <Markdown\n components={{\n a: ({ node, ...props }) => <a target=\"_blank\" rel=\"noopener noreferrer\" {...props} />,\n }}\n >\n {part.text}\n </Markdown>\n </MarkdownStyles>\n );\n }\n\n if (isSchemaToolPart(part)) {\n const marker = toMarkerFromSchemaTool(part);\n return <Marker {...marker} />;\n }\n\n return null;\n};\n\nconst UserMessage = ({ message }: { message: UserMessageType }) => {\n const hasText = message.parts.some(\n (content) => content.type === 'text' && content.text.trim() !== ''\n );\n const attachments = message.parts.filter((content) => content.type === 'file');\n\n return (\n <AnimatedBox\n as={Flex}\n direction=\"column\"\n alignItems=\"flex-end\"\n style={{ alignSelf: 'flex-end' }}\n gap={2}\n maxWidth=\"80%\"\n >\n {hasText ? (\n <Box background=\"neutral150\" borderStyle=\"none\" padding={['10px', '16px']} hasRadius>\n {message.parts.map((content, index) => {\n if (content.type !== 'text') return null;\n return <Typography key={index}>{content.text}</Typography>;\n })}\n </Box>\n ) : null}\n\n {/* Attachments */}\n {attachments.map((attachment, idx) => (\n <AttachmentPreview\n key={`${attachment.type === 'file' ? attachment.filename : attachment.type}-${idx}`}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n attachment={{ ...attachment, status: 'ready' } as any}\n />\n ))}\n </AnimatedBox>\n );\n};\n\nconst AssistantMessage = ({\n message,\n isLoading,\n}: {\n message: AssistantMessageType;\n isLoading?: boolean;\n}) => {\n const { upvoteMessage } = useFeedback();\n const { openFeedbackModal } = useFeedbackModal();\n\n return (\n <Box style={{ alignSelf: 'flex-start' }} maxWidth=\"90%\">\n {message.parts.map((content, index) => (\n <MessageContent key={index} part={content} />\n ))}\n {isLoading ? (\n <Flex gap={1}>\n <IconButton\n label=\"Upvote\"\n size=\"XS\"\n variant=\"ghost\"\n onClick={() => upvoteMessage(message.id)}\n >\n <ThumbUp />\n </IconButton>\n <IconButton\n label=\"Downvote\"\n size=\"XS\"\n variant=\"ghost\"\n // For downvoting, user must provide specific feedback\n onClick={() => openFeedbackModal(message.id)}\n >\n <ThumbDown />\n </IconButton>\n </Flex>\n ) : null}\n </Box>\n );\n};\n\nexport const ChatMessage = ({\n message,\n isLoading,\n}: {\n message: AIMessage;\n isLoading?: boolean;\n}) => {\n /**\n * IMPORTANT: Messages are rendered using react-markdown (heavy compute)\n * Component re-renders on each message update, but AI SDK v5 provides\n * throttling (experimental_throttle: 100ms) which batches updates and reduces\n * re-render frequency during streaming.\n */\n if (message.role === 'user') {\n return <UserMessage message={message as UserMessageType} />;\n }\n return <AssistantMessage message={message as AssistantMessageType} />;\n};\n"],"names":["MarkdownStyles","styled","Typography","theme","colors","neutral100","borderRadius","neutral150","primary500","isSchemaToolPart","part","type","capitalize","s","charAt","toUpperCase","slice","getSchemaLink","schema","isComponent","kind","modelType","uid","undefined","category","toMarkerFromSchemaTool","outSchemas","output","schemas","inSchemas","input","length","numSchemas","state","error","steps","map","index","id","toolCallId","name","description","status","action","link","title","MessageContent","_jsx","Markdown","components","a","node","props","target","rel","text","marker","Marker","UserMessage","message","hasText","parts","some","content","trim","attachments","filter","_jsxs","AnimatedBox","as","Flex","direction","alignItems","style","alignSelf","gap","maxWidth","Box","background","borderStyle","padding","hasRadius","attachment","idx","AttachmentPreview","filename","AssistantMessage","isLoading","upvoteMessage","useFeedback","openFeedbackModal","useFeedbackModal","IconButton","label","size","variant","onClick","ThumbUp","ThumbDown","ChatMessage","role"],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var designSystem = require('@strapi/design-system');
|
|
6
|
+
var styledComponents = require('styled-components');
|
|
7
|
+
|
|
8
|
+
const TextAreaElement = styledComponents.styled(designSystem.Box).attrs({
|
|
9
|
+
as: 'textarea'
|
|
10
|
+
})`
|
|
11
|
+
border: none;
|
|
12
|
+
resize: none;
|
|
13
|
+
background: transparent;
|
|
14
|
+
outline: none !important;
|
|
15
|
+
width: 100%;
|
|
16
|
+
min-height: 44px;
|
|
17
|
+
max-height: 160px;
|
|
18
|
+
line-height: ${({ theme })=>theme.lineHeights[4]};
|
|
19
|
+
font-size: ${({ theme })=>theme.fontSizes[2]};
|
|
20
|
+
color: ${({ theme })=>theme.colors.neutral800};
|
|
21
|
+
padding-bottom: ${({ theme })=>theme.spaces[1]};
|
|
22
|
+
overflow-y: auto;
|
|
23
|
+
|
|
24
|
+
/* Show partial lines when content exceeds visible area */
|
|
25
|
+
height: ${({ rows, theme })=>rows === 5 ? `calc(${rows} * ${theme.lineHeights[4]} * 1em + 0.7em)` : `calc(${rows} * ${theme.lineHeights[4]} * 1em)`};
|
|
26
|
+
|
|
27
|
+
&:disabled,
|
|
28
|
+
&::placeholder {
|
|
29
|
+
color: ${({ theme })=>theme.colors.neutral600};
|
|
30
|
+
}
|
|
31
|
+
`;
|
|
32
|
+
const ResizableTextArea = ({ value, onChange, onSubmit, placeholder })=>{
|
|
33
|
+
const textareaRef = React.useRef(null);
|
|
34
|
+
const [rows, setRows] = React.useState(1);
|
|
35
|
+
const calculateRows = (text)=>{
|
|
36
|
+
if (!text) return 1;
|
|
37
|
+
// Count newlines in the text
|
|
38
|
+
const lineCount = (text.match(/\n/g) || []).length + 1;
|
|
39
|
+
// Limit to a maximum of 5 rows
|
|
40
|
+
return Math.min(lineCount, 5);
|
|
41
|
+
};
|
|
42
|
+
// Update rows when value changes
|
|
43
|
+
React.useEffect(()=>{
|
|
44
|
+
setRows(calculateRows(value));
|
|
45
|
+
}, [
|
|
46
|
+
value
|
|
47
|
+
]);
|
|
48
|
+
const handleKeyDown = (e)=>{
|
|
49
|
+
if (!textareaRef.current?.value.trim()) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (e.key === 'Enter' && !e.shiftKey && onSubmit) {
|
|
53
|
+
e.preventDefault();
|
|
54
|
+
onSubmit(e);
|
|
55
|
+
// Ensure focus is maintained after submission using a small delay
|
|
56
|
+
// This helps ensure the focus happens after any other effects from submission
|
|
57
|
+
setTimeout(()=>{
|
|
58
|
+
textareaRef.current?.focus();
|
|
59
|
+
}, 10);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
React.useEffect(()=>{
|
|
63
|
+
textareaRef.current?.focus();
|
|
64
|
+
}, [
|
|
65
|
+
textareaRef
|
|
66
|
+
]);
|
|
67
|
+
return /*#__PURE__*/ jsxRuntime.jsx(TextAreaElement, {
|
|
68
|
+
ref: textareaRef,
|
|
69
|
+
value: value,
|
|
70
|
+
onChange: onChange,
|
|
71
|
+
onKeyDown: handleKeyDown,
|
|
72
|
+
placeholder: placeholder,
|
|
73
|
+
rows: rows
|
|
74
|
+
});
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
exports.ResizableTextArea = ResizableTextArea;
|
|
78
|
+
//# sourceMappingURL=ResizableTextArea.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResizableTextArea.js","sources":["../../../../../admin/src/components/AIChat/components/ResizableTextArea.tsx"],"sourcesContent":["import { useRef, useEffect, useState } from 'react';\n\nimport { Box } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\ninterface TextAreaProps {\n value: string;\n onChange: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;\n onSubmit?: (e: React.FormEvent<HTMLFormElement>) => void;\n placeholder?: string;\n}\n\nconst TextAreaElement = styled(Box).attrs({ as: 'textarea' })`\n border: none;\n resize: none;\n background: transparent;\n outline: none !important;\n width: 100%;\n min-height: 44px;\n max-height: 160px;\n line-height: ${({ theme }) => theme.lineHeights[4]};\n font-size: ${({ theme }) => theme.fontSizes[2]};\n color: ${({ theme }) => theme.colors.neutral800};\n padding-bottom: ${({ theme }) => theme.spaces[1]};\n overflow-y: auto;\n\n /* Show partial lines when content exceeds visible area */\n height: ${({ rows, theme }) =>\n rows === 5\n ? `calc(${rows} * ${theme.lineHeights[4]} * 1em + 0.7em)`\n : `calc(${rows} * ${theme.lineHeights[4]} * 1em)`};\n\n &:disabled,\n &::placeholder {\n color: ${({ theme }) => theme.colors.neutral600};\n }\n`;\n\nexport const ResizableTextArea = ({ value, onChange, onSubmit, placeholder }: TextAreaProps) => {\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const [rows, setRows] = useState(1);\n\n const calculateRows = (text: string) => {\n if (!text) return 1;\n // Count newlines in the text\n const lineCount = (text.match(/\\n/g) || []).length + 1;\n // Limit to a maximum of 5 rows\n return Math.min(lineCount, 5);\n };\n\n // Update rows when value changes\n useEffect(() => {\n setRows(calculateRows(value));\n }, [value]);\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (!textareaRef.current?.value.trim()) {\n return;\n }\n\n if (e.key === 'Enter' && !e.shiftKey && onSubmit) {\n e.preventDefault();\n onSubmit(e as unknown as React.FormEvent<HTMLFormElement>);\n // Ensure focus is maintained after submission using a small delay\n // This helps ensure the focus happens after any other effects from submission\n setTimeout(() => {\n textareaRef.current?.focus();\n }, 10);\n }\n };\n\n useEffect(() => {\n textareaRef.current?.focus();\n }, [textareaRef]);\n\n return (\n <TextAreaElement\n ref={textareaRef}\n value={value}\n onChange={onChange}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n rows={rows}\n />\n );\n};\n"],"names":["TextAreaElement","styled","Box","attrs","as","theme","lineHeights","fontSizes","colors","neutral800","spaces","rows","neutral600","ResizableTextArea","value","onChange","onSubmit","placeholder","textareaRef","useRef","setRows","useState","calculateRows","text","lineCount","match","length","Math","min","useEffect","handleKeyDown","e","current","trim","key","shiftKey","preventDefault","setTimeout","focus","_jsx","ref","onKeyDown"],"mappings":";;;;;;;AAYA,MAAMA,eAAkBC,GAAAA,uBAAAA,CAAOC,gBAAKC,CAAAA,CAAAA,KAAK,CAAC;IAAEC,EAAI,EAAA;AAAW,CAAA,CAAE;;;;;;;;eAQ9C,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAMC,CAAAA,WAAW,CAAC,CAAA,CAAE,CAAC;aACxC,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAME,CAAAA,SAAS,CAAC,CAAA,CAAE,CAAC;SACxC,EAAE,CAAC,EAAEF,KAAK,EAAE,GAAKA,KAAMG,CAAAA,MAAM,CAACC,UAAU,CAAC;kBAChC,EAAE,CAAC,EAAEJ,KAAK,EAAE,GAAKA,KAAMK,CAAAA,MAAM,CAAC,CAAA,CAAE,CAAC;;;;AAIzC,UAAA,EAAE,CAAC,EAAEC,IAAI,EAAEN,KAAK,EAAE,GACxBM,IAAAA,KAAS,CACL,GAAA,CAAC,KAAK,EAAEA,IAAAA,CAAK,GAAG,EAAEN,MAAMC,WAAW,CAAC,CAAE,CAAA,CAAC,eAAe,CAAC,GACvD,CAAC,KAAK,EAAEK,IAAK,CAAA,GAAG,EAAEN,KAAAA,CAAMC,WAAW,CAAC,CAAA,CAAE,CAAC,OAAO,CAAC,CAAC;;;;WAI7C,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAMG,CAAAA,MAAM,CAACI,UAAU,CAAC;;AAEpD,CAAC;AAEM,MAAMC,iBAAoB,GAAA,CAAC,EAAEC,KAAK,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,WAAW,EAAiB,GAAA;AACzF,IAAA,MAAMC,cAAcC,YAA4B,CAAA,IAAA,CAAA;AAChD,IAAA,MAAM,CAACR,IAAAA,EAAMS,OAAQ,CAAA,GAAGC,cAAS,CAAA,CAAA,CAAA;AAEjC,IAAA,MAAMC,gBAAgB,CAACC,IAAAA,GAAAA;QACrB,IAAI,CAACA,MAAM,OAAO,CAAA;;QAElB,MAAMC,SAAAA,GAAY,CAACD,IAAKE,CAAAA,KAAK,CAAC,KAAA,CAAA,IAAU,EAAC,EAAGC,MAAM,GAAG,CAAA;;QAErD,OAAOC,IAAAA,CAAKC,GAAG,CAACJ,SAAW,EAAA,CAAA,CAAA;AAC7B,KAAA;;IAGAK,eAAU,CAAA,IAAA;AACRT,QAAAA,OAAAA,CAAQE,aAAcR,CAAAA,KAAAA,CAAAA,CAAAA;KACrB,EAAA;AAACA,QAAAA;AAAM,KAAA,CAAA;AAEV,IAAA,MAAMgB,gBAAgB,CAACC,CAAAA,GAAAA;AACrB,QAAA,IAAI,CAACb,WAAAA,CAAYc,OAAO,EAAElB,MAAMmB,IAAQ,EAAA,EAAA;AACtC,YAAA;AACF;QAEA,IAAIF,CAAAA,CAAEG,GAAG,KAAK,OAAA,IAAW,CAACH,CAAEI,CAAAA,QAAQ,IAAInB,QAAU,EAAA;AAChDe,YAAAA,CAAAA,CAAEK,cAAc,EAAA;YAChBpB,QAASe,CAAAA,CAAAA,CAAAA;;;YAGTM,UAAW,CAAA,IAAA;AACTnB,gBAAAA,WAAAA,CAAYc,OAAO,EAAEM,KAAAA,EAAAA;aACpB,EAAA,EAAA,CAAA;AACL;AACF,KAAA;IAEAT,eAAU,CAAA,IAAA;AACRX,QAAAA,WAAAA,CAAYc,OAAO,EAAEM,KAAAA,EAAAA;KACpB,EAAA;AAACpB,QAAAA;AAAY,KAAA,CAAA;AAEhB,IAAA,qBACEqB,cAACvC,CAAAA,eAAAA,EAAAA;QACCwC,GAAKtB,EAAAA,WAAAA;QACLJ,KAAOA,EAAAA,KAAAA;QACPC,QAAUA,EAAAA,QAAAA;QACV0B,SAAWX,EAAAA,aAAAA;QACXb,WAAaA,EAAAA,WAAAA;QACbN,IAAMA,EAAAA;;AAGZ;;;;"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useRef, useState, useEffect } from 'react';
|
|
3
|
+
import { Box } from '@strapi/design-system';
|
|
4
|
+
import { styled } from 'styled-components';
|
|
5
|
+
|
|
6
|
+
const TextAreaElement = styled(Box).attrs({
|
|
7
|
+
as: 'textarea'
|
|
8
|
+
})`
|
|
9
|
+
border: none;
|
|
10
|
+
resize: none;
|
|
11
|
+
background: transparent;
|
|
12
|
+
outline: none !important;
|
|
13
|
+
width: 100%;
|
|
14
|
+
min-height: 44px;
|
|
15
|
+
max-height: 160px;
|
|
16
|
+
line-height: ${({ theme })=>theme.lineHeights[4]};
|
|
17
|
+
font-size: ${({ theme })=>theme.fontSizes[2]};
|
|
18
|
+
color: ${({ theme })=>theme.colors.neutral800};
|
|
19
|
+
padding-bottom: ${({ theme })=>theme.spaces[1]};
|
|
20
|
+
overflow-y: auto;
|
|
21
|
+
|
|
22
|
+
/* Show partial lines when content exceeds visible area */
|
|
23
|
+
height: ${({ rows, theme })=>rows === 5 ? `calc(${rows} * ${theme.lineHeights[4]} * 1em + 0.7em)` : `calc(${rows} * ${theme.lineHeights[4]} * 1em)`};
|
|
24
|
+
|
|
25
|
+
&:disabled,
|
|
26
|
+
&::placeholder {
|
|
27
|
+
color: ${({ theme })=>theme.colors.neutral600};
|
|
28
|
+
}
|
|
29
|
+
`;
|
|
30
|
+
const ResizableTextArea = ({ value, onChange, onSubmit, placeholder })=>{
|
|
31
|
+
const textareaRef = useRef(null);
|
|
32
|
+
const [rows, setRows] = useState(1);
|
|
33
|
+
const calculateRows = (text)=>{
|
|
34
|
+
if (!text) return 1;
|
|
35
|
+
// Count newlines in the text
|
|
36
|
+
const lineCount = (text.match(/\n/g) || []).length + 1;
|
|
37
|
+
// Limit to a maximum of 5 rows
|
|
38
|
+
return Math.min(lineCount, 5);
|
|
39
|
+
};
|
|
40
|
+
// Update rows when value changes
|
|
41
|
+
useEffect(()=>{
|
|
42
|
+
setRows(calculateRows(value));
|
|
43
|
+
}, [
|
|
44
|
+
value
|
|
45
|
+
]);
|
|
46
|
+
const handleKeyDown = (e)=>{
|
|
47
|
+
if (!textareaRef.current?.value.trim()) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (e.key === 'Enter' && !e.shiftKey && onSubmit) {
|
|
51
|
+
e.preventDefault();
|
|
52
|
+
onSubmit(e);
|
|
53
|
+
// Ensure focus is maintained after submission using a small delay
|
|
54
|
+
// This helps ensure the focus happens after any other effects from submission
|
|
55
|
+
setTimeout(()=>{
|
|
56
|
+
textareaRef.current?.focus();
|
|
57
|
+
}, 10);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
useEffect(()=>{
|
|
61
|
+
textareaRef.current?.focus();
|
|
62
|
+
}, [
|
|
63
|
+
textareaRef
|
|
64
|
+
]);
|
|
65
|
+
return /*#__PURE__*/ jsx(TextAreaElement, {
|
|
66
|
+
ref: textareaRef,
|
|
67
|
+
value: value,
|
|
68
|
+
onChange: onChange,
|
|
69
|
+
onKeyDown: handleKeyDown,
|
|
70
|
+
placeholder: placeholder,
|
|
71
|
+
rows: rows
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
export { ResizableTextArea };
|
|
76
|
+
//# sourceMappingURL=ResizableTextArea.mjs.map
|