@design.estate/dees-catalog 3.71.0 → 3.72.0

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;
@@ -187149,7 +187227,7 @@ var stepperDemo = /* @__PURE__ */ __name(() => b2`
187149
187227
  init_dist_ts30();
187150
187228
  init_dist_ts29();
187151
187229
  init_theme();
187152
- var _activeFormValid_dec, _activeForm_dec, _stepperZIndex_dec, _overlay_dec, _selectedStep_dec, _steps_dec, _a81, _DeesStepper_decorators, _init82, _steps, _selectedStep, _overlay, _stepperZIndex, _activeForm, _activeFormValid;
187230
+ var _activeFormValid_dec, _activeForm_dec, _stepperZIndex_dec, _cancelable_dec, _overlay_dec, _selectedStep_dec, _steps_dec, _a81, _DeesStepper_decorators, _init82, _steps, _selectedStep, _overlay, _cancelable, _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
@@ -187158,31 +187236,43 @@ var _DeesStepper = class _DeesStepper extends (_a81 = DeesElement, _steps_dec =
187158
187236
  })], _overlay_dec = [n5({
187159
187237
  type: Boolean,
187160
187238
  reflect: true
187239
+ })], _cancelable_dec = [n5({
187240
+ type: Boolean,
187241
+ reflect: true
187161
187242
  })], _stepperZIndex_dec = [n5({ type: Number, attribute: false })], _activeForm_dec = [n5({ type: Object, attribute: false })], _activeFormValid_dec = [n5({ type: Boolean, attribute: false })], _a81) {
187162
187243
  constructor() {
187163
187244
  super();
187164
187245
  __privateAdd(this, _steps, __runInitializers(_init82, 8, this, [])), __runInitializers(_init82, 11, this);
187165
187246
  __privateAdd(this, _selectedStep, __runInitializers(_init82, 12, this)), __runInitializers(_init82, 15, this);
187166
187247
  __privateAdd(this, _overlay, __runInitializers(_init82, 16, this, false)), __runInitializers(_init82, 19, this);
187167
- __privateAdd(this, _stepperZIndex, __runInitializers(_init82, 20, this, 1e3)), __runInitializers(_init82, 23, this);
187168
- __privateAdd(this, _activeForm, __runInitializers(_init82, 24, this, null)), __runInitializers(_init82, 27, this);
187169
- __privateAdd(this, _activeFormValid, __runInitializers(_init82, 28, this, true)), __runInitializers(_init82, 31, this);
187248
+ __privateAdd(this, _cancelable, __runInitializers(_init82, 20, this, true)), __runInitializers(_init82, 23, this);
187249
+ __privateAdd(this, _stepperZIndex, __runInitializers(_init82, 24, this, 1e3)), __runInitializers(_init82, 27, this);
187250
+ __privateAdd(this, _activeForm, __runInitializers(_init82, 28, this, null)), __runInitializers(_init82, 31, this);
187251
+ __privateAdd(this, _activeFormValid, __runInitializers(_init82, 32, this, true)), __runInitializers(_init82, 35, this);
187170
187252
  __publicField(this, "activeFormSubscription");
187171
187253
  __publicField(this, "windowLayer");
187172
187254
  __publicField(this, "getIndexOfStep", /* @__PURE__ */ __name((stepArg) => {
187173
187255
  return this.steps.findIndex((stepArg2) => stepArg === stepArg2);
187174
187256
  }, "getIndexOfStep"));
187175
187257
  __publicField(this, "scroller");
187258
+ /**
187259
+ * Currently-open confirmation modal (if any). Prevents double-stacking when
187260
+ * the user clicks the backdrop or the Cancel button while a confirm modal
187261
+ * is already visible. The reference may become stale (point to a destroyed
187262
+ * modal) if the user dismisses the confirm modal by clicking its own
187263
+ * backdrop — so handleCancelRequest() uses isConnected to detect that.
187264
+ */
187265
+ __publicField(this, "cancelConfirmModal");
187176
187266
  }
187177
187267
  static async createAndShow(optionsArg) {
187178
187268
  const body3 = document.body;
187179
187269
  const stepper = new _DeesStepper();
187180
187270
  stepper.steps = optionsArg.steps;
187181
187271
  stepper.overlay = true;
187272
+ if (optionsArg.cancelable !== void 0) {
187273
+ stepper.cancelable = optionsArg.cancelable;
187274
+ }
187182
187275
  stepper.windowLayer = await DeesWindowLayer.createAndShow({ blur: true });
187183
- stepper.windowLayer.addEventListener("click", async () => {
187184
- await stepper.destroy();
187185
- });
187186
187276
  body3.append(stepper.windowLayer);
187187
187277
  body3.append(stepper);
187188
187278
  stepper.stepperZIndex = zIndexRegistry.getNextZIndex();
@@ -187194,6 +187284,7 @@ var _DeesStepper = class _DeesStepper extends (_a81 = DeesElement, _steps_dec =
187194
187284
  <div
187195
187285
  class="stepperContainer ${this.overlay ? "overlay" : ""}"
187196
187286
  style=${this.overlay ? `z-index: ${this.stepperZIndex};` : ""}
187287
+ @click=${this.handleOutsideClick}
187197
187288
  >
187198
187289
  ${this.steps.map((stepArg, stepIndex) => {
187199
187290
  const isSelected = stepArg === this.selectedStep;
@@ -187214,19 +187305,23 @@ var _DeesStepper = class _DeesStepper extends (_a81 = DeesElement, _steps_dec =
187214
187305
  <div class="title">${stepArg.title}</div>
187215
187306
  <div class="content">${stepArg.content}</div>
187216
187307
  </div>
187217
- ${stepArg.menuOptions && stepArg.menuOptions.length > 0 ? b2`<div slot="footer" class="bottomButtons">
187218
- ${isSelected && this.activeForm !== null && !this.activeFormValid ? b2`<div class="stepHint">Complete form to continue</div>` : ""}
187219
- ${stepArg.menuOptions.map((actionArg, actionIndex) => {
187308
+ <div slot="footer" class="bottomButtons">
187309
+ ${isSelected && this.activeForm !== null && !this.activeFormValid ? b2`<div class="stepHint">Complete form to continue</div>` : ""}
187310
+ ${this.cancelable ? b2`<div
187311
+ class="bottomButton"
187312
+ @click=${() => this.handleCancelRequest()}
187313
+ >Cancel</div>` : ""}
187314
+ ${stepArg.menuOptions?.map((actionArg, actionIndex) => {
187220
187315
  const isPrimary = actionIndex === stepArg.menuOptions.length - 1;
187221
187316
  const isDisabled = isPrimary && this.activeForm !== null && !this.activeFormValid;
187222
187317
  return b2`
187223
- <div
187224
- class="bottomButton ${isPrimary ? "primary" : ""} ${isDisabled ? "disabled" : ""}"
187225
- @click=${() => this.handleMenuOptionClick(actionArg, isPrimary)}
187226
- >${actionArg.name}</div>
187227
- `;
187228
- })}
187229
- </div>` : ""}
187318
+ <div
187319
+ class="bottomButton ${isPrimary ? "primary" : ""} ${isDisabled ? "disabled" : ""}"
187320
+ @click=${() => this.handleMenuOptionClick(actionArg, isPrimary)}
187321
+ >${actionArg.name}</div>
187322
+ `;
187323
+ }) ?? ""}
187324
+ </div>
187230
187325
  </dees-tile>`;
187231
187326
  })}
187232
187327
  </div>
@@ -187368,6 +187463,65 @@ var _DeesStepper = class _DeesStepper extends (_a81 = DeesElement, _steps_dec =
187368
187463
  }
187369
187464
  await optionArg.action(this);
187370
187465
  }
187466
+ /**
187467
+ * Click handler on .stepperContainer. Mirrors dees-modal.handleOutsideClick:
187468
+ * when the user clicks the empty backdrop area (target === stepperContainer,
187469
+ * not any descendant tile), trigger the cancel confirmation flow. Clicks
187470
+ * that originate inside a step tile have a different event.target and are
187471
+ * ignored here.
187472
+ */
187473
+ handleOutsideClick(eventArg) {
187474
+ if (!this.overlay) return;
187475
+ if (!this.cancelable) return;
187476
+ eventArg.stopPropagation();
187477
+ const stepperContainer = this.shadowRoot.querySelector(".stepperContainer");
187478
+ if (eventArg.target === stepperContainer) {
187479
+ this.handleCancelRequest();
187480
+ }
187481
+ }
187482
+ /**
187483
+ * Shown by both the backdrop click and the Cancel button in the footer.
187484
+ * Presents a dees-modal asking the user to confirm cancellation. If they
187485
+ * confirm, the stepper and window layer are destroyed; otherwise the
187486
+ * confirm modal is dismissed and the stepper stays open.
187487
+ *
187488
+ * The isConnected check on the cached reference handles the case where the
187489
+ * user dismissed the previous confirm modal by clicking ITS OWN backdrop —
187490
+ * dees-modal.handleOutsideClick calls destroy() directly, bypassing our
187491
+ * action callbacks, so our cached reference would be stale without this
187492
+ * fallback check.
187493
+ */
187494
+ async handleCancelRequest() {
187495
+ if (!this.cancelable) return;
187496
+ if (this.cancelConfirmModal && this.cancelConfirmModal.isConnected) return;
187497
+ this.cancelConfirmModal = void 0;
187498
+ this.cancelConfirmModal = await DeesModal.createAndShow({
187499
+ heading: "Cancel setup?",
187500
+ width: "small",
187501
+ content: b2`
187502
+ <p style="margin: 0;">
187503
+ Are you sure you want to cancel? Any progress on the current step will be lost.
187504
+ </p>
187505
+ `,
187506
+ menuOptions: [
187507
+ {
187508
+ name: "Continue setup",
187509
+ action: /* @__PURE__ */ __name(async (modal) => {
187510
+ this.cancelConfirmModal = void 0;
187511
+ await modal.destroy();
187512
+ }, "action")
187513
+ },
187514
+ {
187515
+ name: "Yes, cancel",
187516
+ action: /* @__PURE__ */ __name(async (modal) => {
187517
+ this.cancelConfirmModal = void 0;
187518
+ await modal.destroy();
187519
+ await this.destroy();
187520
+ }, "action")
187521
+ }
187522
+ ]
187523
+ });
187524
+ }
187371
187525
  async destroy() {
187372
187526
  const domtools19 = await this.domtoolsPromise;
187373
187527
  const container = this.shadowRoot.querySelector(".stepperContainer");
@@ -187389,12 +187543,14 @@ _init82 = __decoratorStart(_a81);
187389
187543
  _steps = new WeakMap();
187390
187544
  _selectedStep = new WeakMap();
187391
187545
  _overlay = new WeakMap();
187546
+ _cancelable = new WeakMap();
187392
187547
  _stepperZIndex = new WeakMap();
187393
187548
  _activeForm = new WeakMap();
187394
187549
  _activeFormValid = new WeakMap();
187395
187550
  __decorateElement(_init82, 4, "steps", _steps_dec, _DeesStepper, _steps);
187396
187551
  __decorateElement(_init82, 4, "selectedStep", _selectedStep_dec, _DeesStepper, _selectedStep);
187397
187552
  __decorateElement(_init82, 4, "overlay", _overlay_dec, _DeesStepper, _overlay);
187553
+ __decorateElement(_init82, 4, "cancelable", _cancelable_dec, _DeesStepper, _cancelable);
187398
187554
  __decorateElement(_init82, 4, "stepperZIndex", _stepperZIndex_dec, _DeesStepper, _stepperZIndex);
187399
187555
  __decorateElement(_init82, 4, "activeForm", _activeForm_dec, _DeesStepper, _activeForm);
187400
187556
  __decorateElement(_init82, 4, "activeFormValid", _activeFormValid_dec, _DeesStepper, _activeFormValid);
@@ -187585,15 +187741,17 @@ __publicField(_DeesStepper, "styles", [
187585
187741
  transition: all 0.15s ease;
187586
187742
  background: transparent;
187587
187743
  border: none;
187588
- border-left: 1px solid var(--dees-color-border-subtle);
187589
187744
  color: var(--dees-color-text-muted);
187590
187745
  white-space: nowrap;
187591
187746
  display: flex;
187592
187747
  align-items: center;
187593
187748
  }
187594
187749
 
187595
- .bottomButtons .bottomButton:first-child {
187596
- border-left: none;
187750
+ /* Border-left separator on every button EXCEPT the first one.
187751
+ Uses general sibling so the stepHint (if rendered on the left) does
187752
+ not shift which button counts as "first" and create a phantom border. */
187753
+ .bottomButtons .bottomButton ~ .bottomButton {
187754
+ border-left: 1px solid var(--dees-color-border-subtle);
187597
187755
  }
187598
187756
 
187599
187757
  .bottomButtons .bottomButton:hover {
@@ -201120,7 +201278,7 @@ init_group_runtime();
201120
201278
  // ts_web/00_commitinfo_data.ts
201121
201279
  var commitinfo = {
201122
201280
  name: "@design.estate/dees-catalog",
201123
- version: "3.71.0",
201281
+ version: "3.72.0",
201124
201282
  description: "A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript."
201125
201283
  };
201126
201284
  export {
@@ -203093,4 +203251,4 @@ ibantools/jsnext/ibantools.js:
203093
203251
  * @preferred
203094
203252
  *)
203095
203253
  */
203096
- //# sourceMappingURL=bundle-1775904431442.js.map
203254
+ //# sourceMappingURL=bundle-1775937892404.js.map
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@design.estate/dees-catalog',
6
- version: '3.71.0',
6
+ version: '3.72.0',
7
7
  description: 'A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfd2ViLzAwX2NvbW1pdGluZm9fZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixJQUFJLEVBQUUsNkJBQTZCO0lBQ25DLE9BQU8sRUFBRSxRQUFRO0lBQ2pCLFdBQVcsRUFBRSxzSkFBc0o7Q0FDcEssQ0FBQSJ9
@@ -22,10 +22,18 @@ export declare class DeesStepper extends DeesElement {
22
22
  static demoGroups: string[];
23
23
  static createAndShow(optionsArg: {
24
24
  steps: IStep[];
25
+ cancelable?: boolean;
25
26
  }): Promise<DeesStepper>;
26
27
  accessor steps: IStep[];
27
28
  accessor selectedStep: IStep;
28
29
  accessor overlay: boolean;
30
+ /**
31
+ * When true (default), the stepper renders a Cancel button in every step's
32
+ * footer, and clicking the backdrop (overlay mode) triggers the same cancel
33
+ * confirmation flow. Set to false for forced flows where the user must
34
+ * complete the stepper — no Cancel button, no backdrop dismissal.
35
+ */
36
+ accessor cancelable: boolean;
29
37
  accessor stepperZIndex: number;
30
38
  accessor activeForm: DeesForm | null;
31
39
  accessor activeFormValid: boolean;
@@ -64,5 +72,34 @@ export declare class DeesStepper extends DeesElement {
64
72
  * completes before the click handler returns.
65
73
  */
66
74
  private handleMenuOptionClick;
75
+ /**
76
+ * Currently-open confirmation modal (if any). Prevents double-stacking when
77
+ * the user clicks the backdrop or the Cancel button while a confirm modal
78
+ * is already visible. The reference may become stale (point to a destroyed
79
+ * modal) if the user dismisses the confirm modal by clicking its own
80
+ * backdrop — so handleCancelRequest() uses isConnected to detect that.
81
+ */
82
+ private cancelConfirmModal?;
83
+ /**
84
+ * Click handler on .stepperContainer. Mirrors dees-modal.handleOutsideClick:
85
+ * when the user clicks the empty backdrop area (target === stepperContainer,
86
+ * not any descendant tile), trigger the cancel confirmation flow. Clicks
87
+ * that originate inside a step tile have a different event.target and are
88
+ * ignored here.
89
+ */
90
+ private handleOutsideClick;
91
+ /**
92
+ * Shown by both the backdrop click and the Cancel button in the footer.
93
+ * Presents a dees-modal asking the user to confirm cancellation. If they
94
+ * confirm, the stepper and window layer are destroyed; otherwise the
95
+ * confirm modal is dismissed and the stepper stays open.
96
+ *
97
+ * The isConnected check on the cached reference handles the case where the
98
+ * user dismissed the previous confirm modal by clicking ITS OWN backdrop —
99
+ * dees-modal.handleOutsideClick calls destroy() directly, bypassing our
100
+ * action callbacks, so our cached reference would be stale without this
101
+ * fallback check.
102
+ */
103
+ handleCancelRequest(): Promise<void>;
67
104
  destroy(): Promise<void>;
68
105
  }