@studiolxd/brand 48.1.0 → 49.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/CHANGELOG.md +137 -0
  2. package/dist/_shared/untrustedtext.js +27 -26
  3. package/dist/_types/atoms/TypingIndicator/TypingIndicator.d.ts +29 -2
  4. package/dist/_types/messages/BrandMessages.d.ts +25 -1
  5. package/dist/_types/messages/index.d.ts +1 -1
  6. package/dist/_types/molecules/AssistantMessage/AssistantMessage.d.ts +15 -1
  7. package/dist/_types/molecules/ConversationList/ConversationList.d.ts +42 -8
  8. package/dist/_types/molecules/MessageComposer/MessageComposer.d.ts +24 -1
  9. package/dist/_types/organisms/AnnotationThread/AnnotationThread.d.ts +52 -7
  10. package/dist/_types/organisms/ConversationThread/ConversationThread.d.ts +26 -3
  11. package/dist/_types/templates/ChatShell/ChatShell.d.ts +22 -4
  12. package/dist/_types/templates/ConnectorAuth/ConnectorAuthShell.d.ts +6 -1
  13. package/dist/_types/templates/ConnectorAuth/ConnectorConsentPage.d.ts +52 -18
  14. package/dist/_types/templates/ConnectorAuth/ConnectorExternalSignInPage.d.ts +57 -17
  15. package/dist/_types/templates/ConnectorAuth/ConnectorRejectionPage.d.ts +59 -15
  16. package/dist/_types/templates/ConnectorAuth/ConnectorRequestSummary.d.ts +43 -12
  17. package/dist/_types/templates/ConnectorAuth/ConnectorSignInPage.d.ts +46 -12
  18. package/dist/_types/templates/ConnectorAuth/UntrustedText.d.ts +31 -4
  19. package/dist/annotation-thread.js +49 -46
  20. package/dist/assistant-message.js +12 -9
  21. package/dist/chat-shell.js +50 -49
  22. package/dist/connector-consent-page.js +58 -68
  23. package/dist/connector-external-sign-in-page.js +22 -28
  24. package/dist/connector-rejection-page.js +31 -62
  25. package/dist/connector-request-summary.js +22 -20
  26. package/dist/connector-sign-in-page.js +21 -25
  27. package/dist/conversation-list.js +56 -55
  28. package/dist/conversation-thread.js +33 -31
  29. package/dist/message-composer.js +38 -37
  30. package/dist/typing-indicator.js +12 -9
  31. package/package.json +1 -1
@@ -1,6 +1,28 @@
1
1
  import type { ReactNode } from 'react';
2
2
  import { type ConnectorAuthChromeProps } from './ConnectorAuthShell';
3
3
  import { ConnectorRequestSummary, type ConnectorScope } from './ConnectorRequestSummary';
4
+ /**
5
+ * El cromo de la pantalla de consentimiento, y **solo el cromo**: cómo se
6
+ * titula y cómo se llama la salida que no concede nada.
7
+ *
8
+ * Todo lo demás de esta pantalla se queda fuera del catálogo y pasa a ser prop
9
+ * obligatoria, porque **afirma algo**: la frase que cuenta qué se pide
10
+ * (`intro`), el aviso de a dónde sale el acceso (`redirectNotice`), qué se
11
+ * concede (`scopeReadLabel`/`scopeWriteLabel`) y el rótulo del botón que
12
+ * concede (`approveLabel`). Es la misma línea que ya separa
13
+ * `confirmDialog.cancel` —cromo— de `ConfirmDialog.confirmLabel` —obligatoria,
14
+ * porque nombra la consecuencia—.
15
+ */
16
+ export interface ConnectorConsentMessages {
17
+ /** Título de la pantalla. */
18
+ title: string;
19
+ /**
20
+ * Rótulo del botón que no concede nada. Es cromo por la misma razón que
21
+ * «Cancelar»: describe lo único que hace —no seguir— y no hay consecuencia
22
+ * que nombrar.
23
+ */
24
+ deny: string;
25
+ }
4
26
  export interface ConnectorConsentPageProps extends ConnectorAuthChromeProps {
5
27
  /** El nombre con el que la herramienta se registró. **Dato de fuera**: ver `ConnectorRequestSummary`. */
6
28
  clientName: string;
@@ -55,15 +77,17 @@ export interface ConnectorConsentPageProps extends ConnectorAuthChromeProps {
55
77
  * abrir la página.
56
78
  */
57
79
  initialFocus?: 'none' | 'deny';
58
- /** Título de la pantalla. Default castellano: «Conectar una herramienta». */
80
+ /** Título de la pantalla. **Sin default**: sin él, sale de `connectorConsent.title`. */
59
81
  title?: ReactNode;
60
82
  /**
61
83
  * La frase de la cabecera. Recibe las tres piezas ya compuestas —la
62
84
  * herramienta y la cuenta en negrita, el permiso en texto corriente— porque
63
85
  * el orden cambia con el idioma (en alemán la cuenta va antes del permiso).
64
- * Default castellano.
86
+ *
87
+ * **Obligatoria y sin default**: es la frase que cuenta qué se está
88
+ * consintiendo, y el sistema de diseño no puede escribirla por el producto.
65
89
  */
66
- intro?: (parts: {
90
+ intro: (parts: {
67
91
  client: ReactNode;
68
92
  what: ReactNode;
69
93
  email: ReactNode;
@@ -72,27 +96,37 @@ export interface ConnectorConsentPageProps extends ConnectorAuthChromeProps {
72
96
  * El aviso de a dónde se enviará el acceso, bajo la ficha. Recibe el host ya
73
97
  * en negrita. Va a tamaño de cuerpo, no de nota al pie: es la señal que
74
98
  * convierte una suplantación en visible y no puede leerse como letra
75
- * pequeña. Default castellano.
99
+ * pequeña.
100
+ *
101
+ * **Obligatoria y sin default**: afirma a dónde sale el acceso y qué hacer
102
+ * si no se reconoce el destino. Un texto de catálogo la dejaría diciendo lo
103
+ * mismo en todas partes sin que nada fallara.
76
104
  */
77
- redirectNotice?: (parts: {
105
+ redirectNotice: (parts: {
78
106
  host: ReactNode;
79
107
  }) => ReactNode;
80
- /** Etiqueta del botón que concede. Default castellano: «Permitir acceso». */
81
- approveLabel?: string;
82
- /** Etiqueta del botón que deniega. Default castellano: «Denegar». */
108
+ /**
109
+ * Etiqueta del botón que concede.
110
+ *
111
+ * **Obligatoria y sin default, y fuera del catálogo**: es donde se toma la
112
+ * decisión, y tiene que nombrar la consecuencia. Mismo caso —y misma
113
+ * respuesta— que `ConfirmDialog.confirmLabel`.
114
+ */
115
+ approveLabel: string;
116
+ /** Etiqueta del botón que deniega. **Sin default**: sin ella, sale de `connectorConsent.deny`. */
83
117
  denyLabel?: string;
84
- /** Alcance en texto, para la frase y para la ficha. Default castellano. */
85
- scopeReadLabel?: string;
86
- /** Ídem, lectura y escritura. Default castellano. */
87
- scopeWriteLabel?: string;
88
- /** Etiqueta del desplegador de un valor de fuera recortado. Default castellano: «Ver el valor completo». */
89
- expandLabel?: string;
90
- /** Etiqueta del desplegador abierto. Default castellano: «Ver menos». */
91
- collapseLabel?: string;
92
118
  /**
93
- * Las comillas que enmarcan los datos de fuera —la herramienta, la cuenta, el
94
- * host—, aquí y en la ficha. Default castellano: `['«', '»']`.
119
+ * Qué se concede con `mcp:read`, para la frase y para la ficha.
120
+ * **Obligatoria y sin default**: ver `ConnectorRequestSummary`.
95
121
  */
122
+ scopeReadLabel: string;
123
+ /** Ídem, lectura y escritura. **Obligatoria y sin default**. */
124
+ scopeWriteLabel: string;
125
+ /** Reenvío puro a `UntrustedText` (`untrustedText.expand`). */
126
+ expandLabel?: string;
127
+ /** Reenvío puro a `UntrustedText` (`untrustedText.collapse`). */
128
+ collapseLabel?: string;
129
+ /** Reenvío puro a `UntrustedText` (`untrustedText.quotes`), aquí y en la ficha. */
96
130
  valueQuotes?: [string, string];
97
131
  /** Rótulos de la ficha. Ver `ConnectorRequestSummary`. */
98
132
  summaryLabels?: Pick<React.ComponentProps<typeof ConnectorRequestSummary>, 'clientLabel' | 'productLabel' | 'accountLabel' | 'scopeLabel' | 'redirectLabel'>;
@@ -1,13 +1,38 @@
1
1
  import type { ReactNode } from 'react';
2
2
  import { type ConnectorAuthChromeProps } from './ConnectorAuthShell';
3
+ /**
4
+ * El cromo de la pantalla del conector ajeno: el título, el rótulo del único
5
+ * campo y la plantilla del botón.
6
+ *
7
+ * `submit` es una **función** por la misma razón que
8
+ * `typingIndicator.typing(name)`: la frase tiene dos mitades que no se deciden
9
+ * en el mismo sitio. «Iniciar sesión con …» es cromo —el verbo y el orden son
10
+ * del idioma—, pero **cómo se llama la instalación** es contenido del
11
+ * producto y entra por `platformName`, que es obligatoria.
12
+ *
13
+ * Fuera del catálogo se quedan las dos frases que afirman algo: la que cuenta
14
+ * qué se está autorizando (`intro`) y la que confirma a dónde se entra
15
+ * (`signingInTo`).
16
+ */
17
+ export interface ConnectorExternalSignInMessages {
18
+ /** Título de la pantalla. */
19
+ title: string;
20
+ /** Etiqueta del campo de organización. */
21
+ organization: string;
22
+ /** Plantilla del botón. Recibe el nombre de la instalación. */
23
+ submit: (platform: string) => string;
24
+ }
3
25
  export interface ConnectorExternalSignInPageProps extends ConnectorAuthChromeProps {
4
26
  /**
5
27
  * Cómo se llama la instalación de la que es el conector, para la frase y
6
- * para el botón. Default castellano: «tu Moodle», que hoy es el único
7
- * conector de esta forma; cambiarlo sirve a cualquier otra instalación
8
- * ajena a la suite.
28
+ * para el botón.
29
+ *
30
+ * **Obligatoria y sin default**: nombra al producto —hoy «tu Moodle», que es
31
+ * el único conector de esta forma—, y un nombre de producto no lo pone el
32
+ * sistema de diseño. Es una **cadena** porque el catálogo la interpola
33
+ * dentro del rótulo del botón (`connectorExternalSignIn.submit`).
9
34
  */
10
- platformName?: ReactNode;
35
+ platformName: string;
11
36
  /**
12
37
  * La organización a la que se va a entrar, **ya resuelta**: el conector vive
13
38
  * en un subdominio y el servidor la saca del `resource` de la petición. Con
@@ -31,28 +56,43 @@ export interface ConnectorExternalSignInPageProps extends ConnectorAuthChromePro
31
56
  hiddenFields?: Record<string, string>;
32
57
  /** Un fallo del intento anterior —«no hay ninguna conexión para esa organización»—, sobre el formulario. */
33
58
  error?: ReactNode;
34
- /** Título de la pantalla. Default castellano: «Autorizar la conexión». */
59
+ /** Título de la pantalla. **Sin default**: sin él, sale de `connectorExternalSignIn.title`. */
35
60
  title?: ReactNode;
36
- /** La frase de la cabecera. Recibe el nombre de la instalación. Default castellano. */
37
- intro?: (parts: {
61
+ /**
62
+ * La frase de la cabecera. Recibe el nombre de la instalación.
63
+ *
64
+ * **Obligatoria y sin default**: cuenta qué se está autorizando y con qué
65
+ * cuenta hay que identificarse. El sistema de diseño no puede afirmarlo por
66
+ * el producto.
67
+ */
68
+ intro: (parts: {
38
69
  platform: ReactNode;
39
70
  }) => ReactNode;
40
- /** La frase que confirma a dónde se entra, con `organization`. Default castellano. */
41
- signingInTo?: (parts: {
71
+ /**
72
+ * La frase que confirma a dónde se entra, con `organization`.
73
+ *
74
+ * **Obligatoria y sin default**, por lo mismo que `intro`: afirma a dónde va
75
+ * la sesión, que es el dato que convierte una suplantación en visible.
76
+ */
77
+ signingInTo: (parts: {
42
78
  organization: ReactNode;
43
79
  }) => ReactNode;
44
80
  /**
45
- * Las comillas que enmarcan la organización en la frase de confirmación:
46
- * viene de la petición, así que es dato de fuera y se pinta como tal. Default
47
- * castellano: `['«', '»']`.
81
+ * Reenvío puro a `UntrustedText` (`untrustedText.quotes`): la organización
82
+ * viene de la petición, así que es dato de fuera y se pinta como tal.
48
83
  */
49
84
  valueQuotes?: [string, string];
50
- /** Etiqueta del campo de organización. Default castellano: «Tu organización». */
85
+ /**
86
+ * Etiqueta del campo de organización. **Sin default**: sin ella, sale de
87
+ * `connectorExternalSignIn.organization`, y solo se lee cuando hay que
88
+ * escribir la organización.
89
+ */
51
90
  organizationLabel?: string;
52
- /** Etiqueta de la acción. Recibe el nombre de la instalación. Default castellano. */
53
- submitLabel?: (parts: {
54
- platform: ReactNode;
55
- }) => ReactNode;
91
+ /**
92
+ * Plantilla del rótulo de la acción, que recibe el nombre de la instalación.
93
+ * **Sin default**: sin ella, sale de `connectorExternalSignIn.submit`.
94
+ */
95
+ submitLabel?: (platform: string) => string;
56
96
  /**
57
97
  * Debajo del formulario: lo que no es del sistema de diseño. Es la ranura
58
98
  * donde el producto cuelga su andamio de desarrollo —pegar una clave de MCP,
@@ -5,17 +5,42 @@ import { type ConnectorAuthChromeProps } from './ConnectorAuthShell';
5
5
  * autorización devuelve hoy en crudo —`invalid_client`,
6
6
  * `invalid_redirect_uri`, `access_denied`, `invalid_request`,
7
7
  * `login_required`—, uno por uno y con el nombre que entiende quien los lee.
8
+ *
9
+ * **Es un vocabulario, no una prop.** Desde la v49 los cuatro textos del
10
+ * rechazo los pasa el producto (`title`, `description`, `hint`, `retryLabel`),
11
+ * así que el tipo ya no elige nada dentro del componente: está aquí para que
12
+ * la aplicación teclee el motivo contra él al sacar del catálogo los cuatro
13
+ * textos, y para que la lista de motivos siga siendo una sola y esté escrita
14
+ * en el sistema.
8
15
  */
9
16
  export type ConnectorRejectionReason = 'invalid-client' | 'invalid-redirect-uri' | 'invalid-request' | 'access-denied' | 'session-expired';
17
+ /**
18
+ * El único texto del rechazo que es cromo: el rótulo del código técnico.
19
+ *
20
+ * Los otros cuatro —qué pasó, qué se puede hacer y cómo se llama la salida—
21
+ * **afirman algo sobre una comprobación de seguridad** («no se ha enviado nada
22
+ * a ninguna parte», «si no la reconoces, no vuelvas a intentarlo») y son props
23
+ * obligatorias: el sistema de diseño no puede decidir qué se le cuenta a
24
+ * alguien sobre un acceso que no se ha concedido.
25
+ */
26
+ export interface ConnectorRejectionMessages {
27
+ /** Rótulo del código técnico, bajo la explicación. */
28
+ code: string;
29
+ }
10
30
  export interface ConnectorRejectionPageProps extends ConnectorAuthChromeProps {
11
- /** Por qué no se ha conectado nada. De él salen el título, la explicación y el texto de la salida. */
12
- reason: ConnectorRejectionReason;
13
- /** Título, si el producto quiere el suyo. Default: el de la variante, en castellano. */
14
- title?: ReactNode;
15
- /** La frase bajo el título. Default: la de la variante, en castellano. */
16
- description?: ReactNode;
17
- /** Qué se puede hacer, en la columna de la derecha. Default: el de la variante, en castellano. */
18
- hint?: ReactNode;
31
+ /**
32
+ * Qué ha pasado.
33
+ *
34
+ * **Obligatorio y sin default**: los cinco motivos afirman cada uno algo
35
+ * sobre una comprobación de seguridad —qué se ha enviado y qué no—, y eso lo
36
+ * escribe quien conoce el servidor de autorización, no un catálogo de cromo.
37
+ * El vocabulario de los cinco está en `ConnectorRejectionReason`.
38
+ */
39
+ title: ReactNode;
40
+ /** La frase bajo el título. **Obligatoria y sin default**, por lo mismo. */
41
+ description: ReactNode;
42
+ /** Qué se puede hacer, en la columna de la derecha. **Obligatoria y sin default**, por lo mismo. */
43
+ hint: ReactNode;
19
44
  /**
20
45
  * El código técnico tal cual lo devuelve el servidor (`invalid_client`…),
21
46
  * bajo la explicación. No es para quien lee la pantalla: es para que pueda
@@ -23,14 +48,25 @@ export interface ConnectorRejectionPageProps extends ConnectorAuthChromeProps {
23
48
  * palabras. Sin él, no se pinta.
24
49
  */
25
50
  code?: string;
26
- /** Rótulo del código. Default castellano: «Código». */
51
+ /**
52
+ * Rótulo del código. **Sin default**: sin él, sale de
53
+ * `connectorRejection.code` del `BrandMessagesProvider`, y solo se lee
54
+ * cuando hay `code`.
55
+ */
27
56
  codeLabel?: string;
28
57
  /** La salida, como enlace: la vuelta a la herramienta o al acceso. */
29
58
  retryHref?: string;
30
59
  /** La salida, en modo React (sin `retryHref`). */
31
60
  onRetry?: () => void;
32
- /** Etiqueta de la salida. Default: la de la variante, en castellano. */
33
- retryLabel?: string;
61
+ /**
62
+ * Etiqueta de la salida.
63
+ *
64
+ * **Obligatoria y sin default**: nombra a dónde lleva —volver a la
65
+ * herramienta, volver a intentarlo, iniciar sesión—, y de los cinco motivos
66
+ * salen tres salidas distintas. Se pide aunque la salida se monte entera con
67
+ * `retryAction`: un rótulo que se traduce solo a veces acaba sin traducir.
68
+ */
69
+ retryLabel: string;
34
70
  /**
35
71
  * La salida entera, ya montada, cuando no basta con un botón (el `Link` del
36
72
  * router, dos acciones). Manda sobre `retryHref` / `onRetry`.
@@ -43,14 +79,22 @@ export interface ConnectorRejectionPageProps extends ConnectorAuthChromeProps {
43
79
  * **Una sola plantilla para los cinco rechazos**, que hoy son cinco respuestas
44
80
  * JSON en crudo sin ninguna pantalla detrás.
45
81
  *
46
- * Son cinco variantes y no cinco plantillas porque lo único que cambia entre
47
- * ellas es el texto. La maqueta es idéntica —la explicación a la izquierda, qué
82
+ * Son cinco motivos y una sola plantilla porque lo único que cambia entre
83
+ * ellos es el texto — y ese texto lo pasa el producto: `title`, `description`,
84
+ * `hint` y `retryLabel` son **obligatorias y sin default** desde la v49,
85
+ * porque cada una afirma algo sobre una comprobación de seguridad y eso no lo
86
+ * decide el sistema de diseño (ver `ConnectorRejectionMessages`). El
87
+ * vocabulario de los cinco sigue escrito aquí, en
88
+ * `ConnectorRejectionReason`, para que la aplicación teclee contra él al sacar
89
+ * los cuatro textos de su catálogo.
90
+ *
91
+ * La maqueta es idéntica en los cinco —la explicación a la izquierda, qué
48
92
  * hacer y la salida a la derecha—, y sobre todo lo es la postura: **ninguna
49
93
  * ofrece reintentar en el sitio**. Ni un botón que repita la petición ni un
50
94
  * formulario que la arregle; la conexión se empieza donde se empezó, en la
51
95
  * herramienta. Un rechazo de autorización que se pueda reintentar a golpes
52
96
  * desde la propia pantalla de rechazo es un fallo de seguridad, no una
53
- * comodidad, y por eso la salida por defecto es «volver» y no «reintentar».
97
+ * comodidad, y por eso la salida se llama «volver» y no «reintentar».
54
98
  *
55
99
  * Los cinco se agrupan en tres causas, y el texto de cada uno lo dice sin
56
100
  * jerga:
@@ -66,4 +110,4 @@ export interface ConnectorRejectionPageProps extends ConnectorAuthChromeProps {
66
110
  * hecho su trabajo —y en `access-denied`, ni siquiera eso: es lo que se ha
67
111
  * pedido—. La página lo cuenta como cuenta cualquier otra cosa.
68
112
  */
69
- export declare function ConnectorRejectionPage({ reason, title, description, hint, code, codeLabel, retryHref, onRetry, retryLabel, retryAction, aside, header, footer, preferences, preferencesLabel, id, shell, }: ConnectorRejectionPageProps): import("react/jsx-runtime").JSX.Element;
113
+ export declare function ConnectorRejectionPage({ title, description, hint, code, codeLabel, retryHref, onRetry, retryLabel, retryAction, aside, header, footer, preferences, preferencesLabel, id, shell, }: ConnectorRejectionPageProps): import("react/jsx-runtime").JSX.Element;
@@ -1,5 +1,28 @@
1
1
  import type { ReactNode } from 'react';
2
2
  import './ConnectorRequestSummary.css';
3
+ /**
4
+ * Los cinco rótulos de la ficha. Son cromo: nombran **qué dato** va en cada
5
+ * fila —herramienta, producto, cuenta, permiso, destino—, que es el vocabulario
6
+ * cerrado de una petición de OAuth y dice lo mismo en los cinco productos de
7
+ * la suite.
8
+ *
9
+ * Lo que **no** está aquí es qué se concede (`scopeReadLabel`,
10
+ * `scopeWriteLabel`): eso afirma qué va a poder hacer la herramienta con los
11
+ * datos de quien lo lea, y el sistema de diseño no puede decidirlo. Son props
12
+ * obligatorias y sin default — ver `ConnectorRequestSummaryProps`.
13
+ */
14
+ export interface ConnectorRequestSummaryMessages {
15
+ /** Rótulo de la herramienta. */
16
+ client: string;
17
+ /** Rótulo del producto. */
18
+ product: string;
19
+ /** Rótulo de la cuenta. */
20
+ account: string;
21
+ /** Rótulo del permiso. */
22
+ scope: string;
23
+ /** Rótulo del destino. */
24
+ redirect: string;
25
+ }
3
26
  /** Qué se le concede al conector: leer, o leer y modificar. Son los dos únicos alcances que emite el servidor de autorización (`mcp:read` y `mcp:write`). */
4
27
  export type ConnectorScope = 'read' | 'write';
5
28
  export interface ConnectorRequestSummaryProps {
@@ -31,25 +54,33 @@ export interface ConnectorRequestSummaryProps {
31
54
  * lo impone el registro.
32
55
  */
33
56
  redirectHost?: ReactNode;
34
- /** Rótulo de la herramienta. Default castellano: «Herramienta». */
57
+ /** Rótulo de la herramienta. **Sin default**: sin él, sale de `connectorRequestSummary.client`. */
35
58
  clientLabel?: string;
36
- /** Rótulo del producto. Default castellano: «Producto». */
59
+ /** Rótulo del producto. **Sin default**: `connectorRequestSummary.product`, y solo con `productName`. */
37
60
  productLabel?: string;
38
- /** Rótulo de la cuenta. Default castellano: «Cuenta». */
61
+ /** Rótulo de la cuenta. **Sin default**: `connectorRequestSummary.account`, y solo con `accountEmail`. */
39
62
  accountLabel?: string;
40
- /** Rótulo del permiso. Default castellano: «Permiso». */
63
+ /** Rótulo del permiso. **Sin default**: `connectorRequestSummary.scope`, y solo con `scope`. */
41
64
  scopeLabel?: string;
42
- /** Rótulo del destino. Default castellano: «Destino». */
65
+ /** Rótulo del destino. **Sin default**: `connectorRequestSummary.redirect`, y solo con `redirectHost`. */
43
66
  redirectLabel?: string;
44
- /** Valor del permiso de solo lectura. Default castellano, el del servidor de autorización. */
45
- scopeReadLabel?: ReactNode;
46
- /** Valor del permiso de lectura y escritura. Default castellano, el del servidor de autorización. */
47
- scopeWriteLabel?: ReactNode;
48
- /** Etiqueta del desplegador de un valor recortado. Default castellano: «Ver el valor completo». */
67
+ /**
68
+ * Qué se concede con `mcp:read`, en texto.
69
+ *
70
+ * **Obligatoria y sin default, y fuera del catálogo**: es una afirmación
71
+ * sobre lo que la herramienta va a poder hacer con los datos de quien lee la
72
+ * pantalla, y eso lo sabe el servidor de autorización —que es quien emite el
73
+ * alcance— y no un catálogo de cromo. Un texto común aquí diría lo mismo en
74
+ * los cinco productos sin que nada fallara, que es exactamente el riesgo.
75
+ */
76
+ scopeReadLabel: ReactNode;
77
+ /** Ídem para `mcp:write`. **Obligatoria y sin default**, por lo mismo. */
78
+ scopeWriteLabel: ReactNode;
79
+ /** Reenvío puro a `UntrustedText`, que lee `untrustedText.expand` por su cuenta. */
49
80
  expandLabel?: string;
50
- /** Etiqueta del desplegador abierto. Default castellano: «Ver menos». */
81
+ /** Reenvío puro a `UntrustedText` (`untrustedText.collapse`). */
51
82
  collapseLabel?: string;
52
- /** Las comillas que enmarcan los valores de fuera. Default castellano: `['«', '»']`. */
83
+ /** Reenvío puro a `UntrustedText` (`untrustedText.quotes`). */
53
84
  valueQuotes?: [string, string];
54
85
  /** Se añade DESPUÉS de las clases propias. */
55
86
  className?: string;
@@ -1,6 +1,27 @@
1
1
  import type { ReactNode } from 'react';
2
2
  import { type ConnectorAuthChromeProps } from './ConnectorAuthShell';
3
3
  import { ConnectorRequestSummary, type ConnectorScope } from './ConnectorRequestSummary';
4
+ /**
5
+ * El cromo de la pantalla de identificarse dentro del flujo del conector.
6
+ *
7
+ * Aquí **no se concede nada** —la única acción es iniciar sesión—, así que el
8
+ * título y el rótulo de la acción sí son cromo: describen lo que hace el
9
+ * control, no una consecuencia sobre los datos de nadie. La frase que cuenta
10
+ * qué pide la herramienta (`intro`) y qué se pedirá (`scopeReadLabel` /
11
+ * `scopeWriteLabel`) siguen fuera, obligatorias.
12
+ */
13
+ export interface ConnectorSignInMessages {
14
+ /** Título de la pantalla. */
15
+ title: string;
16
+ /** Rótulo de la acción de identificarse. */
17
+ signIn: string;
18
+ /**
19
+ * Cómo se nombra el producto en la frase cuando la pantalla no recibe
20
+ * `productName` («este producto»). Es un relleno genérico, no el nombre de
21
+ * nada: el nombre de verdad viaja en `productName`.
22
+ */
23
+ fallbackProduct: string;
24
+ }
4
25
  export interface ConnectorSignInPageProps extends ConnectorAuthChromeProps {
5
26
  /** El nombre con el que la herramienta se registró. **Dato de fuera**: ver `ConnectorRequestSummary`. */
6
27
  clientName: string;
@@ -22,29 +43,42 @@ export interface ConnectorSignInPageProps extends ConnectorAuthChromeProps {
22
43
  action?: string;
23
44
  /** Los parámetros de OAuth que tienen que sobrevivir al acceso, como `<input type="hidden">`. */
24
45
  hiddenFields?: Record<string, string>;
25
- /** Título de la pantalla. Default castellano. */
46
+ /** Título de la pantalla. **Sin default**: sin él, sale de `connectorSignIn.title`. */
26
47
  title?: ReactNode;
27
48
  /**
28
49
  * La frase de la cabecera. Recibe la herramienta y el producto ya
29
- * compuestos. Default castellano.
50
+ * compuestos.
51
+ *
52
+ * **Obligatoria y sin default**: cuenta qué herramienta hay detrás y para
53
+ * qué se está tecleando una contraseña. Eso no lo escribe un catálogo de
54
+ * cromo.
30
55
  */
31
- intro?: (parts: {
56
+ intro: (parts: {
32
57
  client: ReactNode;
33
58
  product: ReactNode;
34
59
  }) => ReactNode;
35
- /** Nombre del producto cuando no se pasa `productName`, para la frase. Default castellano: «este producto». */
60
+ /**
61
+ * Cómo se nombra el producto en la frase cuando no se pasa `productName`.
62
+ * **Sin default**: sin ella, sale de `connectorSignIn.fallbackProduct`, y
63
+ * solo se lee cuando falta `productName`.
64
+ */
36
65
  fallbackProductName?: ReactNode;
37
- /** Etiqueta de la acción. Default castellano: «Iniciar sesión». */
66
+ /** Etiqueta de la acción. **Sin default**: sin ella, sale de `connectorSignIn.signIn`. */
38
67
  signInLabel?: string;
39
- /** Alcance en texto. Default castellano. */
40
- scopeReadLabel?: string;
41
- /** Ídem, lectura y escritura. Default castellano. */
42
- scopeWriteLabel?: string;
43
- /** Etiqueta del desplegador de un valor de fuera recortado. Default castellano: «Ver el valor completo». */
68
+ /**
69
+ * Qué se pedirá con `mcp:read`. **Obligatoria y sin default**: ver
70
+ * `ConnectorRequestSummary`. Solo se pinta si hay `scope`, pero se pide
71
+ * siempre — un alcance que se muestra a veces no puede depender de que
72
+ * alguien se acordara de traducirlo.
73
+ */
74
+ scopeReadLabel: string;
75
+ /** Ídem, lectura y escritura. **Obligatoria y sin default**. */
76
+ scopeWriteLabel: string;
77
+ /** Reenvío puro a `UntrustedText` (`untrustedText.expand`). */
44
78
  expandLabel?: string;
45
- /** Etiqueta del desplegador abierto. Default castellano: «Ver menos». */
79
+ /** Reenvío puro a `UntrustedText` (`untrustedText.collapse`). */
46
80
  collapseLabel?: string;
47
- /** Las comillas que enmarcan los datos de fuera. Default castellano: `['«', '»']`. */
81
+ /** Reenvío puro a `UntrustedText` (`untrustedText.quotes`). */
48
82
  valueQuotes?: [string, string];
49
83
  /** Rótulos de la ficha. Ver `ConnectorRequestSummary`. */
50
84
  summaryLabels?: Pick<React.ComponentProps<typeof ConnectorRequestSummary>, 'clientLabel' | 'productLabel' | 'scopeLabel' | 'redirectLabel'>;
@@ -1,5 +1,24 @@
1
1
  import type { ReactNode } from 'react';
2
2
  import './UntrustedText.css';
3
+ /**
4
+ * El cromo con el que se enmarca un dato de fuera: el desplegador de un valor
5
+ * recortado y las comillas que dicen dónde empieza y dónde acaba el texto
6
+ * ajeno.
7
+ *
8
+ * **Los tres son cromo y ninguno afirma nada**, así que van al catálogo: «Ver
9
+ * el valor completo» describe lo único que hace ese desplegador, y las
10
+ * comillas son puntuación del idioma (`['„', '“']` en alemán), no una decisión
11
+ * del producto. Lo que sí es de fuera —el valor— entra por `value` y nunca
12
+ * pasa por aquí.
13
+ */
14
+ export interface UntrustedTextMessages {
15
+ /** Etiqueta del desplegador cerrado. */
16
+ expand: string;
17
+ /** Etiqueta del desplegador abierto. */
18
+ collapse: string;
19
+ /** Las comillas que enmarcan el valor, apertura y cierre. */
20
+ quotes: [string, string];
21
+ }
3
22
  export interface UntrustedTextProps {
4
23
  /**
5
24
  * El valor. Si es una cadena recibe el tratamiento entero —marcado de
@@ -16,13 +35,21 @@ export interface UntrustedTextProps {
16
35
  * quiera verlo entero lo despliega en la ficha.
17
36
  */
18
37
  expandable?: boolean;
19
- /** Etiqueta del desplegador cerrado. Default castellano: «Ver el valor completo». */
38
+ /**
39
+ * Etiqueta del desplegador cerrado. **Sin default**: sin ella, sale de
40
+ * `untrustedText.expand` del `BrandMessagesProvider`, y solo se lee cuando
41
+ * el valor se recorta con `expandable`.
42
+ */
20
43
  expandLabel?: string;
21
- /** Etiqueta del desplegador abierto. Default castellano: «Ver menos». */
44
+ /**
45
+ * Etiqueta del desplegador abierto. **Sin default**: sin ella, sale de
46
+ * `untrustedText.collapse`, en el mismo caso.
47
+ */
22
48
  collapseLabel?: string;
23
49
  /**
24
- * Las comillas que enmarcan el valor. Default castellano: `['«', '»']`. Van
25
- * en prop porque cambian con el idioma (`['„', '“']` en alemán).
50
+ * Las comillas que enmarcan el valor. **Sin default**: sin ellas, salen de
51
+ * `untrustedText.quotes`. Cambian con el idioma (`['„', '“']` en alemán), y
52
+ * por eso están en el catálogo y no cableadas.
26
53
  */
27
54
  quotes?: [string, string];
28
55
  /** Se añade DESPUÉS de las clases propias. */