valtech-components 4.0.1009 → 4.0.1011

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.
@@ -70,7 +70,7 @@ import fixWebmDuration from 'fix-webm-duration';
70
70
  * Current version of valtech-components.
71
71
  * This is automatically updated during the publish process.
72
72
  */
73
- const VERSION = '4.0.1009';
73
+ const VERSION = '4.0.1011';
74
74
 
75
75
  function evaluateValtechAccess(rule, context, features = {}, visitedFeatures = new Set()) {
76
76
  if (rule == null)
@@ -13263,7 +13263,7 @@ class EmojiRatingComponent {
13263
13263
  <p class="emoji-rating__hint">{{ props.hint }}</p>
13264
13264
  }
13265
13265
  </div>
13266
- `, isInline: true, styles: [".emoji-rating{display:flex;flex-direction:column;gap:8px}.emoji-rating__label{font-size:1rem;font-weight:600;color:var(--ion-text-color, #000)}.emoji-rating__faces{display:flex;gap:8px;flex-wrap:wrap}.emoji-rating__face{width:44px;height:44px;display:flex;align-items:center;justify-content:center;font-size:1.5rem;line-height:1;border-radius:999px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-card-background, var(--ion-background-color, #fff));cursor:pointer;transition:transform .15s ease,border-color .15s ease,background .15s ease}.emoji-rating__face:hover{transform:translateY(-1px)}.emoji-rating__face--selected{border-color:var(--ion-color-primary, #7026df);background:var(--ion-color-primary-tint, rgba(112, 38, 223, .12));transform:scale(1.08)}.emoji-rating--small .emoji-rating__face{font-size:1.125rem}.emoji-rating__hint{font-size:.8125rem;color:var(--ion-color-medium, #92949c);margin:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }] }); }
13266
+ `, isInline: true, styles: [".emoji-rating{display:flex;flex-direction:column;gap:8px}.emoji-rating__label{font-size:1rem;font-weight:600;color:var(--ion-text-color, #000)}.emoji-rating__faces{display:flex;gap:8px;flex-wrap:wrap}.emoji-rating__face{width:44px;height:44px;display:flex;align-items:center;justify-content:center;font-size:1.5rem;line-height:1;border-radius:999px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-card-background, var(--ion-background-color, #fff));cursor:pointer;transition:transform .15s ease,border-color .15s ease,background .15s ease}.emoji-rating__face:hover{transform:translateY(-1px)}.emoji-rating__face--selected{border-color:var(--ion-color-primary, #7026df);background:var(--ion-color-primary-tint, rgba(112, 38, 223, .12));transform:scale(1.08)}.emoji-rating--small .emoji-rating__face{font-size:1.125rem}.emoji-rating__hint{font-size:.875rem;color:var(--ion-color-dark, var(--ion-text-color, #000));margin:0;line-height:1.4;opacity:.78}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }] }); }
13267
13267
  }
13268
13268
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EmojiRatingComponent, decorators: [{
13269
13269
  type: Component,
@@ -13291,7 +13291,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
13291
13291
  <p class="emoji-rating__hint">{{ props.hint }}</p>
13292
13292
  }
13293
13293
  </div>
13294
- `, styles: [".emoji-rating{display:flex;flex-direction:column;gap:8px}.emoji-rating__label{font-size:1rem;font-weight:600;color:var(--ion-text-color, #000)}.emoji-rating__faces{display:flex;gap:8px;flex-wrap:wrap}.emoji-rating__face{width:44px;height:44px;display:flex;align-items:center;justify-content:center;font-size:1.5rem;line-height:1;border-radius:999px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-card-background, var(--ion-background-color, #fff));cursor:pointer;transition:transform .15s ease,border-color .15s ease,background .15s ease}.emoji-rating__face:hover{transform:translateY(-1px)}.emoji-rating__face--selected{border-color:var(--ion-color-primary, #7026df);background:var(--ion-color-primary-tint, rgba(112, 38, 223, .12));transform:scale(1.08)}.emoji-rating--small .emoji-rating__face{font-size:1.125rem}.emoji-rating__hint{font-size:.8125rem;color:var(--ion-color-medium, #92949c);margin:0}\n"] }]
13294
+ `, styles: [".emoji-rating{display:flex;flex-direction:column;gap:8px}.emoji-rating__label{font-size:1rem;font-weight:600;color:var(--ion-text-color, #000)}.emoji-rating__faces{display:flex;gap:8px;flex-wrap:wrap}.emoji-rating__face{width:44px;height:44px;display:flex;align-items:center;justify-content:center;font-size:1.5rem;line-height:1;border-radius:999px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-card-background, var(--ion-background-color, #fff));cursor:pointer;transition:transform .15s ease,border-color .15s ease,background .15s ease}.emoji-rating__face:hover{transform:translateY(-1px)}.emoji-rating__face--selected{border-color:var(--ion-color-primary, #7026df);background:var(--ion-color-primary-tint, rgba(112, 38, 223, .12));transform:scale(1.08)}.emoji-rating--small .emoji-rating__face{font-size:1.125rem}.emoji-rating__hint{font-size:.875rem;color:var(--ion-color-dark, var(--ion-text-color, #000));margin:0;line-height:1.4;opacity:.78}\n"] }]
13295
13295
  }], propDecorators: { props: [{
13296
13296
  type: Input
13297
13297
  }] } });
@@ -39456,6 +39456,456 @@ const SURVEY_RESPONSE_I18N = {
39456
39456
  },
39457
39457
  };
39458
39458
 
39459
+ /** Defaults de `rows` por preset cuando el consumer no lo especifica. */
39460
+ const SKELETON_LAYOUT_DEFAULT_ROWS = {
39461
+ form: 3,
39462
+ list: 5,
39463
+ article: 3,
39464
+ cards: 4,
39465
+ detail: 4,
39466
+ hero: 3,
39467
+ };
39468
+
39469
+ /**
39470
+ * `val-skeleton-layout`
39471
+ *
39472
+ * Skeleton de página **preset-driven**. En vez de que cada vista componga
39473
+ * átomos `val-skeleton` a mano, declara una shape y este organism arma el
39474
+ * placeholder completo. Estándar único para loading states en todo el factory.
39475
+ *
39476
+ * Presets: `form` · `list` · `article` · `cards` · `detail` · `hero`.
39477
+ *
39478
+ * Extender = agregar un valor a `SkeletonLayoutPreset` + un `@case` acá.
39479
+ * Los consumers no cambian.
39480
+ *
39481
+ * @example
39482
+ * ```html
39483
+ * @if (loading()) {
39484
+ * <val-skeleton-layout [props]="{ preset: 'form', rows: 3, showAvatar: true }" />
39485
+ * } @else {
39486
+ * ...contenido real...
39487
+ * }
39488
+ * ```
39489
+ */
39490
+ class SkeletonLayoutComponent {
39491
+ constructor() {
39492
+ this.props_ = signal({ preset: 'list' }, {
39493
+ equal: (a, b) => a === b || JSON.stringify(a) === JSON.stringify(b),
39494
+ });
39495
+ /** Props con defaults aplicados. */
39496
+ this.resolved = computed(() => this.props_());
39497
+ /** Shimmer on/off — default on. */
39498
+ this.anim = computed(() => this.resolved().animated !== false);
39499
+ /** Array `[0..rows)` para los `@for`. rows del prop o default del preset. */
39500
+ this.rowsArray = computed(() => {
39501
+ const p = this.resolved();
39502
+ const preset = p.preset;
39503
+ const count = p.rows && p.rows > 0 ? Math.floor(p.rows) : SKELETON_LAYOUT_DEFAULT_ROWS[preset];
39504
+ return Array.from({ length: count }, (_, i) => i);
39505
+ });
39506
+ /** True si el consumer fijó `columns` explícito → manda su grid (inline).
39507
+ * Si no, el preset cards usa el grid responsive mobile-first (.sk-cards--auto). */
39508
+ this.hasExplicitColumns = computed(() => this.resolved().columns != null);
39509
+ /** `grid-template-columns` para el preset cards con `columns` explícito. */
39510
+ this.gridColumns = computed(() => {
39511
+ const cols = this.resolved().columns ?? 2;
39512
+ return `repeat(${Math.max(1, cols)}, 1fr)`;
39513
+ });
39514
+ }
39515
+ set props(value) {
39516
+ if (value)
39517
+ this.props_.set(value);
39518
+ }
39519
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SkeletonLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
39520
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SkeletonLayoutComponent, isStandalone: true, selector: "val-skeleton-layout", inputs: { props: "props" }, ngImport: i0, template: `
39521
+ <div class="val-skeleton-layout" [class]="resolved().cssClass || ''" aria-busy="true" aria-live="polite">
39522
+ @switch (resolved().preset) {
39523
+ <!-- FORM — avatar opcional + N fields (label+input) + botón -->
39524
+ @case ('form') {
39525
+ @if (resolved().showAvatar) {
39526
+ <div class="sk-form__avatar">
39527
+ <val-skeleton
39528
+ [props]="{
39529
+ type: 'avatar',
39530
+ width: '96px',
39531
+ height: '96px',
39532
+ circle: true,
39533
+ animated: anim(),
39534
+ }"
39535
+ />
39536
+ <div class="sk-form__avatar-meta">
39537
+ <val-skeleton
39538
+ [props]="{
39539
+ type: 'text',
39540
+ width: '150px',
39541
+ height: '18px',
39542
+ animated: anim(),
39543
+ }"
39544
+ />
39545
+ <val-skeleton
39546
+ [props]="{
39547
+ type: 'text',
39548
+ width: '190px',
39549
+ height: '13px',
39550
+ animated: anim(),
39551
+ }"
39552
+ />
39553
+ <val-skeleton
39554
+ [props]="{
39555
+ type: 'text',
39556
+ width: '110px',
39557
+ height: '13px',
39558
+ animated: anim(),
39559
+ }"
39560
+ />
39561
+ </div>
39562
+ </div>
39563
+ }
39564
+ <div class="sk-form__fields">
39565
+ @for (i of rowsArray(); track i) {
39566
+ <div class="sk-form__field">
39567
+ <val-skeleton
39568
+ [props]="{
39569
+ type: 'text',
39570
+ width: '90px',
39571
+ height: '13px',
39572
+ animated: anim(),
39573
+ }"
39574
+ />
39575
+ <val-skeleton
39576
+ [props]="{
39577
+ type: 'custom',
39578
+ width: '100%',
39579
+ height: '48px',
39580
+ borderRadius: '12px',
39581
+ animated: anim(),
39582
+ }"
39583
+ />
39584
+ </div>
39585
+ }
39586
+ @if (resolved().showButton !== false) {
39587
+ <val-skeleton
39588
+ [props]="{
39589
+ type: 'custom',
39590
+ width: '100%',
39591
+ height: '48px',
39592
+ borderRadius: '24px',
39593
+ animated: anim(),
39594
+ }"
39595
+ />
39596
+ }
39597
+ </div>
39598
+ }
39599
+
39600
+ <!-- LIST — N filas list-item (el átomo ya trae icono + 2 líneas) -->
39601
+ @case ('list') {
39602
+ <div class="sk-list">
39603
+ @for (i of rowsArray(); track i) {
39604
+ <val-skeleton [props]="{ type: 'list-item', animated: anim() }" />
39605
+ }
39606
+ </div>
39607
+ }
39608
+
39609
+ <!-- ARTICLE — título + meta + párrafos -->
39610
+ @case ('article') {
39611
+ <div class="sk-article">
39612
+ @if (resolved().showTitle !== false) {
39613
+ <val-skeleton
39614
+ [props]="{
39615
+ type: 'text',
39616
+ width: '70%',
39617
+ height: '30px',
39618
+ animated: anim(),
39619
+ }"
39620
+ />
39621
+ <val-skeleton
39622
+ [props]="{
39623
+ type: 'text',
39624
+ width: '40%',
39625
+ height: '14px',
39626
+ animated: anim(),
39627
+ }"
39628
+ />
39629
+ }
39630
+ @for (i of rowsArray(); track i) {
39631
+ <val-skeleton [props]="{ type: 'paragraph', lines: 4, animated: anim() }" />
39632
+ }
39633
+ </div>
39634
+ }
39635
+
39636
+ <!-- CARDS — grid de N card blocks -->
39637
+ @case ('cards') {
39638
+ <!-- Sin columns explícito, grid responsive mobile-first (1 col en
39639
+ mobile, 2 en 640, 3 en 960) que espeja el grid estandar de las
39640
+ vistas del factory. Con columns explícito, el consumer manda
39641
+ (inline). Antes era fijo a 2 columnas, apretado en mobile. -->
39642
+ <div
39643
+ class="sk-cards"
39644
+ [class.sk-cards--auto]="!hasExplicitColumns()"
39645
+ [style.grid-template-columns]="hasExplicitColumns() ? gridColumns() : null"
39646
+ >
39647
+ @for (i of rowsArray(); track i) {
39648
+ <val-skeleton [props]="{ type: 'card', animated: anim() }" />
39649
+ }
39650
+ </div>
39651
+ }
39652
+
39653
+ <!-- DETAIL — N filas key-value -->
39654
+ @case ('detail') {
39655
+ <div class="sk-detail">
39656
+ @for (i of rowsArray(); track i) {
39657
+ <div class="sk-detail__row">
39658
+ <val-skeleton
39659
+ [props]="{
39660
+ type: 'text',
39661
+ width: '110px',
39662
+ height: '14px',
39663
+ animated: anim(),
39664
+ }"
39665
+ />
39666
+ <val-skeleton
39667
+ [props]="{
39668
+ type: 'text',
39669
+ width: '160px',
39670
+ height: '14px',
39671
+ animated: anim(),
39672
+ }"
39673
+ />
39674
+ </div>
39675
+ }
39676
+ </div>
39677
+ }
39678
+
39679
+ <!-- HERO — banner grande + filas de contenido -->
39680
+ @case ('hero') {
39681
+ <div class="sk-hero">
39682
+ @if (resolved().showTitle !== false) {
39683
+ <val-skeleton
39684
+ [props]="{
39685
+ type: 'custom',
39686
+ width: '100%',
39687
+ height: '140px',
39688
+ borderRadius: '20px',
39689
+ animated: anim(),
39690
+ }"
39691
+ />
39692
+ }
39693
+ <div class="sk-hero__rows">
39694
+ @for (i of rowsArray(); track i) {
39695
+ <val-skeleton
39696
+ [props]="{
39697
+ type: 'custom',
39698
+ width: '100%',
39699
+ height: '72px',
39700
+ borderRadius: '14px',
39701
+ animated: anim(),
39702
+ }"
39703
+ />
39704
+ }
39705
+ </div>
39706
+ </div>
39707
+ }
39708
+ }
39709
+ </div>
39710
+ `, isInline: true, styles: [":host{display:block;width:100%}.val-skeleton-layout{width:100%}.sk-form__avatar{display:flex;align-items:center;gap:16px;padding:16px 0}.sk-form__avatar-meta{display:flex;flex-direction:column;gap:8px}.sk-form__fields{padding:16px 0;display:flex;flex-direction:column;gap:18px}.sk-form__field{display:flex;flex-direction:column;gap:8px}.sk-list{display:flex;flex-direction:column;gap:10px;padding:8px 0}.sk-article{display:flex;flex-direction:column;gap:16px;padding:8px 0}.sk-cards{display:grid;gap:12px;padding:8px 0}.sk-cards--auto{grid-template-columns:1fr}@media (min-width: 640px){.sk-cards--auto{grid-template-columns:repeat(2,1fr)}}@media (min-width: 960px){.sk-cards--auto{grid-template-columns:repeat(3,1fr)}}.sk-detail{display:flex;flex-direction:column;gap:14px;padding:8px 0}.sk-detail__row{display:flex;align-items:center;justify-content:space-between;gap:16px}.sk-hero{display:flex;flex-direction:column;gap:16px;padding:8px 0}.sk-hero__rows{display:flex;flex-direction:column;gap:12px}\n"], dependencies: [{ kind: "component", type: SkeletonComponent, selector: "val-skeleton", inputs: ["props"] }] }); }
39711
+ }
39712
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SkeletonLayoutComponent, decorators: [{
39713
+ type: Component,
39714
+ args: [{ selector: 'val-skeleton-layout', standalone: true, imports: [SkeletonComponent], template: `
39715
+ <div class="val-skeleton-layout" [class]="resolved().cssClass || ''" aria-busy="true" aria-live="polite">
39716
+ @switch (resolved().preset) {
39717
+ <!-- FORM — avatar opcional + N fields (label+input) + botón -->
39718
+ @case ('form') {
39719
+ @if (resolved().showAvatar) {
39720
+ <div class="sk-form__avatar">
39721
+ <val-skeleton
39722
+ [props]="{
39723
+ type: 'avatar',
39724
+ width: '96px',
39725
+ height: '96px',
39726
+ circle: true,
39727
+ animated: anim(),
39728
+ }"
39729
+ />
39730
+ <div class="sk-form__avatar-meta">
39731
+ <val-skeleton
39732
+ [props]="{
39733
+ type: 'text',
39734
+ width: '150px',
39735
+ height: '18px',
39736
+ animated: anim(),
39737
+ }"
39738
+ />
39739
+ <val-skeleton
39740
+ [props]="{
39741
+ type: 'text',
39742
+ width: '190px',
39743
+ height: '13px',
39744
+ animated: anim(),
39745
+ }"
39746
+ />
39747
+ <val-skeleton
39748
+ [props]="{
39749
+ type: 'text',
39750
+ width: '110px',
39751
+ height: '13px',
39752
+ animated: anim(),
39753
+ }"
39754
+ />
39755
+ </div>
39756
+ </div>
39757
+ }
39758
+ <div class="sk-form__fields">
39759
+ @for (i of rowsArray(); track i) {
39760
+ <div class="sk-form__field">
39761
+ <val-skeleton
39762
+ [props]="{
39763
+ type: 'text',
39764
+ width: '90px',
39765
+ height: '13px',
39766
+ animated: anim(),
39767
+ }"
39768
+ />
39769
+ <val-skeleton
39770
+ [props]="{
39771
+ type: 'custom',
39772
+ width: '100%',
39773
+ height: '48px',
39774
+ borderRadius: '12px',
39775
+ animated: anim(),
39776
+ }"
39777
+ />
39778
+ </div>
39779
+ }
39780
+ @if (resolved().showButton !== false) {
39781
+ <val-skeleton
39782
+ [props]="{
39783
+ type: 'custom',
39784
+ width: '100%',
39785
+ height: '48px',
39786
+ borderRadius: '24px',
39787
+ animated: anim(),
39788
+ }"
39789
+ />
39790
+ }
39791
+ </div>
39792
+ }
39793
+
39794
+ <!-- LIST — N filas list-item (el átomo ya trae icono + 2 líneas) -->
39795
+ @case ('list') {
39796
+ <div class="sk-list">
39797
+ @for (i of rowsArray(); track i) {
39798
+ <val-skeleton [props]="{ type: 'list-item', animated: anim() }" />
39799
+ }
39800
+ </div>
39801
+ }
39802
+
39803
+ <!-- ARTICLE — título + meta + párrafos -->
39804
+ @case ('article') {
39805
+ <div class="sk-article">
39806
+ @if (resolved().showTitle !== false) {
39807
+ <val-skeleton
39808
+ [props]="{
39809
+ type: 'text',
39810
+ width: '70%',
39811
+ height: '30px',
39812
+ animated: anim(),
39813
+ }"
39814
+ />
39815
+ <val-skeleton
39816
+ [props]="{
39817
+ type: 'text',
39818
+ width: '40%',
39819
+ height: '14px',
39820
+ animated: anim(),
39821
+ }"
39822
+ />
39823
+ }
39824
+ @for (i of rowsArray(); track i) {
39825
+ <val-skeleton [props]="{ type: 'paragraph', lines: 4, animated: anim() }" />
39826
+ }
39827
+ </div>
39828
+ }
39829
+
39830
+ <!-- CARDS — grid de N card blocks -->
39831
+ @case ('cards') {
39832
+ <!-- Sin columns explícito, grid responsive mobile-first (1 col en
39833
+ mobile, 2 en 640, 3 en 960) que espeja el grid estandar de las
39834
+ vistas del factory. Con columns explícito, el consumer manda
39835
+ (inline). Antes era fijo a 2 columnas, apretado en mobile. -->
39836
+ <div
39837
+ class="sk-cards"
39838
+ [class.sk-cards--auto]="!hasExplicitColumns()"
39839
+ [style.grid-template-columns]="hasExplicitColumns() ? gridColumns() : null"
39840
+ >
39841
+ @for (i of rowsArray(); track i) {
39842
+ <val-skeleton [props]="{ type: 'card', animated: anim() }" />
39843
+ }
39844
+ </div>
39845
+ }
39846
+
39847
+ <!-- DETAIL — N filas key-value -->
39848
+ @case ('detail') {
39849
+ <div class="sk-detail">
39850
+ @for (i of rowsArray(); track i) {
39851
+ <div class="sk-detail__row">
39852
+ <val-skeleton
39853
+ [props]="{
39854
+ type: 'text',
39855
+ width: '110px',
39856
+ height: '14px',
39857
+ animated: anim(),
39858
+ }"
39859
+ />
39860
+ <val-skeleton
39861
+ [props]="{
39862
+ type: 'text',
39863
+ width: '160px',
39864
+ height: '14px',
39865
+ animated: anim(),
39866
+ }"
39867
+ />
39868
+ </div>
39869
+ }
39870
+ </div>
39871
+ }
39872
+
39873
+ <!-- HERO — banner grande + filas de contenido -->
39874
+ @case ('hero') {
39875
+ <div class="sk-hero">
39876
+ @if (resolved().showTitle !== false) {
39877
+ <val-skeleton
39878
+ [props]="{
39879
+ type: 'custom',
39880
+ width: '100%',
39881
+ height: '140px',
39882
+ borderRadius: '20px',
39883
+ animated: anim(),
39884
+ }"
39885
+ />
39886
+ }
39887
+ <div class="sk-hero__rows">
39888
+ @for (i of rowsArray(); track i) {
39889
+ <val-skeleton
39890
+ [props]="{
39891
+ type: 'custom',
39892
+ width: '100%',
39893
+ height: '72px',
39894
+ borderRadius: '14px',
39895
+ animated: anim(),
39896
+ }"
39897
+ />
39898
+ }
39899
+ </div>
39900
+ </div>
39901
+ }
39902
+ }
39903
+ </div>
39904
+ `, styles: [":host{display:block;width:100%}.val-skeleton-layout{width:100%}.sk-form__avatar{display:flex;align-items:center;gap:16px;padding:16px 0}.sk-form__avatar-meta{display:flex;flex-direction:column;gap:8px}.sk-form__fields{padding:16px 0;display:flex;flex-direction:column;gap:18px}.sk-form__field{display:flex;flex-direction:column;gap:8px}.sk-list{display:flex;flex-direction:column;gap:10px;padding:8px 0}.sk-article{display:flex;flex-direction:column;gap:16px;padding:8px 0}.sk-cards{display:grid;gap:12px;padding:8px 0}.sk-cards--auto{grid-template-columns:1fr}@media (min-width: 640px){.sk-cards--auto{grid-template-columns:repeat(2,1fr)}}@media (min-width: 960px){.sk-cards--auto{grid-template-columns:repeat(3,1fr)}}.sk-detail{display:flex;flex-direction:column;gap:14px;padding:8px 0}.sk-detail__row{display:flex;align-items:center;justify-content:space-between;gap:16px}.sk-hero{display:flex;flex-direction:column;gap:16px;padding:8px 0}.sk-hero__rows{display:flex;flex-direction:column;gap:12px}\n"] }]
39905
+ }], propDecorators: { props: [{
39906
+ type: Input
39907
+ }] } });
39908
+
39459
39909
  const NAMESPACE$4 = 'SurveyResponse';
39460
39910
  /** Code del backend cuando la invitación de esa persona ya se respondió. */
39461
39911
  const INVITE_USED_CODE = 'SURVEY_INVITE_ALREADY_USED';
@@ -39823,7 +40273,9 @@ class SurveyResponseComponent {
39823
40273
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SurveyResponseComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
39824
40274
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SurveyResponseComponent, isStandalone: true, selector: "val-survey-response", inputs: { props: "props" }, outputs: { submitted: "submitted" }, viewQueries: [{ propertyName: "formComponent", first: true, predicate: FormComponent, descendants: true }], ngImport: i0, template: `
39825
40275
  @if (loading()) {
39826
- <div class="survey-response__loading" aria-hidden="true"></div>
40276
+ <div class="survey-response__loading">
40277
+ <val-skeleton-layout [props]="{ preset: 'form', rows: 4, showAvatar: false }" />
40278
+ </div>
39827
40279
  } @else if (loadError()) {
39828
40280
  <val-empty-state [props]="loadErrorState()" />
39829
40281
  } @else if (alreadyAnswered()) {
@@ -39903,7 +40355,7 @@ class SurveyResponseComponent {
39903
40355
  }
39904
40356
  }
39905
40357
  }
39906
- `, isInline: true, styles: [":host{display:block}.survey-response{display:flex;flex-direction:column;gap:16px}.survey-response__header-image,.survey-response__success-image{display:block;width:100%;max-height:220px;object-fit:contain;border-radius:var(--val-radius-md, 12px)}.survey-response__success{align-items:center;text-align:center}.survey-response__success-image{max-width:320px}.survey-response__success-note{margin:0;color:var(--ion-color-medium, #92949c);font-size:.95rem;font-weight:600}.survey-response__steps{display:flex;gap:6px}.survey-response__step{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .12));border-radius:999px;color:var(--ion-color-medium, #92949c);font-size:.8125rem;font-weight:700}.survey-response__step--active{border-color:var(--ion-color-primary);color:var(--ion-color-primary)}.survey-response__actions{display:flex;justify-content:flex-end;gap:8px}.survey-response__error{margin:0;color:var(--ion-color-danger);font-size:.875rem;font-weight:700}.survey-response__hint{display:block;margin-top:4px;font-size:.8125rem;color:var(--ion-color-medium, #92949c)}.survey-response__loading{min-height:120px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: TextInputComponent, selector: "val-text-input", inputs: ["preset", "props"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: EmptyStateComponent, selector: "val-empty-state", inputs: ["props"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onValueChange", "onInvalid", "onSelectChange"] }] }); }
40358
+ `, isInline: true, styles: [":host{display:block}.survey-response{display:flex;flex-direction:column;gap:16px}.survey-response__header-image,.survey-response__success-image{display:block;width:100%;max-height:220px;object-fit:contain;border-radius:var(--val-radius-md, 12px)}.survey-response__success{align-items:center;text-align:center}.survey-response__success-image{max-width:320px}.survey-response__success-note{margin:0;color:var(--ion-color-medium, #92949c);font-size:.95rem;font-weight:600}.survey-response__steps{display:flex;gap:6px}.survey-response__step{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .12));border-radius:999px;color:var(--ion-color-medium, #92949c);font-size:.8125rem;font-weight:700}.survey-response__step--active{border-color:var(--ion-color-primary);color:var(--ion-color-primary)}.survey-response__actions{display:flex;justify-content:flex-end;gap:8px}.survey-response__error{margin:0;color:var(--ion-color-danger);font-size:.875rem;font-weight:700}.survey-response__hint{display:block;margin-top:4px;font-size:.8125rem;color:var(--ion-color-medium, #92949c)}.survey-response__loading{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: TextInputComponent, selector: "val-text-input", inputs: ["preset", "props"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: EmptyStateComponent, selector: "val-empty-state", inputs: ["props"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onValueChange", "onInvalid", "onSelectChange"] }, { kind: "component", type: SkeletonLayoutComponent, selector: "val-skeleton-layout", inputs: ["props"] }] }); }
39907
40359
  }
39908
40360
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SurveyResponseComponent, decorators: [{
39909
40361
  type: Component,
@@ -39923,9 +40375,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
39923
40375
  ButtonComponent,
39924
40376
  EmptyStateComponent,
39925
40377
  FormComponent,
40378
+ SkeletonLayoutComponent,
39926
40379
  ], template: `
39927
40380
  @if (loading()) {
39928
- <div class="survey-response__loading" aria-hidden="true"></div>
40381
+ <div class="survey-response__loading">
40382
+ <val-skeleton-layout [props]="{ preset: 'form', rows: 4, showAvatar: false }" />
40383
+ </div>
39929
40384
  } @else if (loadError()) {
39930
40385
  <val-empty-state [props]="loadErrorState()" />
39931
40386
  } @else if (alreadyAnswered()) {
@@ -40005,7 +40460,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
40005
40460
  }
40006
40461
  }
40007
40462
  }
40008
- `, styles: [":host{display:block}.survey-response{display:flex;flex-direction:column;gap:16px}.survey-response__header-image,.survey-response__success-image{display:block;width:100%;max-height:220px;object-fit:contain;border-radius:var(--val-radius-md, 12px)}.survey-response__success{align-items:center;text-align:center}.survey-response__success-image{max-width:320px}.survey-response__success-note{margin:0;color:var(--ion-color-medium, #92949c);font-size:.95rem;font-weight:600}.survey-response__steps{display:flex;gap:6px}.survey-response__step{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .12));border-radius:999px;color:var(--ion-color-medium, #92949c);font-size:.8125rem;font-weight:700}.survey-response__step--active{border-color:var(--ion-color-primary);color:var(--ion-color-primary)}.survey-response__actions{display:flex;justify-content:flex-end;gap:8px}.survey-response__error{margin:0;color:var(--ion-color-danger);font-size:.875rem;font-weight:700}.survey-response__hint{display:block;margin-top:4px;font-size:.8125rem;color:var(--ion-color-medium, #92949c)}.survey-response__loading{min-height:120px}\n"] }]
40463
+ `, styles: [":host{display:block}.survey-response{display:flex;flex-direction:column;gap:16px}.survey-response__header-image,.survey-response__success-image{display:block;width:100%;max-height:220px;object-fit:contain;border-radius:var(--val-radius-md, 12px)}.survey-response__success{align-items:center;text-align:center}.survey-response__success-image{max-width:320px}.survey-response__success-note{margin:0;color:var(--ion-color-medium, #92949c);font-size:.95rem;font-weight:600}.survey-response__steps{display:flex;gap:6px}.survey-response__step{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .12));border-radius:999px;color:var(--ion-color-medium, #92949c);font-size:.8125rem;font-weight:700}.survey-response__step--active{border-color:var(--ion-color-primary);color:var(--ion-color-primary)}.survey-response__actions{display:flex;justify-content:flex-end;gap:8px}.survey-response__error{margin:0;color:var(--ion-color-danger);font-size:.875rem;font-weight:700}.survey-response__hint{display:block;margin-top:4px;font-size:.8125rem;color:var(--ion-color-medium, #92949c)}.survey-response__loading{display:block}\n"] }]
40009
40464
  }], ctorParameters: () => [], propDecorators: { props: [{
40010
40465
  type: Input
40011
40466
  }], submitted: [{
@@ -56538,456 +56993,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
56538
56993
  type: Output
56539
56994
  }] } });
56540
56995
 
56541
- /** Defaults de `rows` por preset cuando el consumer no lo especifica. */
56542
- const SKELETON_LAYOUT_DEFAULT_ROWS = {
56543
- form: 3,
56544
- list: 5,
56545
- article: 3,
56546
- cards: 4,
56547
- detail: 4,
56548
- hero: 3,
56549
- };
56550
-
56551
- /**
56552
- * `val-skeleton-layout`
56553
- *
56554
- * Skeleton de página **preset-driven**. En vez de que cada vista componga
56555
- * átomos `val-skeleton` a mano, declara una shape y este organism arma el
56556
- * placeholder completo. Estándar único para loading states en todo el factory.
56557
- *
56558
- * Presets: `form` · `list` · `article` · `cards` · `detail` · `hero`.
56559
- *
56560
- * Extender = agregar un valor a `SkeletonLayoutPreset` + un `@case` acá.
56561
- * Los consumers no cambian.
56562
- *
56563
- * @example
56564
- * ```html
56565
- * @if (loading()) {
56566
- * <val-skeleton-layout [props]="{ preset: 'form', rows: 3, showAvatar: true }" />
56567
- * } @else {
56568
- * ...contenido real...
56569
- * }
56570
- * ```
56571
- */
56572
- class SkeletonLayoutComponent {
56573
- constructor() {
56574
- this.props_ = signal({ preset: 'list' }, {
56575
- equal: (a, b) => a === b || JSON.stringify(a) === JSON.stringify(b),
56576
- });
56577
- /** Props con defaults aplicados. */
56578
- this.resolved = computed(() => this.props_());
56579
- /** Shimmer on/off — default on. */
56580
- this.anim = computed(() => this.resolved().animated !== false);
56581
- /** Array `[0..rows)` para los `@for`. rows del prop o default del preset. */
56582
- this.rowsArray = computed(() => {
56583
- const p = this.resolved();
56584
- const preset = p.preset;
56585
- const count = p.rows && p.rows > 0 ? Math.floor(p.rows) : SKELETON_LAYOUT_DEFAULT_ROWS[preset];
56586
- return Array.from({ length: count }, (_, i) => i);
56587
- });
56588
- /** True si el consumer fijó `columns` explícito → manda su grid (inline).
56589
- * Si no, el preset cards usa el grid responsive mobile-first (.sk-cards--auto). */
56590
- this.hasExplicitColumns = computed(() => this.resolved().columns != null);
56591
- /** `grid-template-columns` para el preset cards con `columns` explícito. */
56592
- this.gridColumns = computed(() => {
56593
- const cols = this.resolved().columns ?? 2;
56594
- return `repeat(${Math.max(1, cols)}, 1fr)`;
56595
- });
56596
- }
56597
- set props(value) {
56598
- if (value)
56599
- this.props_.set(value);
56600
- }
56601
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SkeletonLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
56602
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SkeletonLayoutComponent, isStandalone: true, selector: "val-skeleton-layout", inputs: { props: "props" }, ngImport: i0, template: `
56603
- <div class="val-skeleton-layout" [class]="resolved().cssClass || ''" aria-busy="true" aria-live="polite">
56604
- @switch (resolved().preset) {
56605
- <!-- FORM — avatar opcional + N fields (label+input) + botón -->
56606
- @case ('form') {
56607
- @if (resolved().showAvatar) {
56608
- <div class="sk-form__avatar">
56609
- <val-skeleton
56610
- [props]="{
56611
- type: 'avatar',
56612
- width: '96px',
56613
- height: '96px',
56614
- circle: true,
56615
- animated: anim(),
56616
- }"
56617
- />
56618
- <div class="sk-form__avatar-meta">
56619
- <val-skeleton
56620
- [props]="{
56621
- type: 'text',
56622
- width: '150px',
56623
- height: '18px',
56624
- animated: anim(),
56625
- }"
56626
- />
56627
- <val-skeleton
56628
- [props]="{
56629
- type: 'text',
56630
- width: '190px',
56631
- height: '13px',
56632
- animated: anim(),
56633
- }"
56634
- />
56635
- <val-skeleton
56636
- [props]="{
56637
- type: 'text',
56638
- width: '110px',
56639
- height: '13px',
56640
- animated: anim(),
56641
- }"
56642
- />
56643
- </div>
56644
- </div>
56645
- }
56646
- <div class="sk-form__fields">
56647
- @for (i of rowsArray(); track i) {
56648
- <div class="sk-form__field">
56649
- <val-skeleton
56650
- [props]="{
56651
- type: 'text',
56652
- width: '90px',
56653
- height: '13px',
56654
- animated: anim(),
56655
- }"
56656
- />
56657
- <val-skeleton
56658
- [props]="{
56659
- type: 'custom',
56660
- width: '100%',
56661
- height: '48px',
56662
- borderRadius: '12px',
56663
- animated: anim(),
56664
- }"
56665
- />
56666
- </div>
56667
- }
56668
- @if (resolved().showButton !== false) {
56669
- <val-skeleton
56670
- [props]="{
56671
- type: 'custom',
56672
- width: '100%',
56673
- height: '48px',
56674
- borderRadius: '24px',
56675
- animated: anim(),
56676
- }"
56677
- />
56678
- }
56679
- </div>
56680
- }
56681
-
56682
- <!-- LIST — N filas list-item (el átomo ya trae icono + 2 líneas) -->
56683
- @case ('list') {
56684
- <div class="sk-list">
56685
- @for (i of rowsArray(); track i) {
56686
- <val-skeleton [props]="{ type: 'list-item', animated: anim() }" />
56687
- }
56688
- </div>
56689
- }
56690
-
56691
- <!-- ARTICLE — título + meta + párrafos -->
56692
- @case ('article') {
56693
- <div class="sk-article">
56694
- @if (resolved().showTitle !== false) {
56695
- <val-skeleton
56696
- [props]="{
56697
- type: 'text',
56698
- width: '70%',
56699
- height: '30px',
56700
- animated: anim(),
56701
- }"
56702
- />
56703
- <val-skeleton
56704
- [props]="{
56705
- type: 'text',
56706
- width: '40%',
56707
- height: '14px',
56708
- animated: anim(),
56709
- }"
56710
- />
56711
- }
56712
- @for (i of rowsArray(); track i) {
56713
- <val-skeleton [props]="{ type: 'paragraph', lines: 4, animated: anim() }" />
56714
- }
56715
- </div>
56716
- }
56717
-
56718
- <!-- CARDS — grid de N card blocks -->
56719
- @case ('cards') {
56720
- <!-- Sin columns explícito, grid responsive mobile-first (1 col en
56721
- mobile, 2 en 640, 3 en 960) que espeja el grid estandar de las
56722
- vistas del factory. Con columns explícito, el consumer manda
56723
- (inline). Antes era fijo a 2 columnas, apretado en mobile. -->
56724
- <div
56725
- class="sk-cards"
56726
- [class.sk-cards--auto]="!hasExplicitColumns()"
56727
- [style.grid-template-columns]="hasExplicitColumns() ? gridColumns() : null"
56728
- >
56729
- @for (i of rowsArray(); track i) {
56730
- <val-skeleton [props]="{ type: 'card', animated: anim() }" />
56731
- }
56732
- </div>
56733
- }
56734
-
56735
- <!-- DETAIL — N filas key-value -->
56736
- @case ('detail') {
56737
- <div class="sk-detail">
56738
- @for (i of rowsArray(); track i) {
56739
- <div class="sk-detail__row">
56740
- <val-skeleton
56741
- [props]="{
56742
- type: 'text',
56743
- width: '110px',
56744
- height: '14px',
56745
- animated: anim(),
56746
- }"
56747
- />
56748
- <val-skeleton
56749
- [props]="{
56750
- type: 'text',
56751
- width: '160px',
56752
- height: '14px',
56753
- animated: anim(),
56754
- }"
56755
- />
56756
- </div>
56757
- }
56758
- </div>
56759
- }
56760
-
56761
- <!-- HERO — banner grande + filas de contenido -->
56762
- @case ('hero') {
56763
- <div class="sk-hero">
56764
- @if (resolved().showTitle !== false) {
56765
- <val-skeleton
56766
- [props]="{
56767
- type: 'custom',
56768
- width: '100%',
56769
- height: '140px',
56770
- borderRadius: '20px',
56771
- animated: anim(),
56772
- }"
56773
- />
56774
- }
56775
- <div class="sk-hero__rows">
56776
- @for (i of rowsArray(); track i) {
56777
- <val-skeleton
56778
- [props]="{
56779
- type: 'custom',
56780
- width: '100%',
56781
- height: '72px',
56782
- borderRadius: '14px',
56783
- animated: anim(),
56784
- }"
56785
- />
56786
- }
56787
- </div>
56788
- </div>
56789
- }
56790
- }
56791
- </div>
56792
- `, isInline: true, styles: [":host{display:block;width:100%}.val-skeleton-layout{width:100%}.sk-form__avatar{display:flex;align-items:center;gap:16px;padding:16px 0}.sk-form__avatar-meta{display:flex;flex-direction:column;gap:8px}.sk-form__fields{padding:16px 0;display:flex;flex-direction:column;gap:18px}.sk-form__field{display:flex;flex-direction:column;gap:8px}.sk-list{display:flex;flex-direction:column;gap:10px;padding:8px 0}.sk-article{display:flex;flex-direction:column;gap:16px;padding:8px 0}.sk-cards{display:grid;gap:12px;padding:8px 0}.sk-cards--auto{grid-template-columns:1fr}@media (min-width: 640px){.sk-cards--auto{grid-template-columns:repeat(2,1fr)}}@media (min-width: 960px){.sk-cards--auto{grid-template-columns:repeat(3,1fr)}}.sk-detail{display:flex;flex-direction:column;gap:14px;padding:8px 0}.sk-detail__row{display:flex;align-items:center;justify-content:space-between;gap:16px}.sk-hero{display:flex;flex-direction:column;gap:16px;padding:8px 0}.sk-hero__rows{display:flex;flex-direction:column;gap:12px}\n"], dependencies: [{ kind: "component", type: SkeletonComponent, selector: "val-skeleton", inputs: ["props"] }] }); }
56793
- }
56794
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SkeletonLayoutComponent, decorators: [{
56795
- type: Component,
56796
- args: [{ selector: 'val-skeleton-layout', standalone: true, imports: [SkeletonComponent], template: `
56797
- <div class="val-skeleton-layout" [class]="resolved().cssClass || ''" aria-busy="true" aria-live="polite">
56798
- @switch (resolved().preset) {
56799
- <!-- FORM — avatar opcional + N fields (label+input) + botón -->
56800
- @case ('form') {
56801
- @if (resolved().showAvatar) {
56802
- <div class="sk-form__avatar">
56803
- <val-skeleton
56804
- [props]="{
56805
- type: 'avatar',
56806
- width: '96px',
56807
- height: '96px',
56808
- circle: true,
56809
- animated: anim(),
56810
- }"
56811
- />
56812
- <div class="sk-form__avatar-meta">
56813
- <val-skeleton
56814
- [props]="{
56815
- type: 'text',
56816
- width: '150px',
56817
- height: '18px',
56818
- animated: anim(),
56819
- }"
56820
- />
56821
- <val-skeleton
56822
- [props]="{
56823
- type: 'text',
56824
- width: '190px',
56825
- height: '13px',
56826
- animated: anim(),
56827
- }"
56828
- />
56829
- <val-skeleton
56830
- [props]="{
56831
- type: 'text',
56832
- width: '110px',
56833
- height: '13px',
56834
- animated: anim(),
56835
- }"
56836
- />
56837
- </div>
56838
- </div>
56839
- }
56840
- <div class="sk-form__fields">
56841
- @for (i of rowsArray(); track i) {
56842
- <div class="sk-form__field">
56843
- <val-skeleton
56844
- [props]="{
56845
- type: 'text',
56846
- width: '90px',
56847
- height: '13px',
56848
- animated: anim(),
56849
- }"
56850
- />
56851
- <val-skeleton
56852
- [props]="{
56853
- type: 'custom',
56854
- width: '100%',
56855
- height: '48px',
56856
- borderRadius: '12px',
56857
- animated: anim(),
56858
- }"
56859
- />
56860
- </div>
56861
- }
56862
- @if (resolved().showButton !== false) {
56863
- <val-skeleton
56864
- [props]="{
56865
- type: 'custom',
56866
- width: '100%',
56867
- height: '48px',
56868
- borderRadius: '24px',
56869
- animated: anim(),
56870
- }"
56871
- />
56872
- }
56873
- </div>
56874
- }
56875
-
56876
- <!-- LIST — N filas list-item (el átomo ya trae icono + 2 líneas) -->
56877
- @case ('list') {
56878
- <div class="sk-list">
56879
- @for (i of rowsArray(); track i) {
56880
- <val-skeleton [props]="{ type: 'list-item', animated: anim() }" />
56881
- }
56882
- </div>
56883
- }
56884
-
56885
- <!-- ARTICLE — título + meta + párrafos -->
56886
- @case ('article') {
56887
- <div class="sk-article">
56888
- @if (resolved().showTitle !== false) {
56889
- <val-skeleton
56890
- [props]="{
56891
- type: 'text',
56892
- width: '70%',
56893
- height: '30px',
56894
- animated: anim(),
56895
- }"
56896
- />
56897
- <val-skeleton
56898
- [props]="{
56899
- type: 'text',
56900
- width: '40%',
56901
- height: '14px',
56902
- animated: anim(),
56903
- }"
56904
- />
56905
- }
56906
- @for (i of rowsArray(); track i) {
56907
- <val-skeleton [props]="{ type: 'paragraph', lines: 4, animated: anim() }" />
56908
- }
56909
- </div>
56910
- }
56911
-
56912
- <!-- CARDS — grid de N card blocks -->
56913
- @case ('cards') {
56914
- <!-- Sin columns explícito, grid responsive mobile-first (1 col en
56915
- mobile, 2 en 640, 3 en 960) que espeja el grid estandar de las
56916
- vistas del factory. Con columns explícito, el consumer manda
56917
- (inline). Antes era fijo a 2 columnas, apretado en mobile. -->
56918
- <div
56919
- class="sk-cards"
56920
- [class.sk-cards--auto]="!hasExplicitColumns()"
56921
- [style.grid-template-columns]="hasExplicitColumns() ? gridColumns() : null"
56922
- >
56923
- @for (i of rowsArray(); track i) {
56924
- <val-skeleton [props]="{ type: 'card', animated: anim() }" />
56925
- }
56926
- </div>
56927
- }
56928
-
56929
- <!-- DETAIL — N filas key-value -->
56930
- @case ('detail') {
56931
- <div class="sk-detail">
56932
- @for (i of rowsArray(); track i) {
56933
- <div class="sk-detail__row">
56934
- <val-skeleton
56935
- [props]="{
56936
- type: 'text',
56937
- width: '110px',
56938
- height: '14px',
56939
- animated: anim(),
56940
- }"
56941
- />
56942
- <val-skeleton
56943
- [props]="{
56944
- type: 'text',
56945
- width: '160px',
56946
- height: '14px',
56947
- animated: anim(),
56948
- }"
56949
- />
56950
- </div>
56951
- }
56952
- </div>
56953
- }
56954
-
56955
- <!-- HERO — banner grande + filas de contenido -->
56956
- @case ('hero') {
56957
- <div class="sk-hero">
56958
- @if (resolved().showTitle !== false) {
56959
- <val-skeleton
56960
- [props]="{
56961
- type: 'custom',
56962
- width: '100%',
56963
- height: '140px',
56964
- borderRadius: '20px',
56965
- animated: anim(),
56966
- }"
56967
- />
56968
- }
56969
- <div class="sk-hero__rows">
56970
- @for (i of rowsArray(); track i) {
56971
- <val-skeleton
56972
- [props]="{
56973
- type: 'custom',
56974
- width: '100%',
56975
- height: '72px',
56976
- borderRadius: '14px',
56977
- animated: anim(),
56978
- }"
56979
- />
56980
- }
56981
- </div>
56982
- </div>
56983
- }
56984
- }
56985
- </div>
56986
- `, styles: [":host{display:block;width:100%}.val-skeleton-layout{width:100%}.sk-form__avatar{display:flex;align-items:center;gap:16px;padding:16px 0}.sk-form__avatar-meta{display:flex;flex-direction:column;gap:8px}.sk-form__fields{padding:16px 0;display:flex;flex-direction:column;gap:18px}.sk-form__field{display:flex;flex-direction:column;gap:8px}.sk-list{display:flex;flex-direction:column;gap:10px;padding:8px 0}.sk-article{display:flex;flex-direction:column;gap:16px;padding:8px 0}.sk-cards{display:grid;gap:12px;padding:8px 0}.sk-cards--auto{grid-template-columns:1fr}@media (min-width: 640px){.sk-cards--auto{grid-template-columns:repeat(2,1fr)}}@media (min-width: 960px){.sk-cards--auto{grid-template-columns:repeat(3,1fr)}}.sk-detail{display:flex;flex-direction:column;gap:14px;padding:8px 0}.sk-detail__row{display:flex;align-items:center;justify-content:space-between;gap:16px}.sk-hero{display:flex;flex-direction:column;gap:16px;padding:8px 0}.sk-hero__rows{display:flex;flex-direction:column;gap:12px}\n"] }]
56987
- }], propDecorators: { props: [{
56988
- type: Input
56989
- }] } });
56990
-
56991
56996
  /**
56992
56997
  * PageRefreshService — bus del pull-to-refresh estándar del factory.
56993
56998
  *