@brightspot/ui 6.1.2-pr.275 → 6.3.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 (195) hide show
  1. package/dist/components/action-bar/ActionBar.d.ts +1 -0
  2. package/dist/components/action-bar/ActionBar.d.ts.map +1 -1
  3. package/dist/components/action-bar/ActionBar.js +6 -2
  4. package/dist/components/action-bar/ActionBar.js.map +1 -1
  5. package/dist/components/avatar/Avatar.d.ts +1 -0
  6. package/dist/components/avatar/Avatar.d.ts.map +1 -1
  7. package/dist/components/avatar/Avatar.js +6 -2
  8. package/dist/components/avatar/Avatar.js.map +1 -1
  9. package/dist/components/avatar/AvatarGroup.d.ts +1 -0
  10. package/dist/components/avatar/AvatarGroup.d.ts.map +1 -1
  11. package/dist/components/avatar/AvatarGroup.js +6 -2
  12. package/dist/components/avatar/AvatarGroup.js.map +1 -1
  13. package/dist/components/badge/Badge.d.ts +1 -0
  14. package/dist/components/badge/Badge.d.ts.map +1 -1
  15. package/dist/components/badge/Badge.js +6 -2
  16. package/dist/components/badge/Badge.js.map +1 -1
  17. package/dist/components/button-group/ButtonGroup.d.ts +1 -0
  18. package/dist/components/button-group/ButtonGroup.d.ts.map +1 -1
  19. package/dist/components/button-group/ButtonGroup.js +6 -2
  20. package/dist/components/button-group/ButtonGroup.js.map +1 -1
  21. package/dist/components/card/Card.d.ts.map +1 -1
  22. package/dist/components/card/Card.js +4 -2
  23. package/dist/components/card/Card.js.map +1 -1
  24. package/dist/components/checkbox/Checkbox.d.ts.map +1 -1
  25. package/dist/components/checkbox/Checkbox.js +4 -2
  26. package/dist/components/checkbox/Checkbox.js.map +1 -1
  27. package/dist/components/circular-progress/CircularProgress.d.ts +2 -0
  28. package/dist/components/circular-progress/CircularProgress.d.ts.map +1 -1
  29. package/dist/components/circular-progress/CircularProgress.js +9 -3
  30. package/dist/components/circular-progress/CircularProgress.js.map +1 -1
  31. package/dist/components/icon/Icon.d.ts +1 -0
  32. package/dist/components/icon/Icon.d.ts.map +1 -1
  33. package/dist/components/icon/Icon.js +6 -2
  34. package/dist/components/icon/Icon.js.map +1 -1
  35. package/dist/components/linear-progress/LinearProgress.d.ts +2 -0
  36. package/dist/components/linear-progress/LinearProgress.d.ts.map +1 -1
  37. package/dist/components/linear-progress/LinearProgress.js +9 -3
  38. package/dist/components/linear-progress/LinearProgress.js.map +1 -1
  39. package/dist/components/pagination/Pagination.d.ts +1 -0
  40. package/dist/components/pagination/Pagination.d.ts.map +1 -1
  41. package/dist/components/pagination/Pagination.js +6 -2
  42. package/dist/components/pagination/Pagination.js.map +1 -1
  43. package/dist/components/popover/Popover.d.ts +1 -0
  44. package/dist/components/popover/Popover.d.ts.map +1 -1
  45. package/dist/components/popover/Popover.js +6 -2
  46. package/dist/components/popover/Popover.js.map +1 -1
  47. package/dist/components/switch/Switch.d.ts.map +1 -1
  48. package/dist/components/switch/Switch.js +4 -2
  49. package/dist/components/switch/Switch.js.map +1 -1
  50. package/dist/components/tabs/Tab.d.ts +1 -0
  51. package/dist/components/tabs/Tab.d.ts.map +1 -1
  52. package/dist/components/tabs/Tab.js +6 -2
  53. package/dist/components/tabs/Tab.js.map +1 -1
  54. package/dist/components/tabs/Tabs.d.ts +1 -0
  55. package/dist/components/tabs/Tabs.d.ts.map +1 -1
  56. package/dist/components/tabs/Tabs.js +6 -2
  57. package/dist/components/tabs/Tabs.js.map +1 -1
  58. package/dist/custom-elements.json +90 -0
  59. package/dist/storybook/assets/{ActionBar.stories-Q_bdek_N.js → ActionBar.stories-CgkvHW27.js} +1 -1
  60. package/dist/storybook/assets/{ActionItem.stories-Ccyot7vj.js → ActionItem.stories-CyxwhrvR.js} +1 -1
  61. package/dist/storybook/assets/{AiSparkle.stories-Ccapqzcw.js → AiSparkle.stories-h2LSw10e.js} +1 -1
  62. package/dist/storybook/assets/{Avatar.stories-CPcQWZtG.js → Avatar.stories-CQ3eFTbI.js} +1 -1
  63. package/dist/storybook/assets/{AvatarGroup.stories-Bws-izJt.js → AvatarGroup.stories-CIyZOd7R.js} +1 -1
  64. package/dist/storybook/assets/{Badge.stories-xck9Ke5e.js → Badge.stories-CwPkYUuY.js} +1 -1
  65. package/dist/storybook/assets/{Banner.stories-D3ieqG7F.js → Banner.stories-B7AhWymc.js} +1 -1
  66. package/dist/storybook/assets/{Button-CQ2ZvHGM.js → Button-fLz-Mqji.js} +1 -1
  67. package/dist/storybook/assets/{Button.stories-BkGox6QF.js → Button.stories-Bj_cB5Tr.js} +1 -1
  68. package/dist/storybook/assets/{ButtonGroup.stories-BxDNL7ej.js → ButtonGroup.stories-DMAr8q3A.js} +1 -1
  69. package/dist/storybook/assets/{Card.stories-BrzAwQwE.js → Card.stories-CouVkvTr.js} +1 -1
  70. package/dist/storybook/assets/{Celebrate.stories-BFqqbYhp.js → Celebrate.stories-Cai7aITx.js} +1 -1
  71. package/dist/storybook/assets/{Checkbox.stories-yNb9DH9g.js → Checkbox.stories-BTzuHih7.js} +1 -1
  72. package/dist/storybook/assets/{CircularProgress.stories--KSA2X4d.js → CircularProgress.stories-DwiMDCrW.js} +1 -1
  73. package/dist/storybook/assets/{ClipboardMixin.stories-DT0symyW.js → ClipboardMixin.stories-BTzKKsAG.js} +1 -1
  74. package/dist/storybook/assets/{Color-6BZIO3FS-CEpjJcuB.js → Color-6BZIO3FS-z5x4axZs.js} +1 -1
  75. package/dist/storybook/assets/{Colors.stories-BEtjS3CS.js → Colors.stories-LjQN3QJP.js} +1 -1
  76. package/dist/storybook/assets/{CombinedEffects.stories-DZsO6E1c.js → CombinedEffects.stories-CcWkxBPD.js} +1 -1
  77. package/dist/storybook/assets/{ComponentStatesMixin-C-G6neuB.js → ComponentStatesMixin-6JmalSeW.js} +1 -1
  78. package/dist/storybook/assets/{ComponentStatesMixin.stories-D4B2eXzV.js → ComponentStatesMixin.stories-wr7wl9D5.js} +1 -1
  79. package/dist/storybook/assets/{CopyToClipboard.stories-C1wxRcNr.js → CopyToClipboard.stories-CBL_GlzJ.js} +1 -1
  80. package/dist/storybook/assets/{Debounce.stories-CEXdiU_4.js → Debounce.stories-DDW0347e.js} +1 -1
  81. package/dist/storybook/assets/{DocsRenderer-LL677BLK-iD6uwWm0.js → DocsRenderer-LL677BLK-LHrG4h5r.js} +3 -3
  82. package/dist/storybook/assets/{Dropdown.stories-DzgAKuev.js → Dropdown.stories-BixGKdVC.js} +1 -1
  83. package/dist/storybook/assets/{EmptyState.stories-8IezRmLe.js → EmptyState.stories-DYCizkT5.js} +1 -1
  84. package/dist/storybook/assets/{EscaAvatar.stories-CFRMImDC.js → EscaAvatar.stories-IV0FybUu.js} +1 -1
  85. package/dist/storybook/assets/{Events.stories-wc_WlNNX.js → Events.stories-9X1B5LFU.js} +1 -1
  86. package/dist/storybook/assets/{Heading.stories-CBopc-Ov.js → Heading.stories-BWFKyeYP.js} +1 -1
  87. package/dist/storybook/assets/{HueRipple.stories-B1BLaONM.js → HueRipple.stories-KJySD4yc.js} +1 -1
  88. package/dist/storybook/assets/{Icon.stories-Bul1n2nN.js → Icon.stories-n4-_RBwe.js} +1 -1
  89. package/dist/storybook/assets/{IconButton.stories-DDCBKBqw.js → IconButton.stories--cc9Az0q.js} +1 -1
  90. package/dist/storybook/assets/{LinearProgress.stories-DWroemrV.js → LinearProgress.stories-CXISMQqr.js} +1 -1
  91. package/dist/storybook/assets/{Message.stories-CfWo8uqR.js → Message.stories-DCgZ9H2r.js} +1 -1
  92. package/dist/storybook/assets/{OnFindMixin.stories-DRr67PU5.js → OnFindMixin.stories-DwYEl4q4.js} +1 -1
  93. package/dist/storybook/assets/{Pagination.stories-CJ0dmE6y.js → Pagination.stories-B8AqV3jI.js} +1 -1
  94. package/dist/storybook/assets/{Popover.stories-CFFe2utX.js → Popover.stories-Dj8TUysk.js} +1 -1
  95. package/dist/storybook/assets/{ReadyMixin-euHV5BrF.js → ReadyMixin-B1y8EBLz.js} +1 -1
  96. package/dist/storybook/assets/{RovingTabindexMixin.stories-CcKn8eYu.js → RovingTabindexMixin.stories-BTYV78Cy.js} +1 -1
  97. package/dist/storybook/assets/{Rtc.stories-B_26leBQ.js → Rtc.stories-CiQ4OgEf.js} +1 -1
  98. package/dist/storybook/assets/{ScrollShadow.stories-COcTqDYx.js → ScrollShadow.stories-BRpbl9WU.js} +1 -1
  99. package/dist/storybook/assets/{Switch.stories-fZAYVOXQ.js → Switch.stories-Dfw56-LB.js} +1 -1
  100. package/dist/storybook/assets/{Tab.stories-ChmYj35a.js → Tab.stories-DCIPSPwr.js} +1 -1
  101. package/dist/storybook/assets/{Tabs.stories-Bgb-44oF.js → Tabs.stories-DrT2D2oW.js} +1 -1
  102. package/dist/storybook/assets/{Throttle.stories-BP21CM6q.js → Throttle.stories-B5Y8K9s3.js} +1 -1
  103. package/dist/storybook/assets/{Tooltip.stories-Ck7XsJKW.js → Tooltip.stories-CUjm8cuW.js} +1 -1
  104. package/dist/storybook/assets/{Upload.stories-DMedgAwp.js → Upload.stories-Dt7V8qIe.js} +1 -1
  105. package/dist/storybook/assets/{UploadItem.stories-D1rV5quQ.js → UploadItem.stories-DSXxGs8M.js} +1 -1
  106. package/dist/storybook/assets/{Welcome.stories-DDEhWqOY.js → Welcome.stories-BDFQb8oF.js} +1 -1
  107. package/dist/storybook/assets/{Widget.stories-iTycJQkv.js → Widget.stories-CQnE1dST.js} +1 -1
  108. package/dist/storybook/assets/{WithTooltip-65CFNBJE-BDmGdT_q.js → WithTooltip-65CFNBJE-D1OYJPzp.js} +1 -1
  109. package/dist/storybook/assets/{blocks-45GMe9mP.js → blocks-Z0quNc1U.js} +5 -5
  110. package/dist/storybook/assets/{formatter-EIJCOSYU-Dvxzfjid.js → formatter-EIJCOSYU-DwWzDvJC.js} +1 -1
  111. package/dist/storybook/assets/if-defined-Dl8MuiCE.js +1 -0
  112. package/dist/storybook/assets/iframe-HDp5BmO_.css +1 -0
  113. package/dist/storybook/assets/{iframe-CemlMLl9.js → iframe-WTEmYHJj.js} +4 -4
  114. package/dist/storybook/assets/{index-Ei3bFG4y.js → index-BvPCa7_B.js} +1 -1
  115. package/dist/storybook/assets/{onFind-96dPwZGj.js → onFind-CqIRRMTv.js} +1 -1
  116. package/dist/storybook/assets/{onFind.stories-DwMmvzD8.js → onFind.stories-C4PPQTaQ.js} +1 -1
  117. package/dist/storybook/assets/{onRemove.stories-Bw8nC3q8.js → onRemove.stories-BGFCh6DN.js} +1 -1
  118. package/dist/storybook/assets/{onVisible.stories-BZyJ5si2.js → onVisible.stories-4ni7syfJ.js} +1 -1
  119. package/dist/storybook/assets/{style-map-BZ1BR1yx.js → style-map-BhvFBtuB.js} +1 -1
  120. package/dist/storybook/assets/{syntaxhighlighter-ED5Y7EFY-B4dajqNJ.js → syntaxhighlighter-ED5Y7EFY-D_cJwnoJ.js} +1 -1
  121. package/dist/storybook/iframe.html +2 -2
  122. package/dist/storybook/project.json +1 -1
  123. package/dist/tailwind-plugin-button.js +2 -0
  124. package/dist/tailwind-plugin-button.js.map +1 -1
  125. package/dist/tailwind-plugin-button.ts +2 -0
  126. package/package.json +4 -1
  127. package/src/legacy/tool-ui/src/Admin.css +2 -6
  128. package/src/legacy/tool-ui/src/CIGCluster.css +9 -1
  129. package/src/legacy/tool-ui/src/ChartCompat.ts +1 -1
  130. package/src/legacy/tool-ui/src/Compat.css +11 -0
  131. package/src/legacy/tool-ui/src/ContentEdit.css +19 -12
  132. package/src/legacy/tool-ui/src/ContentEditPanel.ts +26 -12
  133. package/src/legacy/tool-ui/src/ContentInputGroup.css +12 -10
  134. package/src/legacy/tool-ui/src/Conversation.css +19 -7
  135. package/src/legacy/tool-ui/src/DashboardWidget.css +4 -0
  136. package/src/legacy/tool-ui/src/Dialog.css +83 -26
  137. package/src/legacy/tool-ui/src/EmbeddedInputGroup/index.ts +20 -50
  138. package/src/legacy/tool-ui/src/Enhancement.css +3 -2
  139. package/src/legacy/tool-ui/src/Entry.ts +11 -0
  140. package/src/legacy/tool-ui/src/FileInput.css +1 -1
  141. package/src/legacy/tool-ui/src/Global.d.ts +3 -0
  142. package/src/legacy/tool-ui/src/Guide.css +5 -5
  143. package/src/legacy/tool-ui/src/ImageEditor.css +1 -1
  144. package/src/legacy/tool-ui/src/LinkTable.css +4 -0
  145. package/src/legacy/tool-ui/src/LiveBlog.css +2 -2
  146. package/src/legacy/tool-ui/src/MenuView.css +13 -7
  147. package/src/legacy/tool-ui/src/Message.css +4 -9
  148. package/src/legacy/tool-ui/src/Page.css +32 -9
  149. package/src/legacy/tool-ui/src/Popup.css +18 -1
  150. package/src/legacy/tool-ui/src/ProseMirror.css +1 -1
  151. package/src/legacy/tool-ui/src/RepeatableContentInputGroup.css +5 -5
  152. package/src/legacy/tool-ui/src/Revisions.css +8 -4
  153. package/src/legacy/tool-ui/src/SearchFields.css +2 -2
  154. package/src/legacy/tool-ui/src/SearchWidgetAdvanced.css +4 -13
  155. package/src/legacy/tool-ui/src/TabBar.css +2 -2
  156. package/src/legacy/tool-ui/src/Widget.css +29 -2
  157. package/src/legacy/tool-ui/src/dialog/index.ts +10 -18
  158. package/src/legacy/tool-ui/src/form/FormFilter/index.ts +2 -2
  159. package/src/legacy/tool-ui/src/main/webapp/dist/2111.5d43fec84fea624d6371.css +1 -0
  160. package/src/legacy/tool-ui/src/main/webapp/dist/5598.315afb3723a27880f87c.js +2 -0
  161. package/src/legacy/tool-ui/src/main/webapp/dist/6086.82620005e5673191c44f.js +1 -0
  162. package/src/legacy/tool-ui/src/main/webapp/dist/7718.5d43fec84fea624d6371.css +1 -0
  163. package/src/legacy/tool-ui/src/main/webapp/dist/{9360.41a5ba8d859d49f86811.js → 9360.22bc0127e04bc73d5261.js} +2 -2
  164. package/src/legacy/tool-ui/src/main/webapp/dist/{9360.41a5ba8d859d49f86811.js.LICENSE.txt → 9360.22bc0127e04bc73d5261.js.LICENSE.txt} +1 -1
  165. package/src/legacy/tool-ui/src/main/webapp/dist/ChartCompat.c7121ea8407d80ee5abe.js +1 -0
  166. package/src/legacy/tool-ui/src/main/webapp/dist/RTEProseMirror.1407c7815b605e9c9e5c.js +500 -0
  167. package/src/legacy/tool-ui/src/main/webapp/dist/{v4.1074f0affb38bd0dd492.js → v4.447a0e68294d13059714.js} +8 -8
  168. package/src/legacy/tool-ui/src/main/webapp/dist/v4.b1e9f6ac0449331711fc.css +3 -0
  169. package/src/legacy/tool-ui/src/main/webapp/dist/v5.4b881dc40345f5053736.js +92 -0
  170. package/src/legacy/tool-ui/src/main/webapp/dist/v5.c4249c5b01957c28ff92.css +5 -0
  171. package/src/legacy/tool-ui/src/main/webapp/v4/CIGCluster.less +9 -0
  172. package/src/legacy/tool-ui/src/main/webapp/v4/TabBar.less +4 -0
  173. package/src/legacy/tool-ui/src/theme/Theme.ts +28 -0
  174. package/src/legacy/tool-ui/src/v5.ts +61 -13
  175. package/dist/storybook/assets/if-defined-C-mi5lcR.js +0 -1
  176. package/dist/storybook/assets/iframe-abUCrGGI.css +0 -1
  177. package/src/legacy/tool-ui/src/main/webapp/dist/011a678e3efe41981754.png +0 -1
  178. package/src/legacy/tool-ui/src/main/webapp/dist/194137260531ee29a5f2.svg +0 -1
  179. package/src/legacy/tool-ui/src/main/webapp/dist/1e8408af1a34bdf61457.png +0 -1
  180. package/src/legacy/tool-ui/src/main/webapp/dist/2111.8f1e08a5cc223fd14542.css +0 -1
  181. package/src/legacy/tool-ui/src/main/webapp/dist/44b38a404dec4643c46b.png +0 -1
  182. package/src/legacy/tool-ui/src/main/webapp/dist/4a4ee777ddc0d4cedee4.png +0 -1
  183. package/src/legacy/tool-ui/src/main/webapp/dist/5598.d84773ca53126661bdca.js +0 -2
  184. package/src/legacy/tool-ui/src/main/webapp/dist/6086.7ca02b827506f29db590.js +0 -1
  185. package/src/legacy/tool-ui/src/main/webapp/dist/7718.8f1e08a5cc223fd14542.css +0 -1
  186. package/src/legacy/tool-ui/src/main/webapp/dist/ChartCompat.4dd096dd030942227ec6.js +0 -1
  187. package/src/legacy/tool-ui/src/main/webapp/dist/RTEProseMirror.55a2d6ccdce502c79815.js +0 -500
  188. package/src/legacy/tool-ui/src/main/webapp/dist/c6e9c007f41bd4d26c20.png +0 -1
  189. package/src/legacy/tool-ui/src/main/webapp/dist/v4.477ad1936f8c04d7b232.css +0 -3
  190. package/src/legacy/tool-ui/src/main/webapp/dist/v5.b49d2d7615d030b68f89.js +0 -92
  191. package/src/legacy/tool-ui/src/main/webapp/dist/v5.f9baf26a8d24e59e7af0.css +0 -5
  192. /package/src/legacy/tool-ui/src/main/webapp/dist/{5598.d84773ca53126661bdca.js.LICENSE.txt → 5598.315afb3723a27880f87c.js.LICENSE.txt} +0 -0
  193. /package/src/legacy/tool-ui/src/main/webapp/dist/{RTEProseMirror.55a2d6ccdce502c79815.js.LICENSE.txt → RTEProseMirror.1407c7815b605e9c9e5c.js.LICENSE.txt} +0 -0
  194. /package/src/legacy/tool-ui/src/main/webapp/dist/{v4.1074f0affb38bd0dd492.js.LICENSE.txt → v4.447a0e68294d13059714.js.LICENSE.txt} +0 -0
  195. /package/src/legacy/tool-ui/src/main/webapp/dist/{v5.b49d2d7615d030b68f89.js.LICENSE.txt → v5.4b881dc40345f5053736.js.LICENSE.txt} +0 -0
@@ -90,6 +90,8 @@ module.exports = plugin(function ({ addComponents, addUtilities, theme }) {
90
90
  '&:disabled': disabledStyle,
91
91
  '&[disabled]': disabledStyle,
92
92
  textDecoration: 'none',
93
+ // Explicit so re-applying btu-button clears an outline, as it already does background/color.
94
+ outline: 'none',
93
95
  transition: 'scale 150ms ease',
94
96
  '&:hover': {
95
97
  color: 'var(--button-pressed-text-color, var(--button-disabled-text-color, var(--button-text-color)))',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brightspot/ui",
3
- "version": "6.1.2-pr.275",
3
+ "version": "6.3.0",
4
4
  "type": "module",
5
5
  "license": "UNLICENSED",
6
6
  "description": "A UI library for building Brightspot CMS components.",
@@ -27,6 +27,7 @@
27
27
  "build-storybook": "yarn cem && storybook build -o ./dist/storybook",
28
28
  "test:storybook": "vitest --project=storybook",
29
29
  "test:css-bloat": "vitest run --project=css-bloat",
30
+ "test:combo-input": "vitest run --project=combo-input",
30
31
  "check:conventions": "yarn cem && node scripts/check-conventions-all.mjs",
31
32
  "check:conventions:fast": "node scripts/check-conventions.mjs",
32
33
  "prepare": "husky && (cd src/legacy/tool-ui && yarn install)",
@@ -54,7 +55,9 @@
54
55
  "eslint-plugin-prettier": "^5.5.4",
55
56
  "eslint-plugin-storybook": "^10.0.7",
56
57
  "globals": "^16.0.0",
58
+ "happy-dom": "^20.11.1",
57
59
  "husky": "^9.1.7",
60
+ "js-cookie": "^3.0.1",
58
61
  "lint-staged": "^16.2.6",
59
62
  "lit": "^3.3.0",
60
63
  "mini-css-extract-plugin": "^2.6.1",
@@ -13,7 +13,7 @@
13
13
  }
14
14
 
15
15
  /* Admin areas side nav styling */
16
- .Admin-nav {
16
+ .Admin .Admin-nav {
17
17
  @apply bg-gray-50;
18
18
 
19
19
  > h2,
@@ -43,7 +43,7 @@
43
43
  }
44
44
 
45
45
  /* These content selectors should just appear as normal ComboInputs */
46
- > form > .ContentSelector-select + .ComboInput {
46
+ > form > .ComboInput {
47
47
  @apply rounded-lg px-4;
48
48
 
49
49
  &:not([aria-expanded='true'], :focus-visible) {
@@ -135,10 +135,6 @@
135
135
  }
136
136
  }
137
137
 
138
- &:not(:first-child) {
139
- @apply mt-2;
140
- }
141
-
142
138
  a:hover {
143
139
  @apply text-gray-900;
144
140
  }
@@ -1,5 +1,13 @@
1
1
  btu-cig-cluster {
2
- @apply blokk flex-grow basis-full contain-layout contain-style;
2
+ --gap: calc(2 * var(--CIG-padding));
3
+
4
+ /* Flex (not block) so narrow .CIG-row children pair up like they do in .CIG. */
5
+ @apply flex flex-grow flex-wrap basis-full gap-x-[--gap] contain-layout contain-style;
6
+ }
7
+
8
+ /* Children run the full row; the narrow modifiers (.is-half etc.) override this to pair up. */
9
+ btu-cig-cluster > * {
10
+ @apply basis-full;
3
11
  }
4
12
 
5
13
  btu-cig-cluster:state(btu-error) {
@@ -247,7 +247,7 @@ Highcharts.theme = {
247
247
  }
248
248
 
249
249
  Highcharts.setOptions(Highcharts.theme)
250
- Highcharts.setOptions({ lang: { noData: 'No Data to Display' } })
250
+ Highcharts.setOptions({ lang: { noData: window.BRIGHTSPOT?.ui?.tooltips?.chartNoData ?? 'No Data to Display' } })
251
251
 
252
252
  const createLabels = (table: HTMLTableElement): string[] => {
253
253
  const labels = []
@@ -202,6 +202,12 @@
202
202
  }
203
203
  }
204
204
 
205
+ /* btu-button is colorless without a variant. :where() keeps this at one class of specificity so
206
+ context rules (ActionBar, etc.) still win. */
207
+ .Button:not(:where(.is-dominant, .is-green, .is-yellow, .Link)) {
208
+ @apply btu-button-gray btu-button-fill-none btu-button-outline;
209
+ }
210
+
205
211
  .Button.is-dominant {
206
212
  @apply btu-button-primary;
207
213
  }
@@ -379,6 +385,11 @@ suggests. Example use case "pin" icon button in live blog posts */
379
385
  }
380
386
  }
381
387
 
388
+ /* Collapse edit-top-html container when empty so it doesn't reserve space above tabs. */
389
+ .bsp-edit-top-html {
390
+ @apply empty:hidden;
391
+ }
392
+
382
393
  /* v4 things which shouldn't appear in v5 */
383
394
  .v4-only {
384
395
  @apply hidden;
@@ -760,18 +760,29 @@
760
760
  @apply flex flex-nowrap gap-2;
761
761
  }
762
762
 
763
+ /* Lives in the edit grid, not the scrolling form, so a space-taking scrollbar
764
+ can't push the hit target off the panel edge. */
763
765
  .ContentEdit-resizeWrapper {
764
- --resize-hitbox-w: 8px;
765
- @apply pointer-events-none invisible absolute z-20 !col-[fullbleed-end] w-[--resize-hitbox-w] bg-transparent [inset-block-end:0] [inset-block-start:0] [inset-inline-start:calc(100%_-_var(--resize-hitbox-w))] md:pointer-events-auto md:visible md:cursor-col-resize;
766
+ --resize-hitbox-w: 16px;
767
+ margin-inline-end: calc(-1 * var(--resize-hitbox-w));
768
+ @apply pointer-events-none hidden w-[--resize-hitbox-w] justify-self-end bg-transparent [grid-area:left] md:pointer-events-auto md:relative md:z-20 md:cursor-col-resize md:touch-none;
766
769
  }
767
770
 
768
- .ContentEdit-resizeWrapper:hover .ContentEdit-resizeHandle {
771
+ /* Laid out only in the edit grid, since other popups are grids with no `left` area. */
772
+ :is(.Page.is-editing .Page-content, .Popup-content.is-editing)
773
+ > .ContentEdit-resizeWrapper {
774
+ @apply md:blokk;
775
+ }
776
+
777
+ .ContentEdit-resizeWrapper:hover .ContentEdit-resizeHandle,
778
+ .ContentEdit-resizeWrapper:active .ContentEdit-resizeHandle {
769
779
  @apply bg-primary-500;
770
780
  }
771
781
 
772
782
  .ContentEdit-resizeHandle {
773
783
  --resize-handle-w: 2px;
774
- @apply pointer-events-none fixed h-full w-[var(--resize-handle-w)] translate-x-[calc(var(--resize-hitbox-w)_-_var(--resize-handle-w))] transition-all;
784
+ /* Persistently visible so it's discoverable on touch devices (no :hover). */
785
+ @apply pointer-events-none absolute inset-y-0 start-0 w-[var(--resize-handle-w)] bg-primary-100 transition-colors;
775
786
  }
776
787
 
777
788
  /* Banners / Messages styling in Content edit form */
@@ -884,14 +895,10 @@
884
895
  }
885
896
 
886
897
  .ContentEdit-revisionActions {
887
- @apply text-[--Revision-revisionEmphasisColor] max-md:mt-3;
898
+ @apply flex flex-wrap gap-4 text-[--Revision-revisionEmphasisColor] max-md:mt-3;
888
899
 
889
900
  > a {
890
- white-space: nowrap;
891
- }
892
-
893
- > a:not(:first-child) {
894
- margin-left: var(--gap-l);
901
+ @apply whitespace-nowrap;
895
902
  }
896
903
  }
897
904
 
@@ -1015,11 +1022,11 @@
1015
1022
  }
1016
1023
 
1017
1024
  button.ContentEdit-workflowLink {
1018
- @apply btu-button btu-button-fill-none btu-button-primary m-6 !ms-auto btu-button-container-none after:btu-icon after:btu-icon-arrow-right after:ml-2;
1025
+ @apply btu-button btu-button-fill-none btu-button-primary m-6 !ms-auto btu-button-container-none after:btu-icon after:btu-icon-arrow-right rtl:after:btu-icon-arrow-left after:ms-2;
1019
1026
  }
1020
1027
 
1021
1028
  [data-name='publishOverride'] button.ContentEdit-workflowLink {
1022
- @apply !me-auto !ms-6 before:btu-icon before:btu-icon-arrow-left before:mr-2 after:hidden;
1029
+ @apply !me-auto !ms-6 before:btu-icon before:btu-icon-arrow-left rtl:before:btu-icon-arrow-right before:me-2 after:hidden;
1023
1030
  }
1024
1031
 
1025
1032
  /* Hide workflow link when not in publish override mode */
@@ -13,9 +13,9 @@ let panelData: PanelData | null
13
13
  let pointerIsDown = false
14
14
  let pdOriginX = 0 // Pointer down origin x position
15
15
  let gtcOrigin: number[] = [] // Origin Grid Template Columns in pixels
16
- let ogTransProp: undefined | string
17
16
  let isRTL = false // Whether the container has RTL direction
18
17
  let container: HTMLElement | null // The target Page
18
+ let grid: HTMLElement | null // The grid whose columns the drag resizes
19
19
  let panel: HTMLElement | null // The target Panel
20
20
 
21
21
  const updateWidth = (length: string) => {
@@ -47,6 +47,8 @@ const onPointerDown = (e: PointerEvent) => {
47
47
  if (e.target.classList.contains('ContentEdit-resizeWrapper')) {
48
48
  container = e.target.closest<HTMLElement>('.Page-content, .Popup')
49
49
  if (!container) return
50
+ // Capture so a touch/trackpad drag isn't stolen by scroll and lost mid-drag.
51
+ e.target.setPointerCapture(e.pointerId)
50
52
  pointerIsDown = true
51
53
  const isPopup = container.classList.contains('Popup')
52
54
  if (isPopup) {
@@ -57,15 +59,15 @@ const onPointerDown = (e: PointerEvent) => {
57
59
  document.body.style.userSelect = 'none'
58
60
  }
59
61
  pdOriginX = e.screenX
60
- const computedStyle = getComputedStyle(container)
61
- ogTransProp = computedStyle.transitionProperty
62
- isRTL = computedStyle.direction === 'rtl'
63
- container.style.transitionProperty = 'none'
64
- const grid = isPopup
62
+ isRTL = getComputedStyle(container).direction === 'rtl'
63
+ grid = isPopup
65
64
  ? container.querySelector<HTMLElement>('.Popup-content')
66
65
  : container
67
66
  if (!grid) return
68
67
 
68
+ // The transition belongs to the grid, which in a popup is not the container.
69
+ grid.style.transitionProperty = 'none'
70
+
69
71
  gtcOrigin = window
70
72
  .getComputedStyle(grid)
71
73
  .gridTemplateColumns.split(' ')
@@ -101,15 +103,16 @@ const onPointerDown = (e: PointerEvent) => {
101
103
  }
102
104
  }
103
105
 
104
- const onPointerUp = (e: PointerEvent) => {
106
+ const onPointerUp = (e: PointerEvent, save = true) => {
105
107
  panel = null
106
108
  pointerIsDown = false
109
+ if (grid) {
110
+ grid.style.removeProperty('transition-property')
111
+ grid = null
112
+ }
107
113
  if (e.target instanceof HTMLElement) {
108
114
  container = e.target.closest<HTMLElement>('.Page-content, .Popup')
109
115
  }
110
- if (container && ogTransProp) {
111
- container.style.transitionProperty = ogTransProp
112
- }
113
116
  if (container?.classList.contains('Popup')) {
114
117
  container.style.cursor = 'initial'
115
118
  container.style.userSelect = 'unset'
@@ -128,7 +131,9 @@ const onPointerUp = (e: PointerEvent) => {
128
131
  }
129
132
 
130
133
  if (panelData && panelData.width) {
131
- savePreferredWidth(panelData)
134
+ // A cancelled drag (scroll gesture stealing the pointer) shouldn't persist its
135
+ // interrupted width.
136
+ if (save) savePreferredWidth(panelData)
132
137
  panelData = null
133
138
  }
134
139
  }
@@ -156,7 +161,11 @@ const onPointerMove = (e: PointerEvent) => {
156
161
 
157
162
  const initResizablePanel = () => {
158
163
  onFind('.ContentEdit-main', (cl) => {
159
- cl.append(
164
+ // Appended to the grid, not the scrolling form: see ContentEdit.css.
165
+ const grid = cl.closest<HTMLElement>('.Page-content, .Popup-content')
166
+ if (!grid || grid.querySelector(':scope > .ContentEdit-resizeWrapper'))
167
+ return
168
+ grid.append(
160
169
  create(
161
170
  'div',
162
171
  { className: 'ContentEdit-resizeWrapper' },
@@ -167,6 +176,11 @@ const initResizablePanel = () => {
167
176
 
168
177
  document.body.addEventListener('pointerdown', onPointerDown, false)
169
178
  document.body.addEventListener('pointerup', onPointerUp, false)
179
+ document.body.addEventListener(
180
+ 'pointercancel',
181
+ (e) => onPointerUp(e, false),
182
+ false,
183
+ )
170
184
  document.body.addEventListener('pointermove', onPointerMove, false)
171
185
 
172
186
  // Check if there's a preferred width for the content form
@@ -171,12 +171,6 @@
171
171
  @apply w-full;
172
172
  }
173
173
 
174
- /* min() replaces a @[312px]/CIG gate. Pixel-identical only while .CIG-row keeps
175
- contain:inline-size - otherwise the 100% inflates intrinsic widths. */
176
- > .CIG-small.inputSmall:not(.is-grid) {
177
- @apply min-w-[min(312px,100%)] max-w-[540px] basis-1/2;
178
- }
179
-
180
174
  /* Inside a layout with columns, unset the min width to prevent fields from
181
175
  overlapping on smaller viewports. Set flex basis back to full so that the fields are not
182
176
  really small here. These will still get the max width of 540px. */
@@ -190,6 +184,10 @@
190
184
  }
191
185
  }
192
186
 
187
+ .CIG .CIG-row:not([data-type="file"]) > .CIG-small.inputSmall:not(.is-grid) {
188
+ @apply min-w-[min(312px,100%)] max-w-[540px] basis-1/2;
189
+ }
190
+
193
191
  .CIG-large,
194
192
  .CIG-small {
195
193
  --CIG-space: 0.375rem;
@@ -515,6 +513,14 @@
515
513
  @apply pointer-events-auto;
516
514
  }
517
515
 
516
+ .CIG-note :where(a, button, [role='button'], btu-copy-to-clipboard) {
517
+ @apply pointer-events-auto cursor-pointer;
518
+ }
519
+
520
+ .CIG-note a {
521
+ @apply text-primary-600;
522
+ }
523
+
518
524
  .MultiSortable:hover {
519
525
  @apply cursor-[unset];
520
526
  }
@@ -684,10 +690,6 @@
684
690
  @apply !pointer-events-auto !opacity-100;
685
691
  }
686
692
 
687
- .CIG-row.is-unlabeled > .AIChatButton {
688
- @apply absolute right-0 top-[calc(-1_*_var(--button-size-md))] ms-0 ![display:initial];
689
- }
690
-
691
693
  /* Focus state for CIG-small in read-only rows */
692
694
  :is(.CIG-row.is-readOnly, .CIG.is-readOnly) .CIG-small:focus-within {
693
695
  @apply rounded-lg outline-dashed outline-[4px] outline-gray-300;
@@ -1,5 +1,5 @@
1
1
  .Conversation {
2
- --post-form-h: 198px; /* this magic number is the approx height of the post form to reduce the jittering of the height while the RTE renders. */
2
+ --post-form-h: 136px; /* this magic number is the approx height of the post form to reduce the jittering of the height while the RTE renders. */
3
3
  @apply !col-[fullbleed-start_/_fullbleed-end] grid min-h-0 grid-rows-[minmax(0px,1fr)_minmax(var(--post-form-h),auto)];
4
4
  }
5
5
 
@@ -94,7 +94,7 @@
94
94
  }
95
95
 
96
96
  .Conversation-workflowStateIcon {
97
- @apply flex before:btu-icon before:btu-icon-arrow-right before:font-semibold before:text-gray-500 before:btu-icon-xs;
97
+ @apply flex before:btu-icon before:btu-icon-arrow-right rtl:before:btu-icon-arrow-left before:font-semibold before:text-gray-500 before:btu-icon-xs;
98
98
  }
99
99
 
100
100
  .Conversation-text {
@@ -128,11 +128,19 @@
128
128
 
129
129
  /* TODO: revisit newPost when ProseMirror is styled */
130
130
  .Conversation-newPost {
131
- @apply flex flex-col items-end gap-4 border-t border-t-gray-200 p-4;
131
+ @apply flex flex-row items-end gap-3 border-t border-t-gray-200 p-4;
132
+
133
+ .CIG-small {
134
+ @apply mt-0;
135
+ }
132
136
  }
133
137
 
134
138
  .Conversation-newPost .ProseMirrorContainer {
135
139
  @apply bg-white;
140
+
141
+ .ProseMirror {
142
+ @apply py-4;
143
+ }
136
144
  }
137
145
 
138
146
  .Conversation-newPostButton {
@@ -181,6 +189,10 @@
181
189
  }
182
190
  }
183
191
 
192
+ .Conversation-newPost {
193
+ @apply flex-col;
194
+ }
195
+
184
196
  .Conversation-posts {
185
197
  @apply max-h-[calc(100vh-3.3rem)] overflow-y-auto;
186
198
  }
@@ -212,10 +224,6 @@
212
224
  @apply blokk max-h-[300px] overflow-y-auto;
213
225
  }
214
226
  }
215
-
216
- .Conversation {
217
- @apply flex min-h-max flex-col;
218
- }
219
227
  }
220
228
 
221
229
  .Popup[name='conversation-reply'] {
@@ -225,6 +233,10 @@
225
233
  .Conversation-posts {
226
234
  @apply overflow-y-visible;
227
235
  }
236
+
237
+ .Conversation-newPost {
238
+ @apply flex-col;
239
+ }
228
240
  }
229
241
  }
230
242
 
@@ -78,6 +78,10 @@ html::view-transition-new(dashboard-widget) {
78
78
  &:has(> a:focus-visible) {
79
79
  @apply ring-inset;
80
80
  }
81
+
82
+ &:not(:first-child) {
83
+ @apply mt-0;
84
+ }
81
85
  }
82
86
 
83
87
  > li > a {
@@ -194,7 +194,13 @@ dialog:modal > .QueryField-frame > .Popup:where(:not([popover])) {
194
194
  }
195
195
  }
196
196
 
197
- /* Fix the ActionBar to the bottom of the modal. */
197
+ /* Fix the ActionBar to the bottom of the modal.
198
+ One layout for every popup body: the frame scrolls, the wrappers between
199
+ it and the ActionBar (has-ActionBarContent) stretch as plain columns, and
200
+ the bar pins to the bottom with mt-auto while staying visible during
201
+ scroll (sticky). This works for any child count or nesting depth, unlike
202
+ the row subgrid it replaces. SearchFields, SearchWidgetAdvanced, and
203
+ PostPublish own their internal layouts and only join the outer column. */
198
204
  &:where(
199
205
  :not(
200
206
  [name='toolUserTfa'],
@@ -204,38 +210,79 @@ dialog:modal > .QueryField-frame > .Popup:where(:not([popover])) {
204
210
  )
205
211
  )
206
212
  .Popup-content:where(.has-ActionBar:not(.has-AdminNav, .is-editing)) {
207
- @apply grid-rows-[[title]_max-content_[main]_1fr_max-content_[action-bar]];
208
-
209
- &.has-StatusMessage {
210
- @apply grid-rows-[[title]_max-content_[message]_max-content_[main]_1fr_max-content_[action-bar]];
211
- }
212
-
213
- *.has-ActionBarContent {
214
- @apply row-[main/action-bar] grid grid-rows-[subgrid] items-baseline;
215
-
216
- &.has-StatusMessage {
217
- @apply row-[message/action-bar];
213
+ @apply grid-rows-[[title]_max-content_[main]_minmax(0,1fr)];
214
+
215
+ .has-ActionBarContent:not(
216
+ .SearchFields,
217
+ .SearchFields *,
218
+ .SearchWidgetAdvanced,
219
+ .SearchWidgetAdvanced *,
220
+ .PostPublish-form,
221
+ .PostPublish-form *
222
+ ) {
223
+ @apply flex grow flex-col row-[main];
224
+
225
+ /* Body content lines up with the popup inset; wrappers and full-bleed
226
+ elements are exempt. */
227
+ > :not(
228
+ .ActionBar,
229
+ .Message,
230
+ .TabBar,
231
+ .has-ActionBarContent,
232
+ .AIChat-wrapper,
233
+ .DT-wrapper,
234
+ table
235
+ ) {
236
+ @apply mx-[--space];
237
+ }
218
238
 
219
- .Widget-title + .Message {
220
- @apply row-[message/main];
221
- }
239
+ /* A form that is a sibling of the ActionBar is plain content here;
240
+ without this it keeps the Widget grid's subgrid columns, which
241
+ collapse inside this flex column. */
242
+ > form:not(.has-ActionBarContent) {
243
+ @apply flex flex-col;
222
244
  }
223
245
 
224
- &.SearchFields.has-tabs {
225
- @apply h-full grid-rows-[auto_[main]_1fr_max-content_[action-bar]];
246
+ /* Same hazard for a fixedScrollable holding the fields before the bar
247
+ (e.g. the Profile popup): Widget.css turns it into a subgrid when it
248
+ holds a TC/CIG, which orphans inside this flex column and shoves the
249
+ fields into a phantom second column. */
250
+ > .fixedScrollable.before-ActionBar {
251
+ @apply flex flex-col;
226
252
  }
227
253
  }
228
254
 
229
- .Widget .has-ActionBarContent {
230
- @apply col-[fullbleed-start/fullbleed-end] grid-cols-subgrid;
255
+ /* Gap between the last content element and the bar. */
256
+ .before-ActionBar {
257
+ @apply mb-6;
231
258
  }
232
259
 
233
- :is(form, .TC, .AIChat-wrapper, .fixedScrollable).before-ActionBar {
234
- @apply col-[fullbleed-start/fullbleed-end] max-h-full overflow-y-auto px-[--space] pb-6;
260
+ /* Chat log keeps its own scroll pane. */
261
+ .AIChat-wrapper.before-ActionBar {
262
+ @apply grow overflow-y-auto px-[--space];
235
263
  }
236
264
 
237
265
  .ActionBar {
238
- @apply mt-0 h-max self-end;
266
+ @apply mt-auto;
267
+ }
268
+
269
+ /* SearchFields keeps its legacy two-pane grid, with or without tabs
270
+ (Select Fields vs Show/Hide Filters). */
271
+ .SearchFields {
272
+ @apply grid h-full grow grid-rows-[[main]_1fr_max-content_[action-bar]] row-[main];
273
+
274
+ &.has-tabs {
275
+ @apply grid-rows-[auto_[main]_1fr_max-content_[action-bar]];
276
+ }
277
+
278
+ > form.has-ActionBarContent {
279
+ @apply grid grid-rows-[subgrid] row-[main/action-bar];
280
+ }
281
+ }
282
+
283
+ /* Self-managed widgets still fill the body column. */
284
+ :is(.Widget.SearchWidgetAdvanced, .PostPublish-form) {
285
+ @apply grow;
239
286
  }
240
287
  }
241
288
 
@@ -255,6 +302,12 @@ dialog:modal > .QueryField-frame > .Popup:where(:not([popover])) {
255
302
  .Popup-content .Popup-close {
256
303
  @apply first:ms-auto;
257
304
  }
305
+
306
+ /* Same when the only element before it is the legacy heading, which is
307
+ always hidden (e.g. objectId-edit popups without a cloned title). */
308
+ .Popup-content > .Popup-heading + .Popup-close {
309
+ @apply ms-auto;
310
+ }
258
311
  }
259
312
 
260
313
  /* Content Edit workflow popup — v4 lifecycle does not always remove [open]
@@ -400,9 +453,10 @@ dialog dialog > .PrePublishPopup {
400
453
  --popup-w: initial;
401
454
  }
402
455
 
403
- /* Post Publish Actions modal */
456
+ /* Post Publish Actions modal. The named columns mirror the Widget grid,
457
+ which no longer reaches here via subgrid. */
404
458
  dialog:modal .PostPublish-form > div {
405
- @apply h-full;
459
+ @apply grid h-full [grid-template-columns:[fullbleed-start]_var(--space)_[content-start]_1fr_auto_[content-end]_var(--space)_[fullbleed-end]];
406
460
 
407
461
  > * {
408
462
  @apply col-[content-start/content-end];
@@ -416,8 +470,11 @@ dialog:modal .PostPublish-form > div {
416
470
  @apply relative mb-12 mt-1.5 after:absolute after:-bottom-6 after:-left-[var(--space)] after:-right-[var(--space)] after:h-px after:bg-gray-200;
417
471
  }
418
472
 
419
- > div:where(:has(~ .ActionBar)),
420
- > :where(:has(+ .ActionBar)) {
473
+ /* Content area(s) before the ActionBar scroll. The ActionBar is always the
474
+ last child, so div:not(.ActionBar) matches the content divs; .before-ActionBar
475
+ (stamped by dialog/index.ts) covers a non-div immediately before the bar. */
476
+ > div:not(.ActionBar),
477
+ > .before-ActionBar {
421
478
  @apply relative col-[fullbleed-start/fullbleed-end] max-h-full overflow-y-auto px-[--space] pb-6;
422
479
  }
423
480
 
@@ -13,11 +13,7 @@ export default class EmbeddedInputGroup extends EventEmitterMixin(LitElement) {
13
13
  @queryAsync('.EIG-item')
14
14
  _eigItem?: Promise<HTMLElement>
15
15
 
16
- @queryAsync('.EIG-title')
17
- _title?: Promise<HTMLElement>
18
-
19
- @queryAsync('.removeButton')
20
- _removeButton?: Promise<HTMLElement>
16
+ private _watchingItems = false
21
17
 
22
18
  connectedCallback(): void {
23
19
  super.connectedCallback()
@@ -25,29 +21,6 @@ export default class EmbeddedInputGroup extends EventEmitterMixin(LitElement) {
25
21
  this.initializeEigItem()
26
22
  }
27
23
 
28
- disconnectedCallback(): void {
29
- super.disconnectedCallback()
30
-
31
- this._removeButton?.then((removeButton) => {
32
- removeButton?.removeEventListener('click', (evt) => {
33
- this._removeItem(evt)
34
- })
35
- })
36
-
37
- this._title?.then((title) => {
38
- title?.removeEventListener('click', () => {
39
- this._eigToggle()
40
- })
41
-
42
- title?.removeEventListener('keydown', ({ key }) => {
43
- if (key === 'Enter' || key === 'Space' || key === ' ') {
44
- event?.preventDefault()
45
- this._eigToggle()
46
- }
47
- })
48
- })
49
- }
50
-
51
24
  private _eigToggle = () => {
52
25
  this._eigItem?.then((eigItem) => {
53
26
  if (eigItem) {
@@ -101,6 +74,9 @@ export default class EmbeddedInputGroup extends EventEmitterMixin(LitElement) {
101
74
  if (eigLiveRegion) eigLiveRegion.textContent = tooltips?.restore
102
75
  }
103
76
  }
77
+
78
+ // Fire a change event so the content-state pipeline recomputes and the live preview reflects the removed/restored item.
79
+ eigItem.dispatchEvent(new Event('change', { bubbles: true }))
104
80
  }
105
81
  })
106
82
  }
@@ -114,43 +90,36 @@ export default class EmbeddedInputGroup extends EventEmitterMixin(LitElement) {
114
90
  }
115
91
 
116
92
  initializeEigItem() {
93
+ // Register the watcher once; onFind then binds each .EIG-item's controls exactly once — on initial load, on Add, and when the item is swapped.
94
+ if (!this._watchingItems) {
95
+ this._watchingItems = true
96
+ onFind(this, '.EIG-item', (eigItem: HTMLElement) => {
97
+ const title = eigItem.querySelector<HTMLElement>('.EIG-title')
98
+ const removeButton = eigItem.querySelector<HTMLElement>('.removeButton')
99
+ this.titleAddEventListeners(title)
100
+ this.removeButtonAddEventListeners(removeButton)
101
+ })
102
+ }
103
+
104
+ // Restore the previously-collapsed state.
117
105
  this._eigItem?.then((eigItem) => {
118
106
  if (eigItem) {
119
107
  const associatedDataField = eigItem.closest<HTMLElement>('[data-field]')
120
- const itemClassList = eigItem.classList
121
- let key = null
122
108
 
123
- // Check if item is collapsed previously
124
109
  if (associatedDataField) {
125
- key = getComponentKey(associatedDataField, 'data-field')
110
+ const key = getComponentKey(associatedDataField, 'data-field')
126
111
  if (key && ls.getItem(key)) {
127
- itemClassList.add('is-collapsed')
112
+ eigItem.classList.add('is-collapsed')
128
113
  eigItem.querySelector('.CIG-large')?.setAttribute('hidden', '')
129
114
  }
130
115
  }
131
- } else {
132
- // No EIG item has been added yet (i.e., Add Module) so monitor for it.
133
- onFind(this, '.EIG-item', (eigItem: HTMLElement) => {
134
- const title = eigItem.querySelector<HTMLElement>('.EIG-title')
135
- const removeButton =
136
- eigItem.querySelector<HTMLElement>('.removeButton')
137
- this.titleAddEventListeners(title)
138
- this.removeButtonAddEventListeners(removeButton)
139
- })
140
116
  }
141
117
  })
142
-
143
- this._title?.then((title) => {
144
- this.titleAddEventListeners(title)
145
- })
146
-
147
- this._removeButton?.then((removeButton) => {
148
- this.removeButtonAddEventListeners(removeButton)
149
- })
150
118
  }
151
119
 
152
120
  titleAddEventListeners(title: HTMLElement | null) {
153
121
  if (!title) return
122
+
154
123
  title.addEventListener('click', () => {
155
124
  this._eigToggle()
156
125
  })
@@ -166,6 +135,7 @@ export default class EmbeddedInputGroup extends EventEmitterMixin(LitElement) {
166
135
 
167
136
  removeButtonAddEventListeners(removeButton: HTMLElement | null) {
168
137
  if (!removeButton) return
138
+
169
139
  const eigLiveRegion = create('span', {
170
140
  class: 'screen-reader-only',
171
141
  'aria-live': 'polite',