jupiter-dynamic-forms 1.16.3 → 1.16.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -607,11 +607,12 @@ class XBRLFormBuilder {
607
607
  };
608
608
  }
609
609
  /**
610
- * Build a form section from a presentation role
610
+ * Extract section title from role name (remove role number prefix)
611
+ * Handle missing role property gracefully by using role ID as fallback
611
612
  */
612
613
  static buildSectionFromRole(role, periodStartDate, periodEndDate, hypercubeData, language = "en", periodPreferences) {
613
- var _a;
614
- const title = this.extractRoleTitle(role.role);
614
+ var _a, _b;
615
+ const title = this.extractRoleTitle(role.role || role.id || "Unknown Role");
615
616
  const nonAbstractConcepts = this.getAllNonAbstractConcepts(role);
616
617
  const periodTypes = new Set(
617
618
  nonAbstractConcepts.filter((concept) => concept.periodType).map((concept) => concept.periodType)
@@ -634,6 +635,11 @@ class XBRLFormBuilder {
634
635
  }
635
636
  });
636
637
  }
638
+ if ((!hypercubeRole || !((_b = hypercubeRole.items) == null ? void 0 : _b.length)) && hypercubeData) {
639
+ conceptTrees.forEach(
640
+ (conceptTree) => this.applyCrossRoleDimensions(conceptTree, role.id, hypercubeData, language)
641
+ );
642
+ }
637
643
  return {
638
644
  id: role.id,
639
645
  title,
@@ -708,7 +714,9 @@ class XBRLFormBuilder {
708
714
  collapsed: level > 0,
709
715
  // Collapse nested levels by default
710
716
  abstract: concept.elementAbstract,
711
- periodType: concept.periodType
717
+ periodType: concept.periodType,
718
+ balance: concept.balance
719
+ // Pass through balance attribute from XBRL data
712
720
  };
713
721
  }
714
722
  /**
@@ -894,6 +902,73 @@ class XBRLFormBuilder {
894
902
  });
895
903
  return filtered;
896
904
  }
905
+ /**
906
+ * Find typed dimension members from another role that shares the same concept.
907
+ * Called when the current role has no hypercube dimensions.
908
+ * Returns typed member info only when EXACTLY ONE other role matches.
909
+ */
910
+ static findCrossRoleDimensions(conceptId, currentRoleId, hypercubeData, language = "en") {
911
+ var _a, _b;
912
+ const matchingRoles = [];
913
+ for (const role of hypercubeData.roles) {
914
+ if (role.roleId === currentRoleId)
915
+ continue;
916
+ for (const item2 of role.items) {
917
+ if (!((_a = item2.conceptIds) == null ? void 0 : _a.includes(conceptId)))
918
+ continue;
919
+ if (!((_b = item2.dimensions) == null ? void 0 : _b.some((d2) => d2.typedMember)))
920
+ continue;
921
+ matchingRoles.push(role);
922
+ break;
923
+ }
924
+ }
925
+ if (matchingRoles.length !== 1)
926
+ return null;
927
+ const matchingRole = matchingRoles[0];
928
+ const item = matchingRole.items.find((i2) => {
929
+ var _a2;
930
+ return (_a2 = i2.conceptIds) == null ? void 0 : _a2.includes(conceptId);
931
+ });
932
+ if (!item)
933
+ return null;
934
+ const result = [];
935
+ for (const dimension of item.dimensions) {
936
+ if (!dimension.typedMember)
937
+ continue;
938
+ const labelObj = dimension.labels.find((l2) => l2.lang === language) || dimension.labels.find((l2) => l2.lang === "en") || dimension.labels[0];
939
+ const axisLabel = (labelObj == null ? void 0 : labelObj.label) || dimension.id;
940
+ result.push({
941
+ axisId: dimension.id,
942
+ axisLabel,
943
+ typedMemberId: dimension.typedMember.id,
944
+ memberLabel: axisLabel
945
+ });
946
+ }
947
+ return result.length > 0 ? result : null;
948
+ }
949
+ /**
950
+ * Recursively walk a concept tree and set crossRoleTypedMembers on every field
951
+ * whose concept appears in exactly one other hypercube role with typed dimensions.
952
+ */
953
+ static applyCrossRoleDimensions(conceptTree, currentRoleId, hypercubeData, language) {
954
+ var _a;
955
+ if (!conceptTree.abstract && conceptTree.fields && conceptTree.fields.length > 0) {
956
+ const crossRoleTypedMembers = this.findCrossRoleDimensions(
957
+ conceptTree.originalConceptId,
958
+ currentRoleId,
959
+ hypercubeData,
960
+ language
961
+ );
962
+ if (crossRoleTypedMembers) {
963
+ conceptTree.fields.forEach((field2) => {
964
+ field2.crossRoleTypedMembers = crossRoleTypedMembers;
965
+ });
966
+ }
967
+ }
968
+ (_a = conceptTree.children) == null ? void 0 : _a.forEach(
969
+ (child) => this.applyCrossRoleDimensions(child, currentRoleId, hypercubeData, language)
970
+ );
971
+ }
897
972
  /**
898
973
  * Generate default columns based on period types of non-abstract concepts in a role
899
974
  */
@@ -1473,10 +1548,21 @@ class XBRLFormBuilder {
1473
1548
  }
1474
1549
  /**
1475
1550
  * Extract role title from role string
1551
+ * Handles various role formats and missing data gracefully
1476
1552
  */
1477
1553
  static extractRoleTitle(role) {
1554
+ if (!role)
1555
+ return "Unnamed Section";
1478
1556
  const match = role.match(/^\[[\d]+\]\s*(.+)$/);
1479
- return match ? match[1].trim() : role;
1557
+ if (match) {
1558
+ return match[1].trim();
1559
+ }
1560
+ if (role.match(/^[a-z]+:[^:]*$/i) || role.match(/^urn:[^:]+:[^:]+/i)) {
1561
+ const parts = role.split(/[:\-]/);
1562
+ const lastPart = parts[parts.length - 1];
1563
+ return lastPart.replace(/[_\-]/g, " ").replace(/\b\w/g, (l2) => l2.toUpperCase());
1564
+ }
1565
+ return role.trim() || "Unnamed Section";
1480
1566
  }
1481
1567
  /**
1482
1568
  * Extract role order from role string
@@ -2024,7 +2110,7 @@ class DraftStorageService {
2024
2110
  /**
2025
2111
  * Create metadata snapshot from current form state
2026
2112
  */
2027
- createMetadataSnapshot(periodStartDate, periodEndDate, language, selectedRoleIds, allSections, typedMemberData, periodPreferences, periodData, unitData, reportingLanguage = "en") {
2113
+ createMetadataSnapshot(periodStartDate, periodEndDate, language, selectedRoleIds, allSections, typedMemberData, periodPreferences, periodData, unitData, reportingLanguage = "en", repeatCounts) {
2028
2114
  return {
2029
2115
  periodStartDate,
2030
2116
  periodEndDate,
@@ -2037,6 +2123,7 @@ class DraftStorageService {
2037
2123
  periodPreferences,
2038
2124
  periodData,
2039
2125
  unitData,
2126
+ repeatCounts,
2040
2127
  schemaVersion: this.STORAGE_VERSION
2041
2128
  };
2042
2129
  }
@@ -2646,7 +2733,6 @@ function getInputTypeForConceptType(conceptType, datatypes) {
2646
2733
  const baseTypeChain = resolveBaseTypeChain(conceptType, datatypes);
2647
2734
  if (baseTypeChain.length > 0) {
2648
2735
  const config = determineInputTypeFromBaseChain(baseTypeChain, datatypes);
2649
- console.log(`🔍 [Type Resolution] ${conceptType} → Chain:`, baseTypeChain, "→ Type:", config.fieldType, config.enumerations ? `(${config.enumerations.length} options)` : "");
2650
2736
  return config;
2651
2737
  }
2652
2738
  }
@@ -2903,6 +2989,7 @@ let JupiterFormField = class extends LitElement {
2903
2989
  this.locale = "en-US";
2904
2990
  this.hideLabel = false;
2905
2991
  this.mode = "inputForm";
2992
+ this.typedMemberValues = {};
2906
2993
  this._errors = [];
2907
2994
  this._xbrlErrors = [];
2908
2995
  this._touched = false;
@@ -3241,6 +3328,20 @@ let JupiterFormField = class extends LitElement {
3241
3328
  periodType: this.field.periodType
3242
3329
  });
3243
3330
  }
3331
+ _handleCrossRoleTypedMemberChange(event, axisId) {
3332
+ const value = event.target.value;
3333
+ this.typedMemberValues = { ...this.typedMemberValues, [axisId]: value };
3334
+ this.dispatchEvent(new CustomEvent("typed-member-change", {
3335
+ detail: {
3336
+ columnId: this.columnId,
3337
+ conceptId: this.conceptId,
3338
+ axisId,
3339
+ value
3340
+ },
3341
+ bubbles: true,
3342
+ composed: true
3343
+ }));
3344
+ }
3244
3345
  /**
3245
3346
  * Renders a plain text label for readonly mode instead of an interactive input.
3246
3347
  * Resolves the display value for selects (shows label, not raw id) and
@@ -3498,6 +3599,21 @@ let JupiterFormField = class extends LitElement {
3498
3599
  </select>
3499
3600
  </div>
3500
3601
  ` : ""}
3602
+
3603
+ ${this.field.crossRoleTypedMembers && this.field.crossRoleTypedMembers.length > 0 ? html`
3604
+ ${this.field.crossRoleTypedMembers.map((tm) => html`
3605
+ <div class="period-controls">
3606
+ <label>${tm.axisLabel}:</label>
3607
+ <input
3608
+ type="text"
3609
+ class="typed-member-input"
3610
+ .value="${this.typedMemberValues[tm.axisId] || ""}"
3611
+ @input="${(e2) => this._handleCrossRoleTypedMemberChange(e2, tm.axisId)}"
3612
+ ?disabled="${this.disabled}"
3613
+ />
3614
+ </div>
3615
+ `)}
3616
+ ` : ""}
3501
3617
  </div>
3502
3618
  </div>
3503
3619
  </div>
@@ -3686,7 +3802,7 @@ JupiterFormField.styles = css`
3686
3802
  border-radius: 8px;
3687
3803
  padding: 24px;
3688
3804
  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
3689
- max-width: 400px;
3805
+ max-width: 800px;
3690
3806
  width: 90%;
3691
3807
  }
3692
3808
 
@@ -3730,7 +3846,7 @@ JupiterFormField.styles = css`
3730
3846
 
3731
3847
  .period-popup-content .period-controls {
3732
3848
  display: grid;
3733
- grid-template-columns: 60px 1fr;
3849
+ grid-template-columns: 200px 1fr;
3734
3850
  gap: 12px;
3735
3851
  align-items: center;
3736
3852
  margin-top: 0;
@@ -3741,6 +3857,8 @@ JupiterFormField.styles = css`
3741
3857
  font-weight: 500;
3742
3858
  color: var(--jupiter-text-primary, #333);
3743
3859
  text-align: right;
3860
+ white-space: normal;
3861
+ word-break: break-word;
3744
3862
  }
3745
3863
 
3746
3864
  .period-popup-content .period-controls input[type="date"] {
@@ -3778,22 +3896,44 @@ JupiterFormField.styles = css`
3778
3896
  cursor: not-allowed;
3779
3897
  }
3780
3898
 
3899
+ .period-popup-content .period-controls .typed-member-input {
3900
+ flex: 1;
3901
+ padding: 6px 8px;
3902
+ border: 1px solid var(--jupiter-border-color, #ddd);
3903
+ border-radius: 4px;
3904
+ font-size: 13px;
3905
+ font-family: inherit;
3906
+ background: var(--jupiter-input-background, #fff);
3907
+ }
3908
+
3909
+ .period-popup-content .period-controls .typed-member-input:focus {
3910
+ outline: none;
3911
+ border-color: var(--jupiter-primary-color, #1976d2);
3912
+ box-shadow: 0 0 0 2px var(--jupiter-primary-color-light, rgba(25, 118, 210, 0.2));
3913
+ }
3914
+
3915
+ .period-popup-content .period-controls .typed-member-input:disabled {
3916
+ background: var(--jupiter-disabled-background, #f5f5f5);
3917
+ color: var(--jupiter-disabled-text, #999);
3918
+ cursor: not-allowed;
3919
+ }
3920
+
3781
3921
  .field-input {
3782
3922
  width: 100%;
3783
3923
  padding: 6px 8px; /* Reduced padding for table cells */
3784
- border: 1px solid var(--jupiter-border-color, #ddd);
3924
+ border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));
3785
3925
  border-radius: 4px;
3786
3926
  font-size: 13px; /* Slightly smaller font for table */
3787
3927
  font-family: inherit;
3788
- background: var(--jupiter-input-background, #fff);
3789
- color: var(--jupiter-text-primary, #333);
3928
+ background: transparent !important;
3929
+ color: var(--primaryTextColor, var(--jupiter-text-primary, #333));
3790
3930
  box-sizing: border-box;
3791
3931
  }
3792
3932
 
3793
3933
  .field-input:focus {
3794
3934
  outline: none;
3795
- border-color: var(--jupiter-primary-color, #1976d2);
3796
- box-shadow: 0 0 0 2px var(--jupiter-primary-color-light, rgba(25, 118, 210, 0.2));
3935
+ border-color: var(--primaryTextColor, var(--jupiter-primary-color, #1976d2));
3936
+ box-shadow: 0 0 0 2px var(--boxShadowColor, var(--jupiter-primary-color-light, rgba(25, 118, 210, 0.2)));
3797
3937
  }
3798
3938
 
3799
3939
  .field-input:disabled {
@@ -3964,6 +4104,9 @@ __decorateClass$5([
3964
4104
  __decorateClass$5([
3965
4105
  n2({ type: String })
3966
4106
  ], JupiterFormField.prototype, "unit", 2);
4107
+ __decorateClass$5([
4108
+ n2({ type: Object })
4109
+ ], JupiterFormField.prototype, "typedMemberValues", 2);
3967
4110
  __decorateClass$5([
3968
4111
  r()
3969
4112
  ], JupiterFormField.prototype, "_errors", 2);
@@ -4005,6 +4148,9 @@ let JupiterConceptTree = class extends LitElement {
4005
4148
  this.locale = "en-US";
4006
4149
  this.expandedConcepts = /* @__PURE__ */ new Set();
4007
4150
  this.mode = "inputForm";
4151
+ this.typedMemberData = {};
4152
+ this.showAddButton = false;
4153
+ this.showRemoveButton = false;
4008
4154
  this._expanded = true;
4009
4155
  }
4010
4156
  connectedCallback() {
@@ -4042,6 +4188,20 @@ let JupiterConceptTree = class extends LitElement {
4042
4188
  bubbles: true
4043
4189
  }));
4044
4190
  }
4191
+ _handleAddRepeat() {
4192
+ this.dispatchEvent(new CustomEvent("add-concept-repeat", {
4193
+ detail: { conceptId: this.concept.id },
4194
+ bubbles: true,
4195
+ composed: true
4196
+ }));
4197
+ }
4198
+ _handleRemoveRepeat() {
4199
+ this.dispatchEvent(new CustomEvent("remove-concept-repeat", {
4200
+ detail: { conceptId: this.concept.id },
4201
+ bubbles: true,
4202
+ composed: true
4203
+ }));
4204
+ }
4045
4205
  _handlePeriodChange(event) {
4046
4206
  console.log(`🌲 [ConceptTree] Received period-change event:`, event.detail);
4047
4207
  event.stopPropagation();
@@ -4066,11 +4226,22 @@ let JupiterConceptTree = class extends LitElement {
4066
4226
  @click="${this._toggleExpanded}">
4067
4227
  ${hasChildren ? "▶" : ""}
4068
4228
  </div>
4069
- <div class="concept-label"
4229
+ <div class="concept-label"
4070
4230
  @click="${this._toggleExpanded}"
4071
4231
  title="${this.concept.id}${this.concept.description ? " - " + this.concept.description : ""}">
4072
4232
  ${this.concept.label}
4073
4233
  </div>
4234
+ ${this.concept.balance ? html`
4235
+ <div class="concept-balance ${this.concept.balance}">${this.concept.balance}</div>
4236
+ ` : ""}
4237
+ ${this.showAddButton ? html`
4238
+ <button class="repeat-btn" type="button" title="Add row"
4239
+ @click="${this._handleAddRepeat}">+</button>
4240
+ ` : ""}
4241
+ ${this.showRemoveButton ? html`
4242
+ <button class="repeat-btn remove" type="button" title="Remove row"
4243
+ @click="${this._handleRemoveRepeat}">−</button>
4244
+ ` : ""}
4074
4245
  </div>
4075
4246
  </td>
4076
4247
 
@@ -4102,6 +4273,7 @@ let JupiterConceptTree = class extends LitElement {
4102
4273
  .masterData="${this.masterData}"
4103
4274
  .facts="${this.facts}"
4104
4275
  .column="${column2}"
4276
+ .typedMemberValues="${this.typedMemberData[`${this.concept.id}__${column2.id}`] || {}}"
4105
4277
  @field-change="${this._handleFieldChange}"
4106
4278
  @period-change="${this._handlePeriodChange}"
4107
4279
  ></jupiter-form-field>
@@ -4121,7 +4293,7 @@ JupiterConceptTree.styles = css`
4121
4293
  .concept-name-cell {
4122
4294
  vertical-align: top;
4123
4295
  padding: 2px 4px;
4124
- border: 1px solid var(--jupiter-border-color, #ddd);
4296
+ border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));
4125
4297
  border-bottom: none;
4126
4298
  background: var(--jupiter-concept-background, #f8f9fa);
4127
4299
  position: sticky;
@@ -4133,12 +4305,13 @@ JupiterConceptTree.styles = css`
4133
4305
  }
4134
4306
 
4135
4307
  .concept-name-cell.abstract {
4136
- background: var(--jupiter-abstract-background, #f0f2f5);
4308
+ background: var(--bg-color-1, var(--jupiter-abstract-background, #f0f2f5));
4137
4309
  font-weight: 600;
4310
+ color: var(--primaryTextColor, var(--jupiter-text-primary, #333));
4138
4311
  }
4139
4312
 
4140
4313
  .concept-name-cell.leaf {
4141
- background: var(--jupiter-leaf-background, #fff);
4314
+ background: var(--bg-color-2, var(--jupiter-leaf-background, #fff));
4142
4315
  font-weight: 400;
4143
4316
  }
4144
4317
 
@@ -4179,7 +4352,7 @@ JupiterConceptTree.styles = css`
4179
4352
 
4180
4353
  .concept-label {
4181
4354
  flex: 1;
4182
- color: var(--jupiter-text-primary, #333);
4355
+ color: var(--primaryTextColor, var(--jupiter-text-primary, #333));
4183
4356
  cursor: pointer;
4184
4357
  word-wrap: break-word;
4185
4358
  overflow-wrap: break-word;
@@ -4188,12 +4361,35 @@ JupiterConceptTree.styles = css`
4188
4361
  min-width: 0; /* Allows flex item to shrink below content size */
4189
4362
  }
4190
4363
 
4364
+ .concept-balance {
4365
+ margin-left: 8px;
4366
+ font-size: 11px;
4367
+ font-weight: 600;
4368
+ padding: 2px 6px;
4369
+ border-radius: 3px;
4370
+ text-transform: uppercase;
4371
+ letter-spacing: 0.5px;
4372
+ flex-shrink: 0;
4373
+ }
4374
+
4375
+ .concept-balance.debit {
4376
+ color: #d32f2f;
4377
+ background: rgba(211, 47, 47, 0.1);
4378
+ border: 1px solid rgba(211, 47, 47, 0.3);
4379
+ }
4380
+
4381
+ .concept-balance.credit {
4382
+ color: #388e3c;
4383
+ background: rgba(56, 142, 60, 0.1);
4384
+ border: 1px solid rgba(56, 142, 60, 0.3);
4385
+ }
4386
+
4191
4387
  .field-cell {
4192
4388
  vertical-align: middle;
4193
4389
  padding: 2px 6px;
4194
- border: 1px solid var(--jupiter-border-color, #ddd);
4390
+ border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));
4195
4391
  border-bottom: none;
4196
- background: var(--jupiter-cell-background, #fff);
4392
+ background: var(--bg-color-2, var(--jupiter-cell-background, #fff));
4197
4393
  min-height: 28px;
4198
4394
  text-align: center;
4199
4395
  min-width: 180px;
@@ -4201,11 +4397,11 @@ JupiterConceptTree.styles = css`
4201
4397
  }
4202
4398
 
4203
4399
  .field-cell.empty {
4204
- background: var(--jupiter-empty-cell-background, #f8f9fa);
4400
+ background: var(--bg-color-2, var(--jupiter-empty-cell-background, #f8f9fa));
4205
4401
  }
4206
4402
 
4207
4403
  .field-cell.abstract-row {
4208
- background: var(--jupiter-abstract-cell-background, #f0f2f5);
4404
+ background: var(--bg-color-2, var(--jupiter-abstract-cell-background, #f0f2f5));
4209
4405
  }
4210
4406
 
4211
4407
  /* Children are rendered as separate table rows, not nested */
@@ -4213,6 +4409,38 @@ JupiterConceptTree.styles = css`
4213
4409
  display: none;
4214
4410
  }
4215
4411
 
4412
+ .repeat-btn {
4413
+ flex-shrink: 0;
4414
+ margin-left: 4px;
4415
+ width: 20px;
4416
+ height: 20px;
4417
+ padding: 0;
4418
+ border-radius: 3px;
4419
+ border: 1px solid var(--jupiter-primary-color, #1976d2);
4420
+ color: var(--jupiter-primary-color, #1976d2);
4421
+ background: transparent;
4422
+ cursor: pointer;
4423
+ font-size: 14px;
4424
+ line-height: 1;
4425
+ display: flex;
4426
+ align-items: center;
4427
+ justify-content: center;
4428
+ }
4429
+
4430
+ .repeat-btn:hover {
4431
+ background: var(--jupiter-primary-color, #1976d2);
4432
+ color: #fff;
4433
+ }
4434
+
4435
+ .repeat-btn.remove {
4436
+ border-color: var(--jupiter-error-color, #d32f2f);
4437
+ color: var(--jupiter-error-color, #d32f2f);
4438
+ }
4439
+
4440
+ .repeat-btn.remove:hover {
4441
+ background: var(--jupiter-error-color, #d32f2f);
4442
+ color: #fff;
4443
+ }
4216
4444
 
4217
4445
  `;
4218
4446
  __decorateClass$4([
@@ -4254,6 +4482,15 @@ __decorateClass$4([
4254
4482
  __decorateClass$4([
4255
4483
  n2({ type: Array })
4256
4484
  ], JupiterConceptTree.prototype, "facts", 2);
4485
+ __decorateClass$4([
4486
+ n2({ type: Object })
4487
+ ], JupiterConceptTree.prototype, "typedMemberData", 2);
4488
+ __decorateClass$4([
4489
+ n2({ type: Boolean })
4490
+ ], JupiterConceptTree.prototype, "showAddButton", 2);
4491
+ __decorateClass$4([
4492
+ n2({ type: Boolean })
4493
+ ], JupiterConceptTree.prototype, "showRemoveButton", 2);
4257
4494
  __decorateClass$4([
4258
4495
  r()
4259
4496
  ], JupiterConceptTree.prototype, "_expanded", 2);
@@ -4575,7 +4812,7 @@ JupiterAddColumnDialog.styles = css`
4575
4812
  }
4576
4813
 
4577
4814
  .dialog {
4578
- background: white;
4815
+ background: var(--bg-color-2, var(--jupiter-card-background, #fff));
4579
4816
  border-radius: 8px;
4580
4817
  padding: 24px;
4581
4818
  min-width: 400px;
@@ -4600,7 +4837,7 @@ JupiterAddColumnDialog.styles = css`
4600
4837
  .dialog-title {
4601
4838
  font-size: 20px;
4602
4839
  font-weight: 600;
4603
- color: var(--jupiter-text-primary, #333);
4840
+ color: var(--primaryTextColor, var(--jupiter-text-primary, #333));
4604
4841
  margin: 0 0 8px 0;
4605
4842
  }
4606
4843
 
@@ -4634,7 +4871,7 @@ JupiterAddColumnDialog.styles = css`
4634
4871
  display: block;
4635
4872
  font-weight: 500;
4636
4873
  margin-bottom: 6px;
4637
- color: var(--jupiter-text-primary, #333);
4874
+ color: var(--primaryTextColor, var(--jupiter-text-primary, #333));
4638
4875
  font-size: 14px;
4639
4876
  }
4640
4877
 
@@ -4647,18 +4884,20 @@ JupiterAddColumnDialog.styles = css`
4647
4884
  width: 100%;
4648
4885
  box-sizing: border-box;
4649
4886
  padding: 10px 12px;
4650
- border: 1px solid var(--jupiter-border-color, #ddd);
4887
+ border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));
4651
4888
  border-radius: 4px;
4652
4889
  font-size: 14px;
4653
4890
  font-family: inherit;
4654
4891
  transition: border-color 0.2s ease;
4892
+ background-color: transparent;
4893
+ color: var(--primaryTextColor, var(--jupiter-text-primary, #333));
4655
4894
  }
4656
4895
 
4657
- .form-input:focus {
4658
- outline: none;
4659
- border-color: var(--jupiter-primary-color, #007bff);
4660
- box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);
4661
- }
4896
+ // .form-input:focus {
4897
+ // outline: none;
4898
+ // border-color: var(--jupiter-primary-color, #007bff);
4899
+ // box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);
4900
+ // }
4662
4901
 
4663
4902
  select.form-input {
4664
4903
  cursor: pointer;
@@ -4686,27 +4925,28 @@ JupiterAddColumnDialog.styles = css`
4686
4925
  }
4687
4926
 
4688
4927
  .btn-cancel {
4689
- background: var(--jupiter-neutral-background, #f5f5f5);
4690
- color: var(--jupiter-text-primary, #333);
4928
+ color: var(--buttonBgColor, var(--jupiter-primary-color, #1976d2));
4929
+ border: 1px solid var(--buttonBgColor, var(--jupiter-primary-color, #1976d2)) !important;
4930
+ background: transparent;
4691
4931
  }
4692
4932
 
4693
- .btn-cancel:hover {
4694
- background: var(--jupiter-neutral-background-hover, #e0e0e0);
4695
- }
4933
+ // .btn-cancel:hover {
4934
+ // background: var(--jupiter-neutral-background-hover, #e0e0e0);
4935
+ // }
4696
4936
 
4697
4937
  .btn-primary {
4698
- background: var(--jupiter-primary-color, #667eea);
4699
- color: white;
4938
+ background: var(--buttonBgColor, var(--jupiter-primary-color, #1976d2));
4939
+ color: var(--buttonTextColor, white);
4700
4940
  }
4701
4941
 
4702
- .btn-primary:hover {
4703
- background: var(--jupiter-primary-color-dark, #5a6fd8);
4704
- }
4942
+ // .btn-primary:hover {
4943
+ // background: var(--jupiter-primary-color-dark, #5a6fd8);
4944
+ // }
4705
4945
 
4706
- .btn-primary:disabled {
4707
- background: var(--jupiter-disabled-background, #ccc);
4708
- cursor: not-allowed;
4709
- }
4946
+ // .btn-primary:disabled {
4947
+ // background: var(--jupiter-disabled-background, #ccc);
4948
+ // cursor: not-allowed;
4949
+ // }
4710
4950
 
4711
4951
  /* Dimension Selection Styles */
4712
4952
  .dimensions-section {
@@ -4862,6 +5102,7 @@ let JupiterFormSection = class extends LitElement {
4862
5102
  this.periodData = {};
4863
5103
  this.unitData = {};
4864
5104
  this.typedMemberData = {};
5105
+ this.repeatCounts = {};
4865
5106
  this.defaultUnits = [];
4866
5107
  this.disabled = false;
4867
5108
  this.collapsible = true;
@@ -5122,6 +5363,70 @@ let JupiterFormSection = class extends LitElement {
5122
5363
  bubbles: true
5123
5364
  }));
5124
5365
  }
5366
+ _handleAddRepeat(event) {
5367
+ event.stopPropagation();
5368
+ this.dispatchEvent(new CustomEvent("add-concept-repeat", {
5369
+ detail: event.detail,
5370
+ bubbles: true
5371
+ }));
5372
+ }
5373
+ _handleRemoveRepeat(event) {
5374
+ event.stopPropagation();
5375
+ this.dispatchEvent(new CustomEvent("remove-concept-repeat", {
5376
+ detail: event.detail,
5377
+ bubbles: true
5378
+ }));
5379
+ }
5380
+ /** Build the list of <tr> template results for a single flattened concept, including any repeat instances. */
5381
+ _renderConceptRows(concept) {
5382
+ var _a;
5383
+ const isRepeatable = this.mode !== "readonly" && !concept.abstract && ((_a = concept.fields) == null ? void 0 : _a.some((f2) => {
5384
+ var _a2;
5385
+ return ((_a2 = f2.crossRoleTypedMembers) == null ? void 0 : _a2.length) > 0;
5386
+ }));
5387
+ const repeatCount = isRepeatable ? this.repeatCounts[concept.id] || 0 : 0;
5388
+ const sharedProps = (instanceConcept, opts) => html`
5389
+ <jupiter-concept-tree
5390
+ .concept="${instanceConcept}"
5391
+ .columns="${this.columns}"
5392
+ .datatypes="${this.datatypes}"
5393
+ .formData="${this.formData}"
5394
+ .periodData="${this.periodData}"
5395
+ .unitData="${this.unitData}"
5396
+ .defaultUnits="${this.defaultUnits}"
5397
+ .disabled="${this.disabled}"
5398
+ .locale="${this.locale}"
5399
+ .expandedConcepts="${this._expandedConcepts}"
5400
+ .mode="${this.mode}"
5401
+ .masterData="${this.masterData}"
5402
+ .facts="${instanceConcept.facts}"
5403
+ .typedMemberData="${this.typedMemberData}"
5404
+ .showAddButton="${opts.showAdd || false}"
5405
+ .showRemoveButton="${opts.showRemove || false}"
5406
+ @field-change="${this._handleFieldChange}"
5407
+ @period-change="${this._handlePeriodChange}"
5408
+ @concept-expand="${this._handleConceptExpand}"
5409
+ @add-concept-repeat="${this._handleAddRepeat}"
5410
+ @remove-concept-repeat="${this._handleRemoveRepeat}"
5411
+ ></jupiter-concept-tree>
5412
+ `;
5413
+ const rows = [html`
5414
+ <tr>${sharedProps(concept, { showAdd: isRepeatable })}</tr>
5415
+ `];
5416
+ for (let n3 = 1; n3 <= repeatCount; n3++) {
5417
+ const instanceConcept = {
5418
+ ...concept,
5419
+ id: `${concept.id}__repeat_${n3}`,
5420
+ label: "",
5421
+ children: [],
5422
+ abstract: false
5423
+ };
5424
+ rows.push(html`
5425
+ <tr>${sharedProps(instanceConcept, { showRemove: true })}</tr>
5426
+ `);
5427
+ }
5428
+ return rows;
5429
+ }
5125
5430
  render() {
5126
5431
  if (!this.section.concepts || this.section.concepts.length === 0) {
5127
5432
  return html`
@@ -5242,28 +5547,7 @@ let JupiterFormSection = class extends LitElement {
5242
5547
  </tr>
5243
5548
  </thead>
5244
5549
  <tbody class="table-body">
5245
- ${this._flattenConcepts(this.section.concepts, this._expandedConcepts).filter((concept) => this.mode !== "readonly" || !this._isConceptRowBlank(concept)).map((concept) => html`
5246
- <tr>
5247
- <jupiter-concept-tree
5248
- .concept="${concept}"
5249
- .columns="${this.columns}"
5250
- .datatypes="${this.datatypes}"
5251
- .formData="${this.formData}"
5252
- .periodData="${this.periodData}"
5253
- .unitData="${this.unitData}"
5254
- .defaultUnits="${this.defaultUnits}"
5255
- .disabled="${this.disabled}"
5256
- .locale="${this.locale}"
5257
- .expandedConcepts="${this._expandedConcepts}"
5258
- .mode="${this.mode}"
5259
- .masterData="${this.masterData}"
5260
- .facts="${concept.facts}"
5261
- @field-change="${this._handleFieldChange}"
5262
- @period-change="${this._handlePeriodChange}"
5263
- @concept-expand="${this._handleConceptExpand}"
5264
- ></jupiter-concept-tree>
5265
- </tr>
5266
- `)}
5550
+ ${this._flattenConcepts(this.section.concepts, this._expandedConcepts).filter((concept) => this.mode !== "readonly" || !this._isConceptRowBlank(concept)).flatMap((concept) => this._renderConceptRows(concept))}
5267
5551
  </tbody>
5268
5552
  </table>
5269
5553
  </div>
@@ -5384,13 +5668,20 @@ JupiterFormSection.styles = css`
5384
5668
  /* Table row - no special display needed */
5385
5669
  }
5386
5670
 
5671
+ .header-cell:first-child {
5672
+ border-radius: 6px 0 0 0;
5673
+ }
5674
+ .header-cell:last-child {
5675
+ border-radius: 0 6px 0 0;
5676
+ }
5677
+
5387
5678
  .header-cell {
5388
5679
  padding: 8px 12px;
5389
5680
  text-align: left;
5390
5681
  font-weight: 600;
5391
- color: var(--jupiter-text-primary, #333);
5392
- border: 1px solid var(--jupiter-border-color, #ddd);
5393
- background: var(--jupiter-header-background, #f8f9fa);
5682
+ color: var(--primaryTextColor, var(--jupiter-text-primary, #333));
5683
+ border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));
5684
+ background: var(--bg-color-1, var(--jupiter-header-background, #f8f9fa));
5394
5685
  min-width: 180px;
5395
5686
  width: 180px;
5396
5687
  font-size: 14px;
@@ -5562,6 +5853,9 @@ __decorateClass$2([
5562
5853
  __decorateClass$2([
5563
5854
  n2({ type: Object })
5564
5855
  ], JupiterFormSection.prototype, "typedMemberData", 2);
5856
+ __decorateClass$2([
5857
+ n2({ type: Object })
5858
+ ], JupiterFormSection.prototype, "repeatCounts", 2);
5565
5859
  __decorateClass$2([
5566
5860
  n2({ type: Array })
5567
5861
  ], JupiterFormSection.prototype, "defaultUnits", 2);
@@ -6594,24 +6888,25 @@ JupiterFilterRolesDialog.styles = css`
6594
6888
 
6595
6889
  .dialog-header {
6596
6890
  padding: 20px 24px 16px;
6597
- border-bottom: 1px solid var(--jupiter-border-color, #ddd);
6891
+ border-bottom: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));
6598
6892
  display: flex;
6599
6893
  align-items: center;
6600
6894
  gap: 12px;
6895
+ background: var(--bg-color-1, var(--jupiter-header-background, #f8f9fa));
6601
6896
  }
6602
6897
 
6603
6898
  .dialog-title {
6604
6899
  font-size: 18px;
6605
6900
  font-weight: 600;
6606
6901
  margin: 0;
6607
- color: var(--jupiter-text-primary, #333);
6902
+ color: var(--primaryTextColor, var(--jupiter-text-primary, #333));
6608
6903
  flex: 1;
6609
6904
  }
6610
6905
 
6611
6906
  .filter-icon {
6612
6907
  width: 20px;
6613
6908
  height: 20px;
6614
- fill: var(--jupiter-primary-color, #1976d2);
6909
+ fill: var(--primaryTextColor, var(--jupiter-primary-color, #1976d2));
6615
6910
  }
6616
6911
 
6617
6912
  .close-button {
@@ -6620,23 +6915,24 @@ JupiterFilterRolesDialog.styles = css`
6620
6915
  font-size: 24px;
6621
6916
  cursor: pointer;
6622
6917
  padding: 4px;
6623
- color: var(--jupiter-text-secondary, #666);
6918
+ color: var(--primaryTextColor, var(--jupiter-text-secondary, #666));
6624
6919
  border-radius: 4px;
6625
6920
  transition: background-color 0.2s ease;
6626
6921
  }
6627
6922
 
6628
- .close-button:hover {
6629
- background: var(--jupiter-hover-background, #f5f5f5);
6630
- }
6923
+ // .close-button:hover {
6924
+ // background: var(--jupiter-hover-background, #f5f5f5);
6925
+ // }
6631
6926
 
6632
6927
  .dialog-content {
6928
+ background: var(--bg-color-2, var(--jupiter-form-content-background, #fff));
6633
6929
  flex: 1;
6634
6930
  overflow-y: auto;
6635
6931
  padding: 20px 24px;
6636
6932
  }
6637
6933
 
6638
6934
  .description {
6639
- color: var(--jupiter-text-secondary, #666);
6935
+ color: var(--primaryTextColor, var(--secondaryTextColor, var(--jupiter-text-secondary, #666))) ;
6640
6936
  font-size: 14px;
6641
6937
  margin: 0 0 20px 0;
6642
6938
  line-height: 1.5;
@@ -6655,25 +6951,25 @@ JupiterFilterRolesDialog.styles = css`
6655
6951
  }
6656
6952
 
6657
6953
  .search-input {
6658
- width: 100%;
6954
+ width: stretch;
6659
6955
  padding: 10px 40px 10px 12px;
6660
- border: 1px solid var(--jupiter-border-color, #ddd);
6956
+ border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));
6661
6957
  border-radius: 4px;
6662
6958
  font-size: 14px;
6663
6959
  font-family: inherit;
6664
- background: var(--jupiter-background, #fff);
6665
- color: var(--jupiter-text-primary, #333);
6960
+ background: transparent;
6961
+ color: var(--primaryTextColor, var(--jupiter-text-primary, #333));
6666
6962
  transition: border-color 0.2s ease;
6667
6963
  }
6668
6964
 
6669
- .search-input:focus {
6670
- outline: none;
6671
- border-color: var(--jupiter-primary-color, #1976d2);
6672
- box-shadow: 0 0 0 2px rgba(25, 118, 210, 0.1);
6673
- }
6965
+ // .search-input:focus {
6966
+ // outline: none;
6967
+ // border-color: var(--jupiter-primary-color, #1976d2);
6968
+ // box-shadow: 0 0 0 2px rgba(25, 118, 210, 0.1);
6969
+ // }
6674
6970
 
6675
6971
  .search-input::placeholder {
6676
- color: var(--jupiter-text-secondary, #666);
6972
+ color: var(--primaryTextColor, var(--jupiter-text-secondary, #666));
6677
6973
  }
6678
6974
 
6679
6975
  .search-icon {
@@ -6731,8 +7027,8 @@ JupiterFilterRolesDialog.styles = css`
6731
7027
 
6732
7028
  .selection-control {
6733
7029
  background: none;
6734
- border: 1px solid var(--jupiter-primary-color, #1976d2);
6735
- color: var(--jupiter-primary-color, #1976d2);
7030
+ border: 1px solid var(--primaryTextColor, var(--jupiter-primary-color, #1976d2));
7031
+ color: var(--primaryTextColor, var(--jupiter-primary-color, #1976d2));
6736
7032
  padding: 6px 12px;
6737
7033
  border-radius: 4px;
6738
7034
  font-size: 12px;
@@ -6741,7 +7037,7 @@ JupiterFilterRolesDialog.styles = css`
6741
7037
  }
6742
7038
 
6743
7039
  .selection-control:hover {
6744
- background: var(--jupiter-primary-color, #1976d2);
7040
+ background: var(--menuBgColorLighter, var(--jupiter-primary-color, #1976d2));
6745
7041
  color: white;
6746
7042
  }
6747
7043
 
@@ -6751,7 +7047,7 @@ JupiterFilterRolesDialog.styles = css`
6751
7047
  gap: 8px;
6752
7048
  max-height: 300px;
6753
7049
  overflow-y: auto;
6754
- border: 1px solid var(--jupiter-border-color, #ddd);
7050
+ border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));
6755
7051
  border-radius: 4px;
6756
7052
  padding: 12px;
6757
7053
  }
@@ -6766,13 +7062,17 @@ JupiterFilterRolesDialog.styles = css`
6766
7062
  }
6767
7063
 
6768
7064
  .role-item:hover {
6769
- background: var(--jupiter-hover-background, #f5f5f5);
7065
+ background: var(--menuBgColorLighter, var(--jupiter-hover-background, #f5f5f5));
6770
7066
  }
6771
7067
 
6772
7068
  .role-checkbox {
6773
7069
  margin-top: 2px;
6774
7070
  cursor: pointer;
6775
7071
  }
7072
+
7073
+ .role-info * {
7074
+ color: var(--primaryTextColor, var(--jupiter-text-primary, #333)) !important;
7075
+ }
6776
7076
 
6777
7077
  .role-info {
6778
7078
  flex: 1;
@@ -6802,15 +7102,15 @@ JupiterFilterRolesDialog.styles = css`
6802
7102
  .period-controls {
6803
7103
  margin-top: 8px;
6804
7104
  padding: 8px;
6805
- background: var(--jupiter-background-light, #f8f9fa);
7105
+ background: var(--bg-color-1, var(--jupiter-background-light, #f8f9fa));
6806
7106
  border-radius: 4px;
6807
- border: 1px solid var(--jupiter-border-color, #e0e0e0);
7107
+ border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #e0e0e0));
6808
7108
  }
6809
7109
 
6810
7110
  .period-controls-label {
6811
7111
  font-size: 12px;
6812
7112
  font-weight: 600;
6813
- color: var(--jupiter-text-primary, #333);
7113
+ color: var(--primaryTextColor, var(--jupiter-text-primary, #333));
6814
7114
  margin: 0 0 6px 0;
6815
7115
  }
6816
7116
 
@@ -6938,11 +7238,11 @@ JupiterFilterRolesDialog.styles = css`
6938
7238
 
6939
7239
  .dialog-actions {
6940
7240
  padding: 16px 24px;
6941
- border-top: 1px solid var(--jupiter-border-color, #ddd);
7241
+ border-top: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));
6942
7242
  display: flex;
6943
7243
  gap: 12px;
6944
7244
  justify-content: flex-end;
6945
- background: var(--jupiter-form-actions-background, #f8f9fa);
7245
+ background: var(--bg-color-2, var(--jupiter-form-actions-background, #f8f9fa));
6946
7246
  }
6947
7247
 
6948
7248
  .dialog-actions button {
@@ -6956,23 +7256,23 @@ JupiterFilterRolesDialog.styles = css`
6956
7256
  }
6957
7257
 
6958
7258
  .btn-primary {
6959
- background: var(--jupiter-primary-color, #1976d2);
6960
- color: white;
7259
+ background: var(--buttonBgColor, var(--jupiter-primary-color, #1976d2));
7260
+ color: var(--buttonTextColor, white);
6961
7261
  }
6962
7262
 
6963
- .btn-primary:hover:not(:disabled) {
6964
- background: var(--jupiter-primary-color-dark, #1565c0);
6965
- }
7263
+ // .btn-primary:hover:not(:disabled) {
7264
+ // background: var(--jupiter-primary-color-dark, #1565c0);
7265
+ // }
6966
7266
 
6967
7267
  .btn-secondary {
7268
+ color: var(--buttonBgColor, var(--jupiter-primary-color, #1976d2));
7269
+ border: 1px solid var(--buttonBgColor, var(--jupiter-primary-color, #1976d2)) !important;
6968
7270
  background: transparent;
6969
- color: var(--jupiter-text-secondary, #666);
6970
- border: 1px solid var(--jupiter-border-color, #ddd);
6971
7271
  }
6972
7272
 
6973
- .btn-secondary:hover:not(:disabled) {
6974
- background: var(--jupiter-hover-background, #f5f5f5);
6975
- }
7273
+ // .btn-secondary:hover:not(:disabled) {
7274
+ // background: var(--jupiter-hover-background, #f5f5f5);
7275
+ // }
6976
7276
 
6977
7277
  button:disabled {
6978
7278
  opacity: 0.6;
@@ -7187,6 +7487,7 @@ let JupiterDynamicForm = class extends LitElement {
7187
7487
  this._preservedUnitData = {};
7188
7488
  this._typedMemberData = {};
7189
7489
  this._preservedTypedMemberData = {};
7490
+ this._repeatCounts = {};
7190
7491
  this._columns = [];
7191
7492
  this._errors = [];
7192
7493
  this._touched = /* @__PURE__ */ new Set();
@@ -7405,7 +7706,6 @@ let JupiterDynamicForm = class extends LitElement {
7405
7706
  if (!((_a = this._currentSchema) == null ? void 0 : _a.sections)) {
7406
7707
  return;
7407
7708
  }
7408
- console.log("🔍 [DynamicForm] Extracting typed member values from facts");
7409
7709
  this._currentSchema.sections.forEach((section2) => {
7410
7710
  this._extractTypedMembersFromConcepts(section2.concepts || [], section2);
7411
7711
  });
@@ -7848,6 +8148,10 @@ let JupiterDynamicForm = class extends LitElement {
7848
8148
  if (this._typedMemberData[field2.columnId]) {
7849
8149
  this._preservedTypedMemberData[field2.columnId] = { ...this._typedMemberData[field2.columnId] };
7850
8150
  }
8151
+ const crossRoleKey = `${concept.id}__${field2.columnId}`;
8152
+ if (this._typedMemberData[crossRoleKey]) {
8153
+ this._preservedTypedMemberData[crossRoleKey] = { ...this._typedMemberData[crossRoleKey] };
8154
+ }
7851
8155
  });
7852
8156
  if (concept.children) {
7853
8157
  concept.children.forEach((child) => {
@@ -7868,6 +8172,10 @@ let JupiterDynamicForm = class extends LitElement {
7868
8172
  if (this._preservedTypedMemberData[field2.columnId]) {
7869
8173
  this._typedMemberData[field2.columnId] = { ...this._preservedTypedMemberData[field2.columnId] };
7870
8174
  }
8175
+ const crossRoleKey = `${concept.id}__${field2.columnId}`;
8176
+ if (this._preservedTypedMemberData[crossRoleKey]) {
8177
+ this._typedMemberData[crossRoleKey] = { ...this._preservedTypedMemberData[crossRoleKey] };
8178
+ }
7871
8179
  });
7872
8180
  if (concept.children) {
7873
8181
  concept.children.forEach((child) => {
@@ -7909,7 +8217,8 @@ let JupiterDynamicForm = class extends LitElement {
7909
8217
  this._periodPreferences,
7910
8218
  this._periodData,
7911
8219
  this._unitData,
7912
- this.reportingLanguage
8220
+ this.reportingLanguage,
8221
+ this._repeatCounts
7913
8222
  );
7914
8223
  this._draftStorageService.saveDraft(currentFormData, currentMetadata);
7915
8224
  console.log("✅ Current form data saved to draft storage with NEW preferences");
@@ -8080,14 +8389,72 @@ let JupiterDynamicForm = class extends LitElement {
8080
8389
  const parts = uniqueConceptKey.split("::");
8081
8390
  return parts.length > 1 ? parts[1] : uniqueConceptKey;
8082
8391
  }
8392
+ _handleAddConceptRepeat(event) {
8393
+ const { conceptId } = event.detail;
8394
+ this._repeatCounts = { ...this._repeatCounts, [conceptId]: (this._repeatCounts[conceptId] || 0) + 1 };
8395
+ this._dirty = true;
8396
+ }
8397
+ _handleRemoveConceptRepeat(event) {
8398
+ const { conceptId: rawConceptId } = event.detail;
8399
+ const repeatMatch = rawConceptId.match(/^(.+)__repeat_(\d+)$/);
8400
+ const baseConceptId = repeatMatch ? repeatMatch[1] : rawConceptId;
8401
+ const removeIndex = repeatMatch ? parseInt(repeatMatch[2]) : this._repeatCounts[rawConceptId] || 0;
8402
+ const current = this._repeatCounts[baseConceptId] || 0;
8403
+ if (current <= 0 || removeIndex < 1 || removeIndex > current)
8404
+ return;
8405
+ const newFormData = { ...this._formData };
8406
+ const newTypedData = { ...this._typedMemberData };
8407
+ const newUnitData = { ...this._unitData };
8408
+ const newPeriodData = { ...this._periodData };
8409
+ for (let n3 = removeIndex; n3 < current; n3++) {
8410
+ const fromId = `${baseConceptId}__repeat_${n3 + 1}`;
8411
+ const toId = `${baseConceptId}__repeat_${n3}`;
8412
+ if (newFormData[fromId] !== void 0) {
8413
+ newFormData[toId] = newFormData[fromId];
8414
+ } else {
8415
+ delete newFormData[toId];
8416
+ }
8417
+ const toPrefix = `${toId}__`;
8418
+ const fromPrefix = `${fromId}__`;
8419
+ const fromEntries = Object.keys(newTypedData).filter((k) => k.startsWith(fromPrefix));
8420
+ Object.keys(newTypedData).filter((k) => k.startsWith(toPrefix)).forEach((k) => delete newTypedData[k]);
8421
+ fromEntries.forEach((k) => {
8422
+ newTypedData[`${toId}__${k.slice(fromPrefix.length)}`] = newTypedData[k];
8423
+ });
8424
+ fromEntries.forEach((k) => delete newTypedData[k]);
8425
+ if (newUnitData[fromId] !== void 0) {
8426
+ newUnitData[toId] = newUnitData[fromId];
8427
+ } else {
8428
+ delete newUnitData[toId];
8429
+ }
8430
+ if (newPeriodData[fromId] !== void 0) {
8431
+ newPeriodData[toId] = newPeriodData[fromId];
8432
+ } else {
8433
+ delete newPeriodData[toId];
8434
+ }
8435
+ }
8436
+ const lastId = `${baseConceptId}__repeat_${current}`;
8437
+ delete newFormData[lastId];
8438
+ delete newUnitData[lastId];
8439
+ delete newPeriodData[lastId];
8440
+ const lastPrefix = `${lastId}__`;
8441
+ Object.keys(newTypedData).filter((k) => k.startsWith(lastPrefix)).forEach((k) => delete newTypedData[k]);
8442
+ this._formData = newFormData;
8443
+ this._typedMemberData = newTypedData;
8444
+ this._unitData = newUnitData;
8445
+ this._periodData = newPeriodData;
8446
+ this._repeatCounts = { ...this._repeatCounts, [baseConceptId]: current - 1 };
8447
+ this._dirty = true;
8448
+ }
8083
8449
  _handleTypedMemberChange(event) {
8084
- const { columnId, axisId, value } = event.detail;
8085
- console.log(`🔍 [DynamicForm] Typed member change: columnId=${columnId}, axisId=${axisId}, value=${value}`);
8450
+ const { columnId, axisId, value, conceptId } = event.detail;
8451
+ const storageKey = conceptId ? `${conceptId}__${columnId}` : columnId;
8452
+ console.log(`🔍 [DynamicForm] Typed member change: storageKey=${storageKey}, axisId=${axisId}, value=${value}`);
8086
8453
  const updatedTypedMemberData = { ...this._typedMemberData };
8087
- if (!updatedTypedMemberData[columnId]) {
8088
- updatedTypedMemberData[columnId] = {};
8454
+ if (!updatedTypedMemberData[storageKey]) {
8455
+ updatedTypedMemberData[storageKey] = {};
8089
8456
  }
8090
- updatedTypedMemberData[columnId] = { ...updatedTypedMemberData[columnId], [axisId]: value };
8457
+ updatedTypedMemberData[storageKey] = { ...updatedTypedMemberData[storageKey], [axisId]: value };
8091
8458
  this._typedMemberData = updatedTypedMemberData;
8092
8459
  this._dirty = true;
8093
8460
  this.requestUpdate();
@@ -8715,7 +9082,8 @@ let JupiterDynamicForm = class extends LitElement {
8715
9082
  this._periodPreferences,
8716
9083
  this._periodData,
8717
9084
  this._unitData,
8718
- this.reportingLanguage
9085
+ this.reportingLanguage,
9086
+ this._repeatCounts
8719
9087
  );
8720
9088
  const draftPayloadSnapshot = JSON.stringify({
8721
9089
  draftData,
@@ -8829,6 +9197,10 @@ let JupiterDynamicForm = class extends LitElement {
8829
9197
  this._preservedTypedMemberData = {};
8830
9198
  console.log("🔄 Restored typed member data");
8831
9199
  }
9200
+ if (metadata.repeatCounts) {
9201
+ this._repeatCounts = metadata.repeatCounts;
9202
+ console.log("🔄 Restored repeat counts:", this._repeatCounts);
9203
+ }
8832
9204
  if (metadata.periodData) {
8833
9205
  this._periodData = metadata.periodData;
8834
9206
  console.log("🔄 Restored custom field-level period data:", Object.keys(this._periodData).length, "concepts");
@@ -8872,7 +9244,7 @@ let JupiterDynamicForm = class extends LitElement {
8872
9244
  const restoredPeriodData = {};
8873
9245
  const restoredUnitData = {};
8874
9246
  formData.forEach((entry) => {
8875
- let { conceptId, value, columnId, period, unit } = entry;
9247
+ let { conceptId, draftInstanceId, value, columnId, period, unit } = entry;
8876
9248
  if (!columnId && period) {
8877
9249
  columnId = this._inferColumnIdFromPeriod(period, conceptId);
8878
9250
  if (!columnId) {
@@ -8880,13 +9252,15 @@ let JupiterDynamicForm = class extends LitElement {
8880
9252
  return;
8881
9253
  }
8882
9254
  }
8883
- const actualConceptId = this._findActualConceptId(conceptId);
8884
- const conceptIdToUse = actualConceptId || conceptId;
9255
+ const instanceKey = draftInstanceId || conceptId;
9256
+ const baseConceptId = instanceKey.includes("__repeat_") ? instanceKey.split("__repeat_")[0] : instanceKey;
9257
+ const actualBaseId = this._findActualConceptId(baseConceptId);
9258
+ const conceptIdToUse = instanceKey.includes("__repeat_") ? `${actualBaseId || baseConceptId}__repeat_${instanceKey.split("__repeat_")[1]}` : actualBaseId || instanceKey;
8885
9259
  if (!restoredFormData[conceptIdToUse]) {
8886
9260
  restoredFormData[conceptIdToUse] = {};
8887
9261
  }
8888
9262
  restoredFormData[conceptIdToUse][columnId] = value;
8889
- console.log(`📦 Restored: ${conceptIdToUse}[${columnId}] = ${value}`);
9263
+ console.log(`📦 Restored: ${conceptIdToUse}[${columnId}] = ${value}${instanceKey !== conceptId ? ` (repeat instance)` : ""}`);
8890
9264
  if (period) {
8891
9265
  if (!restoredPeriodData[conceptIdToUse]) {
8892
9266
  restoredPeriodData[conceptIdToUse] = {};
@@ -9542,7 +9916,7 @@ let JupiterDynamicForm = class extends LitElement {
9542
9916
  }
9543
9917
  if (concept.fields && concept.fields.length > 0) {
9544
9918
  concept.fields.forEach((field2) => {
9545
- var _a, _b, _c, _d;
9919
+ var _a, _b, _c, _d, _e;
9546
9920
  const conceptData = this._formData[concept.id];
9547
9921
  let fieldValue = conceptData == null ? void 0 : conceptData[field2.columnId];
9548
9922
  if ((fieldValue === void 0 || fieldValue === null || fieldValue === "") && this.masterData) {
@@ -9558,6 +9932,8 @@ let JupiterDynamicForm = class extends LitElement {
9558
9932
  const fieldPeriodData = (_a = this._periodData[concept.id]) == null ? void 0 : _a[field2.columnId];
9559
9933
  const submissionEntry = {
9560
9934
  conceptId: concept.id,
9935
+ draftInstanceId: concept.id,
9936
+ // used during draft restoration to route value to the correct _formData slot
9561
9937
  columnId: field2.columnId,
9562
9938
  // CRITICAL: Include columnId for draft restoration
9563
9939
  value: fieldValue,
@@ -9623,12 +9999,90 @@ let JupiterDynamicForm = class extends LitElement {
9623
9999
  });
9624
10000
  }
9625
10001
  }
10002
+ if (!submissionEntry.typedMembers && ((_e = field2.crossRoleTypedMembers) == null ? void 0 : _e.length)) {
10003
+ const crossRoleKey = `${concept.id}__${field2.columnId}`;
10004
+ const crossRoleValues = this._typedMemberData[crossRoleKey];
10005
+ if (crossRoleValues) {
10006
+ const filteredTypedMembers = {};
10007
+ field2.crossRoleTypedMembers.forEach((tm) => {
10008
+ const val = crossRoleValues[tm.axisId];
10009
+ if (val !== void 0 && val !== null && val !== "") {
10010
+ filteredTypedMembers[tm.axisId] = {
10011
+ value: val,
10012
+ memberName: tm.typedMemberId
10013
+ };
10014
+ }
10015
+ });
10016
+ if (Object.keys(filteredTypedMembers).length > 0) {
10017
+ submissionEntry.typedMembers = filteredTypedMembers;
10018
+ console.log(`🔍 [Submission] Adding cross-role typed members for ${concept.id}/${field2.columnId}:`, filteredTypedMembers);
10019
+ }
10020
+ }
10021
+ }
9626
10022
  if (sectionTitle === targetRole) {
9627
10023
  console.warn(`[DUPLICATE DEBUG] Final submission entry:`, submissionEntry);
9628
10024
  }
9629
10025
  submissionData.push(submissionEntry);
9630
10026
  }
9631
10027
  });
10028
+ const repeatCount = this._repeatCounts[concept.id] || 0;
10029
+ if (repeatCount > 0 && concept.fields.some((f2) => {
10030
+ var _a;
10031
+ return (_a = f2.crossRoleTypedMembers) == null ? void 0 : _a.length;
10032
+ })) {
10033
+ for (let n3 = 1; n3 <= repeatCount; n3++) {
10034
+ const instanceId = `${concept.id}__repeat_${n3}`;
10035
+ concept.fields.forEach((field2) => {
10036
+ var _a, _b, _c, _d, _e;
10037
+ const instanceValue = (_a = this._formData[instanceId]) == null ? void 0 : _a[field2.columnId];
10038
+ if (instanceValue === void 0 || instanceValue === null || instanceValue === "")
10039
+ return;
10040
+ const column2 = this._findColumnByIdInSection(field2.columnId, section2);
10041
+ const fieldPeriodData = (_b = this._periodData[instanceId]) == null ? void 0 : _b[field2.columnId];
10042
+ const instanceEntry = {
10043
+ conceptId: concept.id,
10044
+ // original concept ID (not synthetic repeat ID)
10045
+ draftInstanceId: instanceId,
10046
+ // synthetic ID used during draft restoration to route to the correct _formData slot
10047
+ columnId: field2.columnId,
10048
+ value: instanceValue,
10049
+ period: {
10050
+ type: concept.periodType || "duration"
10051
+ }
10052
+ };
10053
+ if (concept.periodType === "instant") {
10054
+ instanceEntry.period.date = (fieldPeriodData == null ? void 0 : fieldPeriodData.instantDate) || (fieldPeriodData == null ? void 0 : fieldPeriodData.endDate) || (column2 == null ? void 0 : column2.periodEndDate) || field2.periodInstantDate || field2.periodEndDate || field2.periodStartDate || this.periodStartDate;
10055
+ } else {
10056
+ instanceEntry.period.startDate = (fieldPeriodData == null ? void 0 : fieldPeriodData.startDate) || (column2 == null ? void 0 : column2.periodStartDate) || field2.periodStartDate || this.periodStartDate;
10057
+ instanceEntry.period.endDate = (fieldPeriodData == null ? void 0 : fieldPeriodData.endDate) || (column2 == null ? void 0 : column2.periodEndDate) || field2.periodEndDate || this.periodEndDate;
10058
+ }
10059
+ const instanceUnit = (_c = this._unitData[instanceId]) == null ? void 0 : _c[field2.columnId];
10060
+ if (instanceUnit) {
10061
+ instanceEntry.unit = instanceUnit;
10062
+ }
10063
+ if ((column2 == null ? void 0 : column2.type) === "dimension" && ((_d = column2.dimensionData) == null ? void 0 : _d.dimensionIdKey)) {
10064
+ instanceEntry.dimension = column2.dimensionData.dimensionIdKey;
10065
+ }
10066
+ if ((_e = field2.crossRoleTypedMembers) == null ? void 0 : _e.length) {
10067
+ const crossRoleKey = `${instanceId}__${field2.columnId}`;
10068
+ const crossRoleValues = this._typedMemberData[crossRoleKey];
10069
+ if (crossRoleValues) {
10070
+ const filteredTypedMembers = {};
10071
+ field2.crossRoleTypedMembers.forEach((tm) => {
10072
+ const val = crossRoleValues[tm.axisId];
10073
+ if (val !== void 0 && val !== null && val !== "") {
10074
+ filteredTypedMembers[tm.axisId] = { value: val, memberName: tm.typedMemberId };
10075
+ }
10076
+ });
10077
+ if (Object.keys(filteredTypedMembers).length > 0) {
10078
+ instanceEntry.typedMembers = filteredTypedMembers;
10079
+ }
10080
+ }
10081
+ }
10082
+ submissionData.push(instanceEntry);
10083
+ });
10084
+ }
10085
+ }
9632
10086
  }
9633
10087
  if (concept.children) {
9634
10088
  this._processConceptsForSubmission(concept.children, submissionData, section2);
@@ -9758,13 +10212,6 @@ let JupiterDynamicForm = class extends LitElement {
9758
10212
  }
9759
10213
  const allFields = [];
9760
10214
  this._collectAllFields(section2.concepts || [], new Set((section2.columns || []).map((col) => col.id)), section2.columns || [], allFields);
9761
- console.warn(`📊 Total fields found: ${allFields.length}`);
9762
- console.warn(`
9763
- 📋 FIELD DETAILS:`);
9764
- allFields.forEach((field2, index) => {
9765
- const status = field2.isEmpty ? "❌ EMPTY" : "✅ FILLED";
9766
- console.warn(` ${index + 1}. ${field2.conceptId} [${field2.columnId}]: ${status} = ${JSON.stringify(field2.value)}`);
9767
- });
9768
10215
  const hasErrors = this._roleHasErrors(roleId);
9769
10216
  const emptyCount = allFields.filter((f2) => f2.isEmpty).length;
9770
10217
  const filledCount = allFields.filter((f2) => !f2.isEmpty).length;
@@ -9839,10 +10286,8 @@ let JupiterDynamicForm = class extends LitElement {
9839
10286
  if (matchedFact && matchedFact.value !== null && matchedFact.value !== void 0 && matchedFact.value !== "") {
9840
10287
  value = matchedFact.value;
9841
10288
  isEmpty = false;
9842
- console.warn(` ✨ FACT PRE-POPULATED: ${fieldConceptId} [${field2.columnId}] = ${JSON.stringify(value)}`);
9843
10289
  }
9844
10290
  }
9845
- console.warn(` 🔍 Field lookup: concept.id="${conceptIdWithSuffix}", field.conceptId="${fieldConceptId}", value=${JSON.stringify(value)}, isEmpty=${isEmpty}`);
9846
10291
  allFields.push({
9847
10292
  conceptId: fieldConceptId,
9848
10293
  columnId: field2.columnId,
@@ -10302,6 +10747,7 @@ let JupiterDynamicForm = class extends LitElement {
10302
10747
  .periodData="${this._periodData}"
10303
10748
  .unitData="${this._unitData}"
10304
10749
  .typedMemberData="${this._typedMemberData}"
10750
+ .repeatCounts="${this._repeatCounts}"
10305
10751
  .defaultUnits="${this.defaultUnits}"
10306
10752
  .disabled="${this.disabled || this.readonly}"
10307
10753
  .collapsible="${config.collapsibleSections !== false}"
@@ -10315,6 +10761,8 @@ let JupiterDynamicForm = class extends LitElement {
10315
10761
  @field-change="${this._handleFieldChange}"
10316
10762
  @period-change="${this._handlePeriodChange}"
10317
10763
  @typed-member-change="${this._handleTypedMemberChange}"
10764
+ @add-concept-repeat="${this._handleAddConceptRepeat}"
10765
+ @remove-concept-repeat="${this._handleRemoveConceptRepeat}"
10318
10766
  @section-expand="${this._handleSectionExpand}"
10319
10767
  @concept-expand="${this._handleConceptExpand}"
10320
10768
  @column-remove="${this._handleColumnRemove}"
@@ -10431,6 +10879,7 @@ let JupiterDynamicForm = class extends LitElement {
10431
10879
  .periodData="${this._periodData}"
10432
10880
  .unitData="${this._unitData}"
10433
10881
  .typedMemberData="${this._typedMemberData}"
10882
+ .repeatCounts="${this._repeatCounts}"
10434
10883
  .defaultUnits="${this.defaultUnits}"
10435
10884
  .disabled="${this.disabled || this.readonly}"
10436
10885
  .collapsible="${false}"
@@ -10444,6 +10893,8 @@ let JupiterDynamicForm = class extends LitElement {
10444
10893
  .periodEndDate="${this.periodEndDate}"
10445
10894
  @field-change="${this._handleFieldChange}"
10446
10895
  @typed-member-change="${this._handleTypedMemberChange}"
10896
+ @add-concept-repeat="${this._handleAddConceptRepeat}"
10897
+ @remove-concept-repeat="${this._handleRemoveConceptRepeat}"
10447
10898
  @section-expand="${this._handleSectionExpand}"
10448
10899
  @concept-expand="${this._handleConceptExpand}"
10449
10900
  @column-remove="${this._handleColumnRemove}"
@@ -10713,7 +11164,7 @@ JupiterDynamicForm.styles = css`
10713
11164
  right: 0;
10714
11165
  padding: 16px 24px;
10715
11166
  border-top: 1px solid var(--jupiter-border-color, #ddd);
10716
- background: var(--jupiter-form-actions-background, #f8f9fa);
11167
+ background: var(--bg-color-2, var(--jupiter-form-actions-background, #f8f9fa));
10717
11168
  display: flex;
10718
11169
  gap: 12px;
10719
11170
  align-items: center;
@@ -10724,6 +11175,7 @@ JupiterDynamicForm.styles = css`
10724
11175
  .form-sections {
10725
11176
  padding: 24px;
10726
11177
  padding-bottom: 100px; /* Add space for fixed footer */
11178
+ background: var(--bg-color-2);
10727
11179
  }
10728
11180
 
10729
11181
  .validation-summary {
@@ -10761,22 +11213,23 @@ JupiterDynamicForm.styles = css`
10761
11213
  }
10762
11214
 
10763
11215
  .btn-primary {
10764
- background: var(--jupiter-primary-color, #1976d2);
10765
- color: white;
11216
+ background: var(--buttonBgColor, var(--jupiter-primary-color, #1976d2));
11217
+ color: var(--buttonTextColor, white);
10766
11218
  }
10767
11219
 
10768
- .btn-primary:hover:not(:disabled) {
10769
- background: var(--jupiter-primary-color-dark, #1565c0);
10770
- }
11220
+ // .btn-primary:hover:not(:disabled) {
11221
+ // background: var(--jupiter-primary-color-dark, #1565c0);
11222
+ // }
10771
11223
 
10772
11224
  .btn-secondary {
10773
- background: var(--jupiter-secondary-color, #757575);
10774
- color: white;
11225
+ color: var(--buttonBgColor, var(--jupiter-primary-color, #1976d2));
11226
+ border: 1px solid var(--buttonBgColor, var(--jupiter-primary-color, #1976d2)) !important;
11227
+ background: transparent;
10775
11228
  }
10776
11229
 
10777
- .btn-secondary:hover:not(:disabled) {
10778
- background: var(--jupiter-secondary-color-dark, #616161);
10779
- }
11230
+ // .btn-secondary:hover:not(:disabled) {
11231
+ // background: var(--jupiter-secondary-color-dark, #616161);
11232
+ // }
10780
11233
 
10781
11234
  .btn-outline {
10782
11235
  background: transparent;
@@ -10854,7 +11307,7 @@ JupiterDynamicForm.styles = css`
10854
11307
  padding: 8px 16px;
10855
11308
  background: transparent;
10856
11309
  border: 1px solid var(--jupiter-primary-color, #1976d2);
10857
- color: var(--jupiter-primary-color, #1976d2);
11310
+ color: var(--primaryTextColor, var(--jupiter-primary-color, #1976d2));
10858
11311
  border-radius: 4px;
10859
11312
  font-size: 13px;
10860
11313
  font-weight: 500;
@@ -10863,10 +11316,10 @@ JupiterDynamicForm.styles = css`
10863
11316
  margin-right: auto;
10864
11317
  }
10865
11318
 
10866
- .filter-roles-button:hover:not(:disabled) {
10867
- background: var(--jupiter-primary-color, #1976d2);
10868
- color: white;
10869
- }
11319
+ // .filter-roles-button:hover:not(:disabled) {
11320
+ // background: var(--jupiter-primary-color, #1976d2);
11321
+ // color: white;
11322
+ // }
10870
11323
 
10871
11324
  .filter-roles-button .filter-icon {
10872
11325
  width: 16px;
@@ -10877,8 +11330,8 @@ JupiterDynamicForm.styles = css`
10877
11330
  .roles-count {
10878
11331
  display: inline-flex;
10879
11332
  align-items: center;
10880
- background: var(--jupiter-primary-color, #1976d2);
10881
- color: white;
11333
+ background: var(--primaryTextColor, var(--jupiter-primary-color, #1976d2));
11334
+ color: var(--headerBgColor, white) !important;
10882
11335
  border-radius: 10px;
10883
11336
  font-size: 11px;
10884
11337
  font-weight: 600;
@@ -10917,9 +11370,9 @@ JupiterDynamicForm.styles = css`
10917
11370
  .side-panel-roles-list {
10918
11371
  width: 280px;
10919
11372
  min-width: 280px;
10920
- border-right: 1px solid var(--jupiter-border-color, #ddd);
11373
+ border-right: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));
10921
11374
  overflow-y: auto;
10922
- background: var(--jupiter-background-light, #f8f9fa);
11375
+ background: var(--bg-color-2, var(--jupiter-background-light, #f8f9fa));
10923
11376
  display: flex;
10924
11377
  flex-direction: column;
10925
11378
  transition: width 0.3s ease, min-width 0.3s ease;
@@ -10939,8 +11392,10 @@ JupiterDynamicForm.styles = css`
10939
11392
  right: 0px;
10940
11393
  width: 32px;
10941
11394
  height: 32px;
10942
- border: 1px solid var(--jupiter-border-color, #ddd);
10943
- background: var(--jupiter-background, #fff);
11395
+ border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));
11396
+ background: var(--bg-color-2, var(--jupiter-background, #fff));
11397
+ color: var(--primaryTextColor);
11398
+
10944
11399
  border-radius: 4px;
10945
11400
  cursor: pointer;
10946
11401
  display: flex;
@@ -10948,7 +11403,6 @@ JupiterDynamicForm.styles = css`
10948
11403
  justify-content: center;
10949
11404
  z-index: 100;
10950
11405
  transition: all 0.2s ease;
10951
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
10952
11406
  }
10953
11407
 
10954
11408
  .side-panel-toggle-btn:hover {
@@ -10972,7 +11426,7 @@ JupiterDynamicForm.styles = css`
10972
11426
  position: sticky;
10973
11427
  top: 0;
10974
11428
  z-index: 10;
10975
- background: var(--jupiter-background, #fff);
11429
+ background: var(--bg-color-2, var(--jupiter-background, #fff));
10976
11430
  padding: 16px;
10977
11431
  border-bottom: 1px solid var(--jupiter-border-color, #ddd);
10978
11432
  }
@@ -10980,21 +11434,21 @@ JupiterDynamicForm.styles = css`
10980
11434
  .side-panel-search-input {
10981
11435
  width: 100%;
10982
11436
  padding: 10px 40px 10px 12px;
10983
- border: 1px solid var(--jupiter-border-color, #ddd);
11437
+ border: 1px solid var(--primaryTextColor, var(--jupiter-border-color, #ddd));
10984
11438
  border-radius: 4px;
10985
11439
  font-size: 14px;
10986
11440
  font-family: inherit;
10987
- background: var(--jupiter-background, #fff);
10988
- color: var(--jupiter-text-primary, #333);
11441
+ background: transparent;
11442
+ color: var(--primaryTextColor, var(--jupiter-text-primary, #333));
10989
11443
  transition: border-color 0.2s ease;
10990
11444
  box-sizing: border-box;
10991
11445
  }
10992
11446
 
10993
- .side-panel-search-input:focus {
10994
- outline: none;
10995
- border-color: var(--jupiter-primary-color, #1976d2);
10996
- box-shadow: 0 0 0 2px rgba(25, 118, 210, 0.1);
10997
- }
11447
+ // .side-panel-search-input:focus {
11448
+ // outline: none;
11449
+ // border-color: var(--jupiter-primary-color, #1976d2);
11450
+ // box-shadow: 0 0 0 2px rgba(25, 118, 210, 0.1);
11451
+ // }
10998
11452
 
10999
11453
  .side-panel-search-input::placeholder {
11000
11454
  color: var(--jupiter-text-secondary, #666);
@@ -11054,16 +11508,16 @@ JupiterDynamicForm.styles = css`
11054
11508
  border-bottom: 1px solid var(--jupiter-border-color, #e0e0e0);
11055
11509
  transition: background-color 0.2s ease;
11056
11510
  font-size: 14px;
11057
- color: var(--jupiter-text-primary, #333);
11511
+ color: var(--primaryTextColor, var(--jupiter-text-primary, #333));
11058
11512
  line-height: 1.4;
11059
11513
  }
11060
11514
 
11061
- .side-panel-role-item:hover {
11062
- background: var(--jupiter-hover-background, #e8e8e8);
11063
- }
11515
+ // .side-panel-role-item:hover {
11516
+ // background: var(--jupiter-hover-background, #e8e8e8);
11517
+ // }
11064
11518
 
11065
11519
  .side-panel-role-item.active {
11066
- background: var(--jupiter-primary-color, #1976d2);
11520
+ background: var(--light-color-1, var(--jupiter-primary-color, #1976d2));
11067
11521
  color: white;
11068
11522
  font-weight: 500;
11069
11523
  }
@@ -11511,6 +11965,9 @@ __decorateClass([
11511
11965
  __decorateClass([
11512
11966
  r()
11513
11967
  ], JupiterDynamicForm.prototype, "_preservedTypedMemberData", 2);
11968
+ __decorateClass([
11969
+ r()
11970
+ ], JupiterDynamicForm.prototype, "_repeatCounts", 2);
11514
11971
  __decorateClass([
11515
11972
  r()
11516
11973
  ], JupiterDynamicForm.prototype, "_columns", 2);