@ds-gn/ui 0.6.2 → 0.8.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.
@@ -16,5 +16,23 @@ export declare const containerPaddingValues: {
16
16
  readonly XL: "xl";
17
17
  };
18
18
  export type ContainerPaddingType = (typeof containerPaddingValues)[keyof typeof containerPaddingValues];
19
+ /**
20
+ * Gutter step override. Leave unset to follow the inherited `--dsgn-gutter`,
21
+ * which pages and brands set once for every component.
22
+ */
19
23
  export declare const containerPaddingXProps: import("lit").PropertyDeclaration<unknown, unknown>;
20
- export declare const containerPaddingYProps: import("lit").PropertyDeclaration<unknown, unknown>;
24
+ /** Steps for the space above and below a page section. */
25
+ export declare const sectionSpaceValues: {
26
+ readonly NONE: "none";
27
+ readonly SM: "sm";
28
+ readonly MD: "md";
29
+ readonly LG: "lg";
30
+ readonly XL: "xl";
31
+ };
32
+ export type SectionSpaceType = ContainerPaddingType;
33
+ /**
34
+ * Section spacing override for one side. Leave unset to follow the inherited
35
+ * `--dsgn-section-space`.
36
+ */
37
+ export declare const paddingTopProps: import("lit").PropertyDeclaration<unknown, unknown>;
38
+ export declare const paddingBottomProps: import("lit").PropertyDeclaration<unknown, unknown>;
@@ -38,12 +38,17 @@ var containerPaddingValues = {
38
38
  LG: "lg",
39
39
  XL: "xl"
40
40
  };
41
- var containerPaddingXProps = enumCreator(Object.values(containerPaddingValues), "padding-x", String, { reflect: true, attribute: "padding-x" });
42
- var containerPaddingYProps = enumCreator(Object.values(containerPaddingValues), "padding-y", String, { reflect: true, attribute: "padding-y" });
41
+ var optional = (values) => [...values, undefined, null];
42
+ var containerPaddingXProps = enumCreator(optional(Object.values(containerPaddingValues)), "padding-x", String, { reflect: true, attribute: "padding-x" });
43
+ var sectionSpaceValues = containerPaddingValues;
44
+ var paddingTopProps = enumCreator(optional(Object.values(sectionSpaceValues)), "padding-top", String, { reflect: true, attribute: "padding-top" });
45
+ var paddingBottomProps = enumCreator(optional(Object.values(sectionSpaceValues)), "padding-bottom", String, { reflect: true, attribute: "padding-bottom" });
43
46
  export {
44
47
  containerPaddingValues,
45
48
  containerPaddingXProps,
46
- containerPaddingYProps,
47
49
  containerSizeProps,
48
- containerSizeValues
50
+ containerSizeValues,
51
+ paddingBottomProps,
52
+ paddingTopProps,
53
+ sectionSpaceValues
49
54
  };
@@ -1,2 +1,9 @@
1
- import type { ContainerPaddingType, ContainerSizeType } from './Container.props.js';
2
- export declare const classNames: (size: ContainerSizeType, paddingX: ContainerPaddingType, paddingY: ContainerPaddingType) => string;
1
+ import type { ContainerPaddingType, ContainerSizeType, SectionSpaceType } from './Container.props.js';
2
+ /** Shared by the component and its pre-upgrade stylesheet. */
3
+ export declare const paddingXClassNames: (padding?: ContainerPaddingType) => string;
4
+ /**
5
+ * Vertical padding. A section follows the inherited section space on any side
6
+ * left unset; a plain container has none there.
7
+ */
8
+ export declare const sectionSpaceClassNames: (section: boolean, top?: SectionSpaceType, bottom?: SectionSpaceType) => string;
9
+ export declare const classNames: (size: ContainerSizeType, paddingX: ContainerPaddingType | undefined, section: boolean, paddingTop?: SectionSpaceType, paddingBottom?: SectionSpaceType) => string;
@@ -8,12 +8,20 @@ import '../../Icon/src/Icon.js';
8
8
  import { Base } from '../../../common/Base/Base.js';
9
9
  import { type SurfaceType } from '../../../common/props/surface/surface.props.js';
10
10
  import { type CSSResultGroup } from 'lit';
11
+ import { type SectionSpaceType } from '../../Container/src/Container.props.js';
11
12
  import { type FeatureTabData } from './FeatureTabs.props.js';
12
13
  /** @slot header - Optional content above the tab interface. */
13
14
  export declare class FeatureTabs extends Base {
14
15
  static styles: CSSResultGroup;
16
+ /** Space above the section. Unset follows the inherited section space. */
17
+ paddingTop?: SectionSpaceType;
18
+ /** Space below the section. Unset follows the inherited section space. */
19
+ paddingBottom?: SectionSpaceType;
15
20
  private _inView;
16
21
  private _rotate;
22
+ private _motion;
23
+ /** The feature whose detail last faded in; the fade replays when it changes. */
24
+ private _shownIndex?;
17
25
  surface: SurfaceType;
18
26
  features: FeatureTabData[];
19
27
  duration: number;
@@ -32,6 +40,12 @@ export declare class FeatureTabs extends Base {
32
40
  constructor();
33
41
  firstUpdated(): void;
34
42
  updated(changedProperties: Map<string | number | symbol, unknown>): void;
43
+ /**
44
+ * Fade the detail in whenever the active feature changes. `keyed` renders a
45
+ * fresh element per feature, so each change animates a new node. This runs
46
+ * after render and before paint, so the new detail never shows unfaded.
47
+ */
48
+ private _fadeInDetail;
35
49
  private _handleTabClick;
36
50
  private _handleTabKeyDown;
37
51
  private _handlePauseResume;
@@ -95,20 +95,8 @@ class Base extends LitElement {
95
95
  }
96
96
  defineElement("dsgn-base", Base);
97
97
 
98
- // common/helpers/motion.ts
99
- var REDUCED_MOTION_QUERY = "(prefers-reduced-motion: reduce)";
100
- var cachedMatchMedia;
101
- var cachedQuery = null;
102
- function prefersReducedMotion() {
103
- const mm = typeof matchMedia === "function" ? matchMedia : undefined;
104
- if (mm !== cachedMatchMedia) {
105
- cachedMatchMedia = mm;
106
- cachedQuery = mm ? mm(REDUCED_MOTION_QUERY) : null;
107
- }
108
- return cachedQuery?.matches ?? false;
109
- }
110
-
111
98
  // common/controllers/AutoRotateController.ts
99
+ import { prefersReducedMotion } from "@ds-gn/motion";
112
100
  var TICK_MS = 32;
113
101
 
114
102
  class AutoRotateController {
@@ -229,6 +217,9 @@ var surfaceValues = {
229
217
  };
230
218
  var surfaceProps = enumCreator(Object.values(surfaceValues), "surface", String, { reflect: true });
231
219
 
220
+ // components/FeatureTabs/src/FeatureTabs.ts
221
+ import { MotionController } from "@ds-gn/motion/lit";
222
+
232
223
  // ../../node_modules/.bun/lit-html@3.3.3/node_modules/lit-html/development/is-server.js
233
224
  var NODE_MODE = false;
234
225
  var isServer = NODE_MODE;
@@ -304,8 +295,9 @@ import { property } from "lit/decorators.js";
304
295
  import { keyed } from "lit/directives/keyed.js";
305
296
  import { styleMap } from "lit/directives/style-map.js";
306
297
  import {
307
- containerPaddingValues,
308
- containerSizeValues
298
+ containerSizeValues,
299
+ paddingBottomProps,
300
+ paddingTopProps
309
301
  } from "../../Container/src/Container.props.js";
310
302
 
311
303
  // components/FeatureTabs/src/FeatureTabs.css
@@ -337,8 +329,6 @@ var styles2 = css2`/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.co
337
329
  --color-text-primary: inherit;
338
330
  --color-text-secondary: inherit;
339
331
  --color-text-tertiary: inherit;
340
- --animate-fade-in-a: fade-in-a 0.3s ease-in;
341
- --animate-fade-in-b: fade-in-b 0.3s ease-in;
342
332
  }
343
333
  }
344
334
  @layer utilities {
@@ -462,12 +452,6 @@ var styles2 = css2`/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.co
462
452
  .shrink-0 {
463
453
  flex-shrink: 0;
464
454
  }
465
- .animate-fade-in-a {
466
- animation: var(--animate-fade-in-a);
467
- }
468
- .animate-fade-in-b {
469
- animation: var(--animate-fade-in-b);
470
- }
471
455
  .cursor-pointer {
472
456
  cursor: pointer;
473
457
  }
@@ -849,22 +833,6 @@ var styles2 = css2`/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.co
849
833
  syntax: "*";
850
834
  inherits: false;
851
835
  }
852
- @keyframes fade-in-a {
853
- from {
854
- opacity: 0;
855
- }
856
- to {
857
- opacity: 1;
858
- }
859
- }
860
- @keyframes fade-in-b {
861
- from {
862
- opacity: 0;
863
- }
864
- to {
865
- opacity: 1;
866
- }
867
- }
868
836
  @layer properties {
869
837
  @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {
870
838
  *, ::before, ::after, ::backdrop {
@@ -1018,7 +986,7 @@ var patternOverlayStyles = () => ({
1018
986
  maskImage: PATTERN_MASK,
1019
987
  WebkitMaskImage: PATTERN_MASK
1020
988
  });
1021
- var detailContentClassNames = (idx) => clsx_default("relative", "flex", "flex-col", "flex-1", idx % 2 === 0 ? "animate-fade-in-a" : "animate-fade-in-b");
989
+ var detailContentClassNames = () => clsx_default("relative", "flex", "flex-col", "flex-1");
1022
990
  var detailHeaderClassNames = () => clsx_default("flex", "items-center", "gap-3", "mb-6");
1023
991
  var detailEyebrowClassNames = () => clsx_default("font-mono", "text-[11px]", "tracking-[0.06em]", "uppercase", "text-text-tertiary");
1024
992
  var detailCounterClassNames = () => clsx_default("ml-auto", "font-mono", "text-[12px]", "text-text-tertiary");
@@ -1068,6 +1036,7 @@ class FeatureTabs extends Base {
1068
1036
  config: { threshold: 0 },
1069
1037
  callback: (entries) => entries[entries.length - 1]?.isIntersecting ?? false
1070
1038
  });
1039
+ this._motion = new MotionController(this);
1071
1040
  this.surface = surfaceValues.DARK;
1072
1041
  this.features = DEFAULT_FEATURES;
1073
1042
  this.duration = DEFAULT_DURATION;
@@ -1088,6 +1057,14 @@ class FeatureTabs extends Base {
1088
1057
  if (changedProperties.has("duration")) {
1089
1058
  this._rotate.setDuration(this.duration);
1090
1059
  }
1060
+ this._fadeInDetail();
1061
+ }
1062
+ _fadeInDetail() {
1063
+ const index = this._rotate.activeIndex;
1064
+ if (index === this._shownIndex)
1065
+ return;
1066
+ this._shownIndex = index;
1067
+ this.renderRoot.querySelectorAll("[data-detail-content]").forEach((detail) => void this._motion.enter(detail, "fade"));
1091
1068
  }
1092
1069
  _handleTabClick(index) {
1093
1070
  this._rotate.goTo(index);
@@ -1147,7 +1124,7 @@ class FeatureTabs extends Base {
1147
1124
  <div aria-hidden="true" style=${styleMap(patternOverlayStyles())}></div>
1148
1125
 
1149
1126
  ${keyed(idx, html2`
1150
- <div class="${detailContentClassNames(idx)}">
1127
+ <div class="${detailContentClassNames()}" data-detail-content>
1151
1128
  <div class="${detailHeaderClassNames()}">
1152
1129
  <span class="${iconBadgeClassNames(true, true)}">
1153
1130
  ${this._renderIcon(feature.icon, "lg")}
@@ -1276,8 +1253,9 @@ class FeatureTabs extends Base {
1276
1253
  <section>
1277
1254
  <dsgn-container
1278
1255
  size="${containerSizeValues.XXL}"
1279
- padding-x="${containerPaddingValues.MD}"
1280
- padding-y="${containerPaddingValues.MD}"
1256
+ section
1257
+ .paddingTop=${this.paddingTop}
1258
+ .paddingBottom=${this.paddingBottom}
1281
1259
  >
1282
1260
  <div class="${headerClassNames()}">
1283
1261
  <slot name="header"></slot>
@@ -1300,6 +1278,12 @@ class FeatureTabs extends Base {
1300
1278
  `;
1301
1279
  }
1302
1280
  }
1281
+ __legacyDecorateClassTS([
1282
+ property({ ...paddingTopProps })
1283
+ ], FeatureTabs.prototype, "paddingTop", undefined);
1284
+ __legacyDecorateClassTS([
1285
+ property({ ...paddingBottomProps })
1286
+ ], FeatureTabs.prototype, "paddingBottom", undefined);
1303
1287
  __legacyDecorateClassTS([
1304
1288
  property({ ...surfaceProps })
1305
1289
  ], FeatureTabs.prototype, "surface", undefined);
@@ -18,7 +18,7 @@ export declare const controlBtnClassNames: () => string;
18
18
  export declare const controlDotClassNames: (rotating: boolean) => string;
19
19
  export declare const detailClassNames: () => string;
20
20
  export declare const patternOverlayStyles: () => Record<string, string>;
21
- export declare const detailContentClassNames: (idx: number) => string;
21
+ export declare const detailContentClassNames: () => string;
22
22
  export declare const detailHeaderClassNames: () => string;
23
23
  export declare const detailEyebrowClassNames: () => string;
24
24
  export declare const detailCounterClassNames: () => string;
@@ -3,7 +3,7 @@ import '../../Container/src/Container.js';
3
3
  import { type CSSResultGroup } from 'lit';
4
4
  import { Base } from '../../../common/Base/Base.js';
5
5
  import { type SurfaceType } from '../../../common/props/surface/surface.props.js';
6
- import { type ContainerPaddingType, type ContainerSizeType } from '../../Container/src/Container.props.js';
6
+ import { type ContainerSizeType, type SectionSpaceType } from '../../Container/src/Container.props.js';
7
7
  /**
8
8
  * @slot logo - Brand or logo content.
9
9
  * @slot col-1 - First footer column.
@@ -21,14 +21,10 @@ export declare class Footer extends Base {
21
21
  * Container max-width size
22
22
  */
23
23
  containerSize: ContainerSizeType;
24
- /**
25
- * Container horizontal padding
26
- */
27
- containerPaddingX: ContainerPaddingType;
28
- /**
29
- * Container vertical padding
30
- */
31
- containerPaddingY: ContainerPaddingType;
24
+ /** Space above the section. Unset follows the inherited section space. */
25
+ paddingTop?: SectionSpaceType;
26
+ /** Space below the section. Unset follows the inherited section space. */
27
+ paddingBottom?: SectionSpaceType;
32
28
  updated(changedProperties: Map<string | number | symbol, unknown>): void;
33
29
  render(): import("lit").TemplateResult<1>;
34
30
  }
@@ -124,11 +124,10 @@ var surfaceProps = enumCreator(Object.values(surfaceValues), "surface", String,
124
124
 
125
125
  // components/Footer/src/Footer.ts
126
126
  import {
127
- containerPaddingValues,
128
- containerPaddingXProps,
129
- containerPaddingYProps,
130
127
  containerSizeProps,
131
- containerSizeValues
128
+ containerSizeValues,
129
+ paddingBottomProps,
130
+ paddingTopProps
132
131
  } from "../../Container/src/Container.props.js";
133
132
 
134
133
  // components/Footer/src/Footer.css
@@ -303,8 +302,6 @@ class Footer extends Base {
303
302
  super(...arguments);
304
303
  this.surface = surfaceValues.DARK;
305
304
  this.containerSize = containerSizeValues.XXL;
306
- this.containerPaddingX = containerPaddingValues.SM;
307
- this.containerPaddingY = containerPaddingValues.LG;
308
305
  }
309
306
  static styles = [Base.styles, Footer_default];
310
307
  updated(changedProperties) {
@@ -316,8 +313,9 @@ class Footer extends Base {
316
313
  <footer class="${classNames()}">
317
314
  <dsgn-container
318
315
  size="${this.containerSize}"
319
- padding-x="${this.containerPaddingX}"
320
- padding-y="${this.containerPaddingY}"
316
+ section
317
+ .paddingTop=${this.paddingTop}
318
+ .paddingBottom=${this.paddingBottom}
321
319
  >
322
320
  <div class="${topClasses()}">
323
321
  <div class="${logoClasses()}">
@@ -350,11 +348,11 @@ __legacyDecorateClassTS([
350
348
  property({ ...containerSizeProps, attribute: "container-size" })
351
349
  ], Footer.prototype, "containerSize", undefined);
352
350
  __legacyDecorateClassTS([
353
- property({ ...containerPaddingXProps })
354
- ], Footer.prototype, "containerPaddingX", undefined);
351
+ property({ ...paddingTopProps })
352
+ ], Footer.prototype, "paddingTop", undefined);
355
353
  __legacyDecorateClassTS([
356
- property({ ...containerPaddingYProps })
357
- ], Footer.prototype, "containerPaddingY", undefined);
354
+ property({ ...paddingBottomProps })
355
+ ], Footer.prototype, "paddingBottom", undefined);
358
356
  defineElement("dsgn-footer", Footer);
359
357
  export {
360
358
  Footer
@@ -157,20 +157,8 @@ class Base extends LitElement {
157
157
  }
158
158
  defineElement("dsgn-base", Base);
159
159
 
160
- // common/helpers/motion.ts
161
- var REDUCED_MOTION_QUERY = "(prefers-reduced-motion: reduce)";
162
- var cachedMatchMedia;
163
- var cachedQuery = null;
164
- function prefersReducedMotion() {
165
- const mm = typeof matchMedia === "function" ? matchMedia : undefined;
166
- if (mm !== cachedMatchMedia) {
167
- cachedMatchMedia = mm;
168
- cachedQuery = mm ? mm(REDUCED_MOTION_QUERY) : null;
169
- }
170
- return cachedQuery?.matches ?? false;
171
- }
172
-
173
160
  // common/controllers/WordCycleController.ts
161
+ import { prefersReducedMotion } from "@ds-gn/motion";
174
162
  var DEFAULT_INTERVAL = 1000;
175
163
 
176
164
  class WordCycleController {
@@ -6,6 +6,7 @@ import '../../HeadingBlock/src/HeadingBlock.js';
6
6
  import { type CSSResultGroup } from 'lit';
7
7
  import { Base } from '../../../common/Base/Base.js';
8
8
  import { type SurfaceType } from '../../../common/props/surface/surface.props.js';
9
+ import { type SectionSpaceType } from '../../Container/src/Container.props.js';
9
10
  import { type HeroContentAlignType, type HeroLayoutType, type HeroMinHeightType } from './Hero.props.js';
10
11
  /**
11
12
  * @slot content - Primary hero content.
@@ -32,6 +33,10 @@ export declare class Hero extends Base {
32
33
  * Has no effect on asset-right / asset-left / asset-background layouts.
33
34
  */
34
35
  contentAlign: HeroContentAlignType;
36
+ /** Space above the section. Unset follows the inherited section space. */
37
+ paddingTop?: SectionSpaceType;
38
+ /** Space below the section. Unset follows the inherited section space. */
39
+ paddingBottom?: SectionSpaceType;
35
40
  updated(changedProperties: Map<string | number | symbol, unknown>): void;
36
41
  render(): import("lit").TemplateResult<1>;
37
42
  }
@@ -126,7 +126,11 @@ var surfaceValues = {
126
126
  var surfaceProps = enumCreator(Object.values(surfaceValues), "surface", String, { reflect: true });
127
127
 
128
128
  // components/Hero/src/Hero.ts
129
- import { containerSizeValues } from "../../Container/src/Container.props.js";
129
+ import {
130
+ containerSizeValues,
131
+ paddingBottomProps,
132
+ paddingTopProps
133
+ } from "../../Container/src/Container.props.js";
130
134
  import {
131
135
  gridAlignValues,
132
136
  gridColsValues,
@@ -399,8 +403,9 @@ var overlayClassNames = () => {
399
403
  var featuresClassNames = () => {
400
404
  return clsx_default("mt-14", "pb-6", "relative", "z-10");
401
405
  };
406
+ var featuresTypographyClassNames = () => clsx_default("font-mono", "text-xs", "text-text-tertiary", "tracking-[0.02em]", "uppercase");
402
407
  var featuresContentClassNames = (layout, contentAlign) => {
403
- return clsx_default("flex", "gap-10", "flex-wrap", "font-mono", "text-xs", "text-text-tertiary", "tracking-[0.02em]", "uppercase", layout === "centered" && contentAlign === "center" && "justify-center");
408
+ return clsx_default("flex", "gap-10", "flex-wrap", featuresTypographyClassNames(), layout === "centered" && contentAlign === "center" && "justify-center");
404
409
  };
405
410
  var centeredFormClassNames = (contentAlign) => {
406
411
  return clsx_default("flex", "w-full", contentAlign === "center" ? "justify-center" : "justify-start");
@@ -430,7 +435,12 @@ class Hero extends Base {
430
435
  </div>
431
436
  </div>
432
437
  <div class="${overlayClassNames()}"></div>
433
- <dsgn-container size="${containerSizeValues.XXL}">
438
+ <dsgn-container
439
+ size="${containerSizeValues.XXL}"
440
+ section
441
+ .paddingTop=${this.paddingTop}
442
+ .paddingBottom=${this.paddingBottom}
443
+ >
434
444
  <div class="${backgroundInnerClassNames()}">
435
445
  <slot name="content"></slot>
436
446
  <slot name="form"></slot>
@@ -447,7 +457,12 @@ class Hero extends Base {
447
457
  if (this.layout === heroLayoutValues.CENTERED) {
448
458
  return html2`
449
459
  <div class="${wrapperClassNames(this.layout, this.minHeight)}">
450
- <dsgn-container size="${containerSizeValues.XXL}">
460
+ <dsgn-container
461
+ size="${containerSizeValues.XXL}"
462
+ section
463
+ .paddingTop=${this.paddingTop}
464
+ .paddingBottom=${this.paddingBottom}
465
+ >
451
466
  <div class="${centeredInnerClassNames()}">
452
467
  <slot name="content"></slot>
453
468
  <div class="${centeredFormClassNames(this.contentAlign)}">
@@ -467,7 +482,12 @@ class Hero extends Base {
467
482
  }
468
483
  return html2`
469
484
  <div class="${wrapperClassNames(this.layout, this.minHeight)}">
470
- <dsgn-container size="${containerSizeValues.XXL}">
485
+ <dsgn-container
486
+ size="${containerSizeValues.XXL}"
487
+ section
488
+ .paddingTop=${this.paddingTop}
489
+ .paddingBottom=${this.paddingBottom}
490
+ >
471
491
  <dsgn-grid
472
492
  .cols=${gridColsValues.EIGHT_FOUR}
473
493
  .gap=${gridGapValues.LG}
@@ -500,6 +520,12 @@ __legacyDecorateClassTS([
500
520
  __legacyDecorateClassTS([
501
521
  property({ ...heroContentAlignProps })
502
522
  ], Hero.prototype, "contentAlign", undefined);
523
+ __legacyDecorateClassTS([
524
+ property({ ...paddingTopProps })
525
+ ], Hero.prototype, "paddingTop", undefined);
526
+ __legacyDecorateClassTS([
527
+ property({ ...paddingBottomProps })
528
+ ], Hero.prototype, "paddingBottom", undefined);
503
529
  defineElement("dsgn-hero", Hero);
504
530
  export {
505
531
  Hero
@@ -6,5 +6,6 @@ export declare const assetClassNames: (layout: HeroLayoutType) => string;
6
6
  export declare const assetInnerClassNames: (layout: HeroLayoutType) => string;
7
7
  export declare const overlayClassNames: () => string;
8
8
  export declare const featuresClassNames: () => string;
9
+ export declare const featuresTypographyClassNames: () => string;
9
10
  export declare const featuresContentClassNames: (layout?: HeroLayoutType, contentAlign?: HeroContentAlignType) => string;
10
11
  export declare const centeredFormClassNames: (contentAlign?: HeroContentAlignType) => string;
@@ -72,8 +72,10 @@ export declare class Modal extends Base {
72
72
  * keyboard users are stuck.
73
73
  */
74
74
  noEscapeDismiss: boolean;
75
- /** Drives `data-state`, which the stylesheet keys the exit animation on. */
75
+ private readonly _motion;
76
76
  private _closing;
77
+ /** Invalidates an exit when reopened, disconnected, or closed externally. */
78
+ private _closeRun;
77
79
  private _hasHeading;
78
80
  private _hasDescription;
79
81
  private _hasFooter;
@@ -118,6 +120,7 @@ export declare class Modal extends Base {
118
120
  * on the animations' own `finished` promises.
119
121
  */
120
122
  private _runCloseSequence;
123
+ private _animateDialog;
121
124
  /**
122
125
  * Deliberate initial focus: an author-marked `[autofocus]` (light DOM first,
123
126
  * since that is where the modal's content lives), otherwise the dialog itself.