@ai-stack/payloadcms 3.68.0 → 3.76.0-beta.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.
Files changed (154) hide show
  1. package/dist/ai/core/media/image/generateImage.js +2 -6
  2. package/dist/ai/core/media/image/generateImage.js.map +1 -1
  3. package/dist/ai/core/media/image/handlers/multimodal.js +5 -0
  4. package/dist/ai/core/media/image/handlers/multimodal.js.map +1 -1
  5. package/dist/ai/core/streamObject.js +3 -3
  6. package/dist/ai/core/streamObject.js.map +1 -1
  7. package/dist/ai/core/types.d.ts +3 -0
  8. package/dist/ai/core/types.js.map +1 -1
  9. package/dist/ai/prompts.d.ts +1 -2
  10. package/dist/ai/prompts.js +0 -110
  11. package/dist/ai/prompts.js.map +1 -1
  12. package/dist/ai/providers/blocks/anthropic.js +2 -1
  13. package/dist/ai/providers/blocks/anthropic.js.map +1 -1
  14. package/dist/ai/providers/blocks/elevenlabs.js +3 -2
  15. package/dist/ai/providers/blocks/elevenlabs.js.map +1 -1
  16. package/dist/ai/providers/blocks/fal.js +2 -1
  17. package/dist/ai/providers/blocks/fal.js.map +1 -1
  18. package/dist/ai/providers/blocks/google.js +11 -6
  19. package/dist/ai/providers/blocks/google.js.map +1 -1
  20. package/dist/ai/providers/blocks/openai-compatible.js +2 -1
  21. package/dist/ai/providers/blocks/openai-compatible.js.map +1 -1
  22. package/dist/ai/providers/blocks/openai.js +3 -2
  23. package/dist/ai/providers/blocks/openai.js.map +1 -1
  24. package/dist/ai/providers/blocks/xai.js +2 -1
  25. package/dist/ai/providers/blocks/xai.js.map +1 -1
  26. package/dist/ai/providers/icons.d.ts +7 -0
  27. package/dist/ai/providers/icons.js +9 -0
  28. package/dist/ai/providers/icons.js.map +1 -0
  29. package/dist/ai/providers/registry.js +34 -24
  30. package/dist/ai/providers/registry.js.map +1 -1
  31. package/dist/ai/utils/filterEditorSchemaByNodes.d.ts +9 -0
  32. package/dist/ai/utils/filterEditorSchemaByNodes.js +30 -3
  33. package/dist/ai/utils/filterEditorSchemaByNodes.js.map +1 -1
  34. package/dist/ai/utils/nodeToSchemaMap.d.ts +22 -0
  35. package/dist/ai/utils/nodeToSchemaMap.js +72 -0
  36. package/dist/ai/utils/nodeToSchemaMap.js.map +1 -0
  37. package/dist/collections/AIJobs.js +1 -1
  38. package/dist/collections/AIJobs.js.map +1 -1
  39. package/dist/collections/AISettings.js +47 -20
  40. package/dist/collections/AISettings.js.map +1 -1
  41. package/dist/collections/Instructions.js +37 -0
  42. package/dist/collections/Instructions.js.map +1 -1
  43. package/dist/defaults.d.ts +1 -0
  44. package/dist/defaults.js +8 -0
  45. package/dist/defaults.js.map +1 -1
  46. package/dist/endpoints/chat.d.ts +4 -0
  47. package/dist/endpoints/fetchFields.js +10 -0
  48. package/dist/endpoints/fetchFields.js.map +1 -1
  49. package/dist/endpoints/fetchVoices.js +41 -24
  50. package/dist/endpoints/fetchVoices.js.map +1 -1
  51. package/dist/endpoints/index.js +194 -16
  52. package/dist/endpoints/index.js.map +1 -1
  53. package/dist/exports/fields.d.ts +1 -0
  54. package/dist/exports/fields.js +1 -0
  55. package/dist/exports/fields.js.map +1 -1
  56. package/dist/fields/ArrayComposeField/ArrayComposeField.d.ts +15 -0
  57. package/dist/fields/ArrayComposeField/ArrayComposeField.js +87 -0
  58. package/dist/fields/ArrayComposeField/ArrayComposeField.js.map +1 -0
  59. package/dist/fields/ArrayComposeField/ArrayComposeField.jsx +73 -0
  60. package/dist/fields/PromptEditorField/PromptEditorField.js +7 -2
  61. package/dist/fields/PromptEditorField/PromptEditorField.js.map +1 -1
  62. package/dist/fields/PromptEditorField/PromptEditorField.jsx +5 -2
  63. package/dist/index.d.ts +3 -1
  64. package/dist/index.js +2 -1
  65. package/dist/index.js.map +1 -1
  66. package/dist/payload-ai.d.ts +152 -0
  67. package/dist/plugin.js +16 -32
  68. package/dist/plugin.js.map +1 -1
  69. package/dist/providers/InstructionsProvider/InstructionsProvider.js +47 -15
  70. package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
  71. package/dist/providers/InstructionsProvider/InstructionsProvider.jsx +39 -16
  72. package/dist/providers/InstructionsProvider/context.d.ts +3 -0
  73. package/dist/providers/InstructionsProvider/context.js +2 -0
  74. package/dist/providers/InstructionsProvider/context.js.map +1 -1
  75. package/dist/providers/InstructionsProvider/useInstructions.js +21 -2
  76. package/dist/providers/InstructionsProvider/useInstructions.js.map +1 -1
  77. package/dist/styles.d.ts +11 -0
  78. package/dist/types/handlebars-async-helpers.d.ts +1 -0
  79. package/dist/types/handlebars-dist-handlebars.d.ts +1 -0
  80. package/dist/types/react-mentions.d.ts +1 -0
  81. package/dist/types.d.ts +34 -5
  82. package/dist/types.js +1 -0
  83. package/dist/types.js.map +1 -1
  84. package/dist/ui/AIConfigDashboard/index.js +198 -22
  85. package/dist/ui/AIConfigDashboard/index.js.map +1 -1
  86. package/dist/ui/AIConfigDashboard/index.jsx +159 -13
  87. package/dist/ui/Compose/Compose.d.ts +1 -0
  88. package/dist/ui/Compose/Compose.js +23 -4
  89. package/dist/ui/Compose/Compose.js.map +1 -1
  90. package/dist/ui/Compose/Compose.jsx +23 -4
  91. package/dist/ui/Compose/UndoRedoActions.d.ts +2 -2
  92. package/dist/ui/Compose/UndoRedoActions.js +8 -5
  93. package/dist/ui/Compose/UndoRedoActions.js.map +1 -1
  94. package/dist/ui/Compose/UndoRedoActions.jsx +6 -5
  95. package/dist/ui/Compose/compose.module.css +56 -16
  96. package/dist/ui/Compose/hooks/menu/itemsMap.js +12 -6
  97. package/dist/ui/Compose/hooks/menu/itemsMap.js.map +1 -1
  98. package/dist/ui/Compose/hooks/menu/useMenu.js +26 -15
  99. package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
  100. package/dist/ui/Compose/hooks/menu/useMenu.jsx +25 -12
  101. package/dist/ui/Compose/hooks/useGenerate.js +26 -174
  102. package/dist/ui/Compose/hooks/useGenerate.js.map +1 -1
  103. package/dist/ui/Compose/hooks/useGenerateUpload.d.ts +11 -0
  104. package/dist/ui/Compose/hooks/useGenerateUpload.js +150 -0
  105. package/dist/ui/Compose/hooks/useGenerateUpload.js.map +1 -0
  106. package/dist/ui/Compose/hooks/useHistory.d.ts +0 -1
  107. package/dist/ui/Compose/hooks/useHistory.js +65 -25
  108. package/dist/ui/Compose/hooks/useHistory.js.map +1 -1
  109. package/dist/ui/Compose/hooks/useStreamingUpdate.d.ts +8 -0
  110. package/dist/ui/Compose/hooks/useStreamingUpdate.js +48 -0
  111. package/dist/ui/Compose/hooks/useStreamingUpdate.js.map +1 -0
  112. package/dist/ui/DynamicVoiceSelect/index.js +63 -11
  113. package/dist/ui/DynamicVoiceSelect/index.js.map +1 -1
  114. package/dist/ui/DynamicVoiceSelect/index.jsx +47 -14
  115. package/dist/ui/EncryptedTextField/index.js +4 -4
  116. package/dist/ui/EncryptedTextField/index.js.map +1 -1
  117. package/dist/ui/EncryptedTextField/index.jsx +4 -4
  118. package/dist/ui/VoicesFetcher/index.js +34 -16
  119. package/dist/ui/VoicesFetcher/index.js.map +1 -1
  120. package/dist/ui/VoicesFetcher/index.jsx +32 -15
  121. package/dist/utilities/buildSmartPrompt.d.ts +22 -0
  122. package/dist/utilities/buildSmartPrompt.js +141 -0
  123. package/dist/utilities/buildSmartPrompt.js.map +1 -0
  124. package/dist/utilities/encryption.js +2 -1
  125. package/dist/utilities/encryption.js.map +1 -1
  126. package/dist/utilities/fieldToJsonSchema.js +32 -3
  127. package/dist/utilities/fieldToJsonSchema.js.map +1 -1
  128. package/dist/utilities/resolveImageReferences.d.ts +3 -1
  129. package/dist/utilities/resolveImageReferences.js +21 -2
  130. package/dist/utilities/resolveImageReferences.js.map +1 -1
  131. package/dist/utilities/seedProperties.d.ts +7 -0
  132. package/dist/utilities/seedProperties.js +100 -0
  133. package/dist/utilities/seedProperties.js.map +1 -0
  134. package/dist/utilities/setSafeLexicalState.js +79 -6
  135. package/dist/utilities/setSafeLexicalState.js.map +1 -1
  136. package/dist/utilities/updateFieldsConfig.d.ts +1 -1
  137. package/dist/utilities/updateFieldsConfig.js +8 -1
  138. package/dist/utilities/updateFieldsConfig.js.map +1 -1
  139. package/package.json +35 -33
  140. package/dist/endpoints/chat.d.js +0 -3
  141. package/dist/endpoints/chat.d.js.map +0 -1
  142. package/dist/init.d.ts +0 -7
  143. package/dist/init.js +0 -135
  144. package/dist/init.js.map +0 -1
  145. package/dist/payload-ai.d.js +0 -3
  146. package/dist/payload-ai.d.js.map +0 -1
  147. package/dist/styles.d.js +0 -2
  148. package/dist/styles.d.js.map +0 -1
  149. package/dist/types/handlebars-async-helpers.d.js +0 -2
  150. package/dist/types/handlebars-async-helpers.d.js.map +0 -1
  151. package/dist/types/handlebars-dist-handlebars.d.js +0 -2
  152. package/dist/types/handlebars-dist-handlebars.d.js.map +0 -1
  153. package/dist/types/react-mentions.d.js +0 -2
  154. package/dist/types/react-mentions.d.js.map +0 -1
@@ -1,24 +1,170 @@
1
1
  'use client';
2
- import React from 'react';
2
+ import { Button, toast, useConfig } from '@payloadcms/ui';
3
+ // @ts-expect-error - Next.js types are not resolving correctly with nodenext but runtime is fine
4
+ import { useRouter } from 'next/navigation';
5
+ import React, { useContext, useEffect, useState } from 'react';
6
+ import { excludeCollections } from '../../defaults.js';
7
+ import { InstructionsContext } from '../../providers/InstructionsProvider/context.js';
3
8
  export const AIConfigDashboard = () => {
9
+ const { config: { collections, routes: { admin: adminRoute, api: apiRoute }, }, } = useConfig();
10
+ const router = useRouter();
11
+ const { refresh, setEnabledCollections: setEnabledCollectionsInContext } = useContext(InstructionsContext);
12
+ const [enabledCollections, setEnabledCollections] = useState([]);
13
+ const [isLoading, setIsLoading] = useState(true);
14
+ const [isSaving, setIsSaving] = useState(false);
15
+ const availableCollections = collections.filter((c) => !excludeCollections.includes(c.slug) &&
16
+ !c.admin?.hidden);
17
+ useEffect(() => {
18
+ const fetchSettings = async () => {
19
+ try {
20
+ const response = await fetch(`${apiRoute}/globals/ai-settings`);
21
+ if (response.ok) {
22
+ const data = await response.json();
23
+ // Handle both simple array and object wrapper if Payload wraps it
24
+ const storedEnabled = data.enabledCollections || [];
25
+ setEnabledCollections(Array.isArray(storedEnabled) ? storedEnabled : []);
26
+ }
27
+ }
28
+ catch (error) {
29
+ console.error('Failed to fetch AI settings:', error);
30
+ }
31
+ finally {
32
+ setIsLoading(false);
33
+ }
34
+ };
35
+ fetchSettings().catch((e) => {
36
+ console.log(e);
37
+ });
38
+ }, [apiRoute]);
39
+ const handleToggle = (slug) => {
40
+ setEnabledCollections((prev) => {
41
+ if (prev.includes(slug)) {
42
+ return prev.filter((s) => s !== slug);
43
+ }
44
+ return [...prev, slug];
45
+ });
46
+ };
47
+ const handleSave = async () => {
48
+ setIsSaving(true);
49
+ try {
50
+ // First fetch current settings to get ID or just rely on global update behavior
51
+ // We need to adhere to Payload's global update API
52
+ const response = await fetch(`${apiRoute}/globals/ai-settings`, {
53
+ body: JSON.stringify({
54
+ enabledCollections,
55
+ }),
56
+ headers: {
57
+ 'Content-Type': 'application/json',
58
+ },
59
+ method: 'POST',
60
+ });
61
+ if (response.ok) {
62
+ toast.success('Settings saved successfully');
63
+ if (setEnabledCollectionsInContext) {
64
+ setEnabledCollectionsInContext(enabledCollections);
65
+ }
66
+ if (refresh) {
67
+ await refresh();
68
+ }
69
+ router.refresh();
70
+ }
71
+ else {
72
+ toast.error('Failed to save settings');
73
+ }
74
+ }
75
+ catch (error) {
76
+ console.error('Error saving settings:', error);
77
+ toast.error('Error saving settings');
78
+ }
79
+ finally {
80
+ setIsSaving(false);
81
+ }
82
+ };
83
+ if (isLoading) {
84
+ return <div style={{ padding: '20px', textAlign: 'center' }}>Loading AI configuration...</div>;
85
+ }
4
86
  return (<div style={{
5
- alignItems: 'center',
6
87
  background: 'var(--theme-elevation-50)',
7
- border: '1px solid var(--theme-elevation-150)',
8
- borderRadius: '8px',
88
+ // border: '1px solid var(--theme-elevation-150)',
89
+ // borderRadius: '8px',
90
+ marginBottom: '20px',
91
+ overflow: 'hidden',
92
+ }}>
93
+ <div style={{
94
+ alignItems: 'center',
95
+ borderBottom: '1px solid var(--theme-elevation-150)',
9
96
  display: 'flex',
10
97
  justifyContent: 'space-between',
11
- marginBottom: '20px',
12
98
  padding: '20px',
13
99
  }}>
14
- <div>
15
- <h4 style={{ margin: '0 0 5px 0' }}>AI Configuration</h4>
16
- <p style={{ color: 'var(--theme-elevation-500)', fontSize: '14px', margin: '0' }}>
17
- Manage your AI providers, API keys, and default models.
18
- </p>
100
+ <div>
101
+ <h4 style={{ margin: '0 0 5px 0' }}>AI Configuration</h4>
102
+ <p style={{ color: 'var(--theme-elevation-500)', fontSize: '14px', margin: '0' }}>
103
+ Manage your AI providers, API keys, and enable AI for specific collections.
104
+ </p>
105
+ </div>
106
+ <div style={{ display: 'flex', gap: '10px' }}>
107
+ <Button buttonStyle="secondary" el="link" to={`${adminRoute}/globals/ai-settings`}>
108
+ Settings
109
+ </Button>
110
+ <Button disabled={isSaving} onClick={handleSave}>
111
+ {isSaving ? 'Saving...' : 'Save Changes'}
112
+ </Button>
113
+ </div>
114
+ </div>
115
+
116
+ <div style={{ padding: '20px' }}>
117
+ <h5 style={{ marginBottom: '15px' }}>Enabled Collections</h5>
118
+ <div style={{
119
+ display: 'grid',
120
+ gap: '15px',
121
+ gridTemplateColumns: 'repeat(auto-fill, minmax(250px, 1fr))',
122
+ }}>
123
+ {availableCollections.map((collection) => {
124
+ const isEnabled = enabledCollections.includes(collection.slug);
125
+ return (<button key={collection.slug} onClick={() => handleToggle(collection.slug)} style={{
126
+ alignItems: 'center',
127
+ background: isEnabled
128
+ ? 'var(--theme-elevation-100)'
129
+ : 'var(--theme-elevation-50)',
130
+ border: `1px solid ${isEnabled ? 'var(--theme-text-success)' : 'var(--theme-elevation-200)'}`,
131
+ borderRadius: '6px',
132
+ cursor: 'pointer',
133
+ display: 'flex',
134
+ gap: '10px',
135
+ padding: '10px 15px',
136
+ textAlign: 'left',
137
+ transition: 'all 0.2s ease',
138
+ width: '100%',
139
+ }} type="button">
140
+ <div style={{
141
+ alignItems: 'center',
142
+ background: isEnabled
143
+ ? 'var(--theme-text-success)'
144
+ : 'var(--theme-elevation-200)',
145
+ borderRadius: '12px',
146
+ display: 'flex',
147
+ height: '24px',
148
+ justifyContent: isEnabled ? 'flex-end' : 'flex-start',
149
+ padding: '2px',
150
+ transition: 'all 0.2s ease',
151
+ width: '44px',
152
+ }}>
153
+ <div style={{
154
+ background: 'white',
155
+ borderRadius: '50%',
156
+ height: '20px',
157
+ width: '20px',
158
+ }}/>
159
+ </div>
160
+ <span style={{ fontWeight: 500 }}>
161
+ {typeof collection.labels?.singular === 'string'
162
+ ? collection.labels.singular
163
+ : collection.labels?.singular?.en || collection.slug}
164
+ </span>
165
+ </button>);
166
+ })}
167
+ </div>
19
168
  </div>
20
- <a href="/admin/globals/ai-settings">
21
- <button className="btn btn--style-primary btn--size-small">Manage AI Settings</button>
22
- </a>
23
169
  </div>);
24
170
  };
@@ -6,6 +6,7 @@ export type ComposeProps = {
6
6
  path: string;
7
7
  schemaPath: string;
8
8
  };
9
+ forceVisible?: boolean;
9
10
  instructionId: string;
10
11
  isConfigAllowed: boolean;
11
12
  };
@@ -11,7 +11,7 @@ import { useMenu } from './hooks/menu/useMenu.js';
11
11
  import { useActiveFieldTracking } from './hooks/useActiveFieldTracking.js';
12
12
  import { useGenerate } from './hooks/useGenerate.js';
13
13
  import { UndoRedoActions } from './UndoRedoActions.js';
14
- export const Compose = ({ descriptionProps, instructionId, isConfigAllowed })=>{
14
+ export const Compose = ({ descriptionProps, forceVisible, instructionId, isConfigAllowed })=>{
15
15
  const pathFromContext = descriptionProps?.path;
16
16
  const { editor: lexicalEditor } = useEditorConfigContext();
17
17
  // Get global openDrawer from context
@@ -134,9 +134,28 @@ export const Compose = ({ descriptionProps, instructionId, isConfigAllowed })=>{
134
134
  path: pathFromContext
135
135
  });
136
136
  const setIfValueIsLexicalState = useCallback((val)=>{
137
- if (val && typeof val === 'object' && 'root' in val && lexicalEditor) {
138
- setSafeLexicalState(JSON.stringify(val), lexicalEditor);
137
+ // Prevent setting incomplete states during streaming
138
+ if (!val || typeof val !== 'object' || !('root' in val) || !lexicalEditor) {
139
+ return;
139
140
  }
141
+ // Validate that the state is complete before setting
142
+ // Check for common incomplete streaming states
143
+ if (!val.root || typeof val.root !== 'object' || Object.keys(val.root).length === 0) {
144
+ return;
145
+ }
146
+ if (val.root.type !== 'root') {
147
+ return;
148
+ }
149
+ if (!val.root.children || !Array.isArray(val.root.children) || val.root.children.length === 0) {
150
+ return;
151
+ }
152
+ // Check for invalid child types (common streaming issue)
153
+ const hasInvalidChildren = val.root.children.some((child)=>!child || !child.type || child.type === 'undefined' || child.type === '');
154
+ if (hasInvalidChildren) {
155
+ return;
156
+ }
157
+ // State looks valid, proceed
158
+ setSafeLexicalState(JSON.stringify(val), lexicalEditor);
140
159
  // DO NOT PROVIDE lexicalEditor as a dependency, it freaks out and does not update the editor after first undo/redo - revisit
141
160
  }, []);
142
161
  const popupRender = useCallback(({ close })=>{
@@ -164,7 +183,7 @@ export const Compose = ({ descriptionProps, instructionId, isConfigAllowed })=>{
164
183
  isAnyLoading
165
184
  ]);
166
185
  return /*#__PURE__*/ _jsxs("label", {
167
- className: `payloadai-compose__actions ${styles.actions}`,
186
+ className: `payloadai-compose__actions ${styles.actions} ${forceVisible ? styles.actionsVisible : ''}`,
168
187
  onClick: (e)=>e.preventDefault(),
169
188
  role: "presentation",
170
189
  children: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/ui/Compose/Compose.tsx"],"sourcesContent":["'use client'\n\nimport type { ClientField } from 'payload'\nimport type { FC } from 'react'\n\nimport { useEditorConfigContext } from '@payloadcms/richtext-lexical/client'\nimport { Popup, useField } from '@payloadcms/ui'\nimport React, { useCallback, useMemo, useState } from 'react'\n\nimport { PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js'\nimport { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js'\nimport { setSafeLexicalState } from '../../utilities/setSafeLexicalState.js'\nimport { PluginIcon } from '../Icons/Icons.js'\nimport styles from './compose.module.css'\nimport { useMenu } from './hooks/menu/useMenu.js'\nimport { useActiveFieldTracking } from './hooks/useActiveFieldTracking.js'\nimport { useGenerate } from './hooks/useGenerate.js'\nimport { UndoRedoActions } from './UndoRedoActions.js'\n\nexport type ComposeProps = {\n descriptionProps?: {\n field: ClientField\n path: string\n schemaPath: string\n }\n instructionId: string\n isConfigAllowed: boolean\n}\n\nexport const Compose: FC<ComposeProps> = ({ descriptionProps, instructionId, isConfigAllowed }) => {\n const pathFromContext = descriptionProps?.path\n const { editor: lexicalEditor } = useEditorConfigContext()\n \n // Get global openDrawer from context\n const { openDrawer } = useInstructions()\n\n // Initialize global active-field tracking\n useActiveFieldTracking()\n\n const [isProcessing, setIsProcessing] = useState<boolean>(false)\n const { generate, isJobActive, isLoading, jobProgress, jobStatus, stop } = useGenerate({ instructionId })\n\n // Memoize menu event handlers to prevent recreation on every render\n const onCompose = useCallback(() => {\n console.log('Composing...')\n setIsProcessing(true)\n generate({\n action: 'Compose',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onExpand = useCallback(() => {\n console.log('Expanding...')\n generate({\n action: 'Expand',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onProofread = useCallback(() => {\n console.log('Proofreading...')\n generate({\n action: 'Proofread',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onRephrase = useCallback(() => {\n console.log('Rephrasing...')\n generate({\n action: 'Rephrase',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onSimplify = useCallback(() => {\n console.log('Simplifying...')\n generate({\n action: 'Simplify',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onSummarize = useCallback(() => {\n console.log('Summarizing...')\n generate({\n action: 'Summarize',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onTranslate = useCallback((data: unknown) => {\n console.log('Translating...')\n generate({\n action: 'Translate',\n params: data,\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const handleOpenSettings = useCallback(() => {\n if (isConfigAllowed) {\n openDrawer(instructionId)\n }\n }, [isConfigAllowed, openDrawer, instructionId])\n\n const { ActiveComponent, Menu } = useMenu(\n {\n onCompose,\n onExpand,\n onProofread,\n onRephrase,\n onSettings: isConfigAllowed ? handleOpenSettings : undefined,\n onSimplify,\n onSummarize,\n onTranslate,\n },\n {\n isConfigAllowed,\n },\n )\n\n const { setValue } = useField<string>({\n path: pathFromContext,\n })\n\n const setIfValueIsLexicalState = useCallback((val: any) => {\n if (val && typeof val === 'object' && 'root' in val && lexicalEditor) {\n setSafeLexicalState(JSON.stringify(val), lexicalEditor)\n }\n\n // DO NOT PROVIDE lexicalEditor as a dependency, it freaks out and does not update the editor after first undo/redo - revisit\n }, [])\n\n const popupRender = useCallback(\n ({ close }: { close: () => void }) => {\n return <Menu isLoading={isProcessing || isLoading} onClose={close} />\n },\n [isProcessing, isLoading, Menu],\n )\n\n // Combine loading states to reduce re-renders\n const isAnyLoading = isProcessing || isLoading || isJobActive\n\n const memoizedPopup = useMemo(() => {\n return (\n <Popup\n button={<PluginIcon isLoading={isAnyLoading} />}\n render={popupRender}\n verticalAlign=\"bottom\"\n />\n )\n }, [popupRender, isAnyLoading])\n\n return (\n <label\n className={`payloadai-compose__actions ${styles.actions}`}\n onClick={(e) => e.preventDefault()}\n role=\"presentation\"\n >\n {memoizedPopup}\n <ActiveComponent\n isLoading={isProcessing || isLoading || isJobActive}\n loadingLabel={isJobActive ? (jobStatus === 'running' ? `Video ${Math.max(0, Math.min(100, Math.round(jobProgress ?? 0)))}%` : (jobStatus || 'Queued')) : undefined}\n stop={stop}\n />\n <UndoRedoActions\n onChange={(val) => {\n setValue(val)\n setIfValueIsLexicalState(val)\n }}\n />\n </label>\n )\n}\n"],"names":["useEditorConfigContext","Popup","useField","React","useCallback","useMemo","useState","useInstructions","setSafeLexicalState","PluginIcon","styles","useMenu","useActiveFieldTracking","useGenerate","UndoRedoActions","Compose","descriptionProps","instructionId","isConfigAllowed","pathFromContext","path","editor","lexicalEditor","openDrawer","isProcessing","setIsProcessing","generate","isJobActive","isLoading","jobProgress","jobStatus","stop","onCompose","console","log","action","catch","reason","error","finally","onExpand","onProofread","onRephrase","onSimplify","onSummarize","onTranslate","data","params","handleOpenSettings","ActiveComponent","Menu","onSettings","undefined","setValue","setIfValueIsLexicalState","val","JSON","stringify","popupRender","close","onClose","isAnyLoading","memoizedPopup","button","render","verticalAlign","label","className","actions","onClick","e","preventDefault","role","loadingLabel","Math","max","min","round","onChange"],"mappings":"AAAA;;AAKA,SAASA,sBAAsB,QAAQ,sCAAqC;AAC5E,SAASC,KAAK,EAAEC,QAAQ,QAAQ,iBAAgB;AAChD,OAAOC,SAASC,WAAW,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,QAAO;AAG7D,SAASC,eAAe,QAAQ,0DAAyD;AACzF,SAASC,mBAAmB,QAAQ,yCAAwC;AAC5E,SAASC,UAAU,QAAQ,oBAAmB;AAC9C,OAAOC,YAAY,uBAAsB;AACzC,SAASC,OAAO,QAAQ,0BAAyB;AACjD,SAASC,sBAAsB,QAAQ,oCAAmC;AAC1E,SAASC,WAAW,QAAQ,yBAAwB;AACpD,SAASC,eAAe,QAAQ,uBAAsB;AAYtD,OAAO,MAAMC,UAA4B,CAAC,EAAEC,gBAAgB,EAAEC,aAAa,EAAEC,eAAe,EAAE;IAC5F,MAAMC,kBAAkBH,kBAAkBI;IAC1C,MAAM,EAAEC,QAAQC,aAAa,EAAE,GAAGtB;IAElC,qCAAqC;IACrC,MAAM,EAAEuB,UAAU,EAAE,GAAGhB;IAEvB,0CAA0C;IAC1CK;IAEA,MAAM,CAACY,cAAcC,gBAAgB,GAAGnB,SAAkB;IAC1D,MAAM,EAAEoB,QAAQ,EAAEC,WAAW,EAAEC,SAAS,EAAEC,WAAW,EAAEC,SAAS,EAAEC,IAAI,EAAE,GAAGlB,YAAY;QAAEI;IAAc;IAEvG,oEAAoE;IACpE,MAAMe,YAAY5B,YAAY;QAC5B6B,QAAQC,GAAG,CAAC;QACZT,gBAAgB;QAChBC,SAAS;YACPS,QAAQ;QACV,GACGC,KAAK,CAAC,CAACC;YACNJ,QAAQK,KAAK,CAAC,cAAcD;QAC9B,GACCE,OAAO,CAAC;YACPd,gBAAgB;QAClB;IACJ,GAAG;QAACC;KAAS;IAEb,MAAMc,WAAWpC,YAAY;QAC3B6B,QAAQC,GAAG,CAAC;QACZR,SAAS;YACPS,QAAQ;QACV,GACGC,KAAK,CAAC,CAACC;YACNJ,QAAQK,KAAK,CAAC,cAAcD;QAC9B,GACCE,OAAO,CAAC;YACPd,gBAAgB;QAClB;IACJ,GAAG;QAACC;KAAS;IAEb,MAAMe,cAAcrC,YAAY;QAC9B6B,QAAQC,GAAG,CAAC;QACZR,SAAS;YACPS,QAAQ;QACV,GACGC,KAAK,CAAC,CAACC;YACNJ,QAAQK,KAAK,CAAC,cAAcD;QAC9B,GACCE,OAAO,CAAC;YACPd,gBAAgB;QAClB;IACJ,GAAG;QAACC;KAAS;IAEb,MAAMgB,aAAatC,YAAY;QAC7B6B,QAAQC,GAAG,CAAC;QACZR,SAAS;YACPS,QAAQ;QACV,GACGC,KAAK,CAAC,CAACC;YACNJ,QAAQK,KAAK,CAAC,cAAcD;QAC9B,GACCE,OAAO,CAAC;YACPd,gBAAgB;QAClB;IACJ,GAAG;QAACC;KAAS;IAEb,MAAMiB,aAAavC,YAAY;QAC7B6B,QAAQC,GAAG,CAAC;QACZR,SAAS;YACPS,QAAQ;QACV,GACGC,KAAK,CAAC,CAACC;YACNJ,QAAQK,KAAK,CAAC,cAAcD;QAC9B,GACCE,OAAO,CAAC;YACPd,gBAAgB;QAClB;IACJ,GAAG;QAACC;KAAS;IAEb,MAAMkB,cAAcxC,YAAY;QAC9B6B,QAAQC,GAAG,CAAC;QACZR,SAAS;YACPS,QAAQ;QACV,GACGC,KAAK,CAAC,CAACC;YACNJ,QAAQK,KAAK,CAAC,cAAcD;QAC9B,GACCE,OAAO,CAAC;YACPd,gBAAgB;QAClB;IACJ,GAAG;QAACC;KAAS;IAEb,MAAMmB,cAAczC,YAAY,CAAC0C;QAC/Bb,QAAQC,GAAG,CAAC;QACZR,SAAS;YACPS,QAAQ;YACRY,QAAQD;QACV,GACGV,KAAK,CAAC,CAACC;YACNJ,QAAQK,KAAK,CAAC,cAAcD;QAC9B,GACCE,OAAO,CAAC;YACPd,gBAAgB;QAClB;IACJ,GAAG;QAACC;KAAS;IAEb,MAAMsB,qBAAqB5C,YAAY;QACrC,IAAIc,iBAAiB;YACnBK,WAAWN;QACb;IACF,GAAG;QAACC;QAAiBK;QAAYN;KAAc;IAE/C,MAAM,EAAEgC,eAAe,EAAEC,IAAI,EAAE,GAAGvC,QAChC;QACEqB;QACAQ;QACAC;QACAC;QACAS,YAAYjC,kBAAkB8B,qBAAqBI;QACnDT;QACAC;QACAC;IACF,GACA;QACE3B;IACF;IAGF,MAAM,EAAEmC,QAAQ,EAAE,GAAGnD,SAAiB;QACpCkB,MAAMD;IACR;IAEA,MAAMmC,2BAA2BlD,YAAY,CAACmD;QAC5C,IAAIA,OAAO,OAAOA,QAAQ,YAAY,UAAUA,OAAOjC,eAAe;YACpEd,oBAAoBgD,KAAKC,SAAS,CAACF,MAAMjC;QAC3C;IAEA,6HAA6H;IAC/H,GAAG,EAAE;IAEL,MAAMoC,cAActD,YAClB,CAAC,EAAEuD,KAAK,EAAyB;QAC/B,qBAAO,KAACT;YAAKtB,WAAWJ,gBAAgBI;YAAWgC,SAASD;;IAC9D,GACA;QAACnC;QAAcI;QAAWsB;KAAK;IAGjC,8CAA8C;IAC9C,MAAMW,eAAerC,gBAAgBI,aAAaD;IAElD,MAAMmC,gBAAgBzD,QAAQ;QAC5B,qBACE,KAACJ;YACC8D,sBAAQ,KAACtD;gBAAWmB,WAAWiC;;YAC/BG,QAAQN;YACRO,eAAc;;IAGpB,GAAG;QAACP;QAAaG;KAAa;IAE9B,qBACE,MAACK;QACCC,WAAW,CAAC,2BAA2B,EAAEzD,OAAO0D,OAAO,CAAC,CAAC;QACzDC,SAAS,CAACC,IAAMA,EAAEC,cAAc;QAChCC,MAAK;;YAEJV;0BACD,KAACb;gBACCrB,WAAWJ,gBAAgBI,aAAaD;gBACxC8C,cAAc9C,cAAeG,cAAc,YAAY,CAAC,MAAM,EAAE4C,KAAKC,GAAG,CAAC,GAAGD,KAAKE,GAAG,CAAC,KAAKF,KAAKG,KAAK,CAAChD,eAAe,KAAK,CAAC,CAAC,GAAIC,aAAa,WAAasB;gBACzJrB,MAAMA;;0BAER,KAACjB;gBACCgE,UAAU,CAACvB;oBACTF,SAASE;oBACTD,yBAAyBC;gBAC3B;;;;AAIR,EAAC"}
1
+ {"version":3,"sources":["../../../src/ui/Compose/Compose.tsx"],"sourcesContent":["'use client'\n\nimport type { ClientField } from 'payload'\nimport type { FC } from 'react'\n\nimport { useEditorConfigContext } from '@payloadcms/richtext-lexical/client'\nimport { Popup, useField } from '@payloadcms/ui'\nimport React, { useCallback, useMemo, useState } from 'react'\n\nimport { PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js'\nimport { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js'\nimport { setSafeLexicalState } from '../../utilities/setSafeLexicalState.js'\nimport { PluginIcon } from '../Icons/Icons.js'\nimport styles from './compose.module.css'\nimport { useMenu } from './hooks/menu/useMenu.js'\nimport { useActiveFieldTracking } from './hooks/useActiveFieldTracking.js'\nimport { useGenerate } from './hooks/useGenerate.js'\nimport { UndoRedoActions } from './UndoRedoActions.js'\n\nexport type ComposeProps = {\n descriptionProps?: {\n field: ClientField\n path: string\n schemaPath: string\n }\n forceVisible?: boolean\n instructionId: string\n isConfigAllowed: boolean\n}\n\nexport const Compose: FC<ComposeProps> = ({ descriptionProps, forceVisible, instructionId, isConfigAllowed }) => {\n const pathFromContext = descriptionProps?.path\n const { editor: lexicalEditor } = useEditorConfigContext()\n \n // Get global openDrawer from context\n const { openDrawer } = useInstructions()\n\n // Initialize global active-field tracking\n useActiveFieldTracking()\n\n const [isProcessing, setIsProcessing] = useState<boolean>(false)\n const { generate, isJobActive, isLoading, jobProgress, jobStatus, stop } = useGenerate({ instructionId })\n\n // Memoize menu event handlers to prevent recreation on every render\n const onCompose = useCallback(() => {\n console.log('Composing...')\n setIsProcessing(true)\n generate({\n action: 'Compose',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onExpand = useCallback(() => {\n console.log('Expanding...')\n generate({\n action: 'Expand',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onProofread = useCallback(() => {\n console.log('Proofreading...')\n generate({\n action: 'Proofread',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onRephrase = useCallback(() => {\n console.log('Rephrasing...')\n generate({\n action: 'Rephrase',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onSimplify = useCallback(() => {\n console.log('Simplifying...')\n generate({\n action: 'Simplify',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onSummarize = useCallback(() => {\n console.log('Summarizing...')\n generate({\n action: 'Summarize',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onTranslate = useCallback((data: unknown) => {\n console.log('Translating...')\n generate({\n action: 'Translate',\n params: data,\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const handleOpenSettings = useCallback(() => {\n if (isConfigAllowed) {\n openDrawer(instructionId)\n }\n }, [isConfigAllowed, openDrawer, instructionId])\n\n const { ActiveComponent, Menu } = useMenu(\n {\n onCompose,\n onExpand,\n onProofread,\n onRephrase,\n onSettings: isConfigAllowed ? handleOpenSettings : undefined,\n onSimplify,\n onSummarize,\n onTranslate,\n },\n {\n isConfigAllowed,\n },\n )\n\n const { setValue } = useField<string>({\n path: pathFromContext,\n })\n\n const setIfValueIsLexicalState = useCallback((val: any) => {\n // Prevent setting incomplete states during streaming\n if (!val || typeof val !== 'object' || !('root' in val) || !lexicalEditor) {\n return\n }\n\n // Validate that the state is complete before setting\n // Check for common incomplete streaming states\n if (!val.root || typeof val.root !== 'object' || Object.keys(val.root).length === 0) {\n return\n }\n\n if (val.root.type !== 'root') {\n return\n }\n\n if (!val.root.children || !Array.isArray(val.root.children) || val.root.children.length === 0) {\n return\n }\n\n // Check for invalid child types (common streaming issue)\n const hasInvalidChildren = val.root.children.some(\n (child: any) => !child || !child.type || child.type === 'undefined' || child.type === '',\n )\n\n if (hasInvalidChildren) {\n return\n }\n\n // State looks valid, proceed\n setSafeLexicalState(JSON.stringify(val), lexicalEditor)\n\n // DO NOT PROVIDE lexicalEditor as a dependency, it freaks out and does not update the editor after first undo/redo - revisit\n }, [])\n\n const popupRender = useCallback(\n ({ close }: { close: () => void }) => {\n return <Menu isLoading={isProcessing || isLoading} onClose={close} />\n },\n [isProcessing, isLoading, Menu],\n )\n\n // Combine loading states to reduce re-renders\n const isAnyLoading = isProcessing || isLoading || isJobActive\n\n const memoizedPopup = useMemo(() => {\n return (\n <Popup\n button={<PluginIcon isLoading={isAnyLoading} />}\n render={popupRender}\n verticalAlign=\"bottom\"\n />\n )\n }, [popupRender, isAnyLoading])\n\n return (\n <label\n className={`payloadai-compose__actions ${styles.actions} ${forceVisible ? styles.actionsVisible : ''}`}\n onClick={(e) => e.preventDefault()}\n role=\"presentation\"\n >\n {memoizedPopup}\n <ActiveComponent\n isLoading={isProcessing || isLoading || isJobActive}\n loadingLabel={isJobActive ? (jobStatus === 'running' ? `Video ${Math.max(0, Math.min(100, Math.round(jobProgress ?? 0)))}%` : (jobStatus || 'Queued')) : undefined}\n stop={stop}\n />\n <UndoRedoActions\n onChange={(val) => {\n setValue(val)\n setIfValueIsLexicalState(val)\n }}\n />\n </label>\n )\n}\n"],"names":["useEditorConfigContext","Popup","useField","React","useCallback","useMemo","useState","useInstructions","setSafeLexicalState","PluginIcon","styles","useMenu","useActiveFieldTracking","useGenerate","UndoRedoActions","Compose","descriptionProps","forceVisible","instructionId","isConfigAllowed","pathFromContext","path","editor","lexicalEditor","openDrawer","isProcessing","setIsProcessing","generate","isJobActive","isLoading","jobProgress","jobStatus","stop","onCompose","console","log","action","catch","reason","error","finally","onExpand","onProofread","onRephrase","onSimplify","onSummarize","onTranslate","data","params","handleOpenSettings","ActiveComponent","Menu","onSettings","undefined","setValue","setIfValueIsLexicalState","val","root","Object","keys","length","type","children","Array","isArray","hasInvalidChildren","some","child","JSON","stringify","popupRender","close","onClose","isAnyLoading","memoizedPopup","button","render","verticalAlign","label","className","actions","actionsVisible","onClick","e","preventDefault","role","loadingLabel","Math","max","min","round","onChange"],"mappings":"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"}
@@ -10,7 +10,7 @@ import { useMenu } from './hooks/menu/useMenu.js';
10
10
  import { useActiveFieldTracking } from './hooks/useActiveFieldTracking.js';
11
11
  import { useGenerate } from './hooks/useGenerate.js';
12
12
  import { UndoRedoActions } from './UndoRedoActions.js';
13
- export const Compose = ({ descriptionProps, instructionId, isConfigAllowed }) => {
13
+ export const Compose = ({ descriptionProps, forceVisible, instructionId, isConfigAllowed }) => {
14
14
  const pathFromContext = descriptionProps?.path;
15
15
  const { editor: lexicalEditor } = useEditorConfigContext();
16
16
  // Get global openDrawer from context
@@ -127,9 +127,28 @@ export const Compose = ({ descriptionProps, instructionId, isConfigAllowed }) =>
127
127
  path: pathFromContext,
128
128
  });
129
129
  const setIfValueIsLexicalState = useCallback((val) => {
130
- if (val && typeof val === 'object' && 'root' in val && lexicalEditor) {
131
- setSafeLexicalState(JSON.stringify(val), lexicalEditor);
130
+ // Prevent setting incomplete states during streaming
131
+ if (!val || typeof val !== 'object' || !('root' in val) || !lexicalEditor) {
132
+ return;
132
133
  }
134
+ // Validate that the state is complete before setting
135
+ // Check for common incomplete streaming states
136
+ if (!val.root || typeof val.root !== 'object' || Object.keys(val.root).length === 0) {
137
+ return;
138
+ }
139
+ if (val.root.type !== 'root') {
140
+ return;
141
+ }
142
+ if (!val.root.children || !Array.isArray(val.root.children) || val.root.children.length === 0) {
143
+ return;
144
+ }
145
+ // Check for invalid child types (common streaming issue)
146
+ const hasInvalidChildren = val.root.children.some((child) => !child || !child.type || child.type === 'undefined' || child.type === '');
147
+ if (hasInvalidChildren) {
148
+ return;
149
+ }
150
+ // State looks valid, proceed
151
+ setSafeLexicalState(JSON.stringify(val), lexicalEditor);
133
152
  // DO NOT PROVIDE lexicalEditor as a dependency, it freaks out and does not update the editor after first undo/redo - revisit
134
153
  }, []);
135
154
  const popupRender = useCallback(({ close }) => {
@@ -140,7 +159,7 @@ export const Compose = ({ descriptionProps, instructionId, isConfigAllowed }) =>
140
159
  const memoizedPopup = useMemo(() => {
141
160
  return (<Popup button={<PluginIcon isLoading={isAnyLoading}/>} render={popupRender} verticalAlign="bottom"/>);
142
161
  }, [popupRender, isAnyLoading]);
143
- return (<label className={`payloadai-compose__actions ${styles.actions}`} onClick={(e) => e.preventDefault()} role="presentation">
162
+ return (<label className={`payloadai-compose__actions ${styles.actions} ${forceVisible ? styles.actionsVisible : ''}`} onClick={(e) => e.preventDefault()} role="presentation">
144
163
  {memoizedPopup}
145
164
  <ActiveComponent isLoading={isProcessing || isLoading || isJobActive} loadingLabel={isJobActive ? (jobStatus === 'running' ? `Video ${Math.max(0, Math.min(100, Math.round(jobProgress ?? 0)))}%` : (jobStatus || 'Queued')) : undefined} stop={stop}/>
146
165
  <UndoRedoActions onChange={(val) => {
@@ -1,4 +1,4 @@
1
1
  import React from 'react';
2
- export declare const UndoRedoActions: ({ onChange }: {
2
+ export declare const UndoRedoActions: React.MemoExoticComponent<({ onChange }: {
3
3
  onChange: (val: unknown) => void;
4
- }) => React.JSX.Element | null;
4
+ }) => React.JSX.Element | null>;
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import React, { useCallback, useEffect, useState } from 'react';
2
+ import React, { memo, useCallback, useEffect, useState } from 'react';
3
3
  import { useHistory } from './hooks/useHistory.js';
4
- export const UndoRedoActions = ({ onChange })=>{
4
+ export const UndoRedoActions = /*#__PURE__*/ memo(({ onChange })=>{
5
5
  const { canRedo, canUndo, redo, undo } = useHistory();
6
6
  const redoHistoryValue = useCallback((event)=>{
7
7
  event.stopPropagation();
@@ -10,7 +10,8 @@ export const UndoRedoActions = ({ onChange })=>{
10
10
  onChange(value);
11
11
  }
12
12
  }, [
13
- redo
13
+ redo,
14
+ onChange
14
15
  ]);
15
16
  const undoHistoryValue = useCallback((event)=>{
16
17
  event.stopPropagation();
@@ -19,7 +20,8 @@ export const UndoRedoActions = ({ onChange })=>{
19
20
  onChange(value);
20
21
  }
21
22
  }, [
22
- undo
23
+ undo,
24
+ onChange
23
25
  ]);
24
26
  // Delay rendering until the client-side hydration is complete
25
27
  const [isMounted, setIsMounted] = useState(false);
@@ -53,6 +55,7 @@ export const UndoRedoActions = ({ onChange })=>{
53
55
  })
54
56
  ]
55
57
  });
56
- };
58
+ });
59
+ UndoRedoActions.displayName = 'UndoRedoActions';
57
60
 
58
61
  //# sourceMappingURL=UndoRedoActions.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/ui/Compose/UndoRedoActions.tsx"],"sourcesContent":["import type { MouseEventHandler} from 'react';\n\nimport React, { useCallback, useEffect, useState } from 'react'\n\nimport { useHistory } from './hooks/useHistory.js'\n\nexport const UndoRedoActions = ({ onChange }: { onChange: (val: unknown) => void }) => {\n const { canRedo, canUndo, redo, undo } = useHistory()\n\n const redoHistoryValue = useCallback<MouseEventHandler>(\n (event) => {\n event.stopPropagation()\n\n const value = redo()\n if (value) {\n onChange(value)\n }\n },\n [redo],\n )\n\n const undoHistoryValue = useCallback<MouseEventHandler>(\n (event) => {\n event.stopPropagation()\n\n const value = undo()\n if (value) {\n onChange(value)\n }\n },\n [undo],\n )\n\n // Delay rendering until the client-side hydration is complete\n const [isMounted, setIsMounted] = useState(false)\n\n useEffect(() => {\n setIsMounted(true)\n }, [])\n\n if (!isMounted || (!canUndo && !canRedo)) {return null}\n\n return (\n <React.Fragment>\n <button\n className={`btn btn--size-small btn--style-secondary ${!canUndo && 'btn--disabled'}`}\n disabled={!canUndo}\n onClick={undoHistoryValue}\n style={{ marginBlock: 0 }}\n type=\"button\"\n >\n Undo\n </button>\n <button\n className={`btn btn--size-small btn--style-secondary ${!canRedo && 'btn--disabled'}`}\n disabled={!canRedo}\n onClick={redoHistoryValue}\n style={{ marginBlock: 0 }}\n type=\"button\"\n >\n Redo\n </button>\n </React.Fragment>\n )\n}\n"],"names":["React","useCallback","useEffect","useState","useHistory","UndoRedoActions","onChange","canRedo","canUndo","redo","undo","redoHistoryValue","event","stopPropagation","value","undoHistoryValue","isMounted","setIsMounted","Fragment","button","className","disabled","onClick","style","marginBlock","type"],"mappings":";AAEA,OAAOA,SAASC,WAAW,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAE/D,SAASC,UAAU,QAAQ,wBAAuB;AAElD,OAAO,MAAMC,kBAAkB,CAAC,EAAEC,QAAQ,EAAwC;IAChF,MAAM,EAAEC,OAAO,EAAEC,OAAO,EAAEC,IAAI,EAAEC,IAAI,EAAE,GAAGN;IAEzC,MAAMO,mBAAmBV,YACvB,CAACW;QACCA,MAAMC,eAAe;QAErB,MAAMC,QAAQL;QACd,IAAIK,OAAO;YACTR,SAASQ;QACX;IACF,GACA;QAACL;KAAK;IAGR,MAAMM,mBAAmBd,YACvB,CAACW;QACCA,MAAMC,eAAe;QAErB,MAAMC,QAAQJ;QACd,IAAII,OAAO;YACTR,SAASQ;QACX;IACF,GACA;QAACJ;KAAK;IAGR,8DAA8D;IAC9D,MAAM,CAACM,WAAWC,aAAa,GAAGd,SAAS;IAE3CD,UAAU;QACRe,aAAa;IACf,GAAG,EAAE;IAEL,IAAI,CAACD,aAAc,CAACR,WAAW,CAACD,SAAU;QAAC,OAAO;IAAI;IAEtD,qBACE,MAACP,MAAMkB,QAAQ;;0BACb,KAACC;gBACCC,WAAW,CAAC,yCAAyC,EAAE,CAACZ,WAAW,gBAAgB,CAAC;gBACpFa,UAAU,CAACb;gBACXc,SAASP;gBACTQ,OAAO;oBAAEC,aAAa;gBAAE;gBACxBC,MAAK;0BACN;;0BAGD,KAACN;gBACCC,WAAW,CAAC,yCAAyC,EAAE,CAACb,WAAW,gBAAgB,CAAC;gBACpFc,UAAU,CAACd;gBACXe,SAASX;gBACTY,OAAO;oBAAEC,aAAa;gBAAE;gBACxBC,MAAK;0BACN;;;;AAKP,EAAC"}
1
+ {"version":3,"sources":["../../../src/ui/Compose/UndoRedoActions.tsx"],"sourcesContent":["import type { MouseEventHandler } from 'react'\n\nimport React, { memo, useCallback, useEffect, useState } from 'react'\n\nimport { useHistory } from './hooks/useHistory.js'\n\nexport const UndoRedoActions = memo(({ onChange }: { onChange: (val: unknown) => void }) => {\n const { canRedo, canUndo, redo, undo } = useHistory()\n\n const redoHistoryValue = useCallback<MouseEventHandler>(\n (event) => {\n event.stopPropagation()\n\n const value = redo()\n if (value) {\n onChange(value)\n }\n },\n [redo, onChange],\n )\n\n const undoHistoryValue = useCallback<MouseEventHandler>(\n (event) => {\n event.stopPropagation()\n\n const value = undo()\n if (value) {\n onChange(value)\n }\n },\n [undo, onChange],\n )\n\n // Delay rendering until the client-side hydration is complete\n const [isMounted, setIsMounted] = useState(false)\n\n useEffect(() => {\n setIsMounted(true)\n }, [])\n\n if (!isMounted || (!canUndo && !canRedo)) {\n return null\n }\n\n return (\n <React.Fragment>\n <button\n className={`btn btn--size-small btn--style-secondary ${!canUndo && 'btn--disabled'}`}\n disabled={!canUndo}\n onClick={undoHistoryValue}\n style={{ marginBlock: 0 }}\n type=\"button\"\n >\n Undo\n </button>\n <button\n className={`btn btn--size-small btn--style-secondary ${!canRedo && 'btn--disabled'}`}\n disabled={!canRedo}\n onClick={redoHistoryValue}\n style={{ marginBlock: 0 }}\n type=\"button\"\n >\n Redo\n </button>\n </React.Fragment>\n )\n})\n\nUndoRedoActions.displayName = 'UndoRedoActions'\n"],"names":["React","memo","useCallback","useEffect","useState","useHistory","UndoRedoActions","onChange","canRedo","canUndo","redo","undo","redoHistoryValue","event","stopPropagation","value","undoHistoryValue","isMounted","setIsMounted","Fragment","button","className","disabled","onClick","style","marginBlock","type","displayName"],"mappings":";AAEA,OAAOA,SAASC,IAAI,EAAEC,WAAW,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAErE,SAASC,UAAU,QAAQ,wBAAuB;AAElD,OAAO,MAAMC,gCAAkBL,KAAK,CAAC,EAAEM,QAAQ,EAAwC;IACrF,MAAM,EAAEC,OAAO,EAAEC,OAAO,EAAEC,IAAI,EAAEC,IAAI,EAAE,GAAGN;IAEzC,MAAMO,mBAAmBV,YACvB,CAACW;QACCA,MAAMC,eAAe;QAErB,MAAMC,QAAQL;QACd,IAAIK,OAAO;YACTR,SAASQ;QACX;IACF,GACA;QAACL;QAAMH;KAAS;IAGlB,MAAMS,mBAAmBd,YACvB,CAACW;QACCA,MAAMC,eAAe;QAErB,MAAMC,QAAQJ;QACd,IAAII,OAAO;YACTR,SAASQ;QACX;IACF,GACA;QAACJ;QAAMJ;KAAS;IAGlB,8DAA8D;IAC9D,MAAM,CAACU,WAAWC,aAAa,GAAGd,SAAS;IAE3CD,UAAU;QACRe,aAAa;IACf,GAAG,EAAE;IAEL,IAAI,CAACD,aAAc,CAACR,WAAW,CAACD,SAAU;QACxC,OAAO;IACT;IAEA,qBACE,MAACR,MAAMmB,QAAQ;;0BACb,KAACC;gBACCC,WAAW,CAAC,yCAAyC,EAAE,CAACZ,WAAW,gBAAgB,CAAC;gBACpFa,UAAU,CAACb;gBACXc,SAASP;gBACTQ,OAAO;oBAAEC,aAAa;gBAAE;gBACxBC,MAAK;0BACN;;0BAGD,KAACN;gBACCC,WAAW,CAAC,yCAAyC,EAAE,CAACb,WAAW,gBAAgB,CAAC;gBACpFc,UAAU,CAACd;gBACXe,SAASX;gBACTY,OAAO;oBAAEC,aAAa;gBAAE;gBACxBC,MAAK;0BACN;;;;AAKP,GAAE;AAEFpB,gBAAgBqB,WAAW,GAAG"}
@@ -1,6 +1,6 @@
1
- import React, { useCallback, useEffect, useState } from 'react';
1
+ import React, { memo, useCallback, useEffect, useState } from 'react';
2
2
  import { useHistory } from './hooks/useHistory.js';
3
- export const UndoRedoActions = ({ onChange }) => {
3
+ export const UndoRedoActions = memo(({ onChange }) => {
4
4
  const { canRedo, canUndo, redo, undo } = useHistory();
5
5
  const redoHistoryValue = useCallback((event) => {
6
6
  event.stopPropagation();
@@ -8,14 +8,14 @@ export const UndoRedoActions = ({ onChange }) => {
8
8
  if (value) {
9
9
  onChange(value);
10
10
  }
11
- }, [redo]);
11
+ }, [redo, onChange]);
12
12
  const undoHistoryValue = useCallback((event) => {
13
13
  event.stopPropagation();
14
14
  const value = undo();
15
15
  if (value) {
16
16
  onChange(value);
17
17
  }
18
- }, [undo]);
18
+ }, [undo, onChange]);
19
19
  // Delay rendering until the client-side hydration is complete
20
20
  const [isMounted, setIsMounted] = useState(false);
21
21
  useEffect(() => {
@@ -32,4 +32,5 @@ export const UndoRedoActions = ({ onChange }) => {
32
32
  Redo
33
33
  </button>
34
34
  </React.Fragment>);
35
- };
35
+ });
36
+ UndoRedoActions.displayName = 'UndoRedoActions';
@@ -13,10 +13,6 @@
13
13
  transform-origin: top;
14
14
  max-height: 0;
15
15
 
16
- will-change: transform, opacity;
17
- backface-visibility: hidden;
18
- perspective: 1000px;
19
-
20
16
  transition:
21
17
  opacity 0.25s cubic-bezier(0.4, 0, 0.2, 1),
22
18
  transform 0.3s cubic-bezier(0.4, 0, 0.2, 1),
@@ -39,23 +35,22 @@
39
35
  max-height 0.3s cubic-bezier(0.4, 0, 0.2, 1);
40
36
  }
41
37
 
38
+
39
+
42
40
  :global(.field-type.ai-plugin-active) .actions {
43
- animation: removeWillChange 0.3s forwards;
41
+ /* animation: removeWillChange 0.3s forwards; */
44
42
  }
45
43
 
46
- @keyframes removeWillChange {
44
+ /* @keyframes removeWillChange {
47
45
  to {
48
46
  will-change: auto;
49
47
  }
50
- }
48
+ } */
51
49
 
52
50
  .actions > * {
53
51
  opacity: 0;
54
52
  transform: translateY(-3px) translateZ(0);
55
53
 
56
- will-change: transform, opacity;
57
- backface-visibility: hidden;
58
-
59
54
  transition:
60
55
  opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1),
61
56
  transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);
@@ -68,27 +63,22 @@
68
63
 
69
64
  :global(.field-type.ai-plugin-active) .actions > *:nth-child(1) {
70
65
  transition-delay: 0.05s;
71
- animation: removeWillChange 0.25s 0.05s forwards;
72
66
  }
73
67
 
74
68
  :global(.field-type.ai-plugin-active) .actions > *:nth-child(2) {
75
69
  transition-delay: 0.08s;
76
- animation: removeWillChange 0.28s 0.08s forwards;
77
70
  }
78
71
 
79
72
  :global(.field-type.ai-plugin-active) .actions > *:nth-child(3) {
80
73
  transition-delay: 0.11s;
81
- animation: removeWillChange 0.31s 0.11s forwards;
82
74
  }
83
75
 
84
76
  :global(.field-type.ai-plugin-active) .actions > *:nth-child(4) {
85
77
  transition-delay: 0.14s;
86
- animation: removeWillChange 0.34s 0.14s forwards;
87
78
  }
88
79
 
89
80
  :global(.field-type.ai-plugin-active) .actions > *:nth-child(5) {
90
81
  transition-delay: 0.17s;
91
- animation: removeWillChange 0.37s 0.17s forwards;
92
82
  }
93
83
 
94
84
  @media (prefers-reduced-motion: no-preference) and (min-resolution: 120dpi) {
@@ -103,6 +93,56 @@
103
93
  .actions > * {
104
94
  transition-duration: 0.01ms !important;
105
95
  animation-duration: 0.01ms !important;
106
- will-change: auto !important;
107
96
  }
108
97
  }
98
+
99
+ /* Force visibility modifier - Placed at end for CSS priority */
100
+ .actions.actionsVisible {
101
+ opacity: 1;
102
+ visibility: visible;
103
+ pointer-events: auto;
104
+ max-height: 100px;
105
+ transform: scaleY(1) skewX(0) translateY(0) translateZ(0);
106
+
107
+ /* User requested overrides */
108
+ margin: 0;
109
+ padding: 0;
110
+ /* flex-direction: row-reverse; - Reverted */
111
+ }
112
+
113
+ .actions.actionsVisible > * {
114
+ opacity: 1;
115
+ transform: translateY(0) translateZ(0);
116
+ }
117
+
118
+ /* Ensure field wrapper is positioned for absolute children */
119
+ /* Ensure field wrapper is positioned for absolute children */
120
+ .arrayFieldWrapper {
121
+ position: relative !important;
122
+ }
123
+
124
+ /* Position Compose button - Base */
125
+ .composePortal {
126
+ display: flex !important;
127
+ align-items: center;
128
+ height: min-content;
129
+ z-index: 5;
130
+ }
131
+
132
+ /* When Add Row is present: Overlay at bottom right */
133
+ .composePortalAbsolute {
134
+ position: absolute;
135
+ bottom: 0;
136
+ right: 0;
137
+ }
138
+
139
+ /* When Add Row is missing: Normal flow at bottom right */
140
+ .composePortalStatic {
141
+ position: relative;
142
+ width: 100%;
143
+ justify-content: flex-end;
144
+ margin-top: -32px;
145
+ /* Reset absolute positioning styles */
146
+ bottom: auto;
147
+ right: auto;
148
+ }
@@ -5,7 +5,8 @@ export const menuItemsMap = [
5
5
  name: 'Proofread',
6
6
  component: Proofread,
7
7
  excludedFor: [
8
- 'upload'
8
+ 'upload',
9
+ 'array'
9
10
  ],
10
11
  loadingText: 'Proofreading'
11
12
  },
@@ -13,7 +14,8 @@ export const menuItemsMap = [
13
14
  name: 'Rephrase',
14
15
  component: Rephrase,
15
16
  excludedFor: [
16
- 'upload'
17
+ 'upload',
18
+ 'array'
17
19
  ],
18
20
  loadingText: 'Rephrasing'
19
21
  },
@@ -21,7 +23,8 @@ export const menuItemsMap = [
21
23
  name: 'Translate',
22
24
  component: MemoizedTranslateMenu,
23
25
  excludedFor: [
24
- 'upload'
26
+ 'upload',
27
+ 'array'
25
28
  ],
26
29
  loadingText: 'Translating'
27
30
  },
@@ -30,7 +33,8 @@ export const menuItemsMap = [
30
33
  component: Expand,
31
34
  excludedFor: [
32
35
  'upload',
33
- 'text'
36
+ 'text',
37
+ 'array'
34
38
  ],
35
39
  loadingText: 'Expanding'
36
40
  },
@@ -41,7 +45,8 @@ export const menuItemsMap = [
41
45
  excludedFor: [
42
46
  'upload',
43
47
  'text',
44
- 'richText'
48
+ 'richText',
49
+ 'array'
45
50
  ],
46
51
  loadingText: 'Summarizing'
47
52
  },
@@ -49,7 +54,8 @@ export const menuItemsMap = [
49
54
  name: 'Simplify',
50
55
  component: Simplify,
51
56
  excludedFor: [
52
- 'upload'
57
+ 'upload',
58
+ 'array'
53
59
  ],
54
60
  loadingText: 'Simplifying'
55
61
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/ui/Compose/hooks/menu/itemsMap.ts"],"sourcesContent":["import type React from 'react'\n\nimport type { ActionMenuItems, BaseItemProps } from '../../../../types.js'\n\nimport { Compose, Expand, Proofread, Rephrase, Settings, Simplify, Summarize } from './items.js'\nimport { MemoizedTranslateMenu, TranslateMenu } from './TranslateMenu.js'\n\ntype MenuItemsMapType = {\n component: React.FC<BaseItemProps>\n excludedFor?: string[]\n loadingText?: string\n name: ActionMenuItems\n}\n\nexport const menuItemsMap: MenuItemsMapType[] = [\n { name: 'Proofread', component: Proofread, excludedFor: ['upload'], loadingText: 'Proofreading' },\n { name: 'Rephrase', component: Rephrase, excludedFor: ['upload'], loadingText: 'Rephrasing' },\n {\n name: 'Translate',\n component: MemoizedTranslateMenu,\n excludedFor: ['upload'],\n loadingText: 'Translating',\n },\n { name: 'Expand', component: Expand, excludedFor: ['upload', 'text'], loadingText: 'Expanding' },\n {\n // Turned off - WIP\n name: 'Summarize',\n component: Summarize,\n excludedFor: ['upload', 'text', 'richText'],\n loadingText: 'Summarizing',\n },\n { name: 'Simplify', component: Simplify, excludedFor: ['upload'], loadingText: 'Simplifying' },\n { name: 'Compose', component: Compose, loadingText: 'Composing' },\n { name: 'Settings', component: Settings },\n]\n"],"names":["Compose","Expand","Proofread","Rephrase","Settings","Simplify","Summarize","MemoizedTranslateMenu","menuItemsMap","name","component","excludedFor","loadingText"],"mappings":"AAIA,SAASA,OAAO,EAAEC,MAAM,EAAEC,SAAS,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,SAAS,QAAQ,aAAY;AAChG,SAASC,qBAAqB,QAAuB,qBAAoB;AASzE,OAAO,MAAMC,eAAmC;IAC9C;QAAEC,MAAM;QAAaC,WAAWR;QAAWS,aAAa;YAAC;SAAS;QAAEC,aAAa;IAAe;IAChG;QAAEH,MAAM;QAAYC,WAAWP;QAAUQ,aAAa;YAAC;SAAS;QAAEC,aAAa;IAAa;IAC5F;QACEH,MAAM;QACNC,WAAWH;QACXI,aAAa;YAAC;SAAS;QACvBC,aAAa;IACf;IACA;QAAEH,MAAM;QAAUC,WAAWT;QAAQU,aAAa;YAAC;YAAU;SAAO;QAAEC,aAAa;IAAY;IAC/F;QACE,mBAAmB;QACnBH,MAAM;QACNC,WAAWJ;QACXK,aAAa;YAAC;YAAU;YAAQ;SAAW;QAC3CC,aAAa;IACf;IACA;QAAEH,MAAM;QAAYC,WAAWL;QAAUM,aAAa;YAAC;SAAS;QAAEC,aAAa;IAAc;IAC7F;QAAEH,MAAM;QAAWC,WAAWV;QAASY,aAAa;IAAY;IAChE;QAAEH,MAAM;QAAYC,WAAWN;IAAS;CACzC,CAAA"}
1
+ {"version":3,"sources":["../../../../../src/ui/Compose/hooks/menu/itemsMap.ts"],"sourcesContent":["import type React from 'react'\n\nimport type { ActionMenuItems, BaseItemProps } from '../../../../types.js'\n\nimport { Compose, Expand, Proofread, Rephrase, Settings, Simplify, Summarize } from './items.js'\nimport { MemoizedTranslateMenu, TranslateMenu } from './TranslateMenu.js'\n\ntype MenuItemsMapType = {\n component: React.FC<BaseItemProps>\n excludedFor?: string[]\n loadingText?: string\n name: ActionMenuItems\n}\n\nexport const menuItemsMap: MenuItemsMapType[] = [\n { name: 'Proofread', component: Proofread, excludedFor: ['upload', 'array'], loadingText: 'Proofreading' },\n { name: 'Rephrase', component: Rephrase, excludedFor: ['upload', 'array'], loadingText: 'Rephrasing' },\n {\n name: 'Translate',\n component: MemoizedTranslateMenu,\n excludedFor: ['upload', 'array'],\n loadingText: 'Translating',\n },\n { name: 'Expand', component: Expand, excludedFor: ['upload', 'text', 'array'], loadingText: 'Expanding' },\n {\n // Turned off - WIP\n name: 'Summarize',\n component: Summarize,\n excludedFor: ['upload', 'text', 'richText', 'array'],\n loadingText: 'Summarizing',\n },\n { name: 'Simplify', component: Simplify, excludedFor: ['upload', 'array'], loadingText: 'Simplifying' },\n { name: 'Compose', component: Compose, loadingText: 'Composing' },\n { name: 'Settings', component: Settings },\n]\n"],"names":["Compose","Expand","Proofread","Rephrase","Settings","Simplify","Summarize","MemoizedTranslateMenu","menuItemsMap","name","component","excludedFor","loadingText"],"mappings":"AAIA,SAASA,OAAO,EAAEC,MAAM,EAAEC,SAAS,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,SAAS,QAAQ,aAAY;AAChG,SAASC,qBAAqB,QAAuB,qBAAoB;AASzE,OAAO,MAAMC,eAAmC;IAC9C;QAAEC,MAAM;QAAaC,WAAWR;QAAWS,aAAa;YAAC;YAAU;SAAQ;QAAEC,aAAa;IAAe;IACzG;QAAEH,MAAM;QAAYC,WAAWP;QAAUQ,aAAa;YAAC;YAAU;SAAQ;QAAEC,aAAa;IAAa;IACrG;QACEH,MAAM;QACNC,WAAWH;QACXI,aAAa;YAAC;YAAU;SAAQ;QAChCC,aAAa;IACf;IACA;QAAEH,MAAM;QAAUC,WAAWT;QAAQU,aAAa;YAAC;YAAU;YAAQ;SAAQ;QAAEC,aAAa;IAAY;IACxG;QACE,mBAAmB;QACnBH,MAAM;QACNC,WAAWJ;QACXK,aAAa;YAAC;YAAU;YAAQ;YAAY;SAAQ;QACpDC,aAAa;IACf;IACA;QAAEH,MAAM;QAAYC,WAAWL;QAAUM,aAAa;YAAC;YAAU;SAAQ;QAAEC,aAAa;IAAc;IACtG;QAAEH,MAAM;QAAWC,WAAWV;QAASY,aAAa;IAAY;IAChE;QAAEH,MAAM;QAAYC,WAAWN;IAAS;CACzC,CAAA"}