@tylertech/forge 3.6.4 → 3.8.0-dev.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.
Files changed (143) hide show
  1. package/custom-elements.json +435 -350
  2. package/dist/button/forge-button.css +3 -2
  3. package/dist/dialog/forge-dialog.css +3 -0
  4. package/dist/lib.js +23 -15
  5. package/dist/lib.js.map +4 -4
  6. package/dist/list/forge-list.css +5 -1
  7. package/dist/switch/forge-switch.css +1 -1
  8. package/dist/vscode.css-custom-data.json +36 -20
  9. package/dist/vscode.html-custom-data.json +27 -48
  10. package/esm/app-bar/notification-button/app-bar-notification-button-adapter.js +4 -5
  11. package/esm/app-bar/notification-button/app-bar-notification-button.js +6 -3
  12. package/esm/app-bar/profile-button/app-bar-profile-button.js +1 -1
  13. package/esm/autocomplete/autocomplete-adapter.js +1 -1
  14. package/esm/avatar/avatar-constants.d.ts +1 -0
  15. package/esm/avatar/avatar-constants.js +1 -0
  16. package/esm/avatar/avatar.d.ts +1 -1
  17. package/esm/avatar/avatar.js +1 -1
  18. package/esm/badge/badge-component-delegate.js +1 -2
  19. package/esm/badge/badge-constants.d.ts +1 -0
  20. package/esm/badge/badge-constants.js +1 -0
  21. package/esm/badge/badge.d.ts +20 -23
  22. package/esm/badge/badge.js +57 -47
  23. package/esm/badge/index.js +3 -3
  24. package/esm/bottom-sheet/bottom-sheet-constants.d.ts +1 -1
  25. package/esm/bottom-sheet/bottom-sheet.d.ts +3 -1
  26. package/esm/button/button.js +1 -1
  27. package/esm/button-toggle/button-toggle-group/button-toggle-group-adapter.js +1 -2
  28. package/esm/button-toggle/button-toggle-group/button-toggle-group.d.ts +6 -6
  29. package/esm/button-toggle/button-toggle-group/button-toggle-group.js +6 -6
  30. package/esm/card/card-constants.d.ts +1 -0
  31. package/esm/card/card-constants.js +1 -0
  32. package/esm/card/card.d.ts +12 -13
  33. package/esm/card/card.js +25 -34
  34. package/esm/card/index.js +3 -3
  35. package/esm/checkbox/checkbox.d.ts +5 -1
  36. package/esm/chips/chip/chip-constants.d.ts +1 -1
  37. package/esm/core/delegates/base-component-delegate.d.ts +1 -1
  38. package/esm/core/mask/date-input-mask.d.ts +3 -3
  39. package/esm/core/mask/date-input-mask.js +7 -8
  40. package/esm/core/mask/intermediate-time-parser.d.ts +2 -2
  41. package/esm/core/mask/intermediate-time-parser.js +2 -3
  42. package/esm/core/mask/time-input-mask.d.ts +3 -3
  43. package/esm/core/mask/time-input-mask.js +4 -5
  44. package/esm/core/mixins/label/with-label-aware.d.ts +4 -1
  45. package/esm/core/utils/a11y-utils.d.ts +0 -8
  46. package/esm/core/utils/a11y-utils.js +5 -25
  47. package/esm/core/utils/dismissible-stack.d.ts +7 -0
  48. package/esm/core/utils/position-utils.d.ts +1 -2
  49. package/esm/core/utils/position-utils.js +7 -22
  50. package/esm/core/utils/utils.d.ts +14 -0
  51. package/esm/core/utils/utils.js +44 -1
  52. package/esm/date-picker/base/base-date-picker-constants.d.ts +2 -2
  53. package/esm/deprecated/button/deprecated-button.js +1 -1
  54. package/esm/dialog/dialog-core.js +2 -2
  55. package/esm/dialog/dialog.d.ts +2 -0
  56. package/esm/dialog/dialog.js +1 -1
  57. package/esm/expansion-panel/expansion-panel-adapter.d.ts +31 -0
  58. package/esm/expansion-panel/expansion-panel-adapter.js +60 -1
  59. package/esm/expansion-panel/expansion-panel-constants.d.ts +4 -0
  60. package/esm/expansion-panel/expansion-panel-constants.js +4 -1
  61. package/esm/expansion-panel/expansion-panel-core.d.ts +13 -1
  62. package/esm/expansion-panel/expansion-panel-core.js +63 -1
  63. package/esm/expansion-panel/expansion-panel.d.ts +9 -0
  64. package/esm/expansion-panel/expansion-panel.js +14 -0
  65. package/esm/field/base/base-field.d.ts +1 -0
  66. package/esm/field/base/base-field.js +1 -0
  67. package/esm/field/field-constants.d.ts +1 -0
  68. package/esm/field/field-constants.js +1 -0
  69. package/esm/field/field.d.ts +1 -0
  70. package/esm/field/field.js +3 -2
  71. package/esm/floating-action-button/floating-action-button-constants.d.ts +1 -1
  72. package/esm/icon/icon-constants.d.ts +1 -1
  73. package/esm/icon/icon-registry.d.ts +6 -0
  74. package/esm/icon-button/icon-button-constants.d.ts +1 -1
  75. package/esm/label/label-adapter.js +1 -1
  76. package/esm/list/list-item/list-item.js +1 -1
  77. package/esm/list-dropdown/list-dropdown-constants.d.ts +11 -0
  78. package/esm/list-dropdown/list-dropdown-utils.js +18 -0
  79. package/esm/menu/menu-constants.d.ts +0 -1
  80. package/esm/menu/menu-constants.js +1 -2
  81. package/esm/menu/menu-core.js +1 -1
  82. package/esm/menu/menu.js +2 -1
  83. package/esm/meter/meter/meter.js +2 -1
  84. package/esm/meter/meter-group/meter-group.js +2 -1
  85. package/esm/overlay/base/base-overlay-core.d.ts +3 -3
  86. package/esm/overlay/base/base-overlay.d.ts +3 -3
  87. package/esm/overlay/base/base-overlay.js +11 -1
  88. package/esm/overlay/base/overlay-aware-core.d.ts +3 -3
  89. package/esm/overlay/base/overlay-aware-core.js +2 -1
  90. package/esm/overlay/overlay-adapter.d.ts +2 -2
  91. package/esm/overlay/overlay-adapter.js +6 -14
  92. package/esm/overlay/overlay-constants.d.ts +2 -5
  93. package/esm/overlay/overlay-constants.js +2 -23
  94. package/esm/overlay/overlay-core.d.ts +3 -3
  95. package/esm/overlay/overlay-core.js +13 -3
  96. package/esm/overlay/overlay.d.ts +2 -2
  97. package/esm/overlay/overlay.js +2 -2
  98. package/esm/popover/popover-adapter.js +2 -2
  99. package/esm/popover/popover.js +1 -1
  100. package/esm/profile-card/profile-card-core.js +4 -4
  101. package/esm/radio/core/radio-group-manager.d.ts +2 -1
  102. package/esm/radio/radio/radio.d.ts +1 -0
  103. package/esm/select/core/base-select-adapter.js +2 -1
  104. package/esm/select/option/option-constants.d.ts +1 -0
  105. package/esm/select/option/option-constants.js +1 -0
  106. package/esm/select/option/option-core.d.ts +4 -1
  107. package/esm/select/option/option-core.js +8 -0
  108. package/esm/select/option/option.d.ts +5 -1
  109. package/esm/select/option/option.js +8 -1
  110. package/esm/select/select/select-core.js +1 -3
  111. package/esm/select/select/select.d.ts +1 -0
  112. package/esm/select/select/select.js +1 -0
  113. package/esm/split-button/split-button-constants.d.ts +2 -2
  114. package/esm/split-view/split-view-panel/split-view-panel.js +1 -1
  115. package/esm/stepper/stepper/stepper-constants.d.ts +15 -1
  116. package/esm/switch/switch.d.ts +6 -2
  117. package/esm/switch/switch.js +1 -1
  118. package/esm/table/table-core.js +10 -2
  119. package/esm/table/table-utils.js +8 -4
  120. package/esm/tabs/tab-bar/tab-bar-core.js +3 -0
  121. package/esm/text-field/text-field.d.ts +1 -0
  122. package/esm/text-field/text-field.js +1 -0
  123. package/esm/time-picker/time-picker-adapter.js +0 -1
  124. package/esm/time-picker/time-picker-constants.d.ts +2 -2
  125. package/esm/toast/toast-constants.d.ts +1 -1
  126. package/esm/tooltip/tooltip-constants.d.ts +1 -1
  127. package/package.json +4 -4
  128. package/sass/badge/badge.scss +10 -10
  129. package/sass/button/_core.scss +1 -0
  130. package/sass/calendar/_variables.scss +3 -2
  131. package/sass/card/card.scss +1 -1
  132. package/sass/core/styles/tokens/button/_tokens.scss +2 -2
  133. package/sass/core/styles/tokens/slider/_tokens.scss +10 -4
  134. package/sass/core/styles/tokens/switch/_tokens.scss +1 -1
  135. package/sass/dialog/dialog.scss +8 -0
  136. package/sass/dialog/forge-dialog.scss +4 -0
  137. package/sass/field/_core.scss +1 -1
  138. package/sass/field/field.scss +1 -1
  139. package/sass/linear-progress/linear-progress.scss +7 -3
  140. package/sass/list/list-item/_core.scss +9 -1
  141. package/sass/list/list-item/list-item.scss +5 -1
  142. package/sass/popover/popover.scss +0 -1
  143. package/sass/slider/_core.scss +2 -3
@@ -15,7 +15,7 @@ import { DialogAdapter } from './dialog-adapter';
15
15
  import { DIALOG_CONSTANTS, dialogStack, hideBackdrop, showBackdrop } from './dialog-constants';
16
16
  import { DialogCore } from './dialog-core';
17
17
  const template = '<template><dialog class=\"forge-dialog\" part=\"root\"><forge-backdrop exportparts=\"root:backdrop\"></forge-backdrop><div class=\"surface\" part=\"surface\"><div class=\"move-handle-container\" part=\"move-handle-container\"><div class=\"move-handle\" part=\"move-handle\"><slot name=\"move-handle\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" part=\"move-handle-icon\"><path d=\"M3 15v-2h2v2H3m0-4V9h2v2H3m4 4v-2h2v2H7m0-4V9h2v2H7m4 4v-2h2v2h-2m0-4V9h2v2h-2m4 4v-2h2v2h-2m0-4V9h2v2h-2m4 4v-2h2v2h-2m0-4V9h2v2h-2z\"/></svg></slot></div></div><slot></slot></div></dialog></template>';
18
- const styles = '@keyframes forge-dialog-zoom-in{from{opacity:var(--_dialog-zoom-opacity);scale:var(--_dialog-zoom-scale)}to{opacity:1;scale:1}}@keyframes forge-dialog-zoom-out{from{opacity:1;scale:1}to{opacity:var(--_dialog-zoom-opacity);scale:var(--_dialog-zoom-scale)}}@keyframes forge-dialog-fade-in{from{opacity:var(--_dialog-fade-opacity)}to{opacity:1}}@keyframes forge-dialog-fade-out{from{opacity:1}to{opacity:var(--_dialog-fade-opacity)}}@keyframes forge-dialog-slide-in{from{opacity:var(--_dialog-slide-opacity);translate:var(--_dialog-slide-translate)}to{opacity:1;translate:0 0}}@keyframes forge-dialog-slide-out{from{opacity:1;translate:0 0}to{opacity:var(--_dialog-slide-opacity);translate:var(--_dialog-slide-translate)}}@layer base,nonmodal,animation,placement,size-strategy,preset,fullscreen,position-strategy,media; @layer base{:host{display:none;--forge-theme-surface:var(--forge-theme-surface-bright, #ffffff)}:host([hidden]){display:none}.forge-dialog{--_dialog-background:var(--forge-dialog-background, var(--forge-theme-surface-bright, #ffffff));--_dialog-shape:var(--forge-dialog-shape, calc(var(--forge-shape-medium, 4px) * var(--forge-shape-factor, 1)));--_dialog-elevation:var(--forge-dialog-elevation, 0px 11px 15px -7px rgba(0, 0, 0, 0.2), 0px 24px 38px 3px rgba(0, 0, 0, 0.14), 0px 9px 46px 8px rgba(0, 0, 0, 0.12));--_dialog-spacing:var(--forge-dialog-spacing, auto);--_dialog-block-start-spacing:var(--forge-dialog-block-start-spacing, var(--_dialog-spacing));--_dialog-block-end-spacing:var(--forge-dialog-block-end-spacing, var(--_dialog-spacing));--_dialog-inline-start-spacing:var(--forge-dialog-inline-start-spacing, var(--_dialog-spacing));--_dialog-inline-end-spacing:var(--forge-dialog-inline-end-spacing, var(--_dialog-spacing));--_dialog-padding:var(--forge-dialog-padding, 0);--_dialog-width:var(--forge-dialog-width, fit-content);--_dialog-height:var(--forge-dialog-height, fit-content);--_dialog-min-width:var(--forge-dialog-min-width, 0);--_dialog-max-width:var(--forge-dialog-max-width, calc(100% - var(--forge-spacing-xxlarge, 48px)));--_dialog-min-height:var(--forge-dialog-min-height, 0);--_dialog-max-height:var(--forge-dialog-max-height, calc(100% - var(--forge-spacing-xxlarge, 48px)));--_dialog-z-index:var(--forge-dialog-z-index, var(--forge-z-index-dialog, 8));--_dialog-move-handle-color:var(--forge-dialog-move-handle-color, currentColor);--_dialog-move-handle-size:var(--forge-dialog-move-handle-size, 24px);--_dialog-move-handle-hover-cursor:var(--forge-dialog-move-handle-hover-cursor, grab);--_dialog-move-handle-active-cursor:var(--forge-dialog-move-handle-active-cursor, grabbing);--_dialog-move-handle-spacing:var(--forge-dialog-move-handle-spacing, calc(var(--forge-spacing-xxsmall, 4px) * -1) 0 0);--_dialog-move-transition-duration:var(--forge-dialog-move-transition-duration, var(--forge-animation-duration-short4, 200ms));--_dialog-move-transition-easing:var(--forge-dialog-move-transition-easing, var(--forge-animation-easing-standard, cubic-bezier(0.2, 0, 0, 1)));--_dialog-moving-opacity:var(--forge-dialog-moving-opacity, 0.54);--_dialog-enter-animation-duration:var(--forge-dialog-enter-animation-duration, var(--forge-animation-duration-medium1, 250ms));--_dialog-enter-animation-easing:var(--forge-dialog-enter-animation-easing, var(--forge-animation-easing-standard, cubic-bezier(0.2, 0, 0, 1)));--_dialog-exit-animation-duration:var(--forge-dialog-exit-animation-duration, var(--forge-animation-duration-short2, 100ms));--_dialog-exit-animation-easing:var(--forge-dialog-exit-animation-easing, var(--forge-animation-easing-emphasized-accelerate, cubic-bezier(0.3, 0, 0.8, 0.15)));--_dialog-zoom-opacity:var(--forge-dialog-zoom-opacity, 0);--_dialog-zoom-scale:var(--forge-dialog-zoom-scale, 0.8);--_dialog-fade-opacity:var(--forge-dialog-fade-opacity, 0);--_dialog-slide-opacity:var(--forge-dialog-slide-opacity, 0);--_dialog-slide-translate:var(--forge-dialog-slide-translate, 0 -30%);--_dialog-backdrop-opacity:var(--forge-dialog-backdrop-opacity, var(--forge-backdrop-opacity, 0.54));--_dialog-nonmodal-elevation:var(--forge-dialog-nonmodal-elevation, 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12));--_dialog-fullscreen-enter-animation-duration:var(--forge-dialog-fullscreen-enter-animation-duration, var(--forge-animation-duration-medium1, 250ms));--_dialog-fullscreen-exit-animation-duration:var(--forge-dialog-fullscreen-exit-animation-duration, var(--forge-animation-duration-short2, 100ms));--_dialog-position-x:var(--forge-dialog-position-x, 0);--_dialog-position-y:var(--forge-dialog-position-y, 0);--_dialog-preset-sheet-enter-animation-duration:var(--forge-dialog-preset-sheet-enter-animation-duration, var(--forge-animation-duration-medium1, 250ms));--_dialog-preset-sheet-exit-animation-duration:var(--forge-dialog-preset-sheet-exit-animation-duration, var(--forge-animation-duration-short3, 150ms))}.forge-dialog{position:fixed;inset:0;z-index:var(--_dialog-z-index);background-color:transparent;color:inherit;border:none;width:auto;height:auto;padding:0;margin:0;overflow:visible;max-width:100%;max-height:100%;box-sizing:border-box}.container{display:flex;justify-content:center;align-items:center;width:100%;height:100%}.surface{position:absolute;inset:0;display:flex;background:var(--_dialog-background);box-shadow:var(--_dialog-elevation);z-index:var(--_dialog-z-index);overflow:hidden;border-radius:var(--_dialog-shape);margin-block-start:var(--_dialog-block-start-spacing);margin-block-end:var(--_dialog-block-end-spacing);margin-inline-start:var(--_dialog-inline-start-spacing);margin-inline-end:var(--_dialog-inline-end-spacing);padding:var(--_dialog-padding);width:var(--_dialog-width);height:var(--_dialog-height);min-width:var(--_dialog-min-width);max-width:var(--_dialog-max-width);min-height:var(--_dialog-min-height);max-height:var(--_dialog-max-height);box-sizing:border-box}.visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:fixed;width:1px;outline:0;-webkit-appearance:none;-moz-appearance:none}dialog.forge-dialog::backdrop{display:none}forge-backdrop{--forge-backdrop-opacity:var(--_dialog-backdrop-opacity);--forge-backdrop-enter-animation-duration:var(--_dialog-enter-animation-duration);--forge-backdrop-enter-animation-easing:var(--_dialog-enter-animation-easing);--forge-backdrop-exit-animation-duration:var(--_dialog-exit-animation-duration);--forge-backdrop-exit-animation-easing:var(--_dialog-exit-animation-easing)}:host(:not([moveable])) .move-handle{display:none}:host([moveable]:not([fullscreen])) .surface{user-select:none;transition-property:opacity;transition-duration:var(--_dialog-move-transition-duration);transition-timing-function:var(--_dialog-move-transition-easing)}:host([moveable]:not([fullscreen])) .surface:not(:hover) .move-handle-container{display:none}:host([moveable]:not([fullscreen])) .surface.moved{margin:0}:host([moveable]:not([fullscreen])) .surface.moving{opacity:var(--_dialog-moving-opacity)}:host([moveable]:not([fullscreen])) .move-handle-container{position:absolute;top:0;z-index:1;display:flex;justify-content:center;width:100%}:host([moveable]:not([fullscreen])) .move-handle-container .move-handle{fill:var(--_dialog-move-handle-color);height:var(--_dialog-move-handle-size);width:var(--_dialog-move-handle-size);margin:var(--_dialog-move-handle-spacing);touch-action:none}:host([moveable]:not([fullscreen])) .move-handle-container .move-handle:hover{cursor:var(--_dialog-move-handle-hover-cursor)}:host([moveable]:not([fullscreen])) .move-handle-container .move-handle:active{cursor:var(--_dialog-move-handle-active-cursor)}:host([moveable]:not([fullscreen])) .move-handle-container .move-handle svg{fill:currentColor}:host([visible]){display:contents}}@layer nonmodal{:host([mode=nonmodal]) .forge-dialog{pointer-events:none}:host([mode=nonmodal]) .container{display:contents}:host([mode=nonmodal]) .surface{--_dialog-elevation:var(--_dialog-nonmodal-elevation);pointer-events:all}:host([mode=nonmodal]) forge-backdrop{display:none}}@layer animation{:host([visible]:not([animation-type=none])) dialog.forge-dialog[open] .surface{animation-duration:var(--_dialog-enter-animation-duration);animation-timing-function:var(--_dialog-enter-animation-easing)}:host([visible]:not([animation-type=none])) dialog.forge-dialog[open] .surface.exiting{animation-duration:var(--_dialog-exit-animation-duration);animation-timing-function:var(--_dialog-exit-animation-easing)}:host([visible]:not([animation-type=none]):is(:not([animation-type]),[animation-type=zoom])) dialog.forge-dialog[open] .surface{animation-name:forge-dialog-zoom-in}:host([visible]:not([animation-type=none]):is(:not([animation-type]),[animation-type=zoom])) dialog.forge-dialog[open] .surface.exiting{animation-name:forge-dialog-zoom-out}:host([visible]:not([animation-type=none])[animation-type=fade]) dialog.forge-dialog[open] .surface{animation-name:forge-dialog-fade-in}:host([visible]:not([animation-type=none])[animation-type=fade]) dialog.forge-dialog[open] .surface.exiting{animation-name:forge-dialog-fade-out}:host([visible]:not([animation-type=none])[animation-type=slide]) dialog.forge-dialog[open] .surface{animation-name:forge-dialog-slide-in}:host([visible]:not([animation-type=none])[animation-type=slide]) dialog.forge-dialog[open] .surface.exiting{animation-name:forge-dialog-slide-out}}@layer placement{:host([placement=custom]) .surface{margin:0;top:var(--_dialog-position-x);left:var(--_dialog-position-y)}:host([placement=top]) .surface{--_dialog-block-start-spacing:var(--forge-dialog-block-start-spacing, 0);top:0;bottom:auto}:host([placement=top-right]) .surface{--_dialog-spacing:var(--forge-dialog-spacing, 0);top:0;left:auto;right:0;bottom:auto}:host([placement=top-left]) .surface{--_dialog-spacing:var(--forge-dialog-spacing, 0);top:0;left:0;right:auto;bottom:auto}:host([placement=bottom]) .surface{--_dialog-block-end-spacing:var(--forge-dialog-block-end-spacing, 0);top:auto;bottom:0}:host([placement=bottom-right]) .surface{--_dialog-spacing:var(--forge-dialog-spacing, 0);top:auto;left:auto;right:0;bottom:0}:host([placement=bottom-left]) .surface{--_dialog-spacing:var(--forge-dialog-spacing, 0);top:auto;left:0;right:auto;bottom:0}}@layer size-strategy{:host([size-strategy=container-inline]) .surface{width:100%}:host([size-strategy=container-block]) .surface{height:100%}}@layer preset{:host([visible]:not([animation-type=none]):is([preset=left-sheet],[preset=right-sheet],[preset=top-sheet],[preset=bottom-sheet])) .forge-dialog{--_dialog-enter-animation-duration:var(--_dialog-preset-sheet-enter-animation-duration);--_dialog-exit-animation-duration:var(--_dialog-preset-sheet-exit-animation-duration)}:host([visible]:not([animation-type=none]):is([preset=left-sheet],[preset=right-sheet],[preset=top-sheet],[preset=bottom-sheet])) .surface{animation-name:forge-dialog-slide-in}:host([visible]:not([animation-type=none]):is([preset=left-sheet],[preset=right-sheet],[preset=top-sheet],[preset=bottom-sheet])) .surface.exiting{animation-name:forge-dialog-slide-out}:host(:is([preset=left-sheet],[preset=right-sheet],[preset=top-sheet],[preset=bottom-sheet])) .surface{--_dialog-max-width:var(--forge-dialog-max-width, none);--_dialog-max-height:var(--forge-dialog-max-height, none);inset:auto;display:inline-flex}:host([preset=left-sheet]) .forge-dialog{--_dialog-slide-translate:var(--forge-dialog-slide-translate, -100% 0)}:host([preset=left-sheet]) .surface{left:0;bottom:0;top:0;height:100%;border-top-left-radius:0;border-bottom-left-radius:0}:host([preset=right-sheet]) .forge-dialog{--_dialog-slide-translate:var(--forge-dialog-slide-translate, 100% 0)}:host([preset=right-sheet]) .surface{right:0;bottom:0;top:0;height:100%;border-top-right-radius:0;border-bottom-right-radius:0}:host([preset=top-sheet]) .forge-dialog{--_dialog-slide-translate:var(--forge-dialog-slide-translate, 0 -100%)}:host([preset=top-sheet]) .surface{top:0;left:0;right:0;border-top-left-radius:0;border-top-right-radius:0}:host([preset=bottom-sheet]) .forge-dialog{--_dialog-slide-translate:var(--forge-dialog-slide-translate, 0 100%)}:host([preset=bottom-sheet]) .surface{bottom:0;left:0;right:0;border-bottom-left-radius:0;border-bottom-right-radius:0}}@layer fullscreen{:host([fullscreen]) .forge-dialog{--_dialog-enter-animation-duration:var(--_dialog-fullscreen-enter-animation-duration);--_dialog-exit-animation-duration:var(--_dialog-fullscreen-exit-animation-duration)}:host([fullscreen]) .surface{height:100%;width:100%;max-width:none;max-height:none;border-radius:0;box-shadow:none}:host([fullscreen]) forge-backdrop{display:none}}@layer position-strategy{:host([position-strategy=viewport]) .forge-dialog{position:fixed}:host([position-strategy=container]) .forge-dialog{position:absolute}:host([position-strategy=container][preset$=-sheet]) .forge-dialog{contain:content}}@layer media{@media (prefers-reduced-motion:reduce){.surface{animation-name:forge-dialog-fade-in}.surface.exiting{animation-name:forge-dialog-fade-out}}}';
18
+ const styles = '@keyframes forge-dialog-zoom-in{from{opacity:var(--_dialog-zoom-opacity);scale:var(--_dialog-zoom-scale)}to{opacity:1;scale:1}}@keyframes forge-dialog-zoom-out{from{opacity:1;scale:1}to{opacity:var(--_dialog-zoom-opacity);scale:var(--_dialog-zoom-scale)}}@keyframes forge-dialog-fade-in{from{opacity:var(--_dialog-fade-opacity)}to{opacity:1}}@keyframes forge-dialog-fade-out{from{opacity:1}to{opacity:var(--_dialog-fade-opacity)}}@keyframes forge-dialog-slide-in{from{opacity:var(--_dialog-slide-opacity);translate:var(--_dialog-slide-translate)}to{opacity:1;translate:0 0}}@keyframes forge-dialog-slide-out{from{opacity:1;translate:0 0}to{opacity:var(--_dialog-slide-opacity);translate:var(--_dialog-slide-translate)}}@layer base,nonmodal,animation,placement,size-strategy,preset,fullscreen,position-strategy,media; @layer base{:host{display:none;--forge-theme-surface:var(--forge-theme-surface-bright, #ffffff)}:host([hidden]){display:none}::slotted(forge-scaffold){height:auto}.forge-dialog{--_dialog-background:var(--forge-dialog-background, var(--forge-theme-surface-bright, #ffffff));--_dialog-shape:var(--forge-dialog-shape, calc(var(--forge-shape-medium, 4px) * var(--forge-shape-factor, 1)));--_dialog-elevation:var(--forge-dialog-elevation, 0px 11px 15px -7px rgba(0, 0, 0, 0.2), 0px 24px 38px 3px rgba(0, 0, 0, 0.14), 0px 9px 46px 8px rgba(0, 0, 0, 0.12));--_dialog-spacing:var(--forge-dialog-spacing, auto);--_dialog-block-start-spacing:var(--forge-dialog-block-start-spacing, var(--_dialog-spacing));--_dialog-block-end-spacing:var(--forge-dialog-block-end-spacing, var(--_dialog-spacing));--_dialog-inline-start-spacing:var(--forge-dialog-inline-start-spacing, var(--_dialog-spacing));--_dialog-inline-end-spacing:var(--forge-dialog-inline-end-spacing, var(--_dialog-spacing));--_dialog-padding:var(--forge-dialog-padding, 0);--_dialog-width:var(--forge-dialog-width, fit-content);--_dialog-height:var(--forge-dialog-height, fit-content);--_dialog-min-width:var(--forge-dialog-min-width, 0);--_dialog-max-width:var(--forge-dialog-max-width, calc(100% - var(--forge-spacing-xxlarge, 48px)));--_dialog-min-height:var(--forge-dialog-min-height, 0);--_dialog-max-height:var(--forge-dialog-max-height, calc(100% - var(--forge-spacing-xxlarge, 48px)));--_dialog-z-index:var(--forge-dialog-z-index, var(--forge-z-index-dialog, 8));--_dialog-move-handle-color:var(--forge-dialog-move-handle-color, currentColor);--_dialog-move-handle-size:var(--forge-dialog-move-handle-size, 24px);--_dialog-move-handle-hover-cursor:var(--forge-dialog-move-handle-hover-cursor, grab);--_dialog-move-handle-active-cursor:var(--forge-dialog-move-handle-active-cursor, grabbing);--_dialog-move-handle-spacing:var(--forge-dialog-move-handle-spacing, calc(var(--forge-spacing-xxsmall, 4px) * -1) 0 0);--_dialog-move-transition-duration:var(--forge-dialog-move-transition-duration, var(--forge-animation-duration-short4, 200ms));--_dialog-move-transition-easing:var(--forge-dialog-move-transition-easing, var(--forge-animation-easing-standard, cubic-bezier(0.2, 0, 0, 1)));--_dialog-moving-opacity:var(--forge-dialog-moving-opacity, 0.54);--_dialog-enter-animation-duration:var(--forge-dialog-enter-animation-duration, var(--forge-animation-duration-medium1, 250ms));--_dialog-enter-animation-easing:var(--forge-dialog-enter-animation-easing, var(--forge-animation-easing-standard, cubic-bezier(0.2, 0, 0, 1)));--_dialog-exit-animation-duration:var(--forge-dialog-exit-animation-duration, var(--forge-animation-duration-short2, 100ms));--_dialog-exit-animation-easing:var(--forge-dialog-exit-animation-easing, var(--forge-animation-easing-emphasized-accelerate, cubic-bezier(0.3, 0, 0.8, 0.15)));--_dialog-zoom-opacity:var(--forge-dialog-zoom-opacity, 0);--_dialog-zoom-scale:var(--forge-dialog-zoom-scale, 0.8);--_dialog-fade-opacity:var(--forge-dialog-fade-opacity, 0);--_dialog-slide-opacity:var(--forge-dialog-slide-opacity, 0);--_dialog-slide-translate:var(--forge-dialog-slide-translate, 0 -30%);--_dialog-backdrop-opacity:var(--forge-dialog-backdrop-opacity, var(--forge-backdrop-opacity, 0.54));--_dialog-nonmodal-elevation:var(--forge-dialog-nonmodal-elevation, 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12));--_dialog-fullscreen-enter-animation-duration:var(--forge-dialog-fullscreen-enter-animation-duration, var(--forge-animation-duration-medium1, 250ms));--_dialog-fullscreen-exit-animation-duration:var(--forge-dialog-fullscreen-exit-animation-duration, var(--forge-animation-duration-short2, 100ms));--_dialog-position-x:var(--forge-dialog-position-x, 0);--_dialog-position-y:var(--forge-dialog-position-y, 0);--_dialog-preset-sheet-enter-animation-duration:var(--forge-dialog-preset-sheet-enter-animation-duration, var(--forge-animation-duration-medium1, 250ms));--_dialog-preset-sheet-exit-animation-duration:var(--forge-dialog-preset-sheet-exit-animation-duration, var(--forge-animation-duration-short3, 150ms))}.forge-dialog{position:fixed;inset:0;z-index:var(--_dialog-z-index);background-color:transparent;color:inherit;border:none;width:auto;height:auto;padding:0;margin:0;overflow:visible;max-width:100%;max-height:100%;box-sizing:border-box}.container{display:flex;justify-content:center;align-items:center;width:100%;height:100%}.surface{position:absolute;inset:0;display:flex;background:var(--_dialog-background);box-shadow:var(--_dialog-elevation);z-index:var(--_dialog-z-index);overflow:hidden;border-radius:var(--_dialog-shape);margin-block-start:var(--_dialog-block-start-spacing);margin-block-end:var(--_dialog-block-end-spacing);margin-inline-start:var(--_dialog-inline-start-spacing);margin-inline-end:var(--_dialog-inline-end-spacing);padding:var(--_dialog-padding);width:var(--_dialog-width);height:var(--_dialog-height);min-width:var(--_dialog-min-width);max-width:var(--_dialog-max-width);min-height:var(--_dialog-min-height);max-height:var(--_dialog-max-height);box-sizing:border-box}.visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:fixed;width:1px;outline:0;-webkit-appearance:none;-moz-appearance:none}dialog.forge-dialog::backdrop{display:none}forge-backdrop{--forge-backdrop-opacity:var(--_dialog-backdrop-opacity);--forge-backdrop-enter-animation-duration:var(--_dialog-enter-animation-duration);--forge-backdrop-enter-animation-easing:var(--_dialog-enter-animation-easing);--forge-backdrop-exit-animation-duration:var(--_dialog-exit-animation-duration);--forge-backdrop-exit-animation-easing:var(--_dialog-exit-animation-easing)}:host(:not([moveable])) .move-handle{display:none}:host([moveable]:not([fullscreen])) .surface{user-select:none;transition-property:opacity;transition-duration:var(--_dialog-move-transition-duration);transition-timing-function:var(--_dialog-move-transition-easing)}:host([moveable]:not([fullscreen])) .surface:not(:hover) .move-handle-container{display:none}:host([moveable]:not([fullscreen])) .surface.moved{margin:0}:host([moveable]:not([fullscreen])) .surface.moving{opacity:var(--_dialog-moving-opacity)}:host([moveable]:not([fullscreen])) .move-handle-container{position:absolute;top:0;z-index:1;display:flex;justify-content:center;width:100%}:host([moveable]:not([fullscreen])) .move-handle-container .move-handle{fill:var(--_dialog-move-handle-color);height:var(--_dialog-move-handle-size);width:var(--_dialog-move-handle-size);margin:var(--_dialog-move-handle-spacing);touch-action:none}:host([moveable]:not([fullscreen])) .move-handle-container .move-handle:hover{cursor:var(--_dialog-move-handle-hover-cursor)}:host([moveable]:not([fullscreen])) .move-handle-container .move-handle:active{cursor:var(--_dialog-move-handle-active-cursor)}:host([moveable]:not([fullscreen])) .move-handle-container .move-handle svg{fill:currentColor}:host([visible]){display:contents}}@layer nonmodal{:host([mode=nonmodal]) .forge-dialog{pointer-events:none}:host([mode=nonmodal]) .container{display:contents}:host([mode=nonmodal]) .surface{--_dialog-elevation:var(--_dialog-nonmodal-elevation);pointer-events:all}:host([mode=nonmodal]) forge-backdrop{display:none}}@layer animation{:host([visible]:not([animation-type=none])) dialog.forge-dialog[open] .surface{animation-duration:var(--_dialog-enter-animation-duration);animation-timing-function:var(--_dialog-enter-animation-easing)}:host([visible]:not([animation-type=none])) dialog.forge-dialog[open] .surface.exiting{animation-duration:var(--_dialog-exit-animation-duration);animation-timing-function:var(--_dialog-exit-animation-easing)}:host([visible]:not([animation-type=none]):is(:not([animation-type]),[animation-type=zoom])) dialog.forge-dialog[open] .surface{animation-name:forge-dialog-zoom-in}:host([visible]:not([animation-type=none]):is(:not([animation-type]),[animation-type=zoom])) dialog.forge-dialog[open] .surface.exiting{animation-name:forge-dialog-zoom-out}:host([visible]:not([animation-type=none])[animation-type=fade]) dialog.forge-dialog[open] .surface{animation-name:forge-dialog-fade-in}:host([visible]:not([animation-type=none])[animation-type=fade]) dialog.forge-dialog[open] .surface.exiting{animation-name:forge-dialog-fade-out}:host([visible]:not([animation-type=none])[animation-type=slide]) dialog.forge-dialog[open] .surface{animation-name:forge-dialog-slide-in}:host([visible]:not([animation-type=none])[animation-type=slide]) dialog.forge-dialog[open] .surface.exiting{animation-name:forge-dialog-slide-out}}@layer placement{:host([placement=custom]) .surface{margin:0;top:var(--_dialog-position-x);left:var(--_dialog-position-y)}:host([placement=top]) .surface{--_dialog-block-start-spacing:var(--forge-dialog-block-start-spacing, 0);top:0;bottom:auto}:host([placement=top-right]) .surface{--_dialog-spacing:var(--forge-dialog-spacing, 0);top:0;left:auto;right:0;bottom:auto}:host([placement=top-left]) .surface{--_dialog-spacing:var(--forge-dialog-spacing, 0);top:0;left:0;right:auto;bottom:auto}:host([placement=bottom]) .surface{--_dialog-block-end-spacing:var(--forge-dialog-block-end-spacing, 0);top:auto;bottom:0}:host([placement=bottom-right]) .surface{--_dialog-spacing:var(--forge-dialog-spacing, 0);top:auto;left:auto;right:0;bottom:0}:host([placement=bottom-left]) .surface{--_dialog-spacing:var(--forge-dialog-spacing, 0);top:auto;left:0;right:auto;bottom:0}}@layer size-strategy{:host([size-strategy=container-inline]) .surface{width:100%}:host([size-strategy=container-block]) .surface{height:100%}}@layer preset{:host([visible]:not([animation-type=none]):is([preset=left-sheet],[preset=right-sheet],[preset=top-sheet],[preset=bottom-sheet])) .forge-dialog{--_dialog-enter-animation-duration:var(--_dialog-preset-sheet-enter-animation-duration);--_dialog-exit-animation-duration:var(--_dialog-preset-sheet-exit-animation-duration)}:host([visible]:not([animation-type=none]):is([preset=left-sheet],[preset=right-sheet],[preset=top-sheet],[preset=bottom-sheet])) .surface{animation-name:forge-dialog-slide-in}:host([visible]:not([animation-type=none]):is([preset=left-sheet],[preset=right-sheet],[preset=top-sheet],[preset=bottom-sheet])) .surface.exiting{animation-name:forge-dialog-slide-out}:host(:is([preset=left-sheet],[preset=right-sheet],[preset=top-sheet],[preset=bottom-sheet])) .surface{--_dialog-max-width:var(--forge-dialog-max-width, none);--_dialog-max-height:var(--forge-dialog-max-height, none);inset:auto;display:inline-flex}:host([preset=left-sheet]) .forge-dialog{--_dialog-slide-translate:var(--forge-dialog-slide-translate, -100% 0)}:host([preset=left-sheet]) .surface{left:0;bottom:0;top:0;height:100%;border-top-left-radius:0;border-bottom-left-radius:0}:host([preset=right-sheet]) .forge-dialog{--_dialog-slide-translate:var(--forge-dialog-slide-translate, 100% 0)}:host([preset=right-sheet]) .surface{right:0;bottom:0;top:0;height:100%;border-top-right-radius:0;border-bottom-right-radius:0}:host([preset=top-sheet]) .forge-dialog{--_dialog-slide-translate:var(--forge-dialog-slide-translate, 0 -100%)}:host([preset=top-sheet]) .surface{top:0;left:0;right:0;border-top-left-radius:0;border-top-right-radius:0}:host([preset=bottom-sheet]) .forge-dialog{--_dialog-slide-translate:var(--forge-dialog-slide-translate, 0 100%)}:host([preset=bottom-sheet]) .surface{bottom:0;left:0;right:0;border-bottom-left-radius:0;border-bottom-right-radius:0}}@layer fullscreen{:host([fullscreen]) .forge-dialog{--_dialog-enter-animation-duration:var(--_dialog-fullscreen-enter-animation-duration);--_dialog-exit-animation-duration:var(--_dialog-fullscreen-exit-animation-duration)}:host([fullscreen]) .surface{height:100%;width:100%;max-width:none;max-height:none;border-radius:0;box-shadow:none}:host([fullscreen]) forge-backdrop{display:none}}@layer position-strategy{:host([position-strategy=viewport]) .forge-dialog{position:fixed}:host([position-strategy=container]) .forge-dialog{position:absolute}:host([position-strategy=container][preset$=-sheet]) .forge-dialog{contain:content}}@layer media{@media (prefers-reduced-motion:reduce){.surface{animation-name:forge-dialog-fade-in}.surface.exiting{animation-name:forge-dialog-fade-out}}}';
19
19
  /**
20
20
  * @tag forge-dialog
21
21
  *
@@ -6,27 +6,58 @@
6
6
  import { BaseAdapter, IBaseAdapter } from '../core/base/base-adapter';
7
7
  import { IExpansionPanelComponent } from './expansion-panel';
8
8
  export interface IExpansionPanelAdapter extends IBaseAdapter {
9
+ readonly triggerElement?: HTMLElement | null;
9
10
  setAnimationCompleteListener(listener: () => void): void;
11
+ addContentSlotListener(listener: EventListener): void;
10
12
  addHeaderListener(type: keyof HTMLElementEventMap, listener: EventListener): void;
13
+ removeTriggerListeners(options?: {
14
+ reset: boolean;
15
+ }): void;
16
+ addTriggerListener(type: keyof HTMLElementEventMap, listener: EventListener): void;
11
17
  tryToggleOpenIcon(value: boolean): void;
12
18
  setContentVisibility(visible: boolean): void;
13
19
  animationStart(): void;
14
20
  animationEnd(): void;
21
+ setTriggerElementById(id: string): void;
22
+ setTriggerElement(el?: HTMLElement | null): void;
23
+ setContentId(): void;
24
+ updateAriaControls(): void;
25
+ updateAriaExpanded(open: boolean): void;
26
+ detachTriggerAria(): void;
15
27
  }
16
28
  export declare class ExpansionPanelAdapter extends BaseAdapter<IExpansionPanelComponent> implements IExpansionPanelAdapter {
17
29
  private _headerElement;
18
30
  private _contentElement;
19
31
  private _innerElement;
32
+ private _defaultSlotElement;
33
+ private _triggerListenerController;
34
+ private _triggerElement?;
20
35
  private _transitionStartListener;
21
36
  private _transitionEndListener;
22
37
  private _transitionCompleteListener;
23
38
  constructor(component: IExpansionPanelComponent);
39
+ get triggerElement(): HTMLElement | null | undefined;
40
+ private get _slottedContentElement();
41
+ private set _slottedContentId(value);
42
+ private get _slottedContentId();
43
+ setTriggerElementById(id: string): void;
24
44
  setAnimationCompleteListener(listener: () => void): void;
45
+ addContentSlotListener(listener: EventListener): void;
25
46
  addHeaderListener(type: keyof HTMLElementEventMap, listener: EventListener): void;
47
+ removeTriggerListeners(options?: {
48
+ reset: boolean;
49
+ }): void;
50
+ addTriggerListener(type: keyof HTMLElementEventMap, listener: EventListener): void;
26
51
  tryToggleOpenIcon(value: boolean): void;
27
52
  setContentVisibility(visible: boolean): void;
28
53
  private _onTransitionStart;
29
54
  private _onTransitionEnd;
30
55
  animationStart(): void;
31
56
  animationEnd(): void;
57
+ setTriggerElement(el: HTMLElement | null): void;
58
+ setContentId(): void;
59
+ updateAriaControls(): void;
60
+ updateAriaExpanded(open: boolean): void;
61
+ detachTriggerAria(): void;
62
+ private _getTriggerElementById;
32
63
  }
@@ -3,7 +3,7 @@
3
3
  * Copyright Tyler Technologies, Inc.
4
4
  * License: Apache-2.0
5
5
  */
6
- import { getShadowElement } from '@tylertech/forge-core';
6
+ import { getShadowElement, randomChars, toggleAttribute } from '@tylertech/forge-core';
7
7
  import { BaseAdapter } from '../core/base/base-adapter';
8
8
  import { EXPANSION_PANEL_CONSTANTS } from './expansion-panel-constants';
9
9
  export class ExpansionPanelAdapter extends BaseAdapter {
@@ -14,15 +14,43 @@ export class ExpansionPanelAdapter extends BaseAdapter {
14
14
  this._headerElement = getShadowElement(this._component, EXPANSION_PANEL_CONSTANTS.selectors.HEADER);
15
15
  this._contentElement = getShadowElement(this._component, EXPANSION_PANEL_CONSTANTS.selectors.CONTENT);
16
16
  this._innerElement = getShadowElement(this._component, EXPANSION_PANEL_CONSTANTS.selectors.INNER);
17
+ this._defaultSlotElement = getShadowElement(this._component, EXPANSION_PANEL_CONSTANTS.selectors.DEFAULT_SLOT);
18
+ }
19
+ get triggerElement() {
20
+ return this._triggerElement;
21
+ }
22
+ get _slottedContentElement() {
23
+ return this._defaultSlotElement.assignedElements({ flatten: true })[0];
24
+ }
25
+ set _slottedContentId(id) {
26
+ this._slottedContentElement?.setAttribute('id', id);
27
+ }
28
+ get _slottedContentId() {
29
+ return this._slottedContentElement?.getAttribute('id') ?? '';
30
+ }
31
+ setTriggerElementById(id) {
32
+ this._triggerElement = this._getTriggerElementById(id);
17
33
  }
18
34
  setAnimationCompleteListener(listener) {
19
35
  this._transitionCompleteListener = listener;
20
36
  this._contentElement.addEventListener('transitionstart', this._transitionStartListener);
21
37
  this._contentElement.addEventListener('transitionend', this._transitionEndListener);
22
38
  }
39
+ addContentSlotListener(listener) {
40
+ this._defaultSlotElement.addEventListener('slotchange', listener);
41
+ }
23
42
  addHeaderListener(type, listener) {
24
43
  this._headerElement.addEventListener(type, listener);
25
44
  }
45
+ removeTriggerListeners(options = { reset: false }) {
46
+ this._triggerListenerController?.abort();
47
+ if (options?.reset) {
48
+ this._triggerListenerController = new AbortController();
49
+ }
50
+ }
51
+ addTriggerListener(type, listener) {
52
+ this._triggerElement?.addEventListener(type, listener, { signal: this._triggerListenerController.signal });
53
+ }
26
54
  tryToggleOpenIcon(value) {
27
55
  const openIconElement = this._component.querySelector(EXPANSION_PANEL_CONSTANTS.selectors.OPEN_ICON);
28
56
  if (openIconElement) {
@@ -49,4 +77,35 @@ export class ExpansionPanelAdapter extends BaseAdapter {
49
77
  animationEnd() {
50
78
  this._innerElement.style.removeProperty('overflow');
51
79
  }
80
+ setTriggerElement(el) {
81
+ this._triggerElement = el;
82
+ }
83
+ setContentId() {
84
+ if (!this._slottedContentId) {
85
+ this._slottedContentId = `forge-expansion-panel-content-${randomChars()}`;
86
+ }
87
+ }
88
+ updateAriaControls() {
89
+ if (this._triggerElement) {
90
+ toggleAttribute(this._triggerElement, !!this._slottedContentId, 'aria-controls', this._slottedContentId);
91
+ }
92
+ }
93
+ updateAriaExpanded(open) {
94
+ if (this._triggerElement) {
95
+ toggleAttribute(this._triggerElement, true, 'aria-expanded', open.toString());
96
+ }
97
+ }
98
+ detachTriggerAria() {
99
+ this._triggerElement?.removeAttribute('aria-controls');
100
+ this._triggerElement?.removeAttribute('aria-expanded');
101
+ }
102
+ _getTriggerElementById(id) {
103
+ if (id) {
104
+ const rootNode = this._component.getRootNode();
105
+ return rootNode.getElementById(id);
106
+ }
107
+ else {
108
+ return null;
109
+ }
110
+ }
52
111
  }
@@ -9,12 +9,14 @@ export declare const EXPANSION_PANEL_CONSTANTS: {
9
9
  OPEN: string;
10
10
  ORIENTATION: string;
11
11
  ANIMATION_TYPE: string;
12
+ TRIGGER: string;
12
13
  };
13
14
  attributes: {
14
15
  OPENING: string;
15
16
  OPEN: string;
16
17
  ORIENTATION: string;
17
18
  ANIMATION_TYPE: string;
19
+ TRIGGER: string;
18
20
  };
19
21
  classes: {
20
22
  HIDDEN: string;
@@ -23,6 +25,8 @@ export declare const EXPANSION_PANEL_CONSTANTS: {
23
25
  HEADER: string;
24
26
  CONTENT: string;
25
27
  INNER: string;
28
+ HEADER_SLOT: string;
29
+ DEFAULT_SLOT: string;
26
30
  IGNORE: string;
27
31
  OPEN_ICON: string;
28
32
  };
@@ -9,7 +9,8 @@ const elementName = `${COMPONENT_NAME_PREFIX}expansion-panel`;
9
9
  const observedAttributes = {
10
10
  OPEN: 'open',
11
11
  ORIENTATION: 'orientation',
12
- ANIMATION_TYPE: 'animation-type'
12
+ ANIMATION_TYPE: 'animation-type',
13
+ TRIGGER: 'trigger'
13
14
  };
14
15
  const attributes = {
15
16
  ...observedAttributes,
@@ -22,6 +23,8 @@ const selectors = {
22
23
  HEADER: '.header',
23
24
  CONTENT: '.content',
24
25
  INNER: '.inner',
26
+ HEADER_SLOT: 'slot[name=header]',
27
+ DEFAULT_SLOT: 'slot:not([name])',
25
28
  IGNORE: ':is([data-forge-ignore],[forge-ignore])',
26
29
  OPEN_ICON: `:is([slot=header] ${OPEN_ICON_CONSTANTS.elementName}, ${OPEN_ICON_CONSTANTS.elementName}[slot^=header])`
27
30
  };
@@ -9,6 +9,8 @@ export interface IExpansionPanelCore {
9
9
  open: boolean;
10
10
  orientation: ExpansionPanelOrientation;
11
11
  animationType: ExpansionPanelAnimationType;
12
+ trigger: string;
13
+ triggerElement?: HTMLElement | null;
12
14
  dispatchToggleEvent(): void;
13
15
  }
14
16
  export declare class ExpansionPanelCore implements IExpansionPanelCore {
@@ -16,11 +18,17 @@ export declare class ExpansionPanelCore implements IExpansionPanelCore {
16
18
  private _open;
17
19
  private _orientation;
18
20
  private _animationType;
21
+ private _trigger;
19
22
  private _clickListener;
20
23
  private _keydownListener;
21
24
  private _animationCompleteListener;
25
+ private _slotListener;
22
26
  constructor(_adapter: IExpansionPanelAdapter);
23
- initialize(): void;
27
+ initialize(): Promise<void>;
28
+ destroy(): void;
29
+ private _handleContentSlotChange;
30
+ private _clearTrigger;
31
+ private _syncTrigger;
24
32
  private _onClick;
25
33
  private _onKeydown;
26
34
  private _onAnimationComplete;
@@ -33,4 +41,8 @@ export declare class ExpansionPanelCore implements IExpansionPanelCore {
33
41
  set orientation(value: ExpansionPanelOrientation);
34
42
  get animationType(): ExpansionPanelAnimationType;
35
43
  set animationType(value: ExpansionPanelAnimationType);
44
+ get trigger(): string;
45
+ set trigger(value: string);
46
+ get triggerElement(): HTMLElement | null | undefined;
47
+ set triggerElement(el: HTMLElement | null | undefined);
36
48
  }
@@ -3,6 +3,7 @@
3
3
  * Copyright Tyler Technologies, Inc.
4
4
  * License: Apache-2.0
5
5
  */
6
+ import { frame } from '../core';
6
7
  import { EXPANSION_PANEL_CONSTANTS } from './expansion-panel-constants';
7
8
  export class ExpansionPanelCore {
8
9
  constructor(_adapter) {
@@ -10,14 +11,49 @@ export class ExpansionPanelCore {
10
11
  this._open = false;
11
12
  this._orientation = 'vertical';
12
13
  this._animationType = 'default';
14
+ this._trigger = '';
13
15
  this._clickListener = this._onClick.bind(this);
14
16
  this._keydownListener = this._onKeydown.bind(this);
15
17
  this._animationCompleteListener = this._onAnimationComplete.bind(this);
18
+ this._slotListener = this._handleContentSlotChange.bind(this);
16
19
  }
17
- initialize() {
20
+ async initialize() {
18
21
  this._adapter.addHeaderListener('click', this._clickListener);
19
22
  this._adapter.addHeaderListener('keydown', this._keydownListener);
20
23
  this._adapter.setAnimationCompleteListener(this._animationCompleteListener);
24
+ this._adapter.addContentSlotListener(this._slotListener);
25
+ this._adapter.setContentId();
26
+ await frame();
27
+ this._syncTrigger();
28
+ }
29
+ destroy() {
30
+ this._adapter.detachTriggerAria();
31
+ this._adapter.removeTriggerListeners();
32
+ this._adapter.setTriggerElement(undefined);
33
+ }
34
+ _handleContentSlotChange() {
35
+ this._adapter.setContentId();
36
+ this._syncTrigger();
37
+ }
38
+ _clearTrigger() {
39
+ this._adapter.removeTriggerListeners({ reset: true });
40
+ this._adapter.detachTriggerAria();
41
+ }
42
+ _syncTrigger() {
43
+ if (!this._adapter.triggerElement?.isConnected) {
44
+ this._clearTrigger();
45
+ if (this._trigger) {
46
+ this._adapter.setTriggerElementById(this._trigger);
47
+ }
48
+ else {
49
+ this._adapter.setTriggerElement(undefined);
50
+ }
51
+ }
52
+ this._adapter.updateAriaControls();
53
+ this._adapter.updateAriaExpanded(this._open);
54
+ this._adapter.removeTriggerListeners({ reset: true });
55
+ this._adapter.addTriggerListener('click', this._clickListener);
56
+ this._adapter.addTriggerListener('keydown', this._keydownListener);
21
57
  }
22
58
  _onClick(evt) {
23
59
  const fromIgnoredEl = evt
@@ -50,6 +86,7 @@ export class ExpansionPanelCore {
50
86
  _togglePanel() {
51
87
  this._adapter.toggleHostAttribute(EXPANSION_PANEL_CONSTANTS.attributes.OPEN, this._open);
52
88
  this._adapter.tryToggleOpenIcon(this._open);
89
+ this._adapter.updateAriaExpanded(this._open);
53
90
  if (this._open) {
54
91
  if (this._animationType !== 'none') {
55
92
  this._adapter.animationStart();
@@ -96,4 +133,29 @@ export class ExpansionPanelCore {
96
133
  this._adapter.setHostAttribute(EXPANSION_PANEL_CONSTANTS.attributes.ANIMATION_TYPE, this._animationType);
97
134
  }
98
135
  }
136
+ get trigger() {
137
+ return this._trigger;
138
+ }
139
+ set trigger(value) {
140
+ if (this._trigger !== value) {
141
+ this._clearTrigger();
142
+ this._trigger = value;
143
+ this._adapter.setTriggerElementById(this._trigger);
144
+ if (this._adapter.isConnected) {
145
+ this._syncTrigger();
146
+ }
147
+ }
148
+ }
149
+ get triggerElement() {
150
+ return this._adapter.triggerElement;
151
+ }
152
+ set triggerElement(el) {
153
+ if (this._adapter.triggerElement !== el) {
154
+ this._clearTrigger();
155
+ this._adapter.setTriggerElement(el);
156
+ if (this._adapter.isConnected) {
157
+ this._syncTrigger();
158
+ }
159
+ }
160
+ }
99
161
  }
@@ -9,7 +9,10 @@ export interface IExpansionPanelComponent extends IBaseComponent {
9
9
  open: boolean;
10
10
  orientation: ExpansionPanelOrientation;
11
11
  animationType: ExpansionPanelAnimationType;
12
+ trigger: string;
13
+ triggerElement: HTMLElement | null;
12
14
  toggle(): void;
15
+ [emulateUserToggle](open: boolean): void;
13
16
  }
14
17
  declare global {
15
18
  interface HTMLElementTagNameMap {
@@ -28,10 +31,13 @@ declare global {
28
31
  * @property {boolean} [open=false] - Whether the panel is open or closed.
29
32
  * @property {ExpansionPanelOrientation} [orientation="vertical"] - The orientation of the panel.
30
33
  * @property {ExpansionPanelAnimationType} [animationType="default"] - The type of animation to use when opening/closing the panel.
34
+ * @property {string} trigger - The id of the element that the expansion panel should be toggled by.
35
+ * @property {HTMLElement | null} triggerElement - The element that the expansion panel should be toggled by.
31
36
  *
32
37
  * @attribute {boolean} [open=false] - Whether the panel is open or closed.
33
38
  * @attribute {ExpansionPanelOrientation} [orientation="vertical"] - The orientation of the panel.
34
39
  * @attribute {ExpansionPanelAnimationType} [animation-type="default"] - The type of animation to use when opening/closing the panel.
40
+ * @attribute {string} [trigger] - The id of the button that the expansion panel is associated with.
35
41
  *
36
42
  * @fires {CustomEvent<boolean>} forge-expansion-panel-toggle - Event fired when the panel is toggled open or closed.
37
43
  * @fires {CustomEvent<boolean>} forge-expansion-panel-animation-complete - Event fired when the panel has finished animating when toggling.
@@ -55,10 +61,13 @@ export declare class ExpansionPanelComponent extends BaseComponent implements IE
55
61
  private _core;
56
62
  constructor();
57
63
  connectedCallback(): void;
64
+ disconnectedCallback(): void;
58
65
  attributeChangedCallback(name: string, oldValue: string, newValue: string): void;
59
66
  open: boolean;
60
67
  orientation: ExpansionPanelOrientation;
61
68
  animationType: ExpansionPanelAnimationType;
69
+ trigger: string;
70
+ triggerElement: HTMLElement | null;
62
71
  /**
63
72
  * Toggles the open state of the panel.
64
73
  */
@@ -19,10 +19,13 @@ const styles = ':host{display:block}:host([hidden]){display:none}.forge-expansio
19
19
  * @property {boolean} [open=false] - Whether the panel is open or closed.
20
20
  * @property {ExpansionPanelOrientation} [orientation="vertical"] - The orientation of the panel.
21
21
  * @property {ExpansionPanelAnimationType} [animationType="default"] - The type of animation to use when opening/closing the panel.
22
+ * @property {string} trigger - The id of the element that the expansion panel should be toggled by.
23
+ * @property {HTMLElement | null} triggerElement - The element that the expansion panel should be toggled by.
22
24
  *
23
25
  * @attribute {boolean} [open=false] - Whether the panel is open or closed.
24
26
  * @attribute {ExpansionPanelOrientation} [orientation="vertical"] - The orientation of the panel.
25
27
  * @attribute {ExpansionPanelAnimationType} [animation-type="default"] - The type of animation to use when opening/closing the panel.
28
+ * @attribute {string} [trigger] - The id of the button that the expansion panel is associated with.
26
29
  *
27
30
  * @fires {CustomEvent<boolean>} forge-expansion-panel-toggle - Event fired when the panel is toggled open or closed.
28
31
  * @fires {CustomEvent<boolean>} forge-expansion-panel-animation-complete - Event fired when the panel has finished animating when toggling.
@@ -53,6 +56,9 @@ let ExpansionPanelComponent = class ExpansionPanelComponent extends BaseComponen
53
56
  connectedCallback() {
54
57
  this._core.initialize();
55
58
  }
59
+ disconnectedCallback() {
60
+ this._core.destroy();
61
+ }
56
62
  attributeChangedCallback(name, oldValue, newValue) {
57
63
  switch (name) {
58
64
  case EXPANSION_PANEL_CONSTANTS.observedAttributes.OPEN:
@@ -64,6 +70,8 @@ let ExpansionPanelComponent = class ExpansionPanelComponent extends BaseComponen
64
70
  case EXPANSION_PANEL_CONSTANTS.observedAttributes.ANIMATION_TYPE:
65
71
  this.animationType = newValue;
66
72
  break;
73
+ case EXPANSION_PANEL_CONSTANTS.observedAttributes.TRIGGER:
74
+ this.trigger = newValue;
67
75
  }
68
76
  }
69
77
  /**
@@ -94,6 +102,12 @@ __decorate([
94
102
  __decorate([
95
103
  coreProperty()
96
104
  ], ExpansionPanelComponent.prototype, "animationType", void 0);
105
+ __decorate([
106
+ coreProperty()
107
+ ], ExpansionPanelComponent.prototype, "trigger", void 0);
108
+ __decorate([
109
+ coreProperty()
110
+ ], ExpansionPanelComponent.prototype, "triggerElement", void 0);
97
111
  ExpansionPanelComponent = __decorate([
98
112
  customElement({
99
113
  name: EXPANSION_PANEL_CONSTANTS.elementName
@@ -111,6 +111,7 @@ declare const BaseField_base: import("../..").AbstractConstructor<import("../../
111
111
  * @csspart accessory - The element containing the accessory slot.
112
112
  * @csspart support-text - The support text element.
113
113
  * @csspart support-text-end - The element containing the support text end slot.
114
+ * @csspart outline - The element containing the forge-focus-indicator element.
114
115
  * @csspart focus-indicator - The focus indicator element.
115
116
  *
116
117
  * @slot - The default/unnamed slot for the field's input.
@@ -92,6 +92,7 @@ import { BASE_FIELD_CONSTANTS } from './base-field-constants';
92
92
  * @csspart accessory - The element containing the accessory slot.
93
93
  * @csspart support-text - The support text element.
94
94
  * @csspart support-text-end - The element containing the support text end slot.
95
+ * @csspart outline - The element containing the forge-focus-indicator element.
95
96
  * @csspart focus-indicator - The focus indicator element.
96
97
  *
97
98
  * @slot - The default/unnamed slot for the field's input.
@@ -77,6 +77,7 @@ export declare const FIELD_CONSTANTS: {
77
77
  ACCESSORY: string;
78
78
  SUPPORT_TEXT: string;
79
79
  SUPPORT_TEXT_END: string;
80
+ OUTLINE: string;
80
81
  FOCUS_INDICATOR: string;
81
82
  };
82
83
  events: {
@@ -48,6 +48,7 @@ const parts = {
48
48
  ACCESSORY: 'accessory',
49
49
  SUPPORT_TEXT: 'support-text',
50
50
  SUPPORT_TEXT_END: 'support-text-end',
51
+ OUTLINE: 'outline',
51
52
  FOCUS_INDICATOR: 'focus-indicator'
52
53
  };
53
54
  const events = {
@@ -137,6 +137,7 @@ declare global {
137
137
  * @csspart accessory - The element containing the accessory slot.
138
138
  * @csspart support-text - The element containing the support text slot.
139
139
  * @csspart support-text-end - The element containing the support text end slot.
140
+ * @csspart outline - The element containing the forge-focus-indicator element.
140
141
  * @csspart focus-indicator - The focus indicator element.
141
142
  *
142
143
  * @cssclass forge-field - The field container that wraps an `<input>` or `<textarea>`.