@ai-stack/payloadcms 3.68.0-beta.1 → 3.68.0-beta.3

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 (134) 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 +0 -3
  6. package/dist/ai/core/streamObject.js.map +1 -1
  7. package/dist/ai/providers/blocks/anthropic.js +2 -1
  8. package/dist/ai/providers/blocks/anthropic.js.map +1 -1
  9. package/dist/ai/providers/blocks/elevenlabs.js +3 -2
  10. package/dist/ai/providers/blocks/elevenlabs.js.map +1 -1
  11. package/dist/ai/providers/blocks/fal.js +2 -1
  12. package/dist/ai/providers/blocks/fal.js.map +1 -1
  13. package/dist/ai/providers/blocks/google.js +11 -6
  14. package/dist/ai/providers/blocks/google.js.map +1 -1
  15. package/dist/ai/providers/blocks/openai-compatible.js +2 -1
  16. package/dist/ai/providers/blocks/openai-compatible.js.map +1 -1
  17. package/dist/ai/providers/blocks/openai.js +3 -2
  18. package/dist/ai/providers/blocks/openai.js.map +1 -1
  19. package/dist/ai/providers/blocks/xai.js +2 -1
  20. package/dist/ai/providers/blocks/xai.js.map +1 -1
  21. package/dist/ai/providers/icons.d.ts +7 -0
  22. package/dist/ai/providers/icons.js +9 -0
  23. package/dist/ai/providers/icons.js.map +1 -0
  24. package/dist/ai/providers/registry.js +34 -23
  25. package/dist/ai/providers/registry.js.map +1 -1
  26. package/dist/collections/AISettings.js +44 -17
  27. package/dist/collections/AISettings.js.map +1 -1
  28. package/dist/collections/Instructions.js +37 -0
  29. package/dist/collections/Instructions.js.map +1 -1
  30. package/dist/defaults.d.ts +1 -0
  31. package/dist/defaults.js +8 -0
  32. package/dist/defaults.js.map +1 -1
  33. package/dist/endpoints/chat.d.ts +4 -0
  34. package/dist/endpoints/fetchFields.js +10 -0
  35. package/dist/endpoints/fetchFields.js.map +1 -1
  36. package/dist/endpoints/index.js +86 -10
  37. package/dist/endpoints/index.js.map +1 -1
  38. package/dist/exports/fields.d.ts +1 -0
  39. package/dist/exports/fields.js +1 -0
  40. package/dist/exports/fields.js.map +1 -1
  41. package/dist/fields/ArrayComposeField/ArrayComposeField.d.ts +15 -0
  42. package/dist/fields/ArrayComposeField/ArrayComposeField.js +87 -0
  43. package/dist/fields/ArrayComposeField/ArrayComposeField.js.map +1 -0
  44. package/dist/fields/ArrayComposeField/ArrayComposeField.jsx +73 -0
  45. package/dist/fields/PromptEditorField/PromptEditorField.js +7 -2
  46. package/dist/fields/PromptEditorField/PromptEditorField.js.map +1 -1
  47. package/dist/fields/PromptEditorField/PromptEditorField.jsx +5 -2
  48. package/dist/index.d.ts +2 -0
  49. package/dist/index.js +1 -0
  50. package/dist/index.js.map +1 -1
  51. package/dist/payload-ai.d.ts +149 -0
  52. package/dist/plugin.js +16 -32
  53. package/dist/plugin.js.map +1 -1
  54. package/dist/providers/InstructionsProvider/InstructionsProvider.js +47 -15
  55. package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
  56. package/dist/providers/InstructionsProvider/InstructionsProvider.jsx +39 -16
  57. package/dist/providers/InstructionsProvider/context.d.ts +3 -0
  58. package/dist/providers/InstructionsProvider/context.js +2 -0
  59. package/dist/providers/InstructionsProvider/context.js.map +1 -1
  60. package/dist/providers/InstructionsProvider/useInstructions.js +21 -2
  61. package/dist/providers/InstructionsProvider/useInstructions.js.map +1 -1
  62. package/dist/styles.d.ts +11 -0
  63. package/dist/types/handlebars-async-helpers.d.ts +1 -0
  64. package/dist/types/handlebars-dist-handlebars.d.ts +1 -0
  65. package/dist/types/react-mentions.d.ts +1 -0
  66. package/dist/types.d.ts +0 -3
  67. package/dist/types.js.map +1 -1
  68. package/dist/ui/AIConfigDashboard/index.js +198 -22
  69. package/dist/ui/AIConfigDashboard/index.js.map +1 -1
  70. package/dist/ui/AIConfigDashboard/index.jsx +159 -13
  71. package/dist/ui/Compose/Compose.d.ts +1 -0
  72. package/dist/ui/Compose/Compose.js +7 -5
  73. package/dist/ui/Compose/Compose.js.map +1 -1
  74. package/dist/ui/Compose/Compose.jsx +5 -5
  75. package/dist/ui/Compose/UndoRedoActions.d.ts +2 -2
  76. package/dist/ui/Compose/UndoRedoActions.js +8 -5
  77. package/dist/ui/Compose/UndoRedoActions.js.map +1 -1
  78. package/dist/ui/Compose/UndoRedoActions.jsx +6 -5
  79. package/dist/ui/Compose/compose.module.css +56 -16
  80. package/dist/ui/Compose/hooks/menu/itemsMap.js +12 -6
  81. package/dist/ui/Compose/hooks/menu/itemsMap.js.map +1 -1
  82. package/dist/ui/Compose/hooks/menu/useMenu.js +26 -15
  83. package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
  84. package/dist/ui/Compose/hooks/menu/useMenu.jsx +25 -12
  85. package/dist/ui/Compose/hooks/useGenerate.js +34 -131
  86. package/dist/ui/Compose/hooks/useGenerate.js.map +1 -1
  87. package/dist/ui/Compose/hooks/useGenerateUpload.d.ts +11 -0
  88. package/dist/ui/Compose/hooks/useGenerateUpload.js +123 -0
  89. package/dist/ui/Compose/hooks/useGenerateUpload.js.map +1 -0
  90. package/dist/ui/Compose/hooks/useHistory.d.ts +0 -1
  91. package/dist/ui/Compose/hooks/useHistory.js +65 -25
  92. package/dist/ui/Compose/hooks/useHistory.js.map +1 -1
  93. package/dist/ui/Compose/hooks/useStreamingUpdate.d.ts +8 -0
  94. package/dist/ui/Compose/hooks/useStreamingUpdate.js +48 -0
  95. package/dist/ui/Compose/hooks/useStreamingUpdate.js.map +1 -0
  96. package/dist/ui/DynamicVoiceSelect/index.js +63 -11
  97. package/dist/ui/DynamicVoiceSelect/index.js.map +1 -1
  98. package/dist/ui/DynamicVoiceSelect/index.jsx +47 -14
  99. package/dist/ui/EncryptedTextField/index.js +4 -4
  100. package/dist/ui/EncryptedTextField/index.js.map +1 -1
  101. package/dist/ui/EncryptedTextField/index.jsx +4 -4
  102. package/dist/ui/VoicesFetcher/index.js +54 -8
  103. package/dist/ui/VoicesFetcher/index.js.map +1 -1
  104. package/dist/ui/VoicesFetcher/index.jsx +32 -9
  105. package/dist/utilities/buildSmartPrompt.d.ts +22 -0
  106. package/dist/utilities/buildSmartPrompt.js +143 -0
  107. package/dist/utilities/buildSmartPrompt.js.map +1 -0
  108. package/dist/utilities/resolveImageReferences.d.ts +3 -1
  109. package/dist/utilities/resolveImageReferences.js +21 -2
  110. package/dist/utilities/resolveImageReferences.js.map +1 -1
  111. package/dist/utilities/seedProperties.d.ts +7 -0
  112. package/dist/utilities/seedProperties.js +117 -0
  113. package/dist/utilities/seedProperties.js.map +1 -0
  114. package/dist/utilities/setSafeLexicalState.js +80 -6
  115. package/dist/utilities/setSafeLexicalState.js.map +1 -1
  116. package/dist/utilities/updateFieldsConfig.d.ts +1 -1
  117. package/dist/utilities/updateFieldsConfig.js +8 -1
  118. package/dist/utilities/updateFieldsConfig.js.map +1 -1
  119. package/package.json +4 -3
  120. package/dist/endpoints/chat.d.js +0 -3
  121. package/dist/endpoints/chat.d.js.map +0 -1
  122. package/dist/init.d.ts +0 -7
  123. package/dist/init.js +0 -135
  124. package/dist/init.js.map +0 -1
  125. package/dist/payload-ai.d.js +0 -3
  126. package/dist/payload-ai.d.js.map +0 -1
  127. package/dist/styles.d.js +0 -2
  128. package/dist/styles.d.js.map +0 -1
  129. package/dist/types/handlebars-async-helpers.d.js +0 -2
  130. package/dist/types/handlebars-async-helpers.d.js.map +0 -1
  131. package/dist/types/handlebars-dist-handlebars.d.js +0 -2
  132. package/dist/types/handlebars-dist-handlebars.d.js.map +0 -1
  133. package/dist/types/react-mentions.d.js +0 -2
  134. 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
@@ -135,10 +135,12 @@ export const Compose = ({ descriptionProps, instructionId, isConfigAllowed })=>{
135
135
  });
136
136
  const setIfValueIsLexicalState = useCallback((val)=>{
137
137
  if (val && typeof val === 'object' && 'root' in val && lexicalEditor) {
138
- setSafeLexicalState(JSON.stringify(val), lexicalEditor);
138
+ // Pass the object directly to our safe setter which handles validation
139
+ setSafeLexicalState(val, lexicalEditor);
139
140
  }
140
- // DO NOT PROVIDE lexicalEditor as a dependency, it freaks out and does not update the editor after first undo/redo - revisit
141
- }, []);
141
+ }, [
142
+ lexicalEditor
143
+ ]);
142
144
  const popupRender = useCallback(({ close })=>{
143
145
  return /*#__PURE__*/ _jsx(Menu, {
144
146
  isLoading: isProcessing || isLoading,
@@ -164,7 +166,7 @@ export const Compose = ({ descriptionProps, instructionId, isConfigAllowed })=>{
164
166
  isAnyLoading
165
167
  ]);
166
168
  return /*#__PURE__*/ _jsxs("label", {
167
- className: `payloadai-compose__actions ${styles.actions}`,
169
+ className: `payloadai-compose__actions ${styles.actions} ${forceVisible ? styles.actionsVisible : ''}`,
168
170
  onClick: (e)=>e.preventDefault(),
169
171
  role: "presentation",
170
172
  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":"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"}
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(\n (val: any) => {\n if (val && typeof val === 'object' && 'root' in val && lexicalEditor) {\n // Pass the object directly to our safe setter which handles validation\n setSafeLexicalState(val, lexicalEditor)\n }\n },\n [lexicalEditor],\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","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
@@ -128,10 +128,10 @@ export const Compose = ({ descriptionProps, instructionId, isConfigAllowed }) =>
128
128
  });
129
129
  const setIfValueIsLexicalState = useCallback((val) => {
130
130
  if (val && typeof val === 'object' && 'root' in val && lexicalEditor) {
131
- setSafeLexicalState(JSON.stringify(val), lexicalEditor);
131
+ // Pass the object directly to our safe setter which handles validation
132
+ setSafeLexicalState(val, lexicalEditor);
132
133
  }
133
- // DO NOT PROVIDE lexicalEditor as a dependency, it freaks out and does not update the editor after first undo/redo - revisit
134
- }, []);
134
+ }, [lexicalEditor]);
135
135
  const popupRender = useCallback(({ close }) => {
136
136
  return <Menu isLoading={isProcessing || isLoading} onClose={close}/>;
137
137
  }, [isProcessing, isLoading, Menu]);
@@ -140,7 +140,7 @@ export const Compose = ({ descriptionProps, instructionId, isConfigAllowed }) =>
140
140
  const memoizedPopup = useMemo(() => {
141
141
  return (<Popup button={<PluginIcon isLoading={isAnyLoading}/>} render={popupRender} verticalAlign="bottom"/>);
142
142
  }, [popupRender, isAnyLoading]);
143
- return (<label className={`payloadai-compose__actions ${styles.actions}`} onClick={(e) => e.preventDefault()} role="presentation">
143
+ return (<label className={`payloadai-compose__actions ${styles.actions} ${forceVisible ? styles.actionsVisible : ''}`} onClick={(e) => e.preventDefault()} role="presentation">
144
144
  {memoizedPopup}
145
145
  <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
146
  <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"}