@arqel-dev/ai 0.15.1 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/register.js +7 -2
- package/dist/register.js.map +1 -1
- package/package.json +5 -5
package/dist/register.js
CHANGED
|
@@ -6,8 +6,13 @@ import { registerField } from '@arqel-dev/ui/form';
|
|
|
6
6
|
|
|
7
7
|
var __defProp = Object.defineProperty;
|
|
8
8
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
9
|
-
var __esm = (fn, res) => function __init() {
|
|
10
|
-
|
|
9
|
+
var __esm = (fn, res, err) => function __init() {
|
|
10
|
+
if (err) throw err[0];
|
|
11
|
+
try {
|
|
12
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
13
|
+
} catch (e) {
|
|
14
|
+
throw err = [e], e;
|
|
15
|
+
}
|
|
11
16
|
};
|
|
12
17
|
var __export = (target, all) => {
|
|
13
18
|
for (var name in all)
|
package/dist/register.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/AiTextInput.tsx","../src/AiTranslateInput.tsx","../src/AiSelectInput.tsx","../src/AiExtractInput.tsx","../src/AiImageInput.tsx","../src/register.tsx"],"names":["Spinner","jsxs","jsx","useArqelTranslations","useMemo","useId","useState","useCallback","Button","Textarea","Alert","AlertDescription","DEFAULT_BUTTON_LABEL","Badge","body","isStringRecord","useArqelLocale","Card","CardContent"],"mappings":"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","file":"register.js","sourcesContent":["/**\n * `<AiTextInput>` — apresentational React component for the PHP\n * `Arqel\\Ai\\Fields\\AiTextField` (component string `AiTextInput`).\n *\n * Render contract (AI-007):\n * - `<textarea>` displaying the current value (controlled if\n * `onChange` is provided, otherwise uncontrolled with internal\n * state seeded by `value`),\n * - \"Generate with AI\" button (label from `props.buttonLabel`,\n * fallback `Generate with AI`); after a successful generation the\n * button label becomes `Regenerate`,\n * - while a request is in-flight the button is disabled and shows a\n * small inline spinner,\n * - on failure a banner with a generic message + HTTP status code is\n * rendered; the button re-enables so the user can retry,\n * - optional `X / maxLength` counter when `props.maxLength` is set.\n *\n * Network:\n * - URL = `props.generateUrl` (caller override) or\n * `/admin/${resource}/fields/${field}/generate` (default route name\n * `arqel.ai.generate`).\n * - `fetch(url, { method: 'POST', credentials: 'same-origin', headers:\n * { Content-Type, Accept, X-CSRF-TOKEN }, body: JSON.stringify({\n * formData }) })`. The PHP controller resolves the prompt template\n * server-side and returns `{ text }`.\n *\n * SSR-safe: nothing in the render path touches `window`/`document`;\n * the network call only fires from the click handler (post-mount).\n */\n\nimport { useArqelLocale, useArqelTranslations } from '@arqel-dev/react/utils';\nimport { Alert, AlertDescription, Button, Textarea } from '@arqel-dev/ui';\nimport { type ChangeEvent, type ReactElement, useCallback, useId, useMemo, useState } from 'react';\n\nexport interface AiTextInputFieldProps {\n provider?: string | null;\n buttonLabel: string;\n maxLength?: number | null;\n hasContextFields: boolean;\n}\n\nexport interface AiTextInputProps {\n name: string;\n value: string;\n onChange?: (value: string) => void;\n props: AiTextInputFieldProps | undefined;\n resource?: string;\n field?: string;\n formData?: Record<string, unknown>;\n generateUrl?: string;\n csrfToken?: string;\n}\n\ninterface AiGenerateResponseBody {\n text?: unknown;\n}\n\nconst DEFAULT_BUTTON_LABEL = 'Generate with AI';\nconst REGENERATE_LABEL = 'Regenerate';\n\nfunction buildGenerateUrl(\n override: string | undefined,\n resource: string | undefined,\n field: string | undefined,\n): string | null {\n if (override !== undefined && override !== '') {\n return override;\n }\n if (resource && field) {\n return `/admin/${resource}/fields/${field}/generate`;\n }\n return null;\n}\n\nfunction Spinner(): ReactElement {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n className=\"animate-spin\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeOpacity=\"0.25\" strokeWidth=\"4\" />\n <path\n d=\"M22 12a10 10 0 0 1-10 10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function AiTextInput(props: AiTextInputProps): ReactElement {\n const {\n name,\n value,\n onChange,\n props: fieldProps,\n resource,\n field,\n formData,\n generateUrl,\n csrfToken,\n } = props;\n\n const t = useArqelTranslations();\n const locale = useArqelLocale();\n const numberFormatter = useMemo(() => new Intl.NumberFormat(locale), [locale]);\n const serverLabel = fieldProps?.buttonLabel;\n const buttonLabel =\n serverLabel !== undefined && serverLabel !== ''\n ? serverLabel\n : t('arqel.ai.generate', DEFAULT_BUTTON_LABEL);\n const maxLength = fieldProps?.maxLength ?? null;\n\n const reactId = useId();\n const textareaId = `arqel-ai-text-${reactId}`;\n\n const [internalValue, setInternalValue] = useState<string>(value);\n const isControlled = onChange !== undefined;\n const currentValue = isControlled ? value : internalValue;\n\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const [hasGenerated, setHasGenerated] = useState<boolean>(false);\n\n const handleTextareaChange = useCallback(\n (event: ChangeEvent<HTMLTextAreaElement>) => {\n const next = event.target.value;\n if (isControlled && onChange) {\n onChange(next);\n } else {\n setInternalValue(next);\n }\n },\n [isControlled, onChange],\n );\n\n const applyGeneratedText = useCallback(\n (next: string) => {\n if (isControlled && onChange) {\n onChange(next);\n } else {\n setInternalValue(next);\n }\n },\n [isControlled, onChange],\n );\n\n const handleGenerate = useCallback(async (): Promise<void> => {\n const url = buildGenerateUrl(generateUrl, resource, field);\n if (url === null) {\n setError(\n t(\n 'arqel.ai.missing_generate_url',\n 'Missing generate URL: provide `generateUrl` or both `resource` and `field`.',\n ),\n );\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'X-CSRF-TOKEN': csrfToken ?? '',\n },\n body: JSON.stringify({ formData: formData ?? {} }),\n });\n\n if (!response.ok) {\n setError(\n t('arqel.ai.error_http', 'Generation failed (HTTP :status).', {\n status: String(response.status),\n }),\n );\n return;\n }\n\n const body = (await response.json()) as AiGenerateResponseBody;\n const text = typeof body.text === 'string' ? body.text : '';\n applyGeneratedText(text);\n setHasGenerated(true);\n } catch {\n setError(t('arqel.ai.error_network', 'Generation failed: network error.'));\n } finally {\n setIsLoading(false);\n }\n }, [applyGeneratedText, csrfToken, field, formData, generateUrl, resource, t]);\n\n const triggerLabel = hasGenerated ? t('arqel.ai.regenerate', REGENERATE_LABEL) : buttonLabel;\n const charCount = currentValue.length;\n\n return (\n <div className=\"flex flex-col gap-2\" data-arqel-field=\"aiText\" data-field-name={name}>\n <Textarea\n id={textareaId}\n name={name}\n value={currentValue}\n onChange={handleTextareaChange}\n {...(maxLength !== null ? { maxLength } : {})}\n rows={6}\n />\n\n {maxLength !== null ? (\n <div className=\"text-xs text-muted-foreground self-end\" aria-live=\"polite\">\n {numberFormatter.format(charCount)} / {numberFormatter.format(maxLength)}\n </div>\n ) : null}\n\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n void handleGenerate();\n }}\n disabled={isLoading}\n aria-label={triggerLabel}\n >\n {isLoading ? (\n <span role=\"status\" aria-label={t('arqel.ai.status_generating', 'Generating')}>\n <Spinner />\n </span>\n ) : null}\n <span>{triggerLabel}</span>\n </Button>\n </div>\n\n {error !== null ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n ) : null}\n </div>\n );\n}\n\nexport default AiTextInput;\n","/**\n * `<AiTranslateInput>` — apresentational React component for the PHP\n * `Arqel\\Ai\\Fields\\AiTranslateField` (component string `AiTranslateInput`).\n *\n * Render contract (AI-008):\n * - Tab list (`role=\"tablist\"`) com um `<button role=\"tab\">` por\n * idioma configurado em `props.languages`. A tab default vem de\n * `props.defaultLanguage`.\n * - Cada tab mostra um indicador visual (`data-missing=\"true\"`)\n * quando a tradução daquela língua está vazia/null.\n * - Painel ativo: `<textarea>` controlado que edita\n * `translations[activeLang]`. Mudanças disparam o `onChange` com o\n * objeto completo `Record<lang, string>`.\n * - Botão \"Translate from {defaultLanguage}\" presente em todas as\n * tabs **não-default**; faz `POST` com `targetLanguages: [lang]`.\n * - Botão \"Translate all missing\" no topo do componente; itera as\n * línguas com tradução vazia e dispara um único `POST` com o\n * array completo.\n * - Loading per-language (`Set<string>`): o botão da tab/lang sendo\n * traduzida fica `disabled` + spinner inline.\n * - Banner `role=\"alert\"` quando o `fetch` falha; o resto continua\n * usável.\n *\n * Network:\n * - URL = `props.translateUrl` (caller override) ou\n * `/admin/${resource}/fields/${field}/translate` (default route\n * name `arqel.ai.translate`).\n * - Body: `{ sourceLanguage, targetLanguages: string[], sourceText }`.\n * `sourceText` vem de `translations[defaultLanguage] ?? ''`.\n * - Response: `{ translations: { [lang]: string } }` é mesclado em\n * state local + `onChange` callback.\n *\n * SSR-safe: nada no render path toca `window`/`document`; o `fetch`\n * só dispara dentro do click handler (post-mount).\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport { Alert, AlertDescription, Badge, Button, Textarea } from '@arqel-dev/ui';\nimport { type ChangeEvent, type ReactElement, useCallback, useId, useMemo, useState } from 'react';\n\nexport interface AiTranslateInputFieldProps {\n languages: string[];\n defaultLanguage: string;\n autoTranslate: boolean;\n provider?: string | null;\n}\n\nexport type AiTranslateValue = Record<string, string>;\n\nexport interface AiTranslateInputProps {\n name: string;\n value: AiTranslateValue | null;\n onChange?: (value: AiTranslateValue) => void;\n props: AiTranslateInputFieldProps | undefined;\n resource?: string;\n field?: string;\n translateUrl?: string;\n csrfToken?: string;\n}\n\ninterface AiTranslateResponseBody {\n translations?: unknown;\n}\n\nfunction buildTranslateUrl(\n override: string | undefined,\n resource: string | undefined,\n field: string | undefined,\n): string | null {\n if (override !== undefined && override !== '') {\n return override;\n }\n if (resource && field) {\n return `/admin/${resource}/fields/${field}/translate`;\n }\n return null;\n}\n\nfunction isStringRecord(input: unknown): input is Record<string, string> {\n if (input === null || typeof input !== 'object') {\n return false;\n }\n for (const v of Object.values(input as Record<string, unknown>)) {\n if (typeof v !== 'string') {\n return false;\n }\n }\n return true;\n}\n\nfunction isMissing(translations: AiTranslateValue, lang: string): boolean {\n const v = translations[lang];\n return v === undefined || v === null || v === '';\n}\n\nfunction Spinner(): ReactElement {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n className=\"animate-spin\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeOpacity=\"0.25\" strokeWidth=\"4\" />\n <path\n d=\"M22 12a10 10 0 0 1-10 10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function AiTranslateInput(props: AiTranslateInputProps): ReactElement {\n const {\n name,\n value,\n onChange,\n props: fieldProps,\n resource,\n field,\n translateUrl,\n csrfToken,\n } = props;\n\n const t = useArqelTranslations();\n const languages = useMemo<string[]>(() => fieldProps?.languages ?? [], [fieldProps?.languages]);\n const defaultLanguage = fieldProps?.defaultLanguage ?? languages[0] ?? '';\n\n const reactId = useId();\n const tablistId = `arqel-ai-translate-${reactId}`;\n\n const [internalValue, setInternalValue] = useState<AiTranslateValue>(value ?? {});\n const isControlled = onChange !== undefined;\n const currentValue: AiTranslateValue = isControlled ? (value ?? {}) : internalValue;\n\n const initialActive = languages.includes(defaultLanguage)\n ? defaultLanguage\n : (languages[0] ?? defaultLanguage);\n const [activeLang, setActiveLang] = useState<string>(initialActive);\n\n const [loadingLangs, setLoadingLangs] = useState<Set<string>>(() => new Set());\n const [error, setError] = useState<string | null>(null);\n\n const applyValue = useCallback(\n (next: AiTranslateValue) => {\n if (isControlled && onChange) {\n onChange(next);\n } else {\n setInternalValue(next);\n }\n },\n [isControlled, onChange],\n );\n\n const handleTextareaChange = useCallback(\n (event: ChangeEvent<HTMLTextAreaElement>) => {\n const next: AiTranslateValue = { ...currentValue, [activeLang]: event.target.value };\n applyValue(next);\n },\n [activeLang, applyValue, currentValue],\n );\n\n const setLoadingFor = useCallback((langs: string[], on: boolean): void => {\n setLoadingLangs((prev) => {\n const next = new Set(prev);\n for (const l of langs) {\n if (on) {\n next.add(l);\n } else {\n next.delete(l);\n }\n }\n return next;\n });\n }, []);\n\n const performTranslate = useCallback(\n async (targetLanguages: string[]): Promise<void> => {\n if (targetLanguages.length === 0) {\n return;\n }\n const url = buildTranslateUrl(translateUrl, resource, field);\n if (url === null) {\n setError(\n t(\n 'arqel.ai.missing_translate_url',\n 'Missing translate URL: provide `translateUrl` or both `resource` and `field`.',\n ),\n );\n return;\n }\n\n setError(null);\n setLoadingFor(targetLanguages, true);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'X-CSRF-TOKEN': csrfToken ?? '',\n },\n body: JSON.stringify({\n sourceLanguage: defaultLanguage,\n targetLanguages,\n sourceText: currentValue[defaultLanguage] ?? '',\n }),\n });\n\n if (!response.ok) {\n setError(\n t('arqel.ai.translate_error_http', 'Translation failed (HTTP :status).', {\n status: String(response.status),\n }),\n );\n return;\n }\n\n const body = (await response.json()) as AiTranslateResponseBody;\n const incoming = body.translations;\n if (!isStringRecord(incoming)) {\n setError(\n t('arqel.ai.translate_error_invalid', 'Translation failed: invalid response body.'),\n );\n return;\n }\n\n const merged: AiTranslateValue = { ...currentValue, ...incoming };\n applyValue(merged);\n } catch {\n setError(t('arqel.ai.translate_error_network', 'Translation failed: network error.'));\n } finally {\n setLoadingFor(targetLanguages, false);\n }\n },\n [\n applyValue,\n csrfToken,\n currentValue,\n defaultLanguage,\n field,\n resource,\n setLoadingFor,\n t,\n translateUrl,\n ],\n );\n\n const handleTranslateOne = useCallback(\n (lang: string) => {\n void performTranslate([lang]);\n },\n [performTranslate],\n );\n\n const handleTranslateAllMissing = useCallback(() => {\n const missing = languages.filter(\n (lang) => lang !== defaultLanguage && isMissing(currentValue, lang),\n );\n void performTranslate(missing);\n }, [currentValue, defaultLanguage, languages, performTranslate]);\n\n const missingCount = languages.filter(\n (lang) => lang !== defaultLanguage && isMissing(currentValue, lang),\n ).length;\n\n const activeText = currentValue[activeLang] ?? '';\n const activeIsLoading = loadingLangs.has(activeLang);\n\n return (\n <div className=\"flex flex-col gap-2\" data-arqel-field=\"aiTranslate\" data-field-name={name}>\n <div className=\"flex items-center justify-end\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleTranslateAllMissing}\n disabled={missingCount === 0 || loadingLangs.size > 0}\n >\n {t('arqel.ai.translate_all_missing', 'Translate all missing')}\n </Button>\n </div>\n\n <div role=\"tablist\" id={tablistId} className=\"flex items-center gap-1 border-b border-border\">\n {languages.map((lang) => {\n const selected = lang === activeLang;\n const missing = isMissing(currentValue, lang);\n return (\n <button\n key={lang}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n aria-controls={`${tablistId}-panel-${lang}`}\n data-missing={missing ? 'true' : 'false'}\n onClick={() => setActiveLang(lang)}\n className={\n 'inline-flex items-center gap-1 px-3 py-1.5 text-sm font-medium border-b-2 -mb-px transition-colors ' +\n (selected\n ? 'border-primary text-foreground'\n : 'border-transparent text-muted-foreground hover:text-foreground')\n }\n >\n <span>{lang}</span>\n {missing ? (\n <Badge\n variant=\"secondary\"\n role=\"img\"\n aria-label={t('arqel.ai.missing_translation', 'Missing translation')}\n data-testid={`missing-dot-${lang}`}\n className=\"px-1 py-0\"\n >\n •\n </Badge>\n ) : null}\n </button>\n );\n })}\n </div>\n\n <div role=\"tabpanel\" id={`${tablistId}-panel-${activeLang}`} className=\"flex flex-col gap-2\">\n <Textarea\n name={`${name}[${activeLang}]`}\n value={activeText}\n onChange={handleTextareaChange}\n rows={6}\n aria-label={t('arqel.ai.translate_textarea_aria', 'Translation in :language', {\n language: activeLang,\n })}\n />\n\n {activeLang !== defaultLanguage ? (\n <div className=\"flex items-center\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => handleTranslateOne(activeLang)}\n disabled={activeIsLoading}\n >\n {activeIsLoading ? (\n <span role=\"status\" aria-label={t('arqel.ai.status_translating', 'Translating')}>\n <Spinner />\n </span>\n ) : null}\n <span>\n {t('arqel.ai.translate_from', 'Translate from :language', {\n language: defaultLanguage,\n })}\n </span>\n </Button>\n </div>\n ) : null}\n </div>\n\n {error !== null ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n ) : null}\n </div>\n );\n}\n\nexport default AiTranslateInput;\n","/**\n * `<AiSelectInput>` — apresentational React component for the PHP\n * `Arqel\\Ai\\Fields\\AiSelectField` (component string `AiSelectInput`).\n *\n * Render contract (AI-009):\n * - `<select>` controlled (or uncontrolled fallback) with a\n * placeholder option + one entry per `props.options`,\n * - \"Classify with AI\" button next to the select; disabled when\n * `hasContextFields` is false (with a tooltip explaining why),\n * - while a request is in-flight the button is disabled and an\n * inline spinner is rendered,\n * - on success a banner with `Suggested by AI` is rendered with two\n * dismiss buttons: `Accept` and `Pick another` (both just hide the\n * banner — the value is already applied),\n * - if the response returns `key: null` and `fallbackOption` is\n * configured, the fallback is applied and a `Used fallback`\n * banner is shown,\n * - if the response returns `key: null` and there is no fallback,\n * an error banner `Could not classify` is rendered.\n *\n * Network:\n * - URL = `props.classifyUrl` override or\n * `/admin/${resource}/fields/${field}/classify`.\n * - `fetch(url, { method: 'POST', credentials: 'same-origin', headers:\n * { Content-Type, Accept, X-CSRF-TOKEN }, body: JSON.stringify({\n * formData }) })`. The PHP controller runs the LLM classification\n * and returns `{ key, label }`.\n *\n * SSR-safe: nothing in the render path touches `window`/`document`.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport {\n Alert,\n AlertDescription,\n Badge,\n Button,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@arqel-dev/ui';\nimport { type ReactElement, useCallback, useId, useState } from 'react';\n\nexport interface AiSelectInputFieldProps {\n options: Record<string, string>;\n classifyFromFields: string[];\n provider?: string | null;\n fallbackOption?: string | null;\n hasContextFields: boolean;\n}\n\nexport interface AiSelectInputProps {\n name: string;\n value: string | null;\n onChange?: (value: string | null) => void;\n props: AiSelectInputFieldProps | undefined;\n resource?: string;\n field?: string;\n formData?: Record<string, unknown>;\n classifyUrl?: string;\n csrfToken?: string;\n}\n\ninterface AiClassifyResponseBody {\n key?: unknown;\n label?: unknown;\n}\n\ntype SuggestionKind = 'ai' | 'fallback';\n\nconst DEFAULT_BUTTON_LABEL = 'Classify with AI';\nconst NO_CONTEXT_TOOLTIP_FALLBACK =\n 'No context fields configured. Add `classifyFromFields` to enable AI classification.';\n\nfunction buildClassifyUrl(\n override: string | undefined,\n resource: string | undefined,\n field: string | undefined,\n): string | null {\n if (override !== undefined && override !== '') {\n return override;\n }\n if (resource && field) {\n return `/admin/${resource}/fields/${field}/classify`;\n }\n return null;\n}\n\nfunction Spinner(): ReactElement {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n className=\"animate-spin\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeOpacity=\"0.25\" strokeWidth=\"4\" />\n <path\n d=\"M22 12a10 10 0 0 1-10 10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function AiSelectInput(props: AiSelectInputProps): ReactElement {\n const {\n name,\n value,\n onChange,\n props: fieldProps,\n resource,\n field,\n formData,\n classifyUrl,\n csrfToken,\n } = props;\n\n const t = useArqelTranslations();\n const options = fieldProps?.options ?? {};\n const fallbackOption = fieldProps?.fallbackOption ?? null;\n const hasContextFields = fieldProps?.hasContextFields ?? false;\n const buttonLabel = t('arqel.ai.classify', DEFAULT_BUTTON_LABEL);\n\n const reactId = useId();\n const selectId = `arqel-ai-select-${reactId}`;\n\n const [internalValue, setInternalValue] = useState<string | null>(value);\n const isControlled = onChange !== undefined;\n const currentValue = isControlled ? value : internalValue;\n\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const [suggestion, setSuggestion] = useState<SuggestionKind | null>(null);\n\n const applyValue = useCallback(\n (next: string | null) => {\n if (isControlled && onChange) {\n onChange(next);\n } else {\n setInternalValue(next);\n }\n },\n [isControlled, onChange],\n );\n\n const handleSelectChange = useCallback(\n (next: string) => {\n applyValue(next === '' ? null : next);\n setSuggestion(null);\n },\n [applyValue],\n );\n\n const handleClassify = useCallback(async (): Promise<void> => {\n const url = buildClassifyUrl(classifyUrl, resource, field);\n if (url === null) {\n setError(\n t(\n 'arqel.ai.missing_classify_url',\n 'Missing classify URL: provide `classifyUrl` or both `resource` and `field`.',\n ),\n );\n return;\n }\n\n setIsLoading(true);\n setError(null);\n setSuggestion(null);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'X-CSRF-TOKEN': csrfToken ?? '',\n },\n body: JSON.stringify({ formData: formData ?? {} }),\n });\n\n if (!response.ok) {\n setError(\n t('arqel.ai.classify_error_http', 'Classification failed (HTTP :status).', {\n status: String(response.status),\n }),\n );\n return;\n }\n\n const body = (await response.json()) as AiClassifyResponseBody;\n const key = typeof body.key === 'string' ? body.key : null;\n\n if (key !== null) {\n applyValue(key);\n setSuggestion('ai');\n return;\n }\n\n // key === null → try fallback\n if (fallbackOption !== null && fallbackOption !== '') {\n applyValue(fallbackOption);\n setSuggestion('fallback');\n return;\n }\n\n setError(t('arqel.ai.classify_error_none', 'Could not classify.'));\n } catch {\n setError(t('arqel.ai.classify_error_network', 'Classification failed: network error.'));\n } finally {\n setIsLoading(false);\n }\n }, [applyValue, classifyUrl, csrfToken, fallbackOption, field, formData, resource, t]);\n\n const buttonDisabled = isLoading || !hasContextFields;\n const buttonTitle = !hasContextFields\n ? t('arqel.ai.classify_no_context_tooltip', NO_CONTEXT_TOOLTIP_FALLBACK)\n : undefined;\n\n return (\n <div className=\"flex flex-col gap-2\" data-arqel-field=\"aiSelect\" data-field-name={name}>\n <div className=\"flex items-center gap-2\">\n <Select value={currentValue ?? ''} onValueChange={handleSelectChange} name={name}>\n <SelectTrigger id={selectId} className=\"flex-1\">\n <SelectValue placeholder={t('arqel.ai.select_placeholder', 'Select...')} />\n </SelectTrigger>\n <SelectContent>\n {Object.entries(options).map(([key, label]) => (\n <SelectItem key={key} value={key}>\n {label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n void handleClassify();\n }}\n disabled={buttonDisabled}\n aria-label={buttonLabel}\n {...(buttonTitle !== undefined ? { title: buttonTitle } : {})}\n >\n {isLoading ? (\n <span role=\"status\" aria-label={t('arqel.ai.status_classifying', 'Classifying')}>\n <Spinner />\n </span>\n ) : null}\n <span>{buttonLabel}</span>\n </Button>\n </div>\n\n {suggestion !== null ? (\n <div role=\"status\" className=\"flex items-center gap-2\">\n <Badge\n variant=\"secondary\"\n className={\n suggestion === 'ai'\n ? 'border-emerald-500/30 bg-emerald-500/10 text-emerald-700 dark:text-emerald-300'\n : 'border-amber-500/30 bg-amber-500/10 text-amber-700 dark:text-amber-300'\n }\n >\n {suggestion === 'ai'\n ? t('arqel.ai.suggestion_ai', 'Suggested by AI')\n : t('arqel.ai.suggestion_fallback', 'Used fallback')}\n </Badge>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n setSuggestion(null);\n }}\n >\n {t('arqel.ai.suggestion_accept', 'Accept')}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n setSuggestion(null);\n }}\n >\n {t('arqel.ai.suggestion_pick_another', 'Pick another')}\n </Button>\n </div>\n ) : null}\n\n {error !== null ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n ) : null}\n </div>\n );\n}\n\nexport default AiSelectInput;\n","/**\n * `<AiExtractInput>` — apresentational React component for the PHP\n * `Arqel\\Ai\\Fields\\AiExtractField` (component string `AiExtractInput`).\n *\n * Render contract (AI-010):\n * - Read-only label `Source: {sourceField}` indicando o campo do\n * formulário de onde o texto-fonte é lido.\n * - Botão `Extract with AI` (label vem de `props.buttonLabel`); em\n * loading o botão fica `disabled` + spinner inline.\n * - Empty state `No extraction yet — click button to start` antes da\n * primeira extração.\n * - Após sucesso: lista preview `<dl>` com cada `targetField:\n * extractedValue`; cada entry tem botão `Apply` individual e o\n * toolbar mostra `Apply all`.\n * - `Apply` chama `onPopulateField?.(targetField, value)` ou\n * `onChange(extracted)` se `onPopulateField` for ausente.\n * - Banner `role=\"alert\"` quando o `fetch` falha (com `message` da\n * response 422 quando disponível).\n *\n * Network:\n * - URL = `props.extractUrl` override ou\n * `/admin/${resource}/fields/${field}/extract`.\n * - Body: `{ sourceText }` lido de `formData?.[sourceField] ?? ''`.\n * - Resposta: `{ extracted: Record<string, unknown> }` (200) ou\n * `{ message }` (422).\n *\n * SSR-safe: nada no render path toca `window`/`document`.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport { Alert, AlertDescription, Badge, Button, Card, CardContent, Label } from '@arqel-dev/ui';\nimport { type ReactElement, useCallback, useId, useState } from 'react';\n\nexport interface AiExtractInputFieldProps {\n sourceField: string;\n targetFields: string[];\n buttonLabel: string;\n usingJsonMode: boolean;\n provider?: string | null;\n}\n\nexport type AiExtractValue = Record<string, unknown>;\n\nexport interface AiExtractInputProps {\n name: string;\n value: AiExtractValue | null;\n onChange?: (value: AiExtractValue) => void;\n props: AiExtractInputFieldProps | undefined;\n resource?: string;\n field?: string;\n formData?: Record<string, unknown>;\n extractUrl?: string;\n csrfToken?: string;\n onPopulateField?: (targetField: string, value: unknown) => void;\n}\n\ninterface AiExtractResponseBody {\n extracted?: unknown;\n message?: unknown;\n}\n\nfunction buildExtractUrl(\n override: string | undefined,\n resource: string | undefined,\n field: string | undefined,\n): string | null {\n if (override !== undefined && override !== '') {\n return override;\n }\n if (resource && field) {\n return `/admin/${resource}/fields/${field}/extract`;\n }\n return null;\n}\n\nfunction isPlainRecord(input: unknown): input is Record<string, unknown> {\n return input !== null && typeof input === 'object' && !Array.isArray(input);\n}\n\nfunction coerceSourceText(raw: unknown): string {\n if (typeof raw === 'string') {\n return raw;\n }\n if (raw === null || raw === undefined) {\n return '';\n }\n if (typeof raw === 'number' || typeof raw === 'boolean') {\n return String(raw);\n }\n return '';\n}\n\nfunction formatPreviewValue(value: unknown): string {\n if (value === null || value === undefined) {\n return '';\n }\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction Spinner(): ReactElement {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n className=\"animate-spin\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeOpacity=\"0.25\" strokeWidth=\"4\" />\n <path\n d=\"M22 12a10 10 0 0 1-10 10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function AiExtractInput(props: AiExtractInputProps): ReactElement {\n const {\n name,\n value,\n onChange,\n props: fieldProps,\n resource,\n field,\n formData,\n extractUrl,\n csrfToken,\n onPopulateField,\n } = props;\n\n const t = useArqelTranslations();\n const sourceField = fieldProps?.sourceField ?? '';\n const targetFields = fieldProps?.targetFields ?? [];\n const serverLabel = fieldProps?.buttonLabel;\n const buttonLabel =\n serverLabel !== undefined && serverLabel !== ''\n ? serverLabel\n : t('arqel.ai.extract', 'Extract with AI');\n\n const reactId = useId();\n const previewId = `arqel-ai-extract-${reactId}`;\n\n const [extracted, setExtracted] = useState<AiExtractValue | null>(value);\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const applyAll = useCallback(\n (next: AiExtractValue) => {\n if (onPopulateField !== undefined) {\n for (const key of Object.keys(next)) {\n onPopulateField(key, next[key]);\n }\n return;\n }\n onChange?.(next);\n },\n [onChange, onPopulateField],\n );\n\n const applyOne = useCallback(\n (target: string, val: unknown) => {\n if (onPopulateField !== undefined) {\n onPopulateField(target, val);\n return;\n }\n onChange?.({ [target]: val });\n },\n [onChange, onPopulateField],\n );\n\n const handleExtract = useCallback(async (): Promise<void> => {\n const url = buildExtractUrl(extractUrl, resource, field);\n if (url === null) {\n setError(\n t(\n 'arqel.ai.missing_extract_url',\n 'Missing extract URL: provide `extractUrl` or both `resource` and `field`.',\n ),\n );\n return;\n }\n\n const sourceText = coerceSourceText(\n formData !== undefined && sourceField !== '' ? formData[sourceField] : '',\n );\n\n setIsLoading(true);\n setError(null);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'X-CSRF-TOKEN': csrfToken ?? '',\n },\n body: JSON.stringify({ sourceText }),\n });\n\n if (!response.ok) {\n let message: string | null = null;\n try {\n const body = (await response.json()) as AiExtractResponseBody;\n if (typeof body.message === 'string' && body.message !== '') {\n message = body.message;\n }\n } catch {\n message = null;\n }\n setError(\n message ??\n t('arqel.ai.extract_error_http', 'Extraction failed (HTTP :status).', {\n status: String(response.status),\n }),\n );\n return;\n }\n\n const body = (await response.json()) as AiExtractResponseBody;\n if (!isPlainRecord(body.extracted)) {\n setError(t('arqel.ai.extract_error_invalid', 'Extraction failed: invalid response body.'));\n return;\n }\n\n setExtracted(body.extracted);\n } catch {\n setError(t('arqel.ai.extract_error_network', 'Extraction failed: network error.'));\n } finally {\n setIsLoading(false);\n }\n }, [csrfToken, extractUrl, field, formData, resource, sourceField, t]);\n\n const hasExtraction = extracted !== null && Object.keys(extracted).length > 0;\n\n return (\n <div className=\"flex flex-col gap-2\" data-arqel-field=\"aiExtract\" data-field-name={name}>\n <div>\n <Label className=\"text-muted-foreground\">\n {t('arqel.ai.source', 'Source: :field', { field: sourceField })}\n </Label>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n void handleExtract();\n }}\n disabled={isLoading}\n aria-label={buttonLabel}\n >\n {isLoading ? (\n <span role=\"status\" aria-label={t('arqel.ai.status_extracting', 'Extracting')}>\n <Spinner />\n </span>\n ) : null}\n <span>{buttonLabel}</span>\n </Button>\n\n {hasExtraction && extracted !== null ? (\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={() => {\n applyAll(extracted);\n }}\n >\n {t('arqel.ai.apply_all', 'Apply all')}\n </Button>\n ) : null}\n </div>\n\n {hasExtraction && extracted !== null ? (\n <Card>\n <CardContent className=\"p-4\">\n <dl id={previewId} className=\"flex flex-col gap-2\">\n {(targetFields.length > 0 ? targetFields : Object.keys(extracted)).map((target) => {\n const val = extracted[target];\n return (\n <div\n key={target}\n className=\"flex items-center justify-between gap-2 border-b border-border pb-2 last:border-b-0 last:pb-0\"\n >\n <dt>\n <Badge variant=\"outline\">{target}</Badge>\n </dt>\n <dd className=\"flex items-center gap-2 flex-1 justify-end\">\n <span\n className=\"text-sm text-foreground truncate\"\n data-testid={`extract-value-${target}`}\n >\n {formatPreviewValue(val)}\n </span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n applyOne(target, val);\n }}\n aria-label={t('arqel.ai.apply_field', 'Apply :field', { field: target })}\n >\n {t('arqel.ai.apply', 'Apply')}\n </Button>\n </dd>\n </div>\n );\n })}\n </dl>\n </CardContent>\n </Card>\n ) : (\n <p className=\"text-sm text-muted-foreground italic\">\n {t('arqel.ai.extract_empty', 'No extraction yet — click button to start.')}\n </p>\n )}\n\n {error !== null ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n ) : null}\n </div>\n );\n}\n\nexport default AiExtractInput;\n","/**\n * `<AiImageInput>` — apresentational React component for the PHP\n * `Arqel\\Ai\\Fields\\AiImageField` (component string `AiImageInput`).\n *\n * Render contract (AI-011):\n * - File input restrito por `accept={props.acceptedMimes.join(',')}`\n * com drag-drop area visual (`<label>` clicável que dispara o\n * `<input type=\"file\">` escondido).\n * - Preview da imagem após selecionar (img src vem de\n * `URL.createObjectURL` — só é chamado dentro do change handler,\n * mantendo o render path SSR-safe).\n * - Validação client-side: rejeita arquivos > `props.maxFileSize`\n * (em bytes) com banner de erro; nesse caso o botão \"Analyze with\n * AI\" fica `disabled`.\n * - Botão `Analyze with AI` (label de `props.buttonLabel`); spinner\n * inline + `disabled` durante o `fetch`. Sem arquivo selecionado o\n * botão também fica `disabled`.\n * - Após sucesso: lista preview `<dl>` com `analysis_key: value` por\n * entry; cada entry tem botão `Apply` individual; toolbar mostra\n * `Apply all`.\n * - `Apply` chama `onPopulateField?.(target, value)` usando o\n * mapeamento `props.populateFields[analysisKey]` quando disponível.\n * `Apply all` itera todas as analyses que têm mapping.\n * - Banner `role=\"alert\"` quando o `fetch` falha (mensagem da\n * response 422 quando disponível).\n *\n * Network:\n * - URL = `props.analyzeUrl` override ou\n * `/admin/${resource}/fields/${field}/analyze-image`.\n * - Body: `{ imageBase64 }` produzido por `FileReader.readAsDataURL`\n * (data URI completo).\n * - Resposta: `{ analyses, populateMapping }` (200) ou\n * `{ message }` (422).\n *\n * SSR-safe: nada no render path toca `window`/`URL`/`FileReader` — só\n * em handlers de evento.\n */\n\nimport { useArqelLocale, useArqelTranslations } from '@arqel-dev/react/utils';\nimport { Alert, AlertDescription, Badge, Button, Card, CardContent } from '@arqel-dev/ui';\nimport { type ChangeEvent, type ReactElement, useCallback, useId, useState } from 'react';\n\nexport interface AiImageInputFieldProps {\n analyses: string[];\n populateFields: Record<string, string>;\n provider?: string | null;\n acceptedMimes: string[];\n maxFileSize: number;\n buttonLabel: string;\n}\n\nexport interface AiImageInputProps {\n name: string;\n value: string | null;\n onChange?: (value: string) => void;\n props: AiImageInputFieldProps | undefined;\n resource?: string;\n field?: string;\n analyzeUrl?: string;\n csrfToken?: string;\n onPopulateField?: (targetField: string, value: string) => void;\n}\n\ninterface AiImageResponseBody {\n analyses?: unknown;\n populateMapping?: unknown;\n message?: unknown;\n}\n\nfunction buildAnalyzeUrl(\n override: string | undefined,\n resource: string | undefined,\n field: string | undefined,\n): string | null {\n if (override !== undefined && override !== '') {\n return override;\n }\n if (resource && field) {\n return `/admin/${resource}/fields/${field}/analyze-image`;\n }\n return null;\n}\n\nfunction isStringRecord(input: unknown): input is Record<string, string> {\n if (input === null || typeof input !== 'object' || Array.isArray(input)) {\n return false;\n }\n for (const value of Object.values(input as Record<string, unknown>)) {\n if (typeof value !== 'string') {\n return false;\n }\n }\n return true;\n}\n\nfunction readFileAsDataUrl(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result;\n if (typeof result === 'string') {\n resolve(result);\n return;\n }\n reject(new Error('FileReader returned non-string result.'));\n };\n reader.onerror = () => {\n reject(reader.error ?? new Error('FileReader error.'));\n };\n reader.readAsDataURL(file);\n });\n}\n\n/**\n * Format a byte count for display, using the active panel locale for the\n * number portion so comma-decimal locales (e.g. `pt-BR` → `1,5 MB`) render\n * correctly instead of always emitting an en-US `.` decimal. The unit suffix\n * stays the conventional symbol (`MB`/`KB`/`B`), which is locale-neutral.\n */\nfunction formatBytes(bytes: number, locale?: string): string {\n const round1 = (value: number): string =>\n new Intl.NumberFormat(locale, { maximumFractionDigits: 1 }).format(value);\n\n if (bytes >= 1_048_576) {\n return `${round1(bytes / 1_048_576)} MB`;\n }\n if (bytes >= 1024) {\n return `${round1(bytes / 1024)} KB`;\n }\n return `${round1(bytes)} B`;\n}\n\nfunction Spinner(): ReactElement {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n className=\"animate-spin\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeOpacity=\"0.25\" strokeWidth=\"4\" />\n <path\n d=\"M22 12a10 10 0 0 1-10 10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function AiImageInput(props: AiImageInputProps): ReactElement {\n const {\n name,\n value,\n onChange,\n props: fieldProps,\n resource,\n field,\n analyzeUrl,\n csrfToken,\n onPopulateField,\n } = props;\n\n const analyses = fieldProps?.analyses ?? [];\n const populateFields = fieldProps?.populateFields ?? {};\n const acceptedMimes = fieldProps?.acceptedMimes ?? [];\n const maxFileSize = fieldProps?.maxFileSize ?? 0;\n const t = useArqelTranslations();\n const locale = useArqelLocale();\n const serverLabel = fieldProps?.buttonLabel;\n const buttonLabel =\n serverLabel !== undefined && serverLabel !== ''\n ? serverLabel\n : t('arqel.ai.analyze', 'Analyze with AI');\n\n const reactId = useId();\n const inputId = `arqel-ai-image-${reactId}`;\n\n const [file, setFile] = useState<File | null>(null);\n const [previewUrl, setPreviewUrl] = useState<string | null>(null);\n const [results, setResults] = useState<Record<string, string> | null>(null);\n const [populateMapping, setPopulateMapping] = useState<Record<string, string>>(populateFields);\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleFileChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const next = event.target.files?.[0] ?? null;\n setError(null);\n setResults(null);\n\n if (next === null) {\n setFile(null);\n setPreviewUrl(null);\n return;\n }\n\n if (maxFileSize > 0 && next.size > maxFileSize) {\n setError(\n t('arqel.ai.file_too_large', 'File too large: :size (max :max).', {\n size: formatBytes(next.size, locale),\n max: formatBytes(maxFileSize, locale),\n }),\n );\n setFile(null);\n setPreviewUrl(null);\n return;\n }\n\n setFile(next);\n try {\n setPreviewUrl(URL.createObjectURL(next));\n } catch {\n setPreviewUrl(null);\n }\n },\n [locale, maxFileSize, t],\n );\n\n const handleAnalyze = useCallback(async (): Promise<void> => {\n if (file === null) {\n return;\n }\n const url = buildAnalyzeUrl(analyzeUrl, resource, field);\n if (url === null) {\n setError(\n t(\n 'arqel.ai.missing_analyze_url',\n 'Missing analyze URL: provide `analyzeUrl` or both `resource` and `field`.',\n ),\n );\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const imageBase64 = await readFileAsDataUrl(file);\n const response = await fetch(url, {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'X-CSRF-TOKEN': csrfToken ?? '',\n },\n body: JSON.stringify({ imageBase64 }),\n });\n\n if (!response.ok) {\n let message: string | null = null;\n try {\n const body = (await response.json()) as AiImageResponseBody;\n if (typeof body.message === 'string' && body.message !== '') {\n message = body.message;\n }\n } catch {\n message = null;\n }\n setError(\n message ??\n t('arqel.ai.analyze_error_http', 'Analysis failed (HTTP :status).', {\n status: String(response.status),\n }),\n );\n return;\n }\n\n const body = (await response.json()) as AiImageResponseBody;\n if (!isStringRecord(body.analyses)) {\n setError(t('arqel.ai.analyze_error_invalid', 'Analysis failed: invalid response body.'));\n return;\n }\n\n setResults(body.analyses);\n if (isStringRecord(body.populateMapping)) {\n setPopulateMapping(body.populateMapping);\n }\n // Promove o data URI ao value do field caso o consumidor controle\n // o value via onChange — útil para quem queira persistir a imagem\n // selecionada como base64 (ou trocar por uma URL upload-side).\n if (onChange !== undefined) {\n onChange(imageBase64);\n }\n } catch {\n setError(t('arqel.ai.analyze_error_network', 'Analysis failed: network error.'));\n } finally {\n setIsLoading(false);\n }\n }, [analyzeUrl, csrfToken, field, file, onChange, resource, t]);\n\n const applyOne = useCallback(\n (analysisKey: string, val: string) => {\n const target = populateMapping[analysisKey];\n if (target === undefined || target === '') {\n return;\n }\n onPopulateField?.(target, val);\n },\n [onPopulateField, populateMapping],\n );\n\n const applyAll = useCallback(\n (entries: Record<string, string>) => {\n for (const key of Object.keys(entries)) {\n const target = populateMapping[key];\n const val = entries[key];\n if (target === undefined || target === '' || val === undefined) {\n continue;\n }\n onPopulateField?.(target, val);\n }\n },\n [onPopulateField, populateMapping],\n );\n\n const accept = acceptedMimes.join(',');\n const hasResults = results !== null && Object.keys(results).length > 0;\n const canAnalyze = file !== null && !isLoading;\n\n return (\n <div\n className=\"flex flex-col gap-2\"\n data-arqel-field=\"aiImage\"\n data-field-name={name}\n data-has-value={value !== null && value !== '' ? 'true' : 'false'}\n >\n <label\n htmlFor={inputId}\n className=\"flex items-center justify-center w-full min-h-[6rem] rounded-sm border-2 border-dashed border-border bg-muted/40 px-4 py-6 text-sm text-muted-foreground hover:bg-muted cursor-pointer transition-colors\"\n >\n <span>\n {file !== null\n ? file.name\n : t('arqel.ai.image_dropzone', 'Click or drop image (:accept)', {\n accept: accept !== '' ? accept : t('arqel.ai.image_accept_any', 'any'),\n })}\n </span>\n <input\n id={inputId}\n type=\"file\"\n accept={accept}\n onChange={handleFileChange}\n className=\"sr-only\"\n aria-label={t('arqel.ai.image_file', 'Image file')}\n />\n </label>\n\n {previewUrl !== null ? (\n <Card>\n <CardContent className=\"p-2 flex items-center justify-center\">\n <img\n src={previewUrl}\n alt={t('arqel.ai.selected_preview_alt', 'Selected preview')}\n data-testid=\"image-preview\"\n className=\"max-h-64 max-w-full rounded-sm\"\n />\n </CardContent>\n </Card>\n ) : null}\n\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n void handleAnalyze();\n }}\n disabled={!canAnalyze}\n aria-label={buttonLabel}\n >\n {isLoading ? (\n <span role=\"status\" aria-label={t('arqel.ai.status_analyzing', 'Analyzing')}>\n <Spinner />\n </span>\n ) : null}\n <span>{buttonLabel}</span>\n </Button>\n\n {hasResults && results !== null ? (\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={() => {\n applyAll(results);\n }}\n >\n {t('arqel.ai.apply_all', 'Apply all')}\n </Button>\n ) : null}\n </div>\n\n {hasResults && results !== null ? (\n <Card>\n <CardContent className=\"p-4\">\n <dl className=\"flex flex-col gap-2\">\n {(analyses.length > 0 ? analyses : Object.keys(results)).map((key) => {\n const val = results[key];\n if (val === undefined) {\n return null;\n }\n const target = populateMapping[key];\n const hasTarget = target !== undefined && target !== '';\n return (\n <div\n key={key}\n className=\"flex items-center justify-between gap-2 border-b border-border pb-2 last:border-b-0 last:pb-0\"\n >\n <dt>\n <Badge variant=\"outline\">{key}</Badge>\n </dt>\n <dd className=\"flex items-center gap-2 flex-1 justify-end\">\n <span\n className=\"text-sm text-foreground truncate\"\n data-testid={`analysis-value-${key}`}\n >\n {val}\n </span>\n {hasTarget ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n applyOne(key, val);\n }}\n aria-label={t('arqel.ai.apply_field', 'Apply :field', { field: key })}\n >\n {t('arqel.ai.apply', 'Apply')}\n </Button>\n ) : null}\n </dd>\n </div>\n );\n })}\n </dl>\n </CardContent>\n </Card>\n ) : null}\n\n {error !== null ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n ) : null}\n </div>\n );\n}\n\nexport default AiImageInput;\n","/**\n * Side-effect import que registra os componentes do `@arqel-dev/ai` no\n * FieldRegistry do `@arqel-dev/ui`, lazily.\n *\n * import '@arqel-dev/ai/register';\n *\n * Os component names (`AiTextInput`, `AiTranslateInput`,\n * `AiSelectInput`) batem com o que o PHP retorna em `getComponent()`.\n * Apps podem re-registrar seus próprios componentes sob a mesma chave\n * para sobrescrever o default.\n *\n * Os componentes têm shapes de props específicos do domínio; o\n * registry espera um adapter genérico `{ field, value }`, então cada\n * um é envolvido aqui.\n */\n\nimport type { FieldSchema } from '@arqel-dev/types/fields';\nimport { registerField } from '@arqel-dev/ui/form';\nimport { type ComponentType, lazy, type ReactElement } from 'react';\nimport type {\n AiExtractInputFieldProps,\n AiExtractInputProps,\n AiExtractValue,\n} from './AiExtractInput.js';\nimport type { AiImageInputFieldProps, AiImageInputProps } from './AiImageInput.js';\nimport type { AiSelectInputFieldProps, AiSelectInputProps } from './AiSelectInput.js';\nimport type { AiTextInputFieldProps, AiTextInputProps } from './AiTextInput.js';\nimport type {\n AiTranslateInputFieldProps,\n AiTranslateInputProps,\n AiTranslateValue,\n} from './AiTranslateInput.js';\n\ninterface RegistryFieldProps {\n field: FieldSchema;\n value: unknown;\n onChange?: (value: string) => void;\n resource?: string;\n formData?: Record<string, unknown>;\n csrfToken?: string;\n}\n\nfunction adaptToAiTextInput(\n Component: ComponentType<AiTextInputProps>,\n): ComponentType<RegistryFieldProps> {\n return function AiTextInputAdapter(registryProps: RegistryFieldProps): ReactElement {\n const { field, value, onChange, resource, formData, csrfToken } = registryProps;\n const fieldProps = (field as unknown as { props?: AiTextInputFieldProps }).props;\n const stringValue = typeof value === 'string' ? value : '';\n return (\n <Component\n name={field.name}\n value={stringValue}\n props={fieldProps}\n {...(onChange !== undefined ? { onChange } : {})}\n {...(resource !== undefined ? { resource } : {})}\n field={field.name}\n {...(formData !== undefined ? { formData } : {})}\n {...(csrfToken !== undefined ? { csrfToken } : {})}\n />\n );\n };\n}\n\nfunction adaptToAiTranslateInput(\n Component: ComponentType<AiTranslateInputProps>,\n): ComponentType<RegistryFieldProps> {\n return function AiTranslateInputAdapter(registryProps: RegistryFieldProps): ReactElement {\n const { field, value, onChange, resource, csrfToken } = registryProps;\n const fieldProps = (field as unknown as { props?: AiTranslateInputFieldProps }).props;\n // O FieldRegistry tipa `onChange` como `(value: string) => void`,\n // mas este field emite um `Record<string, string>`; o cast é\n // compatível em runtime e mantém o registry agnóstico ao shape.\n const onChangeAdapted =\n onChange !== undefined\n ? (next: AiTranslateValue) => {\n (onChange as unknown as (v: AiTranslateValue) => void)(next);\n }\n : undefined;\n\n const objectValue: AiTranslateValue | null =\n value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as AiTranslateValue)\n : null;\n\n return (\n <Component\n name={field.name}\n value={objectValue}\n props={fieldProps}\n {...(onChangeAdapted !== undefined ? { onChange: onChangeAdapted } : {})}\n {...(resource !== undefined ? { resource } : {})}\n field={field.name}\n {...(csrfToken !== undefined ? { csrfToken } : {})}\n />\n );\n };\n}\n\nfunction adaptToAiSelectInput(\n Component: ComponentType<AiSelectInputProps>,\n): ComponentType<RegistryFieldProps> {\n return function AiSelectInputAdapter(registryProps: RegistryFieldProps): ReactElement {\n const { field, value, onChange, resource, formData, csrfToken } = registryProps;\n const fieldProps = (field as unknown as { props?: AiSelectInputFieldProps }).props;\n // O FieldRegistry tipa `onChange` como `(value: string) => void`,\n // mas o select pode emitir `null` ao limpar a seleção; o cast é\n // compatível em runtime com o registry genérico.\n const onChangeAdapted =\n onChange !== undefined\n ? (next: string | null) => {\n (onChange as unknown as (v: string | null) => void)(next);\n }\n : undefined;\n\n const stringValue: string | null = typeof value === 'string' && value !== '' ? value : null;\n\n return (\n <Component\n name={field.name}\n value={stringValue}\n props={fieldProps}\n {...(onChangeAdapted !== undefined ? { onChange: onChangeAdapted } : {})}\n {...(resource !== undefined ? { resource } : {})}\n field={field.name}\n {...(formData !== undefined ? { formData } : {})}\n {...(csrfToken !== undefined ? { csrfToken } : {})}\n />\n );\n };\n}\n\nfunction adaptToAiExtractInput(\n Component: ComponentType<AiExtractInputProps>,\n): ComponentType<RegistryFieldProps> {\n return function AiExtractInputAdapter(registryProps: RegistryFieldProps): ReactElement {\n const { field, value, onChange, resource, formData, csrfToken } = registryProps;\n const fieldProps = (field as unknown as { props?: AiExtractInputFieldProps }).props;\n // O FieldRegistry tipa `onChange` como `(value: string) => void`,\n // mas este field emite um `Record<string, unknown>`; o cast é\n // compatível em runtime e mantém o registry agnóstico ao shape.\n const onChangeAdapted =\n onChange !== undefined\n ? (next: AiExtractValue) => {\n (onChange as unknown as (v: AiExtractValue) => void)(next);\n }\n : undefined;\n\n const objectValue: AiExtractValue | null =\n value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as AiExtractValue)\n : null;\n\n return (\n <Component\n name={field.name}\n value={objectValue}\n props={fieldProps}\n {...(onChangeAdapted !== undefined ? { onChange: onChangeAdapted } : {})}\n {...(resource !== undefined ? { resource } : {})}\n field={field.name}\n {...(formData !== undefined ? { formData } : {})}\n {...(csrfToken !== undefined ? { csrfToken } : {})}\n />\n );\n };\n}\n\nconst LazyAiTextInput = lazy(async () => {\n const mod = await import('./AiTextInput.js');\n return { default: adaptToAiTextInput(mod.AiTextInput) };\n});\n\nconst LazyAiTranslateInput = lazy(async () => {\n const mod = await import('./AiTranslateInput.js');\n return { default: adaptToAiTranslateInput(mod.AiTranslateInput) };\n});\n\nconst LazyAiSelectInput = lazy(async () => {\n const mod = await import('./AiSelectInput.js');\n return { default: adaptToAiSelectInput(mod.AiSelectInput) };\n});\n\nconst LazyAiExtractInput = lazy(async () => {\n const mod = await import('./AiExtractInput.js');\n return { default: adaptToAiExtractInput(mod.AiExtractInput) };\n});\n\nfunction adaptToAiImageInput(\n Component: ComponentType<AiImageInputProps>,\n): ComponentType<RegistryFieldProps> {\n return function AiImageInputAdapter(registryProps: RegistryFieldProps): ReactElement {\n const { field, value, onChange, resource, csrfToken } = registryProps;\n const fieldProps = (field as unknown as { props?: AiImageInputFieldProps }).props;\n const stringValue: string | null = typeof value === 'string' && value !== '' ? value : null;\n return (\n <Component\n name={field.name}\n value={stringValue}\n props={fieldProps}\n {...(onChange !== undefined ? { onChange } : {})}\n {...(resource !== undefined ? { resource } : {})}\n field={field.name}\n {...(csrfToken !== undefined ? { csrfToken } : {})}\n />\n );\n };\n}\n\nconst LazyAiImageInput = lazy(async () => {\n const mod = await import('./AiImageInput.js');\n return { default: adaptToAiImageInput(mod.AiImageInput) };\n});\n\nregisterField('AiTextInput', LazyAiTextInput as unknown as Parameters<typeof registerField>[1]);\nregisterField(\n 'AiTranslateInput',\n LazyAiTranslateInput as unknown as Parameters<typeof registerField>[1],\n);\nregisterField('AiSelectInput', LazyAiSelectInput as unknown as Parameters<typeof registerField>[1]);\nregisterField(\n 'AiExtractInput',\n LazyAiExtractInput as unknown as Parameters<typeof registerField>[1],\n);\nregisterField('AiImageInput', LazyAiImageInput as unknown as Parameters<typeof registerField>[1]);\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/AiTextInput.tsx","../src/AiTranslateInput.tsx","../src/AiSelectInput.tsx","../src/AiExtractInput.tsx","../src/AiImageInput.tsx","../src/register.tsx"],"names":["Spinner","jsxs","jsx","useArqelTranslations","useMemo","useId","useState","useCallback","Button","Textarea","Alert","AlertDescription","DEFAULT_BUTTON_LABEL","Badge","body","isStringRecord","useArqelLocale","Card","CardContent"],"mappings":"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","file":"register.js","sourcesContent":["/**\n * `<AiTextInput>` — apresentational React component for the PHP\n * `Arqel\\Ai\\Fields\\AiTextField` (component string `AiTextInput`).\n *\n * Render contract (AI-007):\n * - `<textarea>` displaying the current value (controlled if\n * `onChange` is provided, otherwise uncontrolled with internal\n * state seeded by `value`),\n * - \"Generate with AI\" button (label from `props.buttonLabel`,\n * fallback `Generate with AI`); after a successful generation the\n * button label becomes `Regenerate`,\n * - while a request is in-flight the button is disabled and shows a\n * small inline spinner,\n * - on failure a banner with a generic message + HTTP status code is\n * rendered; the button re-enables so the user can retry,\n * - optional `X / maxLength` counter when `props.maxLength` is set.\n *\n * Network:\n * - URL = `props.generateUrl` (caller override) or\n * `/admin/${resource}/fields/${field}/generate` (default route name\n * `arqel.ai.generate`).\n * - `fetch(url, { method: 'POST', credentials: 'same-origin', headers:\n * { Content-Type, Accept, X-CSRF-TOKEN }, body: JSON.stringify({\n * formData }) })`. The PHP controller resolves the prompt template\n * server-side and returns `{ text }`.\n *\n * SSR-safe: nothing in the render path touches `window`/`document`;\n * the network call only fires from the click handler (post-mount).\n */\n\nimport { useArqelLocale, useArqelTranslations } from '@arqel-dev/react/utils';\nimport { Alert, AlertDescription, Button, Textarea } from '@arqel-dev/ui';\nimport { type ChangeEvent, type ReactElement, useCallback, useId, useMemo, useState } from 'react';\n\nexport interface AiTextInputFieldProps {\n provider?: string | null;\n buttonLabel: string;\n maxLength?: number | null;\n hasContextFields: boolean;\n}\n\nexport interface AiTextInputProps {\n name: string;\n value: string;\n onChange?: (value: string) => void;\n props: AiTextInputFieldProps | undefined;\n resource?: string;\n field?: string;\n formData?: Record<string, unknown>;\n generateUrl?: string;\n csrfToken?: string;\n}\n\ninterface AiGenerateResponseBody {\n text?: unknown;\n}\n\nconst DEFAULT_BUTTON_LABEL = 'Generate with AI';\nconst REGENERATE_LABEL = 'Regenerate';\n\nfunction buildGenerateUrl(\n override: string | undefined,\n resource: string | undefined,\n field: string | undefined,\n): string | null {\n if (override !== undefined && override !== '') {\n return override;\n }\n if (resource && field) {\n return `/admin/${resource}/fields/${field}/generate`;\n }\n return null;\n}\n\nfunction Spinner(): ReactElement {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n className=\"animate-spin\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeOpacity=\"0.25\" strokeWidth=\"4\" />\n <path\n d=\"M22 12a10 10 0 0 1-10 10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function AiTextInput(props: AiTextInputProps): ReactElement {\n const {\n name,\n value,\n onChange,\n props: fieldProps,\n resource,\n field,\n formData,\n generateUrl,\n csrfToken,\n } = props;\n\n const t = useArqelTranslations();\n const locale = useArqelLocale();\n const numberFormatter = useMemo(() => new Intl.NumberFormat(locale), [locale]);\n const serverLabel = fieldProps?.buttonLabel;\n const buttonLabel =\n serverLabel !== undefined && serverLabel !== ''\n ? serverLabel\n : t('arqel.ai.generate', DEFAULT_BUTTON_LABEL);\n const maxLength = fieldProps?.maxLength ?? null;\n\n const reactId = useId();\n const textareaId = `arqel-ai-text-${reactId}`;\n\n const [internalValue, setInternalValue] = useState<string>(value);\n const isControlled = onChange !== undefined;\n const currentValue = isControlled ? value : internalValue;\n\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const [hasGenerated, setHasGenerated] = useState<boolean>(false);\n\n const handleTextareaChange = useCallback(\n (event: ChangeEvent<HTMLTextAreaElement>) => {\n const next = event.target.value;\n if (isControlled && onChange) {\n onChange(next);\n } else {\n setInternalValue(next);\n }\n },\n [isControlled, onChange],\n );\n\n const applyGeneratedText = useCallback(\n (next: string) => {\n if (isControlled && onChange) {\n onChange(next);\n } else {\n setInternalValue(next);\n }\n },\n [isControlled, onChange],\n );\n\n const handleGenerate = useCallback(async (): Promise<void> => {\n const url = buildGenerateUrl(generateUrl, resource, field);\n if (url === null) {\n setError(\n t(\n 'arqel.ai.missing_generate_url',\n 'Missing generate URL: provide `generateUrl` or both `resource` and `field`.',\n ),\n );\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'X-CSRF-TOKEN': csrfToken ?? '',\n },\n body: JSON.stringify({ formData: formData ?? {} }),\n });\n\n if (!response.ok) {\n setError(\n t('arqel.ai.error_http', 'Generation failed (HTTP :status).', {\n status: String(response.status),\n }),\n );\n return;\n }\n\n const body = (await response.json()) as AiGenerateResponseBody;\n const text = typeof body.text === 'string' ? body.text : '';\n applyGeneratedText(text);\n setHasGenerated(true);\n } catch {\n setError(t('arqel.ai.error_network', 'Generation failed: network error.'));\n } finally {\n setIsLoading(false);\n }\n }, [applyGeneratedText, csrfToken, field, formData, generateUrl, resource, t]);\n\n const triggerLabel = hasGenerated ? t('arqel.ai.regenerate', REGENERATE_LABEL) : buttonLabel;\n const charCount = currentValue.length;\n\n return (\n <div className=\"flex flex-col gap-2\" data-arqel-field=\"aiText\" data-field-name={name}>\n <Textarea\n id={textareaId}\n name={name}\n value={currentValue}\n onChange={handleTextareaChange}\n {...(maxLength !== null ? { maxLength } : {})}\n rows={6}\n />\n\n {maxLength !== null ? (\n <div className=\"text-xs text-muted-foreground self-end\" aria-live=\"polite\">\n {numberFormatter.format(charCount)} / {numberFormatter.format(maxLength)}\n </div>\n ) : null}\n\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n void handleGenerate();\n }}\n disabled={isLoading}\n aria-label={triggerLabel}\n >\n {isLoading ? (\n <span role=\"status\" aria-label={t('arqel.ai.status_generating', 'Generating')}>\n <Spinner />\n </span>\n ) : null}\n <span>{triggerLabel}</span>\n </Button>\n </div>\n\n {error !== null ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n ) : null}\n </div>\n );\n}\n\nexport default AiTextInput;\n","/**\n * `<AiTranslateInput>` — apresentational React component for the PHP\n * `Arqel\\Ai\\Fields\\AiTranslateField` (component string `AiTranslateInput`).\n *\n * Render contract (AI-008):\n * - Tab list (`role=\"tablist\"`) com um `<button role=\"tab\">` por\n * idioma configurado em `props.languages`. A tab default vem de\n * `props.defaultLanguage`.\n * - Cada tab mostra um indicador visual (`data-missing=\"true\"`)\n * quando a tradução daquela língua está vazia/null.\n * - Painel ativo: `<textarea>` controlado que edita\n * `translations[activeLang]`. Mudanças disparam o `onChange` com o\n * objeto completo `Record<lang, string>`.\n * - Botão \"Translate from {defaultLanguage}\" presente em todas as\n * tabs **não-default**; faz `POST` com `targetLanguages: [lang]`.\n * - Botão \"Translate all missing\" no topo do componente; itera as\n * línguas com tradução vazia e dispara um único `POST` com o\n * array completo.\n * - Loading per-language (`Set<string>`): o botão da tab/lang sendo\n * traduzida fica `disabled` + spinner inline.\n * - Banner `role=\"alert\"` quando o `fetch` falha; o resto continua\n * usável.\n *\n * Network:\n * - URL = `props.translateUrl` (caller override) ou\n * `/admin/${resource}/fields/${field}/translate` (default route\n * name `arqel.ai.translate`).\n * - Body: `{ sourceLanguage, targetLanguages: string[], sourceText }`.\n * `sourceText` vem de `translations[defaultLanguage] ?? ''`.\n * - Response: `{ translations: { [lang]: string } }` é mesclado em\n * state local + `onChange` callback.\n *\n * SSR-safe: nada no render path toca `window`/`document`; o `fetch`\n * só dispara dentro do click handler (post-mount).\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport { Alert, AlertDescription, Badge, Button, Textarea } from '@arqel-dev/ui';\nimport { type ChangeEvent, type ReactElement, useCallback, useId, useMemo, useState } from 'react';\n\nexport interface AiTranslateInputFieldProps {\n languages: string[];\n defaultLanguage: string;\n autoTranslate: boolean;\n provider?: string | null;\n}\n\nexport type AiTranslateValue = Record<string, string>;\n\nexport interface AiTranslateInputProps {\n name: string;\n value: AiTranslateValue | null;\n onChange?: (value: AiTranslateValue) => void;\n props: AiTranslateInputFieldProps | undefined;\n resource?: string;\n field?: string;\n translateUrl?: string;\n csrfToken?: string;\n}\n\ninterface AiTranslateResponseBody {\n translations?: unknown;\n}\n\nfunction buildTranslateUrl(\n override: string | undefined,\n resource: string | undefined,\n field: string | undefined,\n): string | null {\n if (override !== undefined && override !== '') {\n return override;\n }\n if (resource && field) {\n return `/admin/${resource}/fields/${field}/translate`;\n }\n return null;\n}\n\nfunction isStringRecord(input: unknown): input is Record<string, string> {\n if (input === null || typeof input !== 'object') {\n return false;\n }\n for (const v of Object.values(input as Record<string, unknown>)) {\n if (typeof v !== 'string') {\n return false;\n }\n }\n return true;\n}\n\nfunction isMissing(translations: AiTranslateValue, lang: string): boolean {\n const v = translations[lang];\n return v === undefined || v === null || v === '';\n}\n\nfunction Spinner(): ReactElement {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n className=\"animate-spin\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeOpacity=\"0.25\" strokeWidth=\"4\" />\n <path\n d=\"M22 12a10 10 0 0 1-10 10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function AiTranslateInput(props: AiTranslateInputProps): ReactElement {\n const {\n name,\n value,\n onChange,\n props: fieldProps,\n resource,\n field,\n translateUrl,\n csrfToken,\n } = props;\n\n const t = useArqelTranslations();\n const languages = useMemo<string[]>(() => fieldProps?.languages ?? [], [fieldProps?.languages]);\n const defaultLanguage = fieldProps?.defaultLanguage ?? languages[0] ?? '';\n\n const reactId = useId();\n const tablistId = `arqel-ai-translate-${reactId}`;\n\n const [internalValue, setInternalValue] = useState<AiTranslateValue>(value ?? {});\n const isControlled = onChange !== undefined;\n const currentValue: AiTranslateValue = isControlled ? (value ?? {}) : internalValue;\n\n const initialActive = languages.includes(defaultLanguage)\n ? defaultLanguage\n : (languages[0] ?? defaultLanguage);\n const [activeLang, setActiveLang] = useState<string>(initialActive);\n\n const [loadingLangs, setLoadingLangs] = useState<Set<string>>(() => new Set());\n const [error, setError] = useState<string | null>(null);\n\n const applyValue = useCallback(\n (next: AiTranslateValue) => {\n if (isControlled && onChange) {\n onChange(next);\n } else {\n setInternalValue(next);\n }\n },\n [isControlled, onChange],\n );\n\n const handleTextareaChange = useCallback(\n (event: ChangeEvent<HTMLTextAreaElement>) => {\n const next: AiTranslateValue = { ...currentValue, [activeLang]: event.target.value };\n applyValue(next);\n },\n [activeLang, applyValue, currentValue],\n );\n\n const setLoadingFor = useCallback((langs: string[], on: boolean): void => {\n setLoadingLangs((prev) => {\n const next = new Set(prev);\n for (const l of langs) {\n if (on) {\n next.add(l);\n } else {\n next.delete(l);\n }\n }\n return next;\n });\n }, []);\n\n const performTranslate = useCallback(\n async (targetLanguages: string[]): Promise<void> => {\n if (targetLanguages.length === 0) {\n return;\n }\n const url = buildTranslateUrl(translateUrl, resource, field);\n if (url === null) {\n setError(\n t(\n 'arqel.ai.missing_translate_url',\n 'Missing translate URL: provide `translateUrl` or both `resource` and `field`.',\n ),\n );\n return;\n }\n\n setError(null);\n setLoadingFor(targetLanguages, true);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'X-CSRF-TOKEN': csrfToken ?? '',\n },\n body: JSON.stringify({\n sourceLanguage: defaultLanguage,\n targetLanguages,\n sourceText: currentValue[defaultLanguage] ?? '',\n }),\n });\n\n if (!response.ok) {\n setError(\n t('arqel.ai.translate_error_http', 'Translation failed (HTTP :status).', {\n status: String(response.status),\n }),\n );\n return;\n }\n\n const body = (await response.json()) as AiTranslateResponseBody;\n const incoming = body.translations;\n if (!isStringRecord(incoming)) {\n setError(\n t('arqel.ai.translate_error_invalid', 'Translation failed: invalid response body.'),\n );\n return;\n }\n\n const merged: AiTranslateValue = { ...currentValue, ...incoming };\n applyValue(merged);\n } catch {\n setError(t('arqel.ai.translate_error_network', 'Translation failed: network error.'));\n } finally {\n setLoadingFor(targetLanguages, false);\n }\n },\n [\n applyValue,\n csrfToken,\n currentValue,\n defaultLanguage,\n field,\n resource,\n setLoadingFor,\n t,\n translateUrl,\n ],\n );\n\n const handleTranslateOne = useCallback(\n (lang: string) => {\n void performTranslate([lang]);\n },\n [performTranslate],\n );\n\n const handleTranslateAllMissing = useCallback(() => {\n const missing = languages.filter(\n (lang) => lang !== defaultLanguage && isMissing(currentValue, lang),\n );\n void performTranslate(missing);\n }, [currentValue, defaultLanguage, languages, performTranslate]);\n\n const missingCount = languages.filter(\n (lang) => lang !== defaultLanguage && isMissing(currentValue, lang),\n ).length;\n\n const activeText = currentValue[activeLang] ?? '';\n const activeIsLoading = loadingLangs.has(activeLang);\n\n return (\n <div className=\"flex flex-col gap-2\" data-arqel-field=\"aiTranslate\" data-field-name={name}>\n <div className=\"flex items-center justify-end\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleTranslateAllMissing}\n disabled={missingCount === 0 || loadingLangs.size > 0}\n >\n {t('arqel.ai.translate_all_missing', 'Translate all missing')}\n </Button>\n </div>\n\n <div role=\"tablist\" id={tablistId} className=\"flex items-center gap-1 border-b border-border\">\n {languages.map((lang) => {\n const selected = lang === activeLang;\n const missing = isMissing(currentValue, lang);\n return (\n <button\n key={lang}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n aria-controls={`${tablistId}-panel-${lang}`}\n data-missing={missing ? 'true' : 'false'}\n onClick={() => setActiveLang(lang)}\n className={\n 'inline-flex items-center gap-1 px-3 py-1.5 text-sm font-medium border-b-2 -mb-px transition-colors ' +\n (selected\n ? 'border-primary text-foreground'\n : 'border-transparent text-muted-foreground hover:text-foreground')\n }\n >\n <span>{lang}</span>\n {missing ? (\n <Badge\n variant=\"secondary\"\n role=\"img\"\n aria-label={t('arqel.ai.missing_translation', 'Missing translation')}\n data-testid={`missing-dot-${lang}`}\n className=\"px-1 py-0\"\n >\n •\n </Badge>\n ) : null}\n </button>\n );\n })}\n </div>\n\n <div role=\"tabpanel\" id={`${tablistId}-panel-${activeLang}`} className=\"flex flex-col gap-2\">\n <Textarea\n name={`${name}[${activeLang}]`}\n value={activeText}\n onChange={handleTextareaChange}\n rows={6}\n aria-label={t('arqel.ai.translate_textarea_aria', 'Translation in :language', {\n language: activeLang,\n })}\n />\n\n {activeLang !== defaultLanguage ? (\n <div className=\"flex items-center\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => handleTranslateOne(activeLang)}\n disabled={activeIsLoading}\n >\n {activeIsLoading ? (\n <span role=\"status\" aria-label={t('arqel.ai.status_translating', 'Translating')}>\n <Spinner />\n </span>\n ) : null}\n <span>\n {t('arqel.ai.translate_from', 'Translate from :language', {\n language: defaultLanguage,\n })}\n </span>\n </Button>\n </div>\n ) : null}\n </div>\n\n {error !== null ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n ) : null}\n </div>\n );\n}\n\nexport default AiTranslateInput;\n","/**\n * `<AiSelectInput>` — apresentational React component for the PHP\n * `Arqel\\Ai\\Fields\\AiSelectField` (component string `AiSelectInput`).\n *\n * Render contract (AI-009):\n * - `<select>` controlled (or uncontrolled fallback) with a\n * placeholder option + one entry per `props.options`,\n * - \"Classify with AI\" button next to the select; disabled when\n * `hasContextFields` is false (with a tooltip explaining why),\n * - while a request is in-flight the button is disabled and an\n * inline spinner is rendered,\n * - on success a banner with `Suggested by AI` is rendered with two\n * dismiss buttons: `Accept` and `Pick another` (both just hide the\n * banner — the value is already applied),\n * - if the response returns `key: null` and `fallbackOption` is\n * configured, the fallback is applied and a `Used fallback`\n * banner is shown,\n * - if the response returns `key: null` and there is no fallback,\n * an error banner `Could not classify` is rendered.\n *\n * Network:\n * - URL = `props.classifyUrl` override or\n * `/admin/${resource}/fields/${field}/classify`.\n * - `fetch(url, { method: 'POST', credentials: 'same-origin', headers:\n * { Content-Type, Accept, X-CSRF-TOKEN }, body: JSON.stringify({\n * formData }) })`. The PHP controller runs the LLM classification\n * and returns `{ key, label }`.\n *\n * SSR-safe: nothing in the render path touches `window`/`document`.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport {\n Alert,\n AlertDescription,\n Badge,\n Button,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@arqel-dev/ui';\nimport { type ReactElement, useCallback, useId, useState } from 'react';\n\nexport interface AiSelectInputFieldProps {\n options: Record<string, string>;\n classifyFromFields: string[];\n provider?: string | null;\n fallbackOption?: string | null;\n hasContextFields: boolean;\n}\n\nexport interface AiSelectInputProps {\n name: string;\n value: string | null;\n onChange?: (value: string | null) => void;\n props: AiSelectInputFieldProps | undefined;\n resource?: string;\n field?: string;\n formData?: Record<string, unknown>;\n classifyUrl?: string;\n csrfToken?: string;\n}\n\ninterface AiClassifyResponseBody {\n key?: unknown;\n label?: unknown;\n}\n\ntype SuggestionKind = 'ai' | 'fallback';\n\nconst DEFAULT_BUTTON_LABEL = 'Classify with AI';\nconst NO_CONTEXT_TOOLTIP_FALLBACK =\n 'No context fields configured. Add `classifyFromFields` to enable AI classification.';\n\nfunction buildClassifyUrl(\n override: string | undefined,\n resource: string | undefined,\n field: string | undefined,\n): string | null {\n if (override !== undefined && override !== '') {\n return override;\n }\n if (resource && field) {\n return `/admin/${resource}/fields/${field}/classify`;\n }\n return null;\n}\n\nfunction Spinner(): ReactElement {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n className=\"animate-spin\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeOpacity=\"0.25\" strokeWidth=\"4\" />\n <path\n d=\"M22 12a10 10 0 0 1-10 10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function AiSelectInput(props: AiSelectInputProps): ReactElement {\n const {\n name,\n value,\n onChange,\n props: fieldProps,\n resource,\n field,\n formData,\n classifyUrl,\n csrfToken,\n } = props;\n\n const t = useArqelTranslations();\n const options = fieldProps?.options ?? {};\n const fallbackOption = fieldProps?.fallbackOption ?? null;\n const hasContextFields = fieldProps?.hasContextFields ?? false;\n const buttonLabel = t('arqel.ai.classify', DEFAULT_BUTTON_LABEL);\n\n const reactId = useId();\n const selectId = `arqel-ai-select-${reactId}`;\n\n const [internalValue, setInternalValue] = useState<string | null>(value);\n const isControlled = onChange !== undefined;\n const currentValue = isControlled ? value : internalValue;\n\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const [suggestion, setSuggestion] = useState<SuggestionKind | null>(null);\n\n const applyValue = useCallback(\n (next: string | null) => {\n if (isControlled && onChange) {\n onChange(next);\n } else {\n setInternalValue(next);\n }\n },\n [isControlled, onChange],\n );\n\n const handleSelectChange = useCallback(\n (next: string) => {\n applyValue(next === '' ? null : next);\n setSuggestion(null);\n },\n [applyValue],\n );\n\n const handleClassify = useCallback(async (): Promise<void> => {\n const url = buildClassifyUrl(classifyUrl, resource, field);\n if (url === null) {\n setError(\n t(\n 'arqel.ai.missing_classify_url',\n 'Missing classify URL: provide `classifyUrl` or both `resource` and `field`.',\n ),\n );\n return;\n }\n\n setIsLoading(true);\n setError(null);\n setSuggestion(null);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'X-CSRF-TOKEN': csrfToken ?? '',\n },\n body: JSON.stringify({ formData: formData ?? {} }),\n });\n\n if (!response.ok) {\n setError(\n t('arqel.ai.classify_error_http', 'Classification failed (HTTP :status).', {\n status: String(response.status),\n }),\n );\n return;\n }\n\n const body = (await response.json()) as AiClassifyResponseBody;\n const key = typeof body.key === 'string' ? body.key : null;\n\n if (key !== null) {\n applyValue(key);\n setSuggestion('ai');\n return;\n }\n\n // key === null → try fallback\n if (fallbackOption !== null && fallbackOption !== '') {\n applyValue(fallbackOption);\n setSuggestion('fallback');\n return;\n }\n\n setError(t('arqel.ai.classify_error_none', 'Could not classify.'));\n } catch {\n setError(t('arqel.ai.classify_error_network', 'Classification failed: network error.'));\n } finally {\n setIsLoading(false);\n }\n }, [applyValue, classifyUrl, csrfToken, fallbackOption, field, formData, resource, t]);\n\n const buttonDisabled = isLoading || !hasContextFields;\n const buttonTitle = !hasContextFields\n ? t('arqel.ai.classify_no_context_tooltip', NO_CONTEXT_TOOLTIP_FALLBACK)\n : undefined;\n\n return (\n <div className=\"flex flex-col gap-2\" data-arqel-field=\"aiSelect\" data-field-name={name}>\n <div className=\"flex items-center gap-2\">\n <Select value={currentValue ?? ''} onValueChange={handleSelectChange} name={name}>\n <SelectTrigger id={selectId} className=\"flex-1\">\n <SelectValue placeholder={t('arqel.ai.select_placeholder', 'Select...')} />\n </SelectTrigger>\n <SelectContent>\n {Object.entries(options).map(([key, label]) => (\n <SelectItem key={key} value={key}>\n {label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n void handleClassify();\n }}\n disabled={buttonDisabled}\n aria-label={buttonLabel}\n {...(buttonTitle !== undefined ? { title: buttonTitle } : {})}\n >\n {isLoading ? (\n <span role=\"status\" aria-label={t('arqel.ai.status_classifying', 'Classifying')}>\n <Spinner />\n </span>\n ) : null}\n <span>{buttonLabel}</span>\n </Button>\n </div>\n\n {suggestion !== null ? (\n <div role=\"status\" className=\"flex items-center gap-2\">\n <Badge\n variant=\"secondary\"\n className={\n suggestion === 'ai'\n ? 'border-emerald-500/30 bg-emerald-500/10 text-emerald-700 dark:text-emerald-300'\n : 'border-amber-500/30 bg-amber-500/10 text-amber-700 dark:text-amber-300'\n }\n >\n {suggestion === 'ai'\n ? t('arqel.ai.suggestion_ai', 'Suggested by AI')\n : t('arqel.ai.suggestion_fallback', 'Used fallback')}\n </Badge>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n setSuggestion(null);\n }}\n >\n {t('arqel.ai.suggestion_accept', 'Accept')}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n setSuggestion(null);\n }}\n >\n {t('arqel.ai.suggestion_pick_another', 'Pick another')}\n </Button>\n </div>\n ) : null}\n\n {error !== null ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n ) : null}\n </div>\n );\n}\n\nexport default AiSelectInput;\n","/**\n * `<AiExtractInput>` — apresentational React component for the PHP\n * `Arqel\\Ai\\Fields\\AiExtractField` (component string `AiExtractInput`).\n *\n * Render contract (AI-010):\n * - Read-only label `Source: {sourceField}` indicando o campo do\n * formulário de onde o texto-fonte é lido.\n * - Botão `Extract with AI` (label vem de `props.buttonLabel`); em\n * loading o botão fica `disabled` + spinner inline.\n * - Empty state `No extraction yet — click button to start` antes da\n * primeira extração.\n * - Após sucesso: lista preview `<dl>` com cada `targetField:\n * extractedValue`; cada entry tem botão `Apply` individual e o\n * toolbar mostra `Apply all`.\n * - `Apply` chama `onPopulateField?.(targetField, value)` ou\n * `onChange(extracted)` se `onPopulateField` for ausente.\n * - Banner `role=\"alert\"` quando o `fetch` falha (com `message` da\n * response 422 quando disponível).\n *\n * Network:\n * - URL = `props.extractUrl` override ou\n * `/admin/${resource}/fields/${field}/extract`.\n * - Body: `{ sourceText }` lido de `formData?.[sourceField] ?? ''`.\n * - Resposta: `{ extracted: Record<string, unknown> }` (200) ou\n * `{ message }` (422).\n *\n * SSR-safe: nada no render path toca `window`/`document`.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport { Alert, AlertDescription, Badge, Button, Card, CardContent, Label } from '@arqel-dev/ui';\nimport { type ReactElement, useCallback, useId, useState } from 'react';\n\nexport interface AiExtractInputFieldProps {\n sourceField: string;\n targetFields: string[];\n buttonLabel: string;\n usingJsonMode: boolean;\n provider?: string | null;\n}\n\nexport type AiExtractValue = Record<string, unknown>;\n\nexport interface AiExtractInputProps {\n name: string;\n value: AiExtractValue | null;\n onChange?: (value: AiExtractValue) => void;\n props: AiExtractInputFieldProps | undefined;\n resource?: string;\n field?: string;\n formData?: Record<string, unknown>;\n extractUrl?: string;\n csrfToken?: string;\n onPopulateField?: (targetField: string, value: unknown) => void;\n}\n\ninterface AiExtractResponseBody {\n extracted?: unknown;\n message?: unknown;\n}\n\nfunction buildExtractUrl(\n override: string | undefined,\n resource: string | undefined,\n field: string | undefined,\n): string | null {\n if (override !== undefined && override !== '') {\n return override;\n }\n if (resource && field) {\n return `/admin/${resource}/fields/${field}/extract`;\n }\n return null;\n}\n\nfunction isPlainRecord(input: unknown): input is Record<string, unknown> {\n return input !== null && typeof input === 'object' && !Array.isArray(input);\n}\n\nfunction coerceSourceText(raw: unknown): string {\n if (typeof raw === 'string') {\n return raw;\n }\n if (raw === null || raw === undefined) {\n return '';\n }\n if (typeof raw === 'number' || typeof raw === 'boolean') {\n return String(raw);\n }\n return '';\n}\n\nfunction formatPreviewValue(value: unknown): string {\n if (value === null || value === undefined) {\n return '';\n }\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction Spinner(): ReactElement {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n className=\"animate-spin\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeOpacity=\"0.25\" strokeWidth=\"4\" />\n <path\n d=\"M22 12a10 10 0 0 1-10 10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function AiExtractInput(props: AiExtractInputProps): ReactElement {\n const {\n name,\n value,\n onChange,\n props: fieldProps,\n resource,\n field,\n formData,\n extractUrl,\n csrfToken,\n onPopulateField,\n } = props;\n\n const t = useArqelTranslations();\n const sourceField = fieldProps?.sourceField ?? '';\n const targetFields = fieldProps?.targetFields ?? [];\n const serverLabel = fieldProps?.buttonLabel;\n const buttonLabel =\n serverLabel !== undefined && serverLabel !== ''\n ? serverLabel\n : t('arqel.ai.extract', 'Extract with AI');\n\n const reactId = useId();\n const previewId = `arqel-ai-extract-${reactId}`;\n\n const [extracted, setExtracted] = useState<AiExtractValue | null>(value);\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const applyAll = useCallback(\n (next: AiExtractValue) => {\n if (onPopulateField !== undefined) {\n for (const key of Object.keys(next)) {\n onPopulateField(key, next[key]);\n }\n return;\n }\n onChange?.(next);\n },\n [onChange, onPopulateField],\n );\n\n const applyOne = useCallback(\n (target: string, val: unknown) => {\n if (onPopulateField !== undefined) {\n onPopulateField(target, val);\n return;\n }\n onChange?.({ [target]: val });\n },\n [onChange, onPopulateField],\n );\n\n const handleExtract = useCallback(async (): Promise<void> => {\n const url = buildExtractUrl(extractUrl, resource, field);\n if (url === null) {\n setError(\n t(\n 'arqel.ai.missing_extract_url',\n 'Missing extract URL: provide `extractUrl` or both `resource` and `field`.',\n ),\n );\n return;\n }\n\n const sourceText = coerceSourceText(\n formData !== undefined && sourceField !== '' ? formData[sourceField] : '',\n );\n\n setIsLoading(true);\n setError(null);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'X-CSRF-TOKEN': csrfToken ?? '',\n },\n body: JSON.stringify({ sourceText }),\n });\n\n if (!response.ok) {\n let message: string | null = null;\n try {\n const body = (await response.json()) as AiExtractResponseBody;\n if (typeof body.message === 'string' && body.message !== '') {\n message = body.message;\n }\n } catch {\n message = null;\n }\n setError(\n message ??\n t('arqel.ai.extract_error_http', 'Extraction failed (HTTP :status).', {\n status: String(response.status),\n }),\n );\n return;\n }\n\n const body = (await response.json()) as AiExtractResponseBody;\n if (!isPlainRecord(body.extracted)) {\n setError(t('arqel.ai.extract_error_invalid', 'Extraction failed: invalid response body.'));\n return;\n }\n\n setExtracted(body.extracted);\n } catch {\n setError(t('arqel.ai.extract_error_network', 'Extraction failed: network error.'));\n } finally {\n setIsLoading(false);\n }\n }, [csrfToken, extractUrl, field, formData, resource, sourceField, t]);\n\n const hasExtraction = extracted !== null && Object.keys(extracted).length > 0;\n\n return (\n <div className=\"flex flex-col gap-2\" data-arqel-field=\"aiExtract\" data-field-name={name}>\n <div>\n <Label className=\"text-muted-foreground\">\n {t('arqel.ai.source', 'Source: :field', { field: sourceField })}\n </Label>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n void handleExtract();\n }}\n disabled={isLoading}\n aria-label={buttonLabel}\n >\n {isLoading ? (\n <span role=\"status\" aria-label={t('arqel.ai.status_extracting', 'Extracting')}>\n <Spinner />\n </span>\n ) : null}\n <span>{buttonLabel}</span>\n </Button>\n\n {hasExtraction && extracted !== null ? (\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={() => {\n applyAll(extracted);\n }}\n >\n {t('arqel.ai.apply_all', 'Apply all')}\n </Button>\n ) : null}\n </div>\n\n {hasExtraction && extracted !== null ? (\n <Card>\n <CardContent className=\"p-4\">\n <dl id={previewId} className=\"flex flex-col gap-2\">\n {(targetFields.length > 0 ? targetFields : Object.keys(extracted)).map((target) => {\n const val = extracted[target];\n return (\n <div\n key={target}\n className=\"flex items-center justify-between gap-2 border-b border-border pb-2 last:border-b-0 last:pb-0\"\n >\n <dt>\n <Badge variant=\"outline\">{target}</Badge>\n </dt>\n <dd className=\"flex items-center gap-2 flex-1 justify-end\">\n <span\n className=\"text-sm text-foreground truncate\"\n data-testid={`extract-value-${target}`}\n >\n {formatPreviewValue(val)}\n </span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n applyOne(target, val);\n }}\n aria-label={t('arqel.ai.apply_field', 'Apply :field', { field: target })}\n >\n {t('arqel.ai.apply', 'Apply')}\n </Button>\n </dd>\n </div>\n );\n })}\n </dl>\n </CardContent>\n </Card>\n ) : (\n <p className=\"text-sm text-muted-foreground italic\">\n {t('arqel.ai.extract_empty', 'No extraction yet — click button to start.')}\n </p>\n )}\n\n {error !== null ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n ) : null}\n </div>\n );\n}\n\nexport default AiExtractInput;\n","/**\n * `<AiImageInput>` — apresentational React component for the PHP\n * `Arqel\\Ai\\Fields\\AiImageField` (component string `AiImageInput`).\n *\n * Render contract (AI-011):\n * - File input restrito por `accept={props.acceptedMimes.join(',')}`\n * com drag-drop area visual (`<label>` clicável que dispara o\n * `<input type=\"file\">` escondido).\n * - Preview da imagem após selecionar (img src vem de\n * `URL.createObjectURL` — só é chamado dentro do change handler,\n * mantendo o render path SSR-safe).\n * - Validação client-side: rejeita arquivos > `props.maxFileSize`\n * (em bytes) com banner de erro; nesse caso o botão \"Analyze with\n * AI\" fica `disabled`.\n * - Botão `Analyze with AI` (label de `props.buttonLabel`); spinner\n * inline + `disabled` durante o `fetch`. Sem arquivo selecionado o\n * botão também fica `disabled`.\n * - Após sucesso: lista preview `<dl>` com `analysis_key: value` por\n * entry; cada entry tem botão `Apply` individual; toolbar mostra\n * `Apply all`.\n * - `Apply` chama `onPopulateField?.(target, value)` usando o\n * mapeamento `props.populateFields[analysisKey]` quando disponível.\n * `Apply all` itera todas as analyses que têm mapping.\n * - Banner `role=\"alert\"` quando o `fetch` falha (mensagem da\n * response 422 quando disponível).\n *\n * Network:\n * - URL = `props.analyzeUrl` override ou\n * `/admin/${resource}/fields/${field}/analyze-image`.\n * - Body: `{ imageBase64 }` produzido por `FileReader.readAsDataURL`\n * (data URI completo).\n * - Resposta: `{ analyses, populateMapping }` (200) ou\n * `{ message }` (422).\n *\n * SSR-safe: nada no render path toca `window`/`URL`/`FileReader` — só\n * em handlers de evento.\n */\n\nimport { useArqelLocale, useArqelTranslations } from '@arqel-dev/react/utils';\nimport { Alert, AlertDescription, Badge, Button, Card, CardContent } from '@arqel-dev/ui';\nimport { type ChangeEvent, type ReactElement, useCallback, useId, useState } from 'react';\n\nexport interface AiImageInputFieldProps {\n analyses: string[];\n populateFields: Record<string, string>;\n provider?: string | null;\n acceptedMimes: string[];\n maxFileSize: number;\n buttonLabel: string;\n}\n\nexport interface AiImageInputProps {\n name: string;\n value: string | null;\n onChange?: (value: string) => void;\n props: AiImageInputFieldProps | undefined;\n resource?: string;\n field?: string;\n analyzeUrl?: string;\n csrfToken?: string;\n onPopulateField?: (targetField: string, value: string) => void;\n}\n\ninterface AiImageResponseBody {\n analyses?: unknown;\n populateMapping?: unknown;\n message?: unknown;\n}\n\nfunction buildAnalyzeUrl(\n override: string | undefined,\n resource: string | undefined,\n field: string | undefined,\n): string | null {\n if (override !== undefined && override !== '') {\n return override;\n }\n if (resource && field) {\n return `/admin/${resource}/fields/${field}/analyze-image`;\n }\n return null;\n}\n\nfunction isStringRecord(input: unknown): input is Record<string, string> {\n if (input === null || typeof input !== 'object' || Array.isArray(input)) {\n return false;\n }\n for (const value of Object.values(input as Record<string, unknown>)) {\n if (typeof value !== 'string') {\n return false;\n }\n }\n return true;\n}\n\nfunction readFileAsDataUrl(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result;\n if (typeof result === 'string') {\n resolve(result);\n return;\n }\n reject(new Error('FileReader returned non-string result.'));\n };\n reader.onerror = () => {\n reject(reader.error ?? new Error('FileReader error.'));\n };\n reader.readAsDataURL(file);\n });\n}\n\n/**\n * Format a byte count for display, using the active panel locale for the\n * number portion so comma-decimal locales (e.g. `pt-BR` → `1,5 MB`) render\n * correctly instead of always emitting an en-US `.` decimal. The unit suffix\n * stays the conventional symbol (`MB`/`KB`/`B`), which is locale-neutral.\n */\nfunction formatBytes(bytes: number, locale?: string): string {\n const round1 = (value: number): string =>\n new Intl.NumberFormat(locale, { maximumFractionDigits: 1 }).format(value);\n\n if (bytes >= 1_048_576) {\n return `${round1(bytes / 1_048_576)} MB`;\n }\n if (bytes >= 1024) {\n return `${round1(bytes / 1024)} KB`;\n }\n return `${round1(bytes)} B`;\n}\n\nfunction Spinner(): ReactElement {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n className=\"animate-spin\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeOpacity=\"0.25\" strokeWidth=\"4\" />\n <path\n d=\"M22 12a10 10 0 0 1-10 10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function AiImageInput(props: AiImageInputProps): ReactElement {\n const {\n name,\n value,\n onChange,\n props: fieldProps,\n resource,\n field,\n analyzeUrl,\n csrfToken,\n onPopulateField,\n } = props;\n\n const analyses = fieldProps?.analyses ?? [];\n const populateFields = fieldProps?.populateFields ?? {};\n const acceptedMimes = fieldProps?.acceptedMimes ?? [];\n const maxFileSize = fieldProps?.maxFileSize ?? 0;\n const t = useArqelTranslations();\n const locale = useArqelLocale();\n const serverLabel = fieldProps?.buttonLabel;\n const buttonLabel =\n serverLabel !== undefined && serverLabel !== ''\n ? serverLabel\n : t('arqel.ai.analyze', 'Analyze with AI');\n\n const reactId = useId();\n const inputId = `arqel-ai-image-${reactId}`;\n\n const [file, setFile] = useState<File | null>(null);\n const [previewUrl, setPreviewUrl] = useState<string | null>(null);\n const [results, setResults] = useState<Record<string, string> | null>(null);\n const [populateMapping, setPopulateMapping] = useState<Record<string, string>>(populateFields);\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleFileChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const next = event.target.files?.[0] ?? null;\n setError(null);\n setResults(null);\n\n if (next === null) {\n setFile(null);\n setPreviewUrl(null);\n return;\n }\n\n if (maxFileSize > 0 && next.size > maxFileSize) {\n setError(\n t('arqel.ai.file_too_large', 'File too large: :size (max :max).', {\n size: formatBytes(next.size, locale),\n max: formatBytes(maxFileSize, locale),\n }),\n );\n setFile(null);\n setPreviewUrl(null);\n return;\n }\n\n setFile(next);\n try {\n setPreviewUrl(URL.createObjectURL(next));\n } catch {\n setPreviewUrl(null);\n }\n },\n [locale, maxFileSize, t],\n );\n\n const handleAnalyze = useCallback(async (): Promise<void> => {\n if (file === null) {\n return;\n }\n const url = buildAnalyzeUrl(analyzeUrl, resource, field);\n if (url === null) {\n setError(\n t(\n 'arqel.ai.missing_analyze_url',\n 'Missing analyze URL: provide `analyzeUrl` or both `resource` and `field`.',\n ),\n );\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const imageBase64 = await readFileAsDataUrl(file);\n const response = await fetch(url, {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'X-CSRF-TOKEN': csrfToken ?? '',\n },\n body: JSON.stringify({ imageBase64 }),\n });\n\n if (!response.ok) {\n let message: string | null = null;\n try {\n const body = (await response.json()) as AiImageResponseBody;\n if (typeof body.message === 'string' && body.message !== '') {\n message = body.message;\n }\n } catch {\n message = null;\n }\n setError(\n message ??\n t('arqel.ai.analyze_error_http', 'Analysis failed (HTTP :status).', {\n status: String(response.status),\n }),\n );\n return;\n }\n\n const body = (await response.json()) as AiImageResponseBody;\n if (!isStringRecord(body.analyses)) {\n setError(t('arqel.ai.analyze_error_invalid', 'Analysis failed: invalid response body.'));\n return;\n }\n\n setResults(body.analyses);\n if (isStringRecord(body.populateMapping)) {\n setPopulateMapping(body.populateMapping);\n }\n // Promove o data URI ao value do field caso o consumidor controle\n // o value via onChange — útil para quem queira persistir a imagem\n // selecionada como base64 (ou trocar por uma URL upload-side).\n if (onChange !== undefined) {\n onChange(imageBase64);\n }\n } catch {\n setError(t('arqel.ai.analyze_error_network', 'Analysis failed: network error.'));\n } finally {\n setIsLoading(false);\n }\n }, [analyzeUrl, csrfToken, field, file, onChange, resource, t]);\n\n const applyOne = useCallback(\n (analysisKey: string, val: string) => {\n const target = populateMapping[analysisKey];\n if (target === undefined || target === '') {\n return;\n }\n onPopulateField?.(target, val);\n },\n [onPopulateField, populateMapping],\n );\n\n const applyAll = useCallback(\n (entries: Record<string, string>) => {\n for (const key of Object.keys(entries)) {\n const target = populateMapping[key];\n const val = entries[key];\n if (target === undefined || target === '' || val === undefined) {\n continue;\n }\n onPopulateField?.(target, val);\n }\n },\n [onPopulateField, populateMapping],\n );\n\n const accept = acceptedMimes.join(',');\n const hasResults = results !== null && Object.keys(results).length > 0;\n const canAnalyze = file !== null && !isLoading;\n\n return (\n <div\n className=\"flex flex-col gap-2\"\n data-arqel-field=\"aiImage\"\n data-field-name={name}\n data-has-value={value !== null && value !== '' ? 'true' : 'false'}\n >\n <label\n htmlFor={inputId}\n className=\"flex items-center justify-center w-full min-h-[6rem] rounded-sm border-2 border-dashed border-border bg-muted/40 px-4 py-6 text-sm text-muted-foreground hover:bg-muted cursor-pointer transition-colors\"\n >\n <span>\n {file !== null\n ? file.name\n : t('arqel.ai.image_dropzone', 'Click or drop image (:accept)', {\n accept: accept !== '' ? accept : t('arqel.ai.image_accept_any', 'any'),\n })}\n </span>\n <input\n id={inputId}\n type=\"file\"\n accept={accept}\n onChange={handleFileChange}\n className=\"sr-only\"\n aria-label={t('arqel.ai.image_file', 'Image file')}\n />\n </label>\n\n {previewUrl !== null ? (\n <Card>\n <CardContent className=\"p-2 flex items-center justify-center\">\n <img\n src={previewUrl}\n alt={t('arqel.ai.selected_preview_alt', 'Selected preview')}\n data-testid=\"image-preview\"\n className=\"max-h-64 max-w-full rounded-sm\"\n />\n </CardContent>\n </Card>\n ) : null}\n\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n void handleAnalyze();\n }}\n disabled={!canAnalyze}\n aria-label={buttonLabel}\n >\n {isLoading ? (\n <span role=\"status\" aria-label={t('arqel.ai.status_analyzing', 'Analyzing')}>\n <Spinner />\n </span>\n ) : null}\n <span>{buttonLabel}</span>\n </Button>\n\n {hasResults && results !== null ? (\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={() => {\n applyAll(results);\n }}\n >\n {t('arqel.ai.apply_all', 'Apply all')}\n </Button>\n ) : null}\n </div>\n\n {hasResults && results !== null ? (\n <Card>\n <CardContent className=\"p-4\">\n <dl className=\"flex flex-col gap-2\">\n {(analyses.length > 0 ? analyses : Object.keys(results)).map((key) => {\n const val = results[key];\n if (val === undefined) {\n return null;\n }\n const target = populateMapping[key];\n const hasTarget = target !== undefined && target !== '';\n return (\n <div\n key={key}\n className=\"flex items-center justify-between gap-2 border-b border-border pb-2 last:border-b-0 last:pb-0\"\n >\n <dt>\n <Badge variant=\"outline\">{key}</Badge>\n </dt>\n <dd className=\"flex items-center gap-2 flex-1 justify-end\">\n <span\n className=\"text-sm text-foreground truncate\"\n data-testid={`analysis-value-${key}`}\n >\n {val}\n </span>\n {hasTarget ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n applyOne(key, val);\n }}\n aria-label={t('arqel.ai.apply_field', 'Apply :field', { field: key })}\n >\n {t('arqel.ai.apply', 'Apply')}\n </Button>\n ) : null}\n </dd>\n </div>\n );\n })}\n </dl>\n </CardContent>\n </Card>\n ) : null}\n\n {error !== null ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n ) : null}\n </div>\n );\n}\n\nexport default AiImageInput;\n","/**\n * Side-effect import que registra os componentes do `@arqel-dev/ai` no\n * FieldRegistry do `@arqel-dev/ui`, lazily.\n *\n * import '@arqel-dev/ai/register';\n *\n * Os component names (`AiTextInput`, `AiTranslateInput`,\n * `AiSelectInput`) batem com o que o PHP retorna em `getComponent()`.\n * Apps podem re-registrar seus próprios componentes sob a mesma chave\n * para sobrescrever o default.\n *\n * Os componentes têm shapes de props específicos do domínio; o\n * registry espera um adapter genérico `{ field, value }`, então cada\n * um é envolvido aqui.\n */\n\nimport type { FieldSchema } from '@arqel-dev/types/fields';\nimport { registerField } from '@arqel-dev/ui/form';\nimport { type ComponentType, lazy, type ReactElement } from 'react';\nimport type {\n AiExtractInputFieldProps,\n AiExtractInputProps,\n AiExtractValue,\n} from './AiExtractInput.js';\nimport type { AiImageInputFieldProps, AiImageInputProps } from './AiImageInput.js';\nimport type { AiSelectInputFieldProps, AiSelectInputProps } from './AiSelectInput.js';\nimport type { AiTextInputFieldProps, AiTextInputProps } from './AiTextInput.js';\nimport type {\n AiTranslateInputFieldProps,\n AiTranslateInputProps,\n AiTranslateValue,\n} from './AiTranslateInput.js';\n\ninterface RegistryFieldProps {\n field: FieldSchema;\n value: unknown;\n onChange?: (value: string) => void;\n resource?: string;\n formData?: Record<string, unknown>;\n csrfToken?: string;\n}\n\nfunction adaptToAiTextInput(\n Component: ComponentType<AiTextInputProps>,\n): ComponentType<RegistryFieldProps> {\n return function AiTextInputAdapter(registryProps: RegistryFieldProps): ReactElement {\n const { field, value, onChange, resource, formData, csrfToken } = registryProps;\n const fieldProps = (field as unknown as { props?: AiTextInputFieldProps }).props;\n const stringValue = typeof value === 'string' ? value : '';\n return (\n <Component\n name={field.name}\n value={stringValue}\n props={fieldProps}\n {...(onChange !== undefined ? { onChange } : {})}\n {...(resource !== undefined ? { resource } : {})}\n field={field.name}\n {...(formData !== undefined ? { formData } : {})}\n {...(csrfToken !== undefined ? { csrfToken } : {})}\n />\n );\n };\n}\n\nfunction adaptToAiTranslateInput(\n Component: ComponentType<AiTranslateInputProps>,\n): ComponentType<RegistryFieldProps> {\n return function AiTranslateInputAdapter(registryProps: RegistryFieldProps): ReactElement {\n const { field, value, onChange, resource, csrfToken } = registryProps;\n const fieldProps = (field as unknown as { props?: AiTranslateInputFieldProps }).props;\n // O FieldRegistry tipa `onChange` como `(value: string) => void`,\n // mas este field emite um `Record<string, string>`; o cast é\n // compatível em runtime e mantém o registry agnóstico ao shape.\n const onChangeAdapted =\n onChange !== undefined\n ? (next: AiTranslateValue) => {\n (onChange as unknown as (v: AiTranslateValue) => void)(next);\n }\n : undefined;\n\n const objectValue: AiTranslateValue | null =\n value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as AiTranslateValue)\n : null;\n\n return (\n <Component\n name={field.name}\n value={objectValue}\n props={fieldProps}\n {...(onChangeAdapted !== undefined ? { onChange: onChangeAdapted } : {})}\n {...(resource !== undefined ? { resource } : {})}\n field={field.name}\n {...(csrfToken !== undefined ? { csrfToken } : {})}\n />\n );\n };\n}\n\nfunction adaptToAiSelectInput(\n Component: ComponentType<AiSelectInputProps>,\n): ComponentType<RegistryFieldProps> {\n return function AiSelectInputAdapter(registryProps: RegistryFieldProps): ReactElement {\n const { field, value, onChange, resource, formData, csrfToken } = registryProps;\n const fieldProps = (field as unknown as { props?: AiSelectInputFieldProps }).props;\n // O FieldRegistry tipa `onChange` como `(value: string) => void`,\n // mas o select pode emitir `null` ao limpar a seleção; o cast é\n // compatível em runtime com o registry genérico.\n const onChangeAdapted =\n onChange !== undefined\n ? (next: string | null) => {\n (onChange as unknown as (v: string | null) => void)(next);\n }\n : undefined;\n\n const stringValue: string | null = typeof value === 'string' && value !== '' ? value : null;\n\n return (\n <Component\n name={field.name}\n value={stringValue}\n props={fieldProps}\n {...(onChangeAdapted !== undefined ? { onChange: onChangeAdapted } : {})}\n {...(resource !== undefined ? { resource } : {})}\n field={field.name}\n {...(formData !== undefined ? { formData } : {})}\n {...(csrfToken !== undefined ? { csrfToken } : {})}\n />\n );\n };\n}\n\nfunction adaptToAiExtractInput(\n Component: ComponentType<AiExtractInputProps>,\n): ComponentType<RegistryFieldProps> {\n return function AiExtractInputAdapter(registryProps: RegistryFieldProps): ReactElement {\n const { field, value, onChange, resource, formData, csrfToken } = registryProps;\n const fieldProps = (field as unknown as { props?: AiExtractInputFieldProps }).props;\n // O FieldRegistry tipa `onChange` como `(value: string) => void`,\n // mas este field emite um `Record<string, unknown>`; o cast é\n // compatível em runtime e mantém o registry agnóstico ao shape.\n const onChangeAdapted =\n onChange !== undefined\n ? (next: AiExtractValue) => {\n (onChange as unknown as (v: AiExtractValue) => void)(next);\n }\n : undefined;\n\n const objectValue: AiExtractValue | null =\n value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as AiExtractValue)\n : null;\n\n return (\n <Component\n name={field.name}\n value={objectValue}\n props={fieldProps}\n {...(onChangeAdapted !== undefined ? { onChange: onChangeAdapted } : {})}\n {...(resource !== undefined ? { resource } : {})}\n field={field.name}\n {...(formData !== undefined ? { formData } : {})}\n {...(csrfToken !== undefined ? { csrfToken } : {})}\n />\n );\n };\n}\n\nconst LazyAiTextInput = lazy(async () => {\n const mod = await import('./AiTextInput.js');\n return { default: adaptToAiTextInput(mod.AiTextInput) };\n});\n\nconst LazyAiTranslateInput = lazy(async () => {\n const mod = await import('./AiTranslateInput.js');\n return { default: adaptToAiTranslateInput(mod.AiTranslateInput) };\n});\n\nconst LazyAiSelectInput = lazy(async () => {\n const mod = await import('./AiSelectInput.js');\n return { default: adaptToAiSelectInput(mod.AiSelectInput) };\n});\n\nconst LazyAiExtractInput = lazy(async () => {\n const mod = await import('./AiExtractInput.js');\n return { default: adaptToAiExtractInput(mod.AiExtractInput) };\n});\n\nfunction adaptToAiImageInput(\n Component: ComponentType<AiImageInputProps>,\n): ComponentType<RegistryFieldProps> {\n return function AiImageInputAdapter(registryProps: RegistryFieldProps): ReactElement {\n const { field, value, onChange, resource, csrfToken } = registryProps;\n const fieldProps = (field as unknown as { props?: AiImageInputFieldProps }).props;\n const stringValue: string | null = typeof value === 'string' && value !== '' ? value : null;\n return (\n <Component\n name={field.name}\n value={stringValue}\n props={fieldProps}\n {...(onChange !== undefined ? { onChange } : {})}\n {...(resource !== undefined ? { resource } : {})}\n field={field.name}\n {...(csrfToken !== undefined ? { csrfToken } : {})}\n />\n );\n };\n}\n\nconst LazyAiImageInput = lazy(async () => {\n const mod = await import('./AiImageInput.js');\n return { default: adaptToAiImageInput(mod.AiImageInput) };\n});\n\nregisterField('AiTextInput', LazyAiTextInput as unknown as Parameters<typeof registerField>[1]);\nregisterField(\n 'AiTranslateInput',\n LazyAiTranslateInput as unknown as Parameters<typeof registerField>[1],\n);\nregisterField('AiSelectInput', LazyAiSelectInput as unknown as Parameters<typeof registerField>[1]);\nregisterField(\n 'AiExtractInput',\n LazyAiExtractInput as unknown as Parameters<typeof registerField>[1],\n);\nregisterField('AiImageInput', LazyAiImageInput as unknown as Parameters<typeof registerField>[1]);\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@arqel-dev/ai",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.0",
|
|
4
4
|
"description": "React components for Arqel AI — AiTextInput field renderer paired with Arqel\\Ai\\Fields\\AiTextField.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://arqel.dev",
|
|
@@ -41,8 +41,8 @@
|
|
|
41
41
|
"@inertiajs/react": "^3.0.0",
|
|
42
42
|
"react": "^19.2.0",
|
|
43
43
|
"react-dom": "^19.2.0",
|
|
44
|
-
"@arqel-dev/react": "0.
|
|
45
|
-
"@arqel-dev/ui": "0.
|
|
44
|
+
"@arqel-dev/react": "0.16.0",
|
|
45
|
+
"@arqel-dev/ui": "0.16.0"
|
|
46
46
|
},
|
|
47
47
|
"peerDependenciesMeta": {
|
|
48
48
|
"@inertiajs/react": {
|
|
@@ -61,8 +61,8 @@
|
|
|
61
61
|
"tsup": "^8.5.0",
|
|
62
62
|
"typescript": "^5.6.3",
|
|
63
63
|
"vitest": "^4.1.0",
|
|
64
|
-
"@arqel-dev/react": "0.
|
|
65
|
-
"@arqel-dev/ui": "0.
|
|
64
|
+
"@arqel-dev/react": "0.16.0",
|
|
65
|
+
"@arqel-dev/ui": "0.16.0"
|
|
66
66
|
},
|
|
67
67
|
"publishConfig": {
|
|
68
68
|
"access": "public"
|