@design.estate/dees-catalog 3.70.1 → 3.71.1

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.
@@ -139563,6 +139563,81 @@ var demoFunc9 = /* @__PURE__ */ __name(() => b2`
139563
139563
  });
139564
139564
  }}>Test Responsive</dees-button>
139565
139565
  </div>
139566
+
139567
+ <div class="demo-section">
139568
+ <h3>Scrollable Content</h3>
139569
+ <p>When content exceeds the modal's max-height (<code>calc(100vh - 80px)</code>), the tile caps at that height and the content area scrolls inside. The heading and bottom buttons stay pinned.</p>
139570
+ <div class="button-grid">
139571
+ <dees-button @click=${() => {
139572
+ DeesModal.createAndShow({
139573
+ heading: "Long Article",
139574
+ width: "medium",
139575
+ content: b2`
139576
+ <h4 style="margin-top: 0;">Lorem ipsum dolor sit amet</h4>
139577
+ ${Array.from({ length: 40 }, (_4, i11) => b2`
139578
+ <p>
139579
+ <strong>§ ${i11 + 1}.</strong>
139580
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do
139581
+ eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
139582
+ enim ad minim veniam, quis nostrud exercitation ullamco laboris
139583
+ nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
139584
+ in reprehenderit in voluptate velit esse cillum dolore eu fugiat
139585
+ nulla pariatur. Excepteur sint occaecat cupidatat non proident,
139586
+ sunt in culpa qui officia deserunt mollit anim id est laborum.
139587
+ </p>
139588
+ `)}
139589
+ `,
139590
+ menuOptions: [{
139591
+ name: "Cancel",
139592
+ action: /* @__PURE__ */ __name(async (modal) => modal.destroy(), "action")
139593
+ }, {
139594
+ name: "Accept",
139595
+ action: /* @__PURE__ */ __name(async (modal) => modal.destroy(), "action")
139596
+ }]
139597
+ });
139598
+ }}>Long Article</dees-button>
139599
+
139600
+ <dees-button @click=${() => {
139601
+ DeesModal.createAndShow({
139602
+ heading: "Long List",
139603
+ width: "small",
139604
+ content: b2`
139605
+ <p>Selected items:</p>
139606
+ <ul style="padding-left: 20px; margin: 0;">
139607
+ ${Array.from({ length: 80 }, (_4, i11) => b2`
139608
+ <li style="padding: 4px 0;">Item ${i11 + 1} — option label</li>
139609
+ `)}
139610
+ </ul>
139611
+ `,
139612
+ menuOptions: [{
139613
+ name: "Done",
139614
+ action: /* @__PURE__ */ __name(async (modal) => modal.destroy(), "action")
139615
+ }]
139616
+ });
139617
+ }}>Long List</dees-button>
139618
+
139619
+ <dees-button @click=${() => {
139620
+ DeesModal.createAndShow({
139621
+ heading: "Tall Form",
139622
+ width: "medium",
139623
+ content: b2`
139624
+ <dees-form>
139625
+ ${Array.from({ length: 25 }, (_4, i11) => b2`
139626
+ <dees-input-text .label=${`Field ${i11 + 1}`}></dees-input-text>
139627
+ `)}
139628
+ </dees-form>
139629
+ `,
139630
+ menuOptions: [{
139631
+ name: "Cancel",
139632
+ action: /* @__PURE__ */ __name(async (modal) => modal.destroy(), "action")
139633
+ }, {
139634
+ name: "Submit",
139635
+ action: /* @__PURE__ */ __name(async (modal) => modal.destroy(), "action")
139636
+ }]
139637
+ });
139638
+ }}>Tall Form</dees-button>
139639
+ </div>
139640
+ </div>
139566
139641
  </div>
139567
139642
  `, "demoFunc");
139568
139643
 
@@ -139714,14 +139789,24 @@ __publicField(_DeesTile, "styles", [
139714
139789
  color: var(--dees-color-text-secondary);
139715
139790
  }
139716
139791
 
139717
- /* --- Content: the rounded inset --- */
139792
+ /* --- Content: the rounded inset ---
139793
+ Uses overflow-y: auto so that when a consumer (e.g. dees-modal) caps
139794
+ the tile with max-height, long content scrolls inside the tile
139795
+ instead of being clipped. For consumers without max-height
139796
+ (e.g. dees-stepper), the tile grows with content and the scroll
139797
+ never activates. Horizontal overflow stays clipped to preserve the
139798
+ rounded corners. */
139718
139799
  .tile-content {
139719
139800
  flex: 1;
139720
139801
  position: relative;
139721
139802
  border-radius: 8px;
139722
139803
  border-top: 1px solid var(--dees-color-border-subtle);
139723
139804
  border-bottom: 1px solid var(--dees-color-border-subtle);
139724
- overflow: hidden;
139805
+ overflow-x: hidden;
139806
+ overflow-y: auto;
139807
+ overscroll-behavior: contain;
139808
+ scrollbar-width: thin;
139809
+ scrollbar-color: var(--dees-color-scrollbar-thumb) transparent;
139725
139810
  }
139726
139811
 
139727
139812
  .tile-content.no-footer {
@@ -140048,13 +140133,6 @@ __publicField(_DeesModal, "styles", [
140048
140133
  font-size: 14px;
140049
140134
  }
140050
140135
 
140051
- .content {
140052
- overflow-y: auto;
140053
- overflow-x: hidden;
140054
- overscroll-behavior: contain;
140055
- scrollbar-width: thin;
140056
- scrollbar-color: var(--dees-color-scrollbar-thumb) transparent;
140057
- }
140058
140136
  .bottomButtons {
140059
140137
  display: flex;
140060
140138
  flex-direction: row;
@@ -187012,175 +187090,223 @@ var DeesPagination = _DeesPagination;
187012
187090
 
187013
187091
  // ts_web/elements/00group-layout/dees-stepper/dees-stepper.demo.ts
187014
187092
  init_dist_ts30();
187015
- var stepperDemo = /* @__PURE__ */ __name(() => b2`
187016
- <dees-stepper
187017
- .steps=${[
187093
+ var demoSteps = [
187018
187094
  {
187019
187095
  title: "Account Setup",
187020
187096
  content: b2`
187021
- <dees-form>
187022
- <dees-input-text key="email" label="Work Email" required></dees-input-text>
187023
- <dees-input-text key="password" label="Create Password" type="password" required></dees-input-text>
187024
- <dees-form-submit>Continue</dees-form-submit>
187025
- </dees-form>
187026
- `,
187027
- validationFunc: /* @__PURE__ */ __name(async (stepperArg, elementArg) => {
187028
- const deesForm = elementArg.querySelector("dees-form");
187029
- deesForm.addEventListener("formData", () => stepperArg.goNext(), { once: true });
187030
- }, "validationFunc")
187097
+ <dees-form>
187098
+ <dees-input-text key="email" label="Work Email" required></dees-input-text>
187099
+ <dees-input-text key="password" label="Create Password" type="password" required></dees-input-text>
187100
+ </dees-form>
187101
+ `,
187102
+ menuOptions: [
187103
+ { name: "Continue", action: /* @__PURE__ */ __name(async (stepper) => stepper.goNext(), "action") }
187104
+ ]
187031
187105
  },
187032
187106
  {
187033
187107
  title: "Profile Details",
187034
187108
  content: b2`
187035
- <dees-form>
187036
- <dees-input-text key="firstName" label="First Name" required></dees-input-text>
187037
- <dees-input-text key="lastName" label="Last Name" required></dees-input-text>
187038
- <dees-form-submit>Continue</dees-form-submit>
187039
- </dees-form>
187040
- `,
187041
- validationFunc: /* @__PURE__ */ __name(async (stepperArg, elementArg) => {
187042
- const deesForm = elementArg.querySelector("dees-form");
187043
- deesForm.addEventListener("formData", () => stepperArg.goNext(), { once: true });
187044
- }, "validationFunc")
187109
+ <dees-form>
187110
+ <dees-input-text key="firstName" label="First Name" required></dees-input-text>
187111
+ <dees-input-text key="lastName" label="Last Name" required></dees-input-text>
187112
+ </dees-form>
187113
+ `,
187114
+ menuOptions: [
187115
+ { name: "Continue", action: /* @__PURE__ */ __name(async (stepper) => stepper.goNext(), "action") }
187116
+ ]
187045
187117
  },
187046
187118
  {
187047
187119
  title: "Contact Information",
187048
187120
  content: b2`
187049
- <dees-form>
187050
- <dees-input-phone key="phone" label="Mobile Number" required></dees-input-phone>
187051
- <dees-input-text key="company" label="Company"></dees-input-text>
187052
- <dees-form-submit>Continue</dees-form-submit>
187053
- </dees-form>
187054
- `,
187055
- validationFunc: /* @__PURE__ */ __name(async (stepperArg, elementArg) => {
187056
- const deesForm = elementArg.querySelector("dees-form");
187057
- deesForm.addEventListener("formData", () => stepperArg.goNext(), { once: true });
187058
- }, "validationFunc")
187121
+ <dees-form>
187122
+ <dees-input-phone key="phone" label="Mobile Number" required></dees-input-phone>
187123
+ <dees-input-text key="company" label="Company"></dees-input-text>
187124
+ </dees-form>
187125
+ `,
187126
+ menuOptions: [
187127
+ { name: "Continue", action: /* @__PURE__ */ __name(async (stepper) => stepper.goNext(), "action") }
187128
+ ]
187059
187129
  },
187060
187130
  {
187061
187131
  title: "Team Size",
187062
187132
  content: b2`
187063
- <dees-form>
187064
- <dees-input-dropdown
187065
- key="teamSize"
187066
- label="How big is your team?"
187067
- .options=${[
187133
+ <dees-form>
187134
+ <dees-input-dropdown
187135
+ key="teamSize"
187136
+ label="How big is your team?"
187137
+ .options=${[
187068
187138
  { label: "1-5", value: "1-5" },
187069
187139
  { label: "6-20", value: "6-20" },
187070
187140
  { label: "21-50", value: "21-50" },
187071
187141
  { label: "51+", value: "51+" }
187072
187142
  ]}
187073
- required
187074
- ></dees-input-dropdown>
187075
- <dees-form-submit>Continue</dees-form-submit>
187076
- </dees-form>
187077
- `,
187078
- validationFunc: /* @__PURE__ */ __name(async (stepperArg, elementArg) => {
187079
- const deesForm = elementArg.querySelector("dees-form");
187080
- deesForm.addEventListener("formData", () => stepperArg.goNext(), { once: true });
187081
- }, "validationFunc")
187143
+ required
187144
+ ></dees-input-dropdown>
187145
+ </dees-form>
187146
+ `,
187147
+ menuOptions: [
187148
+ { name: "Continue", action: /* @__PURE__ */ __name(async (stepper) => stepper.goNext(), "action") }
187149
+ ]
187082
187150
  },
187083
187151
  {
187084
187152
  title: "Goals",
187085
187153
  content: b2`
187086
- <dees-form>
187087
- <dees-input-multitoggle
187088
- key="goal"
187089
- label="Main objective"
187090
- .options=${[
187154
+ <dees-form>
187155
+ <dees-input-multitoggle
187156
+ key="goal"
187157
+ label="Main objective"
187158
+ .options=${[
187091
187159
  { label: "Onboarding", value: "onboarding" },
187092
187160
  { label: "Analytics", value: "analytics" },
187093
187161
  { label: "Automation", value: "automation" }
187094
187162
  ]}
187095
- required
187096
- ></dees-input-multitoggle>
187097
- <dees-form-submit>Continue</dees-form-submit>
187098
- </dees-form>
187099
- `,
187100
- validationFunc: /* @__PURE__ */ __name(async (stepperArg, elementArg) => {
187101
- const deesForm = elementArg.querySelector("dees-form");
187102
- deesForm.addEventListener("formData", () => stepperArg.goNext(), { once: true });
187103
- }, "validationFunc")
187163
+ required
187164
+ ></dees-input-multitoggle>
187165
+ </dees-form>
187166
+ `,
187167
+ menuOptions: [
187168
+ { name: "Continue", action: /* @__PURE__ */ __name(async (stepper) => stepper.goNext(), "action") }
187169
+ ]
187104
187170
  },
187105
187171
  {
187106
187172
  title: "Brand Preferences",
187107
187173
  content: b2`
187108
- <dees-form>
187109
- <dees-input-text key="brandColor" label="Primary brand color"></dees-input-text>
187110
- <dees-input-text key="tone" label="Preferred tone (e.g. friendly, formal)"></dees-input-text>
187111
- <dees-form-submit>Continue</dees-form-submit>
187112
- </dees-form>
187113
- `,
187114
- validationFunc: /* @__PURE__ */ __name(async (stepperArg, elementArg) => {
187115
- const deesForm = elementArg.querySelector("dees-form");
187116
- deesForm.addEventListener("formData", () => stepperArg.goNext(), { once: true });
187117
- }, "validationFunc")
187174
+ <dees-form>
187175
+ <dees-input-text key="brandColor" label="Primary brand color"></dees-input-text>
187176
+ <dees-input-text key="tone" label="Preferred tone (e.g. friendly, formal)"></dees-input-text>
187177
+ </dees-form>
187178
+ `,
187179
+ menuOptions: [
187180
+ { name: "Continue", action: /* @__PURE__ */ __name(async (stepper) => stepper.goNext(), "action") }
187181
+ ]
187118
187182
  },
187119
187183
  {
187120
187184
  title: "Integrations",
187121
187185
  content: b2`
187122
- <dees-form>
187123
- <dees-input-list
187124
- key="integrations"
187125
- label="Integrations in use"
187126
- placeholder="Add integration"
187127
- ></dees-input-list>
187128
- <dees-form-submit>Continue</dees-form-submit>
187129
- </dees-form>
187130
- `,
187131
- validationFunc: /* @__PURE__ */ __name(async (stepperArg, elementArg) => {
187132
- const deesForm = elementArg.querySelector("dees-form");
187133
- deesForm.addEventListener("formData", () => stepperArg.goNext(), { once: true });
187134
- }, "validationFunc")
187186
+ <dees-form>
187187
+ <dees-input-list
187188
+ key="integrations"
187189
+ label="Integrations in use"
187190
+ placeholder="Add integration"
187191
+ ></dees-input-list>
187192
+ </dees-form>
187193
+ `,
187194
+ menuOptions: [
187195
+ { name: "Continue", action: /* @__PURE__ */ __name(async (stepper) => stepper.goNext(), "action") }
187196
+ ]
187135
187197
  },
187136
187198
  {
187137
187199
  title: "Review & Launch",
187138
187200
  content: b2`
187139
- <dees-panel>
187140
- <p>Almost there! Review your selections and launch whenever you're ready.</p>
187141
- </dees-panel>
187142
- `
187201
+ <dees-panel>
187202
+ <p>Almost there! Review your selections and launch whenever you're ready.</p>
187203
+ </dees-panel>
187204
+ `,
187205
+ menuOptions: [
187206
+ { name: "Launch", action: /* @__PURE__ */ __name(async (stepper) => stepper.goNext(), "action") }
187207
+ ]
187143
187208
  }
187144
- ]}
187145
- ></dees-stepper>
187209
+ ];
187210
+ var cloneSteps = /* @__PURE__ */ __name(() => demoSteps.map((step) => ({ ...step })), "cloneSteps");
187211
+ var stepperDemo = /* @__PURE__ */ __name(() => b2`
187212
+ <div style="position: absolute; inset: 0;">
187213
+ <div
187214
+ style="position: absolute; top: 16px; left: 50%; transform: translateX(-50%); z-index: 10;"
187215
+ >
187216
+ <dees-button
187217
+ @click=${async () => {
187218
+ await DeesStepper.createAndShow({ steps: cloneSteps() });
187219
+ }}
187220
+ >Open stepper as overlay</dees-button>
187221
+ </div>
187222
+ <dees-stepper .steps=${cloneSteps()}></dees-stepper>
187223
+ </div>
187146
187224
  `, "stepperDemo");
187147
187225
 
187148
187226
  // ts_web/elements/00group-layout/dees-stepper/dees-stepper.ts
187149
187227
  init_dist_ts30();
187150
187228
  init_dist_ts29();
187151
187229
  init_theme();
187152
- var _selectedStep_dec, _steps_dec, _a81, _DeesStepper_decorators, _init82, _steps, _selectedStep;
187230
+ var _activeFormValid_dec, _activeForm_dec, _stepperZIndex_dec, _overlay_dec, _selectedStep_dec, _steps_dec, _a81, _DeesStepper_decorators, _init82, _steps, _selectedStep, _overlay, _stepperZIndex, _activeForm, _activeFormValid;
187153
187231
  _DeesStepper_decorators = [customElement("dees-stepper")];
187154
187232
  var _DeesStepper = class _DeesStepper extends (_a81 = DeesElement, _steps_dec = [n5({
187155
187233
  type: Array
187156
187234
  })], _selectedStep_dec = [n5({
187157
187235
  type: Object
187158
- })], _a81) {
187236
+ })], _overlay_dec = [n5({
187237
+ type: Boolean,
187238
+ reflect: true
187239
+ })], _stepperZIndex_dec = [n5({ type: Number, attribute: false })], _activeForm_dec = [n5({ type: Object, attribute: false })], _activeFormValid_dec = [n5({ type: Boolean, attribute: false })], _a81) {
187159
187240
  constructor() {
187160
187241
  super();
187161
187242
  __privateAdd(this, _steps, __runInitializers(_init82, 8, this, [])), __runInitializers(_init82, 11, this);
187162
187243
  __privateAdd(this, _selectedStep, __runInitializers(_init82, 12, this)), __runInitializers(_init82, 15, this);
187244
+ __privateAdd(this, _overlay, __runInitializers(_init82, 16, this, false)), __runInitializers(_init82, 19, this);
187245
+ __privateAdd(this, _stepperZIndex, __runInitializers(_init82, 20, this, 1e3)), __runInitializers(_init82, 23, this);
187246
+ __privateAdd(this, _activeForm, __runInitializers(_init82, 24, this, null)), __runInitializers(_init82, 27, this);
187247
+ __privateAdd(this, _activeFormValid, __runInitializers(_init82, 28, this, true)), __runInitializers(_init82, 31, this);
187248
+ __publicField(this, "activeFormSubscription");
187249
+ __publicField(this, "windowLayer");
187163
187250
  __publicField(this, "getIndexOfStep", /* @__PURE__ */ __name((stepArg) => {
187164
187251
  return this.steps.findIndex((stepArg2) => stepArg === stepArg2);
187165
187252
  }, "getIndexOfStep"));
187166
187253
  __publicField(this, "scroller");
187167
187254
  }
187255
+ static async createAndShow(optionsArg) {
187256
+ const body3 = document.body;
187257
+ const stepper = new _DeesStepper();
187258
+ stepper.steps = optionsArg.steps;
187259
+ stepper.overlay = true;
187260
+ stepper.windowLayer = await DeesWindowLayer.createAndShow({ blur: true });
187261
+ stepper.windowLayer.addEventListener("click", async () => {
187262
+ await stepper.destroy();
187263
+ });
187264
+ body3.append(stepper.windowLayer);
187265
+ body3.append(stepper);
187266
+ stepper.stepperZIndex = zIndexRegistry.getNextZIndex();
187267
+ zIndexRegistry.register(stepper, stepper.stepperZIndex);
187268
+ return stepper;
187269
+ }
187168
187270
  render() {
187169
187271
  return b2`
187170
- <div class="stepperContainer">
187171
- ${this.steps.map(
187172
- (stepArg) => b2`<div
187173
- class="step ${stepArg === this.selectedStep ? "selected" : null} ${this.getIndexOfStep(stepArg) > this.getIndexOfStep(this.selectedStep) ? "hiddenStep" : ""} ${this.getIndexOfStep(stepArg) === 0 ? "entrance" : ""}"
187174
- >
187175
- ${this.getIndexOfStep(stepArg) > 0 ? b2`<div class="goBack" @click=${this.goBack}><span style="font-family: Inter"><-</span> go to previous step</div>` : ``}
187272
+ <div
187273
+ class="stepperContainer ${this.overlay ? "overlay" : ""}"
187274
+ style=${this.overlay ? `z-index: ${this.stepperZIndex};` : ""}
187275
+ >
187276
+ ${this.steps.map((stepArg, stepIndex) => {
187277
+ const isSelected = stepArg === this.selectedStep;
187278
+ const isHidden = this.getIndexOfStep(stepArg) > this.getIndexOfStep(this.selectedStep);
187279
+ const isFirst = stepIndex === 0;
187280
+ return b2`<dees-tile
187281
+ class="step ${isSelected ? "selected" : ""} ${isHidden ? "hiddenStep" : ""} ${isFirst ? "entrance" : ""}"
187282
+ >
187283
+ <div slot="header" class="step-header">
187284
+ ${!isFirst ? b2`<div class="goBack" @click=${this.goBack}>
187285
+ <span style="font-family: Inter"><-</span> go to previous step
187286
+ </div>` : b2`<div class="goBack-spacer"></div>`}
187176
187287
  <div class="stepCounter">
187177
- Step ${this.steps.findIndex((elementArg) => elementArg === stepArg) + 1} of
187178
- ${this.steps.length}
187288
+ Step ${stepIndex + 1} of ${this.steps.length}
187179
187289
  </div>
187290
+ </div>
187291
+ <div class="step-body">
187180
187292
  <div class="title">${stepArg.title}</div>
187181
187293
  <div class="content">${stepArg.content}</div>
187182
- </div> `
187183
- )}
187294
+ </div>
187295
+ ${stepArg.menuOptions && stepArg.menuOptions.length > 0 ? b2`<div slot="footer" class="bottomButtons">
187296
+ ${isSelected && this.activeForm !== null && !this.activeFormValid ? b2`<div class="stepHint">Complete form to continue</div>` : ""}
187297
+ ${stepArg.menuOptions.map((actionArg, actionIndex) => {
187298
+ const isPrimary = actionIndex === stepArg.menuOptions.length - 1;
187299
+ const isDisabled = isPrimary && this.activeForm !== null && !this.activeFormValid;
187300
+ return b2`
187301
+ <div
187302
+ class="bottomButton ${isPrimary ? "primary" : ""} ${isDisabled ? "disabled" : ""}"
187303
+ @click=${() => this.handleMenuOptionClick(actionArg, isPrimary)}
187304
+ >${actionArg.name}</div>
187305
+ `;
187306
+ })}
187307
+ </div>` : ""}
187308
+ </dees-tile>`;
187309
+ })}
187184
187310
  </div>
187185
187311
  `;
187186
187312
  }
@@ -187202,6 +187328,7 @@ var _DeesStepper = class _DeesStepper extends (_a81 = DeesElement, _steps_dec =
187202
187328
  if (!selectedStepElement) {
187203
187329
  return;
187204
187330
  }
187331
+ this.scanActiveForm(selectedStepElement);
187205
187332
  if (!stepperContainer.style.paddingTop) {
187206
187333
  stepperContainer.style.paddingTop = `${stepperContainer.offsetHeight / 2 - selectedStepElement.offsetHeight / 2}px`;
187207
187334
  }
@@ -187259,14 +187386,99 @@ var _DeesStepper = class _DeesStepper extends (_a81 = DeesElement, _steps_dec =
187259
187386
  nextStep.validationFuncCalled = false;
187260
187387
  this.selectedStep = nextStep;
187261
187388
  }
187389
+ /**
187390
+ * Scans the currently selected step for a <dees-form> in its content. When
187391
+ * found, subscribes to the form's RxJS changeSubject so the primary
187392
+ * menuOption button can auto-enable/disable as required fields are filled.
187393
+ *
187394
+ * If the form reference is the same as the previous activation (e.g. on a
187395
+ * same-step re-render), we just recompute validity without re-subscribing.
187396
+ */
187397
+ scanActiveForm(selectedStepElement) {
187398
+ const form = selectedStepElement.querySelector("dees-form");
187399
+ if (form === this.activeForm) {
187400
+ this.recomputeFormValid();
187401
+ return;
187402
+ }
187403
+ this.activeFormSubscription?.unsubscribe();
187404
+ this.activeFormSubscription = void 0;
187405
+ this.activeForm = form;
187406
+ if (!form) {
187407
+ this.activeFormValid = true;
187408
+ return;
187409
+ }
187410
+ this.recomputeFormValid();
187411
+ this.activeFormSubscription = form.changeSubject.subscribe(() => {
187412
+ this.recomputeFormValid();
187413
+ });
187414
+ }
187415
+ /**
187416
+ * Recomputes activeFormValid by checking every required field in the active
187417
+ * form for a non-empty value. Mirrors dees-form.updateRequiredStatus's logic
187418
+ * but stores the result on the stepper instead of mutating a submit button.
187419
+ */
187420
+ recomputeFormValid() {
187421
+ const form = this.activeForm;
187422
+ if (!form) {
187423
+ this.activeFormValid = true;
187424
+ return;
187425
+ }
187426
+ const fields = form.getFormElements();
187427
+ this.activeFormValid = fields.every(
187428
+ (field) => !field.required || field.value !== null && field.value !== void 0 && field.value !== ""
187429
+ );
187430
+ }
187431
+ /**
187432
+ * Click handler for menuOption buttons in the footer. For the primary (last)
187433
+ * button, if an active form is present, gates on required-field validity and
187434
+ * triggers the form's gatherAndDispatch() before running the action. The
187435
+ * action is awaited so any async work (e.g. goNext → scroll animation)
187436
+ * completes before the click handler returns.
187437
+ */
187438
+ async handleMenuOptionClick(optionArg, isPrimary) {
187439
+ const form = this.activeForm;
187440
+ if (isPrimary && form) {
187441
+ if (!this.activeFormValid) return;
187442
+ await new Promise((resolve2) => {
187443
+ form.addEventListener("formData", () => resolve2(), { once: true });
187444
+ form.gatherAndDispatch();
187445
+ });
187446
+ }
187447
+ await optionArg.action(this);
187448
+ }
187449
+ async destroy() {
187450
+ const domtools19 = await this.domtoolsPromise;
187451
+ const container = this.shadowRoot.querySelector(".stepperContainer");
187452
+ container?.classList.add("predestroy");
187453
+ await domtools19.convenience.smartdelay.delayFor(200);
187454
+ if (this.parentElement) {
187455
+ this.parentElement.removeChild(this);
187456
+ }
187457
+ if (this.windowLayer) {
187458
+ await this.windowLayer.destroy();
187459
+ }
187460
+ this.activeFormSubscription?.unsubscribe();
187461
+ this.activeFormSubscription = void 0;
187462
+ this.activeForm = null;
187463
+ zIndexRegistry.unregister(this);
187464
+ }
187262
187465
  };
187263
187466
  _init82 = __decoratorStart(_a81);
187264
187467
  _steps = new WeakMap();
187265
187468
  _selectedStep = new WeakMap();
187469
+ _overlay = new WeakMap();
187470
+ _stepperZIndex = new WeakMap();
187471
+ _activeForm = new WeakMap();
187472
+ _activeFormValid = new WeakMap();
187266
187473
  __decorateElement(_init82, 4, "steps", _steps_dec, _DeesStepper, _steps);
187267
187474
  __decorateElement(_init82, 4, "selectedStep", _selectedStep_dec, _DeesStepper, _selectedStep);
187475
+ __decorateElement(_init82, 4, "overlay", _overlay_dec, _DeesStepper, _overlay);
187476
+ __decorateElement(_init82, 4, "stepperZIndex", _stepperZIndex_dec, _DeesStepper, _stepperZIndex);
187477
+ __decorateElement(_init82, 4, "activeForm", _activeForm_dec, _DeesStepper, _activeForm);
187478
+ __decorateElement(_init82, 4, "activeFormValid", _activeFormValid_dec, _DeesStepper, _activeFormValid);
187268
187479
  _DeesStepper = __decorateElement(_init82, 0, "DeesStepper", _DeesStepper_decorators, _DeesStepper);
187269
187480
  __name(_DeesStepper, "DeesStepper");
187481
+ // STATIC
187270
187482
  __publicField(_DeesStepper, "demo", stepperDemo);
187271
187483
  __publicField(_DeesStepper, "demoGroups", ["Layout", "Form"]);
187272
187484
  __publicField(_DeesStepper, "styles", [
@@ -187278,7 +187490,24 @@ __publicField(_DeesStepper, "styles", [
187278
187490
  position: absolute;
187279
187491
  width: 100%;
187280
187492
  height: 100%;
187493
+ font-family: ${cssGeistFontFamily};
187494
+ color: var(--dees-color-text-primary);
187495
+ }
187496
+
187497
+ /*
187498
+ * In overlay mode the host is "transparent" to layout — the inner
187499
+ * .stepperContainer.overlay is what pins to the viewport and carries the
187500
+ * z-index. Keeping :host unpositioned avoids nesting the stacking context
187501
+ * under an auto-z-index parent (which was trapping .stepperContainer
187502
+ * below DeesWindowLayer's sibling layers). This mirrors how dees-modal
187503
+ * keeps its own :host unpositioned and lets .modalContainer drive layout.
187504
+ */
187505
+ :host([overlay]) {
187506
+ position: static;
187507
+ width: 0;
187508
+ height: 0;
187281
187509
  }
187510
+
187282
187511
  .stepperContainer {
187283
187512
  position: absolute;
187284
187513
  width: 100%;
@@ -187286,101 +187515,120 @@ __publicField(_DeesStepper, "styles", [
187286
187515
  overflow: hidden;
187287
187516
  }
187288
187517
 
187289
- .step {
187518
+ .stepperContainer.overlay {
187519
+ position: fixed;
187520
+ top: 0;
187521
+ left: 0;
187522
+ width: 100vw;
187523
+ height: 100vh;
187524
+ }
187525
+
187526
+ .stepperContainer.predestroy {
187527
+ opacity: 0;
187528
+ transition: opacity 0.2s ease-in;
187529
+ }
187530
+
187531
+ dees-tile.step {
187290
187532
  position: relative;
187291
187533
  pointer-events: none;
187292
- overflow: hidden;
187293
- transition: transform 0.7s cubic-bezier(0.87, 0, 0.13, 1), box-shadow 0.7s cubic-bezier(0.87, 0, 0.13, 1), filter 0.7s cubic-bezier(0.87, 0, 0.13, 1), border 0.7s cubic-bezier(0.87, 0, 0.13, 1);
187294
187534
  max-width: 500px;
187295
187535
  min-height: 300px;
187296
- border-radius: 12px;
187297
- background: ${cssManager.bdTheme("#ffffff", "#0f0f11")};
187298
- border: 1px solid ${cssManager.bdTheme("#e2e8f0", "#272729")};
187299
- color: ${cssManager.bdTheme("#0f172a", "#f5f5f5")};
187300
187536
  margin: auto;
187301
187537
  margin-bottom: 20px;
187302
187538
  filter: opacity(0.55) saturate(0.85);
187303
- box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
187539
+ transition: transform 0.7s cubic-bezier(0.87, 0, 0.13, 1), filter 0.7s cubic-bezier(0.87, 0, 0.13, 1);
187304
187540
  user-select: none;
187305
187541
  }
187306
187542
 
187307
- .step.selected {
187543
+ dees-tile.step.selected {
187308
187544
  pointer-events: all;
187309
187545
  filter: opacity(1) saturate(1);
187310
187546
  user-select: auto;
187311
187547
  }
187312
187548
 
187313
- .step.hiddenStep {
187549
+ dees-tile.step.hiddenStep {
187314
187550
  filter: opacity(0);
187315
187551
  }
187316
187552
 
187317
- .step.entrance {
187318
- transition: transform 0.35s ease, box-shadow 0.35s ease, filter 0.35s ease, border 0.35s ease;
187553
+ dees-tile.step.entrance {
187554
+ transition: transform 0.35s ease, filter 0.35s ease;
187319
187555
  }
187320
187556
 
187321
- .step.entrance.hiddenStep {
187557
+ dees-tile.step.entrance.hiddenStep {
187322
187558
  transform: translateY(16px);
187323
187559
  }
187324
187560
 
187325
- .step:last-child {
187561
+ dees-tile.step:last-child {
187326
187562
  margin-bottom: 100vh;
187327
187563
  }
187328
187564
 
187329
- .step .stepCounter {
187330
- color: ${cssManager.bdTheme("#64748b", "#a1a1aa")};
187331
- position: absolute;
187332
- top: 12px;
187333
- right: 12px;
187334
- padding: 6px 14px;
187335
- font-size: 12px;
187336
- border-radius: 999px;
187337
- background: ${cssManager.bdTheme("rgba(226, 232, 240, 0.5)", "rgba(63, 63, 70, 0.45)")};
187338
- border: 1px solid ${cssManager.bdTheme("rgba(226, 232, 240, 0.7)", "rgba(63, 63, 70, 0.6)")};
187565
+ .stepperContainer.overlay dees-tile.step::part(outer) {
187566
+ box-shadow:
187567
+ 0 0 0 1px ${cssManager.bdTheme("hsl(0 0% 0% / 0.03)", "hsl(0 0% 100% / 0.03)")},
187568
+ 0 8px 40px ${cssManager.bdTheme("hsl(0 0% 0% / 0.12)", "hsl(0 0% 0% / 0.5)")},
187569
+ 0 2px 8px ${cssManager.bdTheme("hsl(0 0% 0% / 0.06)", "hsl(0 0% 0% / 0.25)")};
187339
187570
  }
187340
187571
 
187341
- .step .goBack {
187342
- position: absolute;
187343
- top: 12px;
187344
- left: 12px;
187572
+ .step-header {
187573
+ height: 36px;
187574
+ display: flex;
187575
+ align-items: center;
187576
+ justify-content: space-between;
187577
+ padding: 0 8px 0 12px;
187578
+ gap: 12px;
187579
+ }
187580
+
187581
+ .goBack-spacer {
187582
+ width: 1px;
187583
+ }
187584
+
187585
+ .step-header .goBack {
187345
187586
  display: inline-flex;
187346
187587
  align-items: center;
187347
187588
  gap: 6px;
187348
- padding: 6px 12px;
187589
+ height: 24px;
187590
+ padding: 0 8px;
187349
187591
  font-size: 12px;
187350
187592
  font-weight: 500;
187351
- border-radius: 999px;
187352
- border: 1px solid ${cssManager.bdTheme("rgba(226, 232, 240, 0.9)", "rgba(63, 63, 70, 0.85)")};
187353
- background: ${cssManager.bdTheme("rgba(255, 255, 255, 0.9)", "rgba(39, 39, 42, 0.85)")};
187354
- color: ${cssManager.bdTheme("#475569", "#d4d4d8")};
187593
+ line-height: 1;
187594
+ border: none;
187595
+ background: transparent;
187596
+ color: var(--dees-color-text-muted);
187597
+ border-radius: 4px;
187355
187598
  cursor: pointer;
187356
- transition: border 0.2s ease, color 0.2s ease, background 0.2s ease, transform 0.2s ease;
187599
+ transition: background 0.15s ease, color 0.15s ease, transform 0.2s ease;
187357
187600
  }
187358
187601
 
187359
- .step .goBack:hover {
187360
- color: ${cssManager.bdTheme("#0f172a", "#fafafa")};
187361
- border-color: ${cssManager.bdTheme(dark.blue, dark.blue)};
187362
- background: ${cssManager.bdTheme("rgba(226, 232, 240, 0.95)", "rgba(63, 63, 70, 0.7)")};
187602
+ .step-header .goBack:hover {
187603
+ background: var(--dees-color-hover);
187604
+ color: var(--dees-color-text-secondary);
187363
187605
  transform: translateX(-2px);
187364
187606
  }
187365
187607
 
187366
- .step .goBack:active {
187367
- color: ${cssManager.bdTheme("#0f172a", "#fafafa")};
187368
- border-color: ${cssManager.bdTheme(dark.blueActive, dark.blueActive)};
187369
- background: ${cssManager.bdTheme("rgba(226, 232, 240, 0.85)", "rgba(63, 63, 70, 0.6)")};
187608
+ .step-header .goBack:active {
187609
+ background: ${cssManager.bdTheme("hsl(0 0% 90%)", "hsl(0 0% 15%)")};
187370
187610
  }
187371
187611
 
187372
- .step .goBack span {
187612
+ .step-header .goBack span {
187373
187613
  transition: transform 0.2s ease;
187374
187614
  display: inline-block;
187375
187615
  }
187376
187616
 
187377
- .step .goBack:hover span {
187617
+ .step-header .goBack:hover span {
187378
187618
  transform: translateX(-2px);
187379
187619
  }
187380
187620
 
187381
- .step .title {
187621
+ .step-header .stepCounter {
187622
+ color: var(--dees-color-text-muted);
187623
+ font-size: 12px;
187624
+ font-weight: 500;
187625
+ letter-spacing: -0.01em;
187626
+ padding: 0 8px;
187627
+ }
187628
+
187629
+ .step-body .title {
187382
187630
  text-align: center;
187383
- padding-top: 64px;
187631
+ padding-top: 32px;
187384
187632
  font-family: 'Geist Sans', sans-serif;
187385
187633
  font-size: 24px;
187386
187634
  font-weight: 600;
@@ -187388,9 +187636,92 @@ __publicField(_DeesStepper, "styles", [
187388
187636
  color: inherit;
187389
187637
  }
187390
187638
 
187391
- .step .content {
187639
+ .step-body .content {
187392
187640
  padding: 32px;
187393
187641
  }
187642
+
187643
+ /* --- Footer: modal-style bottom buttons --- */
187644
+ .bottomButtons {
187645
+ display: flex;
187646
+ flex-direction: row;
187647
+ justify-content: flex-end;
187648
+ align-items: center;
187649
+ gap: 0;
187650
+ height: 36px;
187651
+ width: 100%;
187652
+ box-sizing: border-box;
187653
+ }
187654
+
187655
+ .bottomButtons .bottomButton {
187656
+ padding: 0 16px;
187657
+ height: 100%;
187658
+ text-align: center;
187659
+ font-size: 12px;
187660
+ font-weight: 500;
187661
+ cursor: pointer;
187662
+ user-select: none;
187663
+ transition: all 0.15s ease;
187664
+ background: transparent;
187665
+ border: none;
187666
+ border-left: 1px solid var(--dees-color-border-subtle);
187667
+ color: var(--dees-color-text-muted);
187668
+ white-space: nowrap;
187669
+ display: flex;
187670
+ align-items: center;
187671
+ }
187672
+
187673
+ .bottomButtons .bottomButton:first-child {
187674
+ border-left: none;
187675
+ }
187676
+
187677
+ .bottomButtons .bottomButton:hover {
187678
+ background: var(--dees-color-hover);
187679
+ color: var(--dees-color-text-primary);
187680
+ }
187681
+
187682
+ .bottomButtons .bottomButton:active {
187683
+ background: ${cssManager.bdTheme("hsl(0 0% 92%)", "hsl(0 0% 13%)")};
187684
+ }
187685
+
187686
+ .bottomButtons .bottomButton.primary {
187687
+ color: ${cssManager.bdTheme("hsl(217.2 91.2% 59.8%)", "hsl(213.1 93.9% 67.8%)")};
187688
+ font-weight: 600;
187689
+ }
187690
+
187691
+ .bottomButtons .bottomButton.primary:hover {
187692
+ background: ${cssManager.bdTheme("hsl(217.2 91.2% 59.8% / 0.08)", "hsl(213.1 93.9% 67.8% / 0.08)")};
187693
+ color: ${cssManager.bdTheme("hsl(217.2 91.2% 50%)", "hsl(213.1 93.9% 75%)")};
187694
+ }
187695
+
187696
+ .bottomButtons .bottomButton.primary:active {
187697
+ background: ${cssManager.bdTheme("hsl(217.2 91.2% 59.8% / 0.12)", "hsl(213.1 93.9% 67.8% / 0.12)")};
187698
+ }
187699
+
187700
+ .bottomButtons .bottomButton.disabled {
187701
+ pointer-events: none;
187702
+ opacity: 0.4;
187703
+ cursor: not-allowed;
187704
+ }
187705
+
187706
+ .bottomButtons .bottomButton.disabled:hover {
187707
+ background: transparent;
187708
+ color: var(--dees-color-text-muted);
187709
+ }
187710
+
187711
+ /* Hint shown on the left of the footer when the active step's form has
187712
+ unfilled required fields. Uses margin-right: auto to push right-aligned
187713
+ buttons to the right while keeping the hint flush-left. */
187714
+ .bottomButtons .stepHint {
187715
+ margin-right: auto;
187716
+ padding: 0 16px;
187717
+ font-size: 11px;
187718
+ line-height: 1;
187719
+ letter-spacing: -0.01em;
187720
+ color: var(--dees-color-text-muted);
187721
+ display: flex;
187722
+ align-items: center;
187723
+ user-select: none;
187724
+ }
187394
187725
  `
187395
187726
  ]);
187396
187727
  __runInitializers(_init82, 1, _DeesStepper);
@@ -200867,7 +201198,7 @@ init_group_runtime();
200867
201198
  // ts_web/00_commitinfo_data.ts
200868
201199
  var commitinfo = {
200869
201200
  name: "@design.estate/dees-catalog",
200870
- version: "3.70.1",
201201
+ version: "3.71.1",
200871
201202
  description: "A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript."
200872
201203
  };
200873
201204
  export {
@@ -202840,4 +203171,4 @@ ibantools/jsnext/ibantools.js:
202840
203171
  * @preferred
202841
203172
  *)
202842
203173
  */
202843
- //# sourceMappingURL=bundle-1775897260164.js.map
203174
+ //# sourceMappingURL=bundle-1775924449030.js.map