valtech-components 4.0.979 → 4.0.981

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 (83) hide show
  1. package/esm2022/lib/components/atoms/avatar/avatar.component.mjs +3 -3
  2. package/esm2022/lib/components/atoms/box/box.component.mjs +3 -3
  3. package/esm2022/lib/components/atoms/button/button.component.mjs +3 -3
  4. package/esm2022/lib/components/atoms/display/display.component.mjs +3 -3
  5. package/esm2022/lib/components/atoms/divider/divider.component.mjs +3 -3
  6. package/esm2022/lib/components/atoms/emoji-rating/emoji-rating.component.mjs +89 -0
  7. package/esm2022/lib/components/atoms/emoji-rating/types.mjs +11 -0
  8. package/esm2022/lib/components/atoms/href/href.component.mjs +3 -3
  9. package/esm2022/lib/components/atoms/icon/icon.component.mjs +3 -3
  10. package/esm2022/lib/components/atoms/image/image.component.mjs +3 -3
  11. package/esm2022/lib/components/atoms/progress-bar/progress-bar.component.mjs +3 -3
  12. package/esm2022/lib/components/atoms/qr-code/qr-code.component.mjs +3 -3
  13. package/esm2022/lib/components/atoms/text/text.component.mjs +3 -3
  14. package/esm2022/lib/components/atoms/title/title.component.mjs +3 -3
  15. package/esm2022/lib/components/molecules/alert-box/alert-box.component.mjs +3 -3
  16. package/esm2022/lib/components/molecules/button-group/button-group.component.mjs +3 -3
  17. package/esm2022/lib/components/molecules/card/card.component.mjs +3 -3
  18. package/esm2022/lib/components/molecules/chip-group/chip-group.component.mjs +3 -3
  19. package/esm2022/lib/components/molecules/code-display/code-display.component.mjs +3 -3
  20. package/esm2022/lib/components/molecules/command-display/command-display.component.mjs +3 -3
  21. package/esm2022/lib/components/molecules/comment/comment.component.mjs +3 -3
  22. package/esm2022/lib/components/molecules/content-loader/content-loader.component.mjs +3 -3
  23. package/esm2022/lib/components/molecules/date-input/date-input.component.mjs +3 -3
  24. package/esm2022/lib/components/molecules/file-input/file-input.component.mjs +3 -3
  25. package/esm2022/lib/components/molecules/glow-card/glow-card.component.mjs +3 -3
  26. package/esm2022/lib/components/molecules/hint/hint.component.mjs +3 -3
  27. package/esm2022/lib/components/molecules/layered-card/layered-card.component.mjs +3 -3
  28. package/esm2022/lib/components/molecules/link/link.component.mjs +3 -3
  29. package/esm2022/lib/components/molecules/links-cake/links-cake.component.mjs +3 -3
  30. package/esm2022/lib/components/molecules/notes-box/notes-box.component.mjs +3 -3
  31. package/esm2022/lib/components/molecules/password-input/password-input.component.mjs +3 -3
  32. package/esm2022/lib/components/molecules/pill/pill.component.mjs +3 -3
  33. package/esm2022/lib/components/molecules/pin-input/pin-input.component.mjs +3 -3
  34. package/esm2022/lib/components/molecules/popover-selector/popover-selector.component.mjs +3 -3
  35. package/esm2022/lib/components/molecules/progress-status/progress-status.component.mjs +3 -3
  36. package/esm2022/lib/components/molecules/prompter/prompter.component.mjs +3 -3
  37. package/esm2022/lib/components/molecules/rating/rating.component.mjs +3 -3
  38. package/esm2022/lib/components/molecules/searchbar/searchbar.component.mjs +3 -3
  39. package/esm2022/lib/components/molecules/select-input/select-input.component.mjs +3 -3
  40. package/esm2022/lib/components/molecules/stepper/stepper.component.mjs +3 -3
  41. package/esm2022/lib/components/molecules/text-input/text-input.component.mjs +3 -3
  42. package/esm2022/lib/components/molecules/title-block/title-block.component.mjs +3 -3
  43. package/esm2022/lib/components/organisms/article/article.component.mjs +3 -3
  44. package/esm2022/lib/components/organisms/banner/banner.component.mjs +3 -3
  45. package/esm2022/lib/components/organisms/code-validator/code-validator.component.mjs +55 -53
  46. package/esm2022/lib/components/organisms/comment-section/comment-section.component.mjs +3 -3
  47. package/esm2022/lib/components/organisms/data-table/data-table.component.mjs +3 -3
  48. package/esm2022/lib/components/organisms/form/form.component.mjs +3 -3
  49. package/esm2022/lib/components/organisms/header/header.component.mjs +3 -3
  50. package/esm2022/lib/components/organisms/item-list/item-list.component.mjs +3 -3
  51. package/esm2022/lib/components/organisms/no-content/no-content.component.mjs +3 -3
  52. package/esm2022/lib/components/organisms/survey-builder/survey-builder.component.mjs +330 -0
  53. package/esm2022/lib/components/organisms/survey-builder/survey-builder.i18n.mjs +39 -0
  54. package/esm2022/lib/components/organisms/survey-builder/types.mjs +2 -0
  55. package/esm2022/lib/components/organisms/survey-response/survey-response.component.mjs +325 -0
  56. package/esm2022/lib/components/organisms/survey-response/survey-response.i18n.mjs +39 -0
  57. package/esm2022/lib/components/organisms/survey-response/types.mjs +2 -0
  58. package/esm2022/lib/components/organisms/toolbar/toolbar.component.mjs +3 -3
  59. package/esm2022/lib/components/organisms/wizard/wizard.component.mjs +3 -3
  60. package/esm2022/lib/components/templates/simple/simple.component.mjs +3 -3
  61. package/esm2022/lib/services/qr-generator/types.mjs +20 -3
  62. package/esm2022/lib/services/requests/request.service.mjs +19 -2
  63. package/esm2022/lib/services/requests/types.mjs +8 -1
  64. package/esm2022/lib/version.mjs +2 -2
  65. package/esm2022/public-api.mjs +7 -1
  66. package/fesm2022/valtech-components.mjs +1228 -388
  67. package/fesm2022/valtech-components.mjs.map +1 -1
  68. package/lib/components/atoms/emoji-rating/emoji-rating.component.d.ts +25 -0
  69. package/lib/components/atoms/emoji-rating/types.d.ts +22 -0
  70. package/lib/components/organisms/code-validator/code-validator.component.d.ts +8 -1
  71. package/lib/components/organisms/survey-builder/survey-builder.component.d.ts +43 -0
  72. package/lib/components/organisms/survey-builder/survey-builder.i18n.d.ts +2 -0
  73. package/lib/components/organisms/survey-builder/types.d.ts +28 -0
  74. package/lib/components/organisms/survey-response/survey-response.component.d.ts +68 -0
  75. package/lib/components/organisms/survey-response/survey-response.i18n.d.ts +2 -0
  76. package/lib/components/organisms/survey-response/types.d.ts +7 -0
  77. package/lib/services/qr-generator/types.d.ts +11 -0
  78. package/lib/services/requests/request.service.d.ts +7 -0
  79. package/lib/services/requests/types.d.ts +34 -0
  80. package/lib/version.d.ts +1 -1
  81. package/package.json +1 -1
  82. package/public-api.d.ts +6 -0
  83. package/src/lib/components/styles/variables.scss +15 -0
@@ -0,0 +1,25 @@
1
+ import { EmojiRatingMetadata } from './types';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * val-emoji-rating
5
+ *
6
+ * Escala corta de calificación con emoji (3-5 caras) — el tipo de pregunta
7
+ * `EMOJI_RATING` de `services/forms` (ADR-092). Existe como widget propio
8
+ * porque este tipo NO pasa por el `val-form` genérico: un `FieldSchemaDef`
9
+ * con un `type` que `FormSchemaBuilderService.parseInputType` no reconoce cae
10
+ * a texto plano en silencio, que sería incorrecto para una calificación.
11
+ *
12
+ * Radio-like: una sola cara seleccionada a la vez. El valor que guarda es
13
+ * `face.value` (ej. "1".."5"), no el emoji — es lo que
14
+ * `AggregateResponsesByType` cuenta en el dashboard.
15
+ *
16
+ * @example
17
+ * <val-emoji-rating [props]="{ control: ratingControl, label: '¿Cómo calificarías la experiencia?' }" />
18
+ */
19
+ export declare class EmojiRatingComponent {
20
+ props: EmojiRatingMetadata;
21
+ get faces(): import("./types").EmojiRatingFace[];
22
+ select(value: string): void;
23
+ static ɵfac: i0.ɵɵFactoryDeclaration<EmojiRatingComponent, never>;
24
+ static ɵcmp: i0.ɵɵComponentDeclaration<EmojiRatingComponent, "val-emoji-rating", never, { "props": { "alias": "props"; "required": false; }; }, {}, never, never, true, never>;
25
+ }
@@ -0,0 +1,22 @@
1
+ import { FormControl } from '@angular/forms';
2
+ /** Una cara de la escala. `value` es lo que se guarda (y lo que se agrega en
3
+ * el dashboard, `services/request.AggregateResponsesByType` cuenta por este
4
+ * string exacto) — el emoji es solo presentación. */
5
+ export interface EmojiRatingFace {
6
+ value: string;
7
+ emoji: string;
8
+ /** Para lectores de pantalla. Sin esto, un emoji suelto no dice nada. */
9
+ ariaLabel: string;
10
+ }
11
+ /** Escala 1-5 por defecto: de "muy mal" a "muy bien". Los textos van en
12
+ * español porque son el fallback — cualquier consumer con soporte i18n pasa
13
+ * su propio `faces` con `ariaLabel` traducido. */
14
+ export declare const DEFAULT_EMOJI_RATING_FACES: EmojiRatingFace[];
15
+ export interface EmojiRatingMetadata {
16
+ control: FormControl<string | null>;
17
+ /** Texto de la pregunta. El componente no trae i18n propio — texto ya resuelto. */
18
+ label?: string;
19
+ hint?: string;
20
+ faces?: EmojiRatingFace[];
21
+ size?: 'default' | 'small';
22
+ }
@@ -30,6 +30,13 @@ export declare class CodeValidatorComponent {
30
30
  * La regla del producto. Sin esto el componente no valida nada: lee y avisa.
31
31
  */
32
32
  validate?: ValidateFn;
33
+ /**
34
+ * Se emite apenas se lee un código, ANTES de invocar `validate`. Sirve para
35
+ * lo que no depende del resultado: analítica de intento de escaneo, o que
36
+ * el producto decida su propia estrategia de reintento alrededor de
37
+ * `validate` sin que el componente sepa de HTTP.
38
+ */
39
+ scanned: EventEmitter<string>;
33
40
  validated: EventEmitter<ValidationEntry>;
34
41
  closed: EventEmitter<void>;
35
42
  /**
@@ -113,5 +120,5 @@ export declare class CodeValidatorComponent {
113
120
  private announce;
114
121
  private clearTimer;
115
122
  static ɵfac: i0.ɵɵFactoryDeclaration<CodeValidatorComponent, never>;
116
- static ɵcmp: i0.ɵɵComponentDeclaration<CodeValidatorComponent, "val-code-validator", never, { "props": { "alias": "props"; "required": false; }; "validate": { "alias": "validate"; "required": false; }; "_modalRef": { "alias": "_modalRef"; "required": false; }; }, { "validated": "validated"; "closed": "closed"; }, never, never, true, never>;
123
+ static ɵcmp: i0.ɵɵComponentDeclaration<CodeValidatorComponent, "val-code-validator", never, { "props": { "alias": "props"; "required": false; }; "validate": { "alias": "validate"; "required": false; }; "_modalRef": { "alias": "_modalRef"; "required": false; }; }, { "scanned": "scanned"; "validated": "validated"; "closed": "closed"; }, never, never, true, never>;
117
124
  }
@@ -0,0 +1,43 @@
1
+ import { EventEmitter, OnInit } from '@angular/core';
2
+ import { FormControl } from '@angular/forms';
3
+ import { SurveyBuilderMetadata, SurveyBuilderSaveEvent, SurveyQuestionRow } from './types';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * val-survey-builder
7
+ *
8
+ * Autoría de una encuesta: título, subtítulo, preguntas — arma o actualiza un
9
+ * `RequestTypeConfig` con `Type: "<prefix>:<slug>"` (ADR-092), `skipReview:
10
+ * true` (cada respuesta se agrega, no se revisa una por una) y el `EntityRef`
11
+ * que le pasa el consumer (ej. el evento de bingo dueño de la encuesta).
12
+ *
13
+ * v1 solo ofrece los dos tipos de pregunta que `val-survey-response` sabe
14
+ * renderizar: emoji-rating y texto libre. Reusa `RequestFormBuilderService`
15
+ * (`toToken`/`uniqueFieldName`/`createFieldSchema`) para el nombre de campo —
16
+ * es la misma primitiva que ya arma el formulario dinámico de `request`, no
17
+ * una reimplementación.
18
+ */
19
+ export declare class SurveyBuilderComponent implements OnInit {
20
+ props: SurveyBuilderMetadata;
21
+ readonly saved: EventEmitter<SurveyBuilderSaveEvent>;
22
+ private readonly i18n;
23
+ private readonly requests;
24
+ private readonly formBuilder;
25
+ private readonly errors;
26
+ readonly emojiType = "EMOJI_RATING";
27
+ readonly titleControl: FormControl<string>;
28
+ readonly subtitleControl: FormControl<string>;
29
+ readonly questions: import("@angular/core").WritableSignal<SurveyQuestionRow[]>;
30
+ readonly saving: import("@angular/core").WritableSignal<boolean>;
31
+ private readonly rowControls;
32
+ constructor();
33
+ ngOnInit(): Promise<void>;
34
+ private rowFromField;
35
+ rowLabelControl(row: SurveyQuestionRow): FormControl<string>;
36
+ addQuestion(): void;
37
+ removeQuestion(row: SurveyQuestionRow): void;
38
+ setType(row: SurveyQuestionRow, type: SurveyQuestionRow['type']): void;
39
+ save(): Promise<void>;
40
+ t(key: string): string;
41
+ static ɵfac: i0.ɵɵFactoryDeclaration<SurveyBuilderComponent, never>;
42
+ static ɵcmp: i0.ɵɵComponentDeclaration<SurveyBuilderComponent, "val-survey-builder", never, { "props": { "alias": "props"; "required": false; }; }, { "saved": "saved"; }, never, never, true, never>;
43
+ }
@@ -0,0 +1,2 @@
1
+ import { LanguagesContent } from '../../../services/i18n';
2
+ export declare const SURVEY_BUILDER_I18N: LanguagesContent;
@@ -0,0 +1,28 @@
1
+ import { EntityRef, RequestTypeConfig, RequestVisibility } from '../../../services/requests/types';
2
+ /**
3
+ * Una pregunta en construcción — antes de convertirse en `FieldSchemaDef`.
4
+ * v1 solo soporta estos dos tipos (ADR-092) — el mismo par que sabe
5
+ * renderizar `val-survey-response`. Ampliar acá implica ampliar también el
6
+ * renderer de respuesta, no es un cambio de un solo lado.
7
+ */
8
+ export interface SurveyQuestionRow {
9
+ /** Id local, solo para `track` en el template — no viaja al backend. */
10
+ id: string;
11
+ label: string;
12
+ type: 'TEXTAREA' | 'EMOJI_RATING';
13
+ required: boolean;
14
+ }
15
+ export interface SurveyBuilderMetadata {
16
+ /** Si se pasa, edita ese tipo existente; si no, crea uno nuevo. */
17
+ typeId?: string;
18
+ /** Prefijo del `Type` del RequestTypeConfig — el componente arma `"<prefix>:<slug>"`. */
19
+ typePrefix?: string;
20
+ entityRef?: EntityRef;
21
+ /** Default 'PUBLIC' — el caso más común: link enviado a gente sin cuenta. */
22
+ visibility?: RequestVisibility;
23
+ /** Default true. */
24
+ allowAnonymous?: boolean;
25
+ }
26
+ export interface SurveyBuilderSaveEvent {
27
+ typeConfig: RequestTypeConfig;
28
+ }
@@ -0,0 +1,68 @@
1
+ import { EventEmitter, OnInit } from '@angular/core';
2
+ import { FormControl } from '@angular/forms';
3
+ import { RequestTypeConfig } from '../../../services/requests/types';
4
+ import { EmptyStateMetadata } from '../../molecules/empty-state/types';
5
+ import { SurveyResponseMetadata, SurveyResponseSubmitEvent } from './types';
6
+ import * as i0 from "@angular/core";
7
+ /**
8
+ * val-survey-response
9
+ *
10
+ * Toma una encuesta (`RequestTypeConfig` con `Type: "survey:<slug>"`, ADR-092)
11
+ * y la presenta como formulario de respuesta — el organism que un visitante
12
+ * ve al abrir el link de una encuesta. Self-contained, igual que
13
+ * `val-content-reaction`/`val-access-request-view`: lee el tipo, arma el
14
+ * formulario, envía la respuesta, sin que el consumer tenga que orquestar
15
+ * nada de eso.
16
+ *
17
+ * Solo lee tipos `visibility: 'PUBLIC'` (vía `getPublicRequestType`, sin
18
+ * auth) — es el caso de uso que describe el ADR (link enviado a compradores,
19
+ * que pueden no tener cuenta). Encuestas AUTHENTICATED/ORG/INTERNAL están
20
+ * fuera de alcance de este componente por ahora.
21
+ *
22
+ * Cada pregunta se renderiza según su `FieldSchemaDef.type`: `EMOJI_RATING`
23
+ * usa `val-emoji-rating` (NUNCA pasa por `val-form`, no lo sabe rutear);
24
+ * cualquier otro tipo (v1: solo `TEXTAREA`) usa `val-textarea-input`. No hay
25
+ * `val-form` de por medio — un FormGroup armado a mano, porque mezclar tipos
26
+ * custom con el form genérico es más complicado que construir el propio.
27
+ */
28
+ export declare class SurveyResponseComponent implements OnInit {
29
+ props: SurveyResponseMetadata;
30
+ readonly submitted: EventEmitter<SurveyResponseSubmitEvent>;
31
+ private readonly i18n;
32
+ private readonly auth;
33
+ private readonly requests;
34
+ private readonly errors;
35
+ readonly emojiType = "EMOJI_RATING";
36
+ readonly loading: import("@angular/core").WritableSignal<boolean>;
37
+ readonly loadError: import("@angular/core").WritableSignal<boolean>;
38
+ readonly sent: import("@angular/core").WritableSignal<boolean>;
39
+ readonly sending: import("@angular/core").WritableSignal<boolean>;
40
+ readonly typeConfig: import("@angular/core").WritableSignal<RequestTypeConfig>;
41
+ readonly nameControl: FormControl<string>;
42
+ readonly emailControl: FormControl<string>;
43
+ private form;
44
+ constructor();
45
+ ngOnInit(): Promise<void>;
46
+ private buildForm;
47
+ /** Preguntas ordenadas — el template las recorre en este orden. */
48
+ readonly questions: import("@angular/core").Signal<import("valtech-components").FieldSchemaDef[]>;
49
+ questionControl(name: string): FormControl;
50
+ questionLabel(q: {
51
+ label?: string;
52
+ labelKey?: string;
53
+ name: string;
54
+ }): string;
55
+ /** Puede responder sin sesión si el tipo lo permite; si no, hace falta login. */
56
+ readonly canRespond: import("@angular/core").Signal<boolean>;
57
+ /** Pide nombre+correo solo cuando responde sin sesión — el backend exige
58
+ * identidad mínima incluso en el camino anónimo (`CreateAnonymousRequest`). */
59
+ needsIdentity(): boolean;
60
+ readonly submitState: import("@angular/core").Signal<"ENABLED" | "WORKING">;
61
+ submit(): Promise<void>;
62
+ readonly sentState: import("@angular/core").Signal<EmptyStateMetadata>;
63
+ readonly loadErrorState: import("@angular/core").Signal<EmptyStateMetadata>;
64
+ readonly loginRequiredState: import("@angular/core").Signal<EmptyStateMetadata>;
65
+ t(key: string): string;
66
+ static ɵfac: i0.ɵɵFactoryDeclaration<SurveyResponseComponent, never>;
67
+ static ɵcmp: i0.ɵɵComponentDeclaration<SurveyResponseComponent, "val-survey-response", never, { "props": { "alias": "props"; "required": false; }; }, { "submitted": "submitted"; }, never, never, true, never>;
68
+ }
@@ -0,0 +1,2 @@
1
+ import { LanguagesContent } from '../../../services/i18n';
2
+ export declare const SURVEY_RESPONSE_I18N: LanguagesContent;
@@ -0,0 +1,7 @@
1
+ export interface SurveyResponseMetadata {
2
+ /** El `TypeID` del RequestTypeConfig (convención: `"survey:<slug>"`). */
3
+ typeId: string;
4
+ }
5
+ export interface SurveyResponseSubmitEvent {
6
+ requestId: string;
7
+ }
@@ -137,5 +137,16 @@ export interface QrPreset {
137
137
  }
138
138
  /**
139
139
  * Default presets for quick styling.
140
+ *
141
+ * ⚠️ 'rounded' / 'dots' / 'classy' / 'modern' usan cornersSquareStyle/
142
+ * cornersDotStyle NO cuadrados. Los patrones de posición (las 3 esquinas)
143
+ * necesitan la proporción 1:1:3:1:1 en cuadrado para que un lector los
144
+ * ubique — redondearlos se ve prolijo pero puede romper la detección en un
145
+ * decode estático (foto ya tomada, sin los múltiples frames de una cámara
146
+ * en vivo). Bug real: 'ticket-friendly' tenía este mismo problema hasta el
147
+ * 2026-08-28 (ver su comentario abajo). Si un preset de estos se va a usar
148
+ * para un QR que alguien va a re-escanear desde una foto/descarga (no solo
149
+ * mostrar en pantalla o imprimir grande para escaneo directo), forzar
150
+ * cornersSquareStyle/cornersDotStyle a 'square' — no usarlo tal cual.
140
151
  */
141
152
  export declare const QR_PRESETS: Record<string, Partial<QrConfig>>;
@@ -51,6 +51,13 @@ export declare class RequestService {
51
51
  watchComments(appId: string, orgId: string, requestId: string): Observable<RequestComment[]>;
52
52
  listRequestTypes(): Observable<ListRequestTypesResponse>;
53
53
  getRequestType(typeId: string): Observable<RequestTypeConfig>;
54
+ /**
55
+ * Lee un tipo de solicitud SIN requerir sesión — la vía para que un
56
+ * visitante anónimo con un link a una encuesta PUBLIC pueda renderizar el
57
+ * formulario antes de responder. El backend rechaza cualquier tipo que no
58
+ * sea `visibility: 'PUBLIC'` (mismo código que "no existe"). Ver ADR-092.
59
+ */
60
+ getPublicRequestType(typeId: string): Observable<RequestTypeConfig>;
54
61
  createRequestType(payload: CreateRequestTypePayload): Observable<RequestTypeConfig>;
55
62
  updateRequestType(typeId: string, payload: UpdateRequestTypePayload): Observable<RequestTypeConfig>;
56
63
  deleteRequestType(typeId: string): Observable<void>;
@@ -19,6 +19,8 @@ export interface AppRequest {
19
19
  priority?: string;
20
20
  submitter: RequestActor;
21
21
  assignee?: RequestActor;
22
+ /** Copiado del RequestTypeConfig al crear — no lo manda quien responde. */
23
+ entityRef?: EntityRef;
22
24
  dueAt?: string;
23
25
  createdAt: string;
24
26
  updatedAt: string;
@@ -33,6 +35,23 @@ export interface RequestComment {
33
35
  }
34
36
  export type FieldOption = FormFieldOption;
35
37
  export type FieldSchemaDef = FormFieldSchemaDef;
38
+ /**
39
+ * Tipo de pregunta de escala corta con emoji (3-5 caras). NO es uno de los
40
+ * tipos que `FormSchemaBuilderService.buildForm` sabe rutear a `val-form` —
41
+ * un tipo sin mapeo cae a texto plano ahí. Renderizarlo requiere el widget
42
+ * dedicado `val-emoji-rating`, nunca el form genérico. Ver ADR-092.
43
+ */
44
+ export declare const FIELD_TYPE_EMOJI_RATING = "EMOJI_RATING";
45
+ /** Identifica la entidad de dominio a la que pertenece un tipo de solicitud
46
+ * (un evento, una adopción, una receta). Opcional — la mayoría de los tipos
47
+ * (tickets de soporte, postulaciones) no la necesitan porque el tipo YA es la
48
+ * entidad. Mismo shape que el `EntityRef` de feedback/chat — no se importa
49
+ * ninguno de esos paquetes para esto: es un struct de 2 campos, replicarlo es
50
+ * más barato que acoplar dominios de negocio por un tipo trivial. */
51
+ export interface EntityRef {
52
+ entityType: string;
53
+ entityId: string;
54
+ }
36
55
  /** Quién puede leer un tipo de solicitud (y sus solicitudes públicas). */
37
56
  export type RequestVisibility = 'PUBLIC' | 'AUTHENTICATED' | 'ORG' | 'INTERNAL';
38
57
  export interface RequestTypeConfig {
@@ -41,6 +60,15 @@ export interface RequestTypeConfig {
41
60
  orgId: string;
42
61
  /** Nombre del tipo, escrito por la organización: no se traduce. */
43
62
  label: string;
63
+ /** Bajada del enunciado (ej. encuestas). Label ya cubre el título. */
64
+ subtitle?: string;
65
+ entityRef?: EntityRef;
66
+ /**
67
+ * true = cada envío se agrega, no se revisa uno por uno (ej. encuestas).
68
+ * false/undefined (default) = comportamiento histórico: se revisa cada
69
+ * solicitud (Chesed adopciones, Okhelia recetas).
70
+ */
71
+ skipReview?: boolean;
44
72
  fieldSchema: FieldSchemaDef[];
45
73
  allowAnonymous: boolean;
46
74
  /**
@@ -99,6 +127,9 @@ export interface CreateRequestTypePayload {
99
127
  typeId?: string;
100
128
  /** Nombre del tipo, escrito por la organización: no se traduce. */
101
129
  label: string;
130
+ subtitle?: string;
131
+ entityRef?: EntityRef;
132
+ skipReview?: boolean;
102
133
  fieldSchema: FieldSchemaDef[];
103
134
  allowAnonymous: boolean;
104
135
  visibility?: RequestVisibility;
@@ -106,6 +137,9 @@ export interface CreateRequestTypePayload {
106
137
  export interface UpdateRequestTypePayload {
107
138
  /** Nombre del tipo, escrito por la organización: no se traduce. */
108
139
  label: string;
140
+ subtitle?: string;
141
+ entityRef?: EntityRef;
142
+ skipReview?: boolean;
109
143
  fieldSchema: FieldSchemaDef[];
110
144
  allowAnonymous: boolean;
111
145
  visibility?: RequestVisibility;
package/lib/version.d.ts CHANGED
@@ -2,4 +2,4 @@
2
2
  * Current version of valtech-components.
3
3
  * This is automatically updated during the publish process.
4
4
  */
5
- export declare const VERSION = "4.0.979";
5
+ export declare const VERSION = "4.0.981";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "valtech-components",
3
- "version": "4.0.979",
3
+ "version": "4.0.981",
4
4
  "private": false,
5
5
  "bin": {
6
6
  "valtech-firebase-config": "./src/lib/services/firebase/scripts/generate-sw-config.js"
package/public-api.d.ts CHANGED
@@ -20,6 +20,8 @@ export * from './lib/components/atoms/display/display.component';
20
20
  export * from './lib/components/atoms/display/types';
21
21
  export * from './lib/components/atoms/divider/divider.component';
22
22
  export * from './lib/components/atoms/divider/types';
23
+ export * from './lib/components/atoms/emoji-rating/emoji-rating.component';
24
+ export * from './lib/components/atoms/emoji-rating/types';
23
25
  export * from './lib/components/atoms/href/href.component';
24
26
  export * from './lib/components/atoms/href/types';
25
27
  export * from './lib/components/atoms/icon/icon.component';
@@ -236,6 +238,10 @@ export * from './lib/components/molecules/linked-providers/linked-providers.comp
236
238
  export * from './lib/components/molecules/linked-providers/types';
237
239
  export * from './lib/components/organisms/access-request-view/access-request-view.component';
238
240
  export * from './lib/components/organisms/access-request-view/access-request-view.i18n';
241
+ export * from './lib/components/organisms/survey-response/survey-response.component';
242
+ export * from './lib/components/organisms/survey-response/types';
243
+ export * from './lib/components/organisms/survey-builder/survey-builder.component';
244
+ export * from './lib/components/organisms/survey-builder/types';
239
245
  export * from './lib/components/molecules/empty-state/empty-state.component';
240
246
  export * from './lib/components/molecules/empty-state/factory';
241
247
  export * from './lib/components/molecules/empty-state/types';
@@ -104,6 +104,21 @@ $color-default-placeholder: #afbacc;
104
104
  --val-container-aside: 0px;
105
105
  --val-container-padding: 16px;
106
106
 
107
+ /* RADIO DE BORDE — nueva personalidad de marca (2026-08-28, pedido del CTO):
108
+ * bordes más redondos, más simpleza. Escala pública consumible desde apps
109
+ * y desde cualquier componente nuevo — usar var(--val-radius-*, fallback)
110
+ * en vez de un número suelto. Reemplaza gradualmente a $border-radius-*
111
+ * (SCSS, solo compile-time, casi sin uso real hoy — ver docs/frontend/
112
+ * design-personality.md). No se migró aún ningún componente existente a
113
+ * propósito: este commit solo establece el token.
114
+ */
115
+ --val-radius-xs: 10px;
116
+ --val-radius-sm: 16px;
117
+ --val-radius-md: 20px;
118
+ --val-radius-lg: 28px;
119
+ --val-radius-xl: 36px;
120
+ --val-radius-full: 999px;
121
+
107
122
  --ion-color-primary: #7026df;
108
123
  --ion-color-primary-rgb: 112, 38, 223;
109
124
  --ion-color-primary-contrast: #ffffff;