@llmnative/react 1.33.0 → 1.34.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/index.css +1 -1
- package/dist/index.js +19 -15
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2342 -1588
- package/dist/index.mjs.map +1 -1
- package/dist/types/src/I18n.d.ts +23 -0
- package/dist/types/src/components/index.d.ts +7 -0
- package/dist/types/src/components/ui/Code.d.ts +1 -2
- package/dist/types/src/components/widgets/chat/ChatMarkdown.d.ts +46 -0
- package/dist/types/src/components/widgets/chat/ChatQuestions.d.ts +80 -0
- package/dist/types/src/components/widgets/chat/ChatReasoning.d.ts +35 -0
- package/dist/types/src/libs/prism.d.ts +25 -0
- package/dist/types/src/libs/streamingMarkdown.d.ts +15 -0
- package/llms-full.txt +45 -1
- package/llms.txt +1 -1
- package/package.json +1 -1
package/dist/types/src/I18n.d.ts
CHANGED
|
@@ -327,6 +327,29 @@ export interface I18nDict {
|
|
|
327
327
|
breadcrumbs: {
|
|
328
328
|
label: string;
|
|
329
329
|
};
|
|
330
|
+
/** CR-109 — ChatReasoning and ChatQuestions (code blocks of ChatMarkdown use `code`). */
|
|
331
|
+
chat: {
|
|
332
|
+
reasoning: string;
|
|
333
|
+
reasoningStreaming: string;
|
|
334
|
+
reasoningFor: string;
|
|
335
|
+
durationSeconds: string;
|
|
336
|
+
durationMinutes: string;
|
|
337
|
+
questions: string;
|
|
338
|
+
questionTab: string;
|
|
339
|
+
review: string;
|
|
340
|
+
reviewHint: string;
|
|
341
|
+
other: string;
|
|
342
|
+
otherPlaceholder: string;
|
|
343
|
+
recommended: string;
|
|
344
|
+
chooseOne: string;
|
|
345
|
+
chooseMany: string;
|
|
346
|
+
keyboardHint: string;
|
|
347
|
+
next: string;
|
|
348
|
+
back: string;
|
|
349
|
+
submit: string;
|
|
350
|
+
noAnswer: string;
|
|
351
|
+
answered: string;
|
|
352
|
+
};
|
|
330
353
|
}
|
|
331
354
|
type DeepPartial<T> = {
|
|
332
355
|
[K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];
|
|
@@ -74,6 +74,13 @@ export { default as MarkdownReader } from './widgets/MarkdownReader';
|
|
|
74
74
|
export type { MarkdownReaderProps } from './widgets/MarkdownReader';
|
|
75
75
|
export * from './widgets/Prompt';
|
|
76
76
|
export * from './widgets/Chatbot';
|
|
77
|
+
export { default as ChatMarkdown } from './widgets/chat/ChatMarkdown';
|
|
78
|
+
export type { ChatMarkdownProps, ChatMarkdownClassNames } from './widgets/chat/ChatMarkdown';
|
|
79
|
+
export { default as ChatReasoning } from './widgets/chat/ChatReasoning';
|
|
80
|
+
export type { ChatReasoningProps, ChatReasoningClassNames } from './widgets/chat/ChatReasoning';
|
|
81
|
+
export { default as ChatQuestions } from './widgets/chat/ChatQuestions';
|
|
82
|
+
export type { ChatQuestion, ChatQuestionOption, ChatQuestionAnswer, ChatQuestionsNumbering, ChatQuestionsProps, ChatQuestionsClassNames } from './widgets/chat/ChatQuestions';
|
|
83
|
+
export { repairStreamingMarkdown } from '../libs/streamingMarkdown';
|
|
77
84
|
export { default as TabDynamic } from './widgets/TabDynamic';
|
|
78
85
|
export { default as Component } from './Component';
|
|
79
86
|
export { ComponentBlock } from './Component';
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { UIProps } from '../..';
|
|
3
|
-
declare const LANGUAGES: Record<string, () => Promise<unknown>>;
|
|
4
3
|
declare const THEMES: {
|
|
5
4
|
prism: string;
|
|
6
5
|
dark: string;
|
|
@@ -11,7 +10,7 @@ declare const THEMES: {
|
|
|
11
10
|
tomorrow: string;
|
|
12
11
|
twilight: string;
|
|
13
12
|
};
|
|
14
|
-
type PrismLanguage =
|
|
13
|
+
type PrismLanguage = string;
|
|
15
14
|
type PrismTheme = keyof typeof THEMES;
|
|
16
15
|
export type PrismBackground = 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | 'white' | 'black' | 'transparent' | 'default';
|
|
17
16
|
interface CodeProps extends UIProps {
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { type Components } from 'react-markdown';
|
|
3
|
+
/** Classes for the parts of a `ChatMarkdown`, added to the defaults. */
|
|
4
|
+
export interface ChatMarkdownClassNames {
|
|
5
|
+
root?: string;
|
|
6
|
+
paragraph?: string;
|
|
7
|
+
heading?: string;
|
|
8
|
+
list?: string;
|
|
9
|
+
blockquote?: string;
|
|
10
|
+
/** The scrolling box around a table. */
|
|
11
|
+
tableWrapper?: string;
|
|
12
|
+
table?: string;
|
|
13
|
+
th?: string;
|
|
14
|
+
td?: string;
|
|
15
|
+
codeBlock?: string;
|
|
16
|
+
codeHeader?: string;
|
|
17
|
+
code?: string;
|
|
18
|
+
inlineCode?: string;
|
|
19
|
+
link?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface ChatMarkdownProps {
|
|
22
|
+
/** GitHub-flavoured Markdown of the message. */
|
|
23
|
+
content: string;
|
|
24
|
+
/**
|
|
25
|
+
* The text is still arriving: what its end left open (a code fence, a table header, `**bold`,
|
|
26
|
+
* a link) is closed before rendering, so the layout does not jump. Leave it off for a finished message.
|
|
27
|
+
*/
|
|
28
|
+
streaming?: boolean;
|
|
29
|
+
/** `muted` for secondary text, such as the reasoning of the model. */
|
|
30
|
+
tone?: 'default' | 'muted';
|
|
31
|
+
/** Syntax highlighting of fenced code (Prism, loaded on demand). Default `true`. */
|
|
32
|
+
highlight?: boolean;
|
|
33
|
+
/** Called on a link to a route of the app (not an address, not `#anchor`); it prevents the navigation. */
|
|
34
|
+
onLinkClick?: (href: string, event: React.MouseEvent<HTMLAnchorElement>) => void;
|
|
35
|
+
/** Overrides of single elements, as in `react-markdown`. */
|
|
36
|
+
components?: Components;
|
|
37
|
+
className?: string;
|
|
38
|
+
classNames?: ChatMarkdownClassNames;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* CR-109 — Markdown of a chat message: GFM (tables, task lists, strikethrough, autolinks), compact
|
|
42
|
+
* spacing, tables that scroll inside themselves, code with highlighting and a copy button, links to
|
|
43
|
+
* addresses in a new tab. Sanitized (`rehype-sanitize`): raw HTML and `javascript:` links are dropped.
|
|
44
|
+
* With `streaming` the end of the text is repaired as it arrives.
|
|
45
|
+
*/
|
|
46
|
+
export default function ChatMarkdown({ content, streaming, tone, highlight, onLinkClick, components, className, classNames, }: ChatMarkdownProps): React.JSX.Element;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
/** A choice of a question. */
|
|
3
|
+
export interface ChatQuestionOption {
|
|
4
|
+
/** What the answer says; it is the value returned when chosen. */
|
|
5
|
+
label: string;
|
|
6
|
+
/** A line under the label. */
|
|
7
|
+
description?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* A question of the model, in the shape of the `question` tool of opencode and of MCP elicitation.
|
|
11
|
+
*/
|
|
12
|
+
export interface ChatQuestion {
|
|
13
|
+
/** Returned with the answer, to match it to the question. */
|
|
14
|
+
id?: string;
|
|
15
|
+
/** Short title: the label of its tab. */
|
|
16
|
+
header?: string;
|
|
17
|
+
question: string;
|
|
18
|
+
/** The choices. Without them the question takes a free-text answer. */
|
|
19
|
+
options?: ChatQuestionOption[];
|
|
20
|
+
/** More than one choice. */
|
|
21
|
+
multiple?: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* The choice the model recommends: its index (from 0) or its label. A label ending with
|
|
24
|
+
* "(Recommended)" is recognised too.
|
|
25
|
+
*/
|
|
26
|
+
recommended?: number | string;
|
|
27
|
+
/** Offers "Other" with a free-text answer. Default: `allowOther` of the component. */
|
|
28
|
+
custom?: boolean;
|
|
29
|
+
}
|
|
30
|
+
/** The answer to one question: the chosen labels and/or the free text. */
|
|
31
|
+
export interface ChatQuestionAnswer {
|
|
32
|
+
id?: string;
|
|
33
|
+
header?: string;
|
|
34
|
+
values: string[];
|
|
35
|
+
}
|
|
36
|
+
/** How the choices are numbered: 1-2-3 or A-B-C. */
|
|
37
|
+
export type ChatQuestionsNumbering = 'numeric' | 'alpha';
|
|
38
|
+
/** Classes for the parts of a `ChatQuestions`, added to the defaults. */
|
|
39
|
+
export interface ChatQuestionsClassNames {
|
|
40
|
+
root?: string;
|
|
41
|
+
tabs?: string;
|
|
42
|
+
tab?: string;
|
|
43
|
+
panel?: string;
|
|
44
|
+
question?: string;
|
|
45
|
+
option?: string;
|
|
46
|
+
/** Added to a chosen option. */
|
|
47
|
+
optionSelected?: string;
|
|
48
|
+
footer?: string;
|
|
49
|
+
/** The answered state. */
|
|
50
|
+
summary?: string;
|
|
51
|
+
}
|
|
52
|
+
export interface ChatQuestionsProps {
|
|
53
|
+
questions: ChatQuestion[];
|
|
54
|
+
/**
|
|
55
|
+
* All the answers, in the order of the questions. May return a promise: the form waits for it and
|
|
56
|
+
* shows the answered state when it resolves (it stays open when it rejects).
|
|
57
|
+
*/
|
|
58
|
+
onSubmit?: (answers: ChatQuestionAnswer[]) => void | Promise<unknown>;
|
|
59
|
+
/** Numbering of the choices. Default: as the labels are written ("A) …", "1. …"), else numeric. */
|
|
60
|
+
numbering?: ChatQuestionsNumbering;
|
|
61
|
+
/** "Other" with a free-text answer on every question (a question can override it with `custom`). Default `true`. */
|
|
62
|
+
allowOther?: boolean;
|
|
63
|
+
/** Answers already given: the component shows them, read-only, instead of the form. */
|
|
64
|
+
answers?: ChatQuestionAnswer[];
|
|
65
|
+
/** Shows the form without letting it change or be sent. */
|
|
66
|
+
disabled?: boolean;
|
|
67
|
+
/** Puts the focus on the first choice when it appears, so the number keys work at once. */
|
|
68
|
+
autoFocus?: boolean;
|
|
69
|
+
/** Text of the submit button. */
|
|
70
|
+
submitLabel?: string;
|
|
71
|
+
className?: string;
|
|
72
|
+
classNames?: ChatQuestionsClassNames;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* CR-109 — Questions of the model the user answers with a click: one tab per question, numbered
|
|
76
|
+
* choices (the recommended one stands out), single or multiple choice, "Other" with free text, a
|
|
77
|
+
* review and one submit for all the answers. Keyboard: number (or letter) keys choose, arrows move
|
|
78
|
+
* between tabs and choices, Enter continues. With `answers` it shows a set already answered.
|
|
79
|
+
*/
|
|
80
|
+
export default function ChatQuestions({ questions, onSubmit, numbering, allowOther, answers, disabled, autoFocus, submitLabel, className, classNames, }: ChatQuestionsProps): React.JSX.Element | null;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { type I18nDict } from '../../../I18n';
|
|
3
|
+
/** Classes for the parts of a `ChatReasoning`, added to the defaults. */
|
|
4
|
+
export interface ChatReasoningClassNames {
|
|
5
|
+
root?: string;
|
|
6
|
+
/** The summary line that opens and closes the block. */
|
|
7
|
+
trigger?: string;
|
|
8
|
+
content?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface ChatReasoningProps {
|
|
11
|
+
/** The reasoning of the model, as Markdown. */
|
|
12
|
+
content: string;
|
|
13
|
+
/** The reasoning is still arriving: the block is open (unless the user closed it) and its end is repaired. */
|
|
14
|
+
streaming?: boolean;
|
|
15
|
+
/** How long the model reasoned, in seconds: the summary says "Reasoned for 12 s". */
|
|
16
|
+
duration?: number;
|
|
17
|
+
/** Open when it is not streaming. Default `false`. */
|
|
18
|
+
defaultOpen?: boolean;
|
|
19
|
+
/** Controlled open state; with it, the block opens and closes only through `onOpenChange`. */
|
|
20
|
+
open?: boolean;
|
|
21
|
+
onOpenChange?: (open: boolean) => void;
|
|
22
|
+
/** Replaces the summary text. */
|
|
23
|
+
label?: React.ReactNode;
|
|
24
|
+
/** Icon of the summary line. Default `brain`. */
|
|
25
|
+
icon?: string;
|
|
26
|
+
className?: string;
|
|
27
|
+
classNames?: ChatReasoningClassNames;
|
|
28
|
+
}
|
|
29
|
+
/** `12` → "12 s", `75` → "1 min 15 s", in the words of the dictionary. */
|
|
30
|
+
export declare function formatReasoningDuration(seconds: number, dict: I18nDict['chat']): string;
|
|
31
|
+
/**
|
|
32
|
+
* CR-109 — The reasoning of the model, in a block of its own: closed by default behind a summary line
|
|
33
|
+
* ("Reasoning", "Reasoned for 12 s"), open while it streams, its Markdown in a muted tone.
|
|
34
|
+
*/
|
|
35
|
+
export default function ChatReasoning({ content, streaming, duration, defaultOpen, open, onOpenChange, label, icon, className, classNames, }: ChatReasoningProps): React.JSX.Element;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prism loaded on demand, shared by `Code` and `ChatMarkdown`.
|
|
3
|
+
*
|
|
4
|
+
* The core and each language pack are imported lazily the first time they are needed, so the root
|
|
5
|
+
* bundle does not carry the grammars.
|
|
6
|
+
*/
|
|
7
|
+
export declare const PRISM_LANGUAGES: Record<string, () => Promise<unknown>>;
|
|
8
|
+
/** The Prism grammar name for a fence language, or `undefined` when Prism has no grammar for it. */
|
|
9
|
+
export declare function resolvePrismLanguage(language: string | undefined): string | undefined;
|
|
10
|
+
export declare function loadPrismLanguage(language: string, loaded?: Set<string>): Promise<void>;
|
|
11
|
+
/** Minimal shape of the Prism object used by the framework. */
|
|
12
|
+
export interface PrismLike {
|
|
13
|
+
languages: Record<string, unknown>;
|
|
14
|
+
highlight: (code: string, grammar: unknown, language: string) => string;
|
|
15
|
+
highlightElement: (element: Element) => void;
|
|
16
|
+
}
|
|
17
|
+
/** Loads the Prism core (once), with the global the language packs extend. */
|
|
18
|
+
export declare function loadPrism(): Promise<PrismLike>;
|
|
19
|
+
/** Loads the scoped Prism themes of `Code` (lazy, once). */
|
|
20
|
+
export declare function ensurePrismStyles(): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Highlights `code` as HTML (Prism escapes the text), or `null` when the language has no grammar or
|
|
23
|
+
* Prism cannot load.
|
|
24
|
+
*/
|
|
25
|
+
export declare function highlightCode(code: string, language: string | undefined): Promise<string | null>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CR-109 — Markdown that is still arriving.
|
|
3
|
+
*
|
|
4
|
+
* A model streams Markdown a few characters at a time, so the text on screen is often cut in the
|
|
5
|
+
* middle of a construct: a code fence not yet closed, a table with only its header, `**bold` without
|
|
6
|
+
* its closing marks, a link without `)`. Rendered as is, the rest of the message turns into code, the
|
|
7
|
+
* table shows as a line of pipes until its delimiter row arrives, and markers flash as text.
|
|
8
|
+
*
|
|
9
|
+
* `repairStreamingMarkdown` closes what the tail of the text left open, so each partial text renders
|
|
10
|
+
* as close as possible to its final form. It only looks at the end of the text, never changes what is
|
|
11
|
+
* already complete, and is meant for text that is still streaming: a finished message is rendered
|
|
12
|
+
* as written.
|
|
13
|
+
*/
|
|
14
|
+
/** Closes the constructs the end of a streaming Markdown text left open (see the module comment). */
|
|
15
|
+
export declare function repairStreamingMarkdown(text: string): string;
|
package/llms-full.txt
CHANGED
|
@@ -71,7 +71,9 @@ inclusi): un testo si cambia con `i18n.translations`, non nel codice. Namespace
|
|
|
71
71
|
`<I18nProvider>`, come l'`ErrorBoundary` radice di `<App>`, resta in inglese), `themeSwitcher`,
|
|
72
72
|
`imageField` (anche i dialoghi immagine di `RichText`), `richText`, `tabDynamic` (`addTab`),
|
|
73
73
|
`breadcrumbs` (`label`, l'`aria-label` del `nav`), `grid` (`tableView`, `galleryView`, `columns`,
|
|
74
|
-
`fields`), `prompt` (anche `Chatbot`: `role`, `language`, `voice`, `style`, `temperature`, `stop`)
|
|
74
|
+
`fields`), `prompt` (anche `Chatbot`: `role`, `language`, `voice`, `style`, `temperature`, `stop`),
|
|
75
|
+
`chat` (`ChatReasoning` e `ChatQuestions`: `reasoning`, `reasoningFor`, `other`, `review`, `submit`, …;
|
|
76
|
+
il codice di `ChatMarkdown` usa `code`).
|
|
75
77
|
|
|
76
78
|
```tsx
|
|
77
79
|
<App i18n={{ locale: 'it', translations: { it: { notifications: { emptyHint: 'Niente di nuovo' } } } }} />
|
|
@@ -991,6 +993,48 @@ e lasciano il menu aperto salvo `closeOnClick`.
|
|
|
991
993
|
/>
|
|
992
994
|
```
|
|
993
995
|
|
|
996
|
+
### Messaggi di chat: ChatMarkdown, ChatReasoning, ChatQuestions (CR-109)
|
|
997
|
+
|
|
998
|
+
Parti di un messaggio di un modello, da comporre nel proprio thread (anche accanto a `Chatbot`).
|
|
999
|
+
|
|
1000
|
+
```tsx
|
|
1001
|
+
// Markdown GFM del messaggio: tabelle (scorrono dentro di sé in un pannello stretto), elenchi,
|
|
1002
|
+
// titoli, citazioni, task list, codice con evidenziazione (Prism, lazy) e pulsante Copia, link a
|
|
1003
|
+
// indirizzi in una nuova scheda (noopener). Sanitizzato: niente HTML grezzo, niente javascript:.
|
|
1004
|
+
// streaming: chiude ciò che la fine del testo lascia aperto (fence, intestazione di tabella,
|
|
1005
|
+
// **grassetto**, `codice`, link) così il layout non salta mentre arriva. Off per un messaggio finito.
|
|
1006
|
+
<ChatMarkdown content={text} streaming={running} onLinkClick={(href) => navigate(href)} />
|
|
1007
|
+
// tone="muted", highlight={false}, components (come react-markdown), className,
|
|
1008
|
+
// classNames={{ root, paragraph, heading, list, blockquote, tableWrapper, table, th, td, codeBlock, codeHeader, code, inlineCode, link }}
|
|
1009
|
+
// repairStreamingMarkdown(text) è la stessa riparazione, pura.
|
|
1010
|
+
|
|
1011
|
+
// Ragionamento: chiuso dietro "Ragionamento" / "Ha ragionato per 12 s"; aperto mentre arriva
|
|
1012
|
+
// (se l'utente non lo chiude) e richiuso alla fine. Contenuto con ChatMarkdown, tono attenuato.
|
|
1013
|
+
<ChatReasoning content={reasoning} streaming={thinking} duration={12} />
|
|
1014
|
+
// defaultOpen, open + onOpenChange (controllato), label, icon ('brain'), className, classNames={{ root, trigger, content }}
|
|
1015
|
+
|
|
1016
|
+
// Domande interattive (formato dello strumento `question` di opencode / elicitation MCP):
|
|
1017
|
+
<ChatQuestions
|
|
1018
|
+
questions={[
|
|
1019
|
+
{ id: 'db', header: 'Database', question: 'Quale database?', recommended: 0,
|
|
1020
|
+
options: [{ label: 'Postgres', description: 'Relazionale' }, { label: 'SQLite' }] },
|
|
1021
|
+
{ id: 'features', header: 'Funzioni', question: 'Quali funzioni?', multiple: true,
|
|
1022
|
+
options: [{ label: 'Auth' }, { label: 'Ricerca' }] },
|
|
1023
|
+
]}
|
|
1024
|
+
onSubmit={async (answers) => send(answers)} // [{ id, header, values: string[] }] in ordine
|
|
1025
|
+
/>
|
|
1026
|
+
// Una scheda per domanda (header) + Riepilogo e un solo Invia; opzioni numerate 1-2-3 o A-B-C
|
|
1027
|
+
// (numbering, altrimenti dedotto da etichette "A) …" / "1. …", che vengono tolte); consigliata
|
|
1028
|
+
// (recommended: indice da 0 o etichetta; anche il suffisso "(Recommended)"); multiple; "Altro" con
|
|
1029
|
+
// testo libero (allowOther, default true; per domanda `custom`); senza options è a testo libero.
|
|
1030
|
+
// Tastiera: numeri (o lettere con A-B-C) scelgono, frecce sinistra/destra tra le schede, su/giù tra
|
|
1031
|
+
// le opzioni, Spazio seleziona, Invio prosegue o invia (su una scelta singola prima la sceglie).
|
|
1032
|
+
// Ruoli tablist/tab/tabpanel, radiogroup/radio o group/checkbox.
|
|
1033
|
+
// Scelta singola: il click sceglie e passa alla domanda dopo. onSubmit che rifiuta lascia il form.
|
|
1034
|
+
// answers={[…]} mostra un insieme già risposto (sola lettura); disabled, autoFocus, submitLabel,
|
|
1035
|
+
// classNames={{ root, tabs, tab, panel, question, option, optionSelected, footer, summary }}
|
|
1036
|
+
```
|
|
1037
|
+
|
|
994
1038
|
### ImageEditor
|
|
995
1039
|
```tsx
|
|
996
1040
|
<ImageEditor src="..." onSave={(dataUrl) => save(dataUrl)} />
|
package/llms.txt
CHANGED
|
@@ -66,7 +66,7 @@ import '@llmnative/react/dist/index.css' // necessario una volta sola
|
|
|
66
66
|
ui/ → primitivi stateless: Alert, Badge, Button, Card, DescriptionList, Image, Modal, Table, Gallery, Tab, Repeat, Icon, LocaleSwitcher, ThemeSwitcher, ProviderSwitcher, LayoutBuilder, ContextMenu
|
|
67
67
|
ui/fields/ → campi form: Input, Select, UploadImage, UploadDocument, UploadCSV, CodeEditor, ImageField, RichText, Prompt, Crop, ContextMenu
|
|
68
68
|
blocks/ → composizioni: Menu, Breadcrumbs, Notifications, Search, Carousel, Dropdown, Toolbar, SideNav, ListCard, AuthButton
|
|
69
|
-
widgets/ → smart (hanno stato e provider): Grid, Form, MarkdownReader, ImageEditor, TabDynamic
|
|
69
|
+
widgets/ → smart (hanno stato e provider): Grid, Form, MarkdownReader, ImageEditor, TabDynamic, Chatbot, ChatMarkdown, ChatReasoning, ChatQuestions
|
|
70
70
|
```
|
|
71
71
|
|
|
72
72
|
Tutti gli import da `'@llmnative/react'` — mai da sottodirectory.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@llmnative/react",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.34.0",
|
|
4
4
|
"description": "LLM-native React framework for deterministic UI generation. Data-driven by default, schema-driven optional. Ultra-low token consumption — built for AI agents, not just humans.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|