easy-forms-core 1.1.12 → 1.1.14

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.
@@ -273,6 +273,10 @@ interface GroupField extends BaseField {
273
273
  fields: Field[];
274
274
  /** Dirección del layout del grupo (override del formulario) */
275
275
  direction?: 'vertical' | 'horizontal';
276
+ /** Si true, el grupo se puede colapsar como acordeón */
277
+ collapsible?: boolean;
278
+ /** Si collapsible, estado inicial: true = abierto, false = cerrado (default: true) */
279
+ defaultOpen?: boolean;
276
280
  }
277
281
  /**
278
282
  * Campo row
@@ -365,6 +369,12 @@ interface FormColors {
365
369
  labelColor?: string;
366
370
  border?: string;
367
371
  background?: string;
372
+ /** Fondo del contenedor .easy-form-group */
373
+ groupBackground?: string;
374
+ /** Color del título .easy-form-group-label */
375
+ groupTitle?: string;
376
+ /** Color del borde .easy-form-group */
377
+ groupBorder?: string;
368
378
  }
369
379
  /**
370
380
  * Template names available
package/dist/easy-form.js CHANGED
@@ -238,7 +238,10 @@ var defaultColors = {
238
238
  text: "#212529",
239
239
  labelColor: "#212529",
240
240
  border: "#ddd",
241
- background: "#ffffff"
241
+ background: "#ffffff",
242
+ groupBackground: "#f8f9fa",
243
+ groupTitle: "#212529",
244
+ groupBorder: "#ddd"
242
245
  };
243
246
  function getColors(colors) {
244
247
  return { ...defaultColors, ...colors };
@@ -260,6 +263,9 @@ function getBaseStyles(colors) {
260
263
  --easy-form-label-color: ${colors.labelColor};
261
264
  --easy-form-border: ${colors.border};
262
265
  --easy-form-background: ${colors.background};
266
+ --easy-form-group-background: ${colors.groupBackground};
267
+ --easy-form-group-title: ${colors.groupTitle};
268
+ --easy-form-group-border: ${colors.groupBorder};
263
269
  }
264
270
  .easy-form-field {
265
271
  margin-bottom: 1rem;
@@ -515,6 +521,60 @@ function getBaseStyles(colors) {
515
521
  .easy-form-group {
516
522
  padding: 1rem;
517
523
  margin-bottom: 1rem;
524
+ background: var(--easy-form-group-background);
525
+ border: 1px solid var(--easy-form-group-border);
526
+ border-radius: 4px;
527
+ }
528
+ .easy-form-group-label {
529
+ color: var(--easy-form-group-title);
530
+ font-weight: 600;
531
+ font-size: 1rem;
532
+ margin-bottom: 0.75rem;
533
+ margin-top: 0;
534
+ }
535
+ .easy-form-group-collapsible {
536
+ border: 1px solid var(--easy-form-group-border);
537
+ border-radius: 4px;
538
+ overflow: hidden;
539
+ }
540
+ .easy-form-group-collapsible .easy-form-group-header {
541
+ display: flex;
542
+ align-items: center;
543
+ justify-content: space-between;
544
+ padding: 0.75rem 1rem;
545
+ cursor: pointer;
546
+ background: var(--easy-form-group-background);
547
+ color: var(--easy-form-group-title);
548
+ font-weight: 600;
549
+ font-size: 1rem;
550
+ user-select: none;
551
+ transition: background-color 0.2s ease;
552
+ }
553
+ .easy-form-group-collapsible .easy-form-group-header:hover {
554
+ background: rgba(0, 0, 0, 0.03);
555
+ }
556
+ .easy-form-group-collapsible .easy-form-group-header:focus {
557
+ outline: none;
558
+ box-shadow: inset 0 0 0 2px var(--easy-form-primary);
559
+ }
560
+ .easy-form-group-collapsible .easy-form-group-chevron {
561
+ flex-shrink: 0;
562
+ margin-left: 0.5rem;
563
+ transition: transform 0.2s ease;
564
+ color: var(--easy-form-secondary);
565
+ }
566
+ .easy-form-group-collapsible.easy-form-group-collapsed .easy-form-group-chevron {
567
+ transform: rotate(-90deg); /* \u25BC \u2192 \u25B6 cuando colapsado */
568
+ }
569
+ .easy-form-group-collapsible .easy-form-group-content {
570
+ overflow: hidden;
571
+ transition: max-height 0.3s ease;
572
+ padding: 0 1rem 1rem 1rem;
573
+ }
574
+ .easy-form-group-collapsible.easy-form-group-collapsed .easy-form-group-content {
575
+ max-height: 0 !important;
576
+ padding-top: 0;
577
+ padding-bottom: 0;
518
578
  }
519
579
  .easy-form-row {
520
580
  display: flex;
@@ -1085,8 +1145,9 @@ function getPlanoStyles(_colors) {
1085
1145
  }
1086
1146
  .easy-form-group {
1087
1147
  border: none;
1088
- border-bottom: 1px solid var(--easy-form-border);
1148
+ border-bottom: 1px solid var(--easy-form-group-border);
1089
1149
  border-radius: 0;
1150
+ background: transparent;
1090
1151
  }
1091
1152
  .easy-form-wizard-step {
1092
1153
  border: none;
@@ -1119,9 +1180,9 @@ function getTradicionalStyles(_colors) {
1119
1180
  font-weight: 500;
1120
1181
  }
1121
1182
  .easy-form-group {
1122
- border: 2px solid var(--easy-form-border);
1183
+ border: 2px solid var(--easy-form-group-border);
1123
1184
  border-radius: 4px;
1124
- background: #f8f9fa;
1185
+ background: var(--easy-form-group-background);
1125
1186
  }
1126
1187
  .easy-form-wizard-step {
1127
1188
  border: 2px solid var(--easy-form-border);
@@ -1171,7 +1232,7 @@ function getMaterialStyles(_colors) {
1171
1232
  .easy-form-group {
1172
1233
  border: none;
1173
1234
  border-radius: 4px;
1174
- background: #f5f5f5;
1235
+ background: var(--easy-form-group-background);
1175
1236
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);
1176
1237
  }
1177
1238
  .easy-form-wizard-step {
@@ -1213,10 +1274,10 @@ function getRoundedShadowStyles(_colors) {
1213
1274
  transform: translateY(-2px);
1214
1275
  }
1215
1276
  .easy-form-group {
1216
- border: 1px solid var(--easy-form-border);
1277
+ border: 1px solid var(--easy-form-group-border);
1217
1278
  border-radius: 16px;
1218
1279
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
1219
- background: var(--easy-form-background);
1280
+ background: var(--easy-form-group-background);
1220
1281
  }
1221
1282
  .easy-form-wizard-step {
1222
1283
  border: 1px solid var(--easy-form-border);
@@ -1267,9 +1328,10 @@ function getLinesStyles(_colors) {
1267
1328
  }
1268
1329
  .easy-form-group {
1269
1330
  border: none;
1270
- border-bottom: 2px solid var(--easy-form-border);
1331
+ border-bottom: 2px solid var(--easy-form-group-border);
1271
1332
  border-radius: 0;
1272
1333
  padding-bottom: 1rem;
1334
+ background: transparent;
1273
1335
  }
1274
1336
  .easy-form-wizard-step {
1275
1337
  border: none;
@@ -1344,9 +1406,9 @@ function getShadcnStyles(_colors) {
1344
1406
  box-shadow: 0 2px 8px rgba(0, 123, 255, 0.3);
1345
1407
  }
1346
1408
  .easy-form-group {
1347
- border: 1.5px solid #e4e4e7;
1409
+ border: 1.5px solid var(--easy-form-group-border);
1348
1410
  border-radius: 12px;
1349
- background: linear-gradient(to bottom, var(--easy-form-background), #fafafa);
1411
+ background: var(--easy-form-group-background);
1350
1412
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
1351
1413
  padding: 1.5rem;
1352
1414
  }
@@ -1441,9 +1503,9 @@ function getChakraStyles(_colors) {
1441
1503
  transform: none;
1442
1504
  }
1443
1505
  .easy-form-group {
1444
- border: 2px solid #e2e8f0;
1506
+ border: 2px solid var(--easy-form-group-border);
1445
1507
  border-radius: 8px;
1446
- background: var(--easy-form-background);
1508
+ background: var(--easy-form-group-background);
1447
1509
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
1448
1510
  }
1449
1511
  .easy-form-wizard-step {
@@ -1522,9 +1584,9 @@ function getMantineStyles(_colors) {
1522
1584
  box-shadow: 0 2px 8px rgba(0, 123, 255, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.2);
1523
1585
  }
1524
1586
  .easy-form-group {
1525
- border: 1px solid #dee2e6;
1587
+ border: 1px solid var(--easy-form-group-border);
1526
1588
  border-radius: 16px;
1527
- background: var(--easy-form-background);
1589
+ background: var(--easy-form-group-background);
1528
1590
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.8);
1529
1591
  padding: 1.5rem;
1530
1592
  }
@@ -1613,9 +1675,9 @@ function getGlassStyles(_colors) {
1613
1675
  transform: translateY(-1px) scale(0.98);
1614
1676
  }
1615
1677
  .easy-form-group {
1616
- border: 2px solid rgba(255, 255, 255, 0.4);
1678
+ border: 2px solid var(--easy-form-group-border);
1617
1679
  border-radius: 20px;
1618
- background: rgba(255, 255, 255, 0.15);
1680
+ background: var(--easy-form-group-background);
1619
1681
  backdrop-filter: blur(20px) saturate(180%);
1620
1682
  -webkit-backdrop-filter: blur(20px) saturate(180%);
1621
1683
  box-shadow: 0 16px 32px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.3);
@@ -1707,9 +1769,9 @@ function getBorderedStyles(_colors) {
1707
1769
  box-shadow: 2px 2px 0 rgba(0, 0, 0, 0.2);
1708
1770
  }
1709
1771
  .easy-form-group {
1710
- border: 4px solid #1a1a1a;
1772
+ border: 4px solid var(--easy-form-group-border);
1711
1773
  border-radius: 0;
1712
- background: var(--easy-form-background);
1774
+ background: var(--easy-form-group-background);
1713
1775
  box-shadow: 8px 8px 0 rgba(0, 0, 0, 0.1);
1714
1776
  padding: 2rem;
1715
1777
  }
@@ -1819,7 +1881,7 @@ function getMinimalStyles(_colors) {
1819
1881
  }
1820
1882
  .easy-form-group {
1821
1883
  border: none;
1822
- border-bottom: 1px solid #e5e7eb;
1884
+ border-bottom: 1px solid var(--easy-form-group-border);
1823
1885
  border-radius: 0;
1824
1886
  background: transparent;
1825
1887
  padding-bottom: 2rem;
@@ -6381,21 +6443,84 @@ var EasyForm = class extends BrowserHTMLElement {
6381
6443
  * Renderiza un grupo de campos
6382
6444
  */
6383
6445
  renderGroup(field) {
6384
- const groupContainer = document.createElement("div");
6385
6446
  const groupField = field;
6386
6447
  const dir = groupField.direction ?? "vertical";
6448
+ const collapsible = groupField.collapsible === true;
6449
+ const defaultOpen = groupField.defaultOpen !== false;
6450
+ const groupContainer = document.createElement("div");
6387
6451
  groupContainer.className = `easy-form-group easy-form-direction-${dir}`;
6388
- if (field.label) {
6389
- const label = document.createElement("h3");
6390
- label.className = "easy-form-group-label";
6391
- label.textContent = field.label;
6392
- groupContainer.appendChild(label);
6393
- }
6394
- if ("fields" in field && field.fields) {
6395
- for (const subField of field.fields) {
6396
- const fieldElement = this.renderField(subField);
6397
- if (fieldElement) {
6398
- groupContainer.appendChild(fieldElement);
6452
+ if (collapsible) {
6453
+ groupContainer.classList.add("easy-form-group-collapsible");
6454
+ if (!defaultOpen) {
6455
+ groupContainer.classList.add("easy-form-group-collapsed");
6456
+ }
6457
+ const header = document.createElement("button");
6458
+ header.type = "button";
6459
+ header.className = "easy-form-group-header";
6460
+ header.setAttribute("aria-expanded", String(defaultOpen));
6461
+ const groupContentId = `easy-form-group-${(field.name || "group").replace(/[^a-z0-9]/gi, "-")}-content`;
6462
+ header.setAttribute("aria-controls", groupContentId);
6463
+ const labelSpan = document.createElement("span");
6464
+ labelSpan.textContent = field.label || "Grupo";
6465
+ const chevron = document.createElement("span");
6466
+ chevron.className = "easy-form-group-chevron";
6467
+ chevron.setAttribute("aria-hidden", "true");
6468
+ chevron.textContent = "\u25BC";
6469
+ header.appendChild(labelSpan);
6470
+ header.appendChild(chevron);
6471
+ groupContainer.appendChild(header);
6472
+ const content = document.createElement("div");
6473
+ content.id = groupContentId;
6474
+ content.className = "easy-form-group-content";
6475
+ if ("fields" in field && field.fields) {
6476
+ for (const subField of field.fields) {
6477
+ const fieldElement = this.renderField(subField);
6478
+ if (fieldElement) {
6479
+ content.appendChild(fieldElement);
6480
+ }
6481
+ }
6482
+ }
6483
+ groupContainer.appendChild(content);
6484
+ const setContentHeight = (open) => {
6485
+ if (open) {
6486
+ content.style.maxHeight = content.scrollHeight + "px";
6487
+ } else {
6488
+ content.style.maxHeight = "0";
6489
+ }
6490
+ };
6491
+ if (defaultOpen) {
6492
+ requestAnimationFrame(() => setContentHeight(true));
6493
+ } else {
6494
+ content.style.maxHeight = "0";
6495
+ }
6496
+ header.addEventListener("click", () => {
6497
+ const isCollapsed = groupContainer.classList.contains("easy-form-group-collapsed");
6498
+ if (isCollapsed) {
6499
+ groupContainer.classList.remove("easy-form-group-collapsed");
6500
+ header.setAttribute("aria-expanded", "true");
6501
+ setContentHeight(true);
6502
+ } else {
6503
+ content.style.maxHeight = content.scrollHeight + "px";
6504
+ requestAnimationFrame(() => {
6505
+ groupContainer.classList.add("easy-form-group-collapsed");
6506
+ header.setAttribute("aria-expanded", "false");
6507
+ setContentHeight(false);
6508
+ });
6509
+ }
6510
+ });
6511
+ } else {
6512
+ if (field.label) {
6513
+ const label = document.createElement("h3");
6514
+ label.className = "easy-form-group-label";
6515
+ label.textContent = field.label;
6516
+ groupContainer.appendChild(label);
6517
+ }
6518
+ if ("fields" in field && field.fields) {
6519
+ for (const subField of field.fields) {
6520
+ const fieldElement = this.renderField(subField);
6521
+ if (fieldElement) {
6522
+ groupContainer.appendChild(fieldElement);
6523
+ }
6399
6524
  }
6400
6525
  }
6401
6526
  }