@brightspot/ui 6.2.0 → 6.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) 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-DgLrwInB.js → ActionBar.stories-CgkvHW27.js} +1 -1
  60. package/dist/storybook/assets/{ActionItem.stories-C-SkWFxc.js → ActionItem.stories-CyxwhrvR.js} +1 -1
  61. package/dist/storybook/assets/{AiSparkle.stories-BdwXJ4C1.js → AiSparkle.stories-h2LSw10e.js} +1 -1
  62. package/dist/storybook/assets/{Avatar.stories-BQrt8GRW.js → Avatar.stories-CQ3eFTbI.js} +1 -1
  63. package/dist/storybook/assets/{AvatarGroup.stories-BdmsYcGc.js → AvatarGroup.stories-CIyZOd7R.js} +1 -1
  64. package/dist/storybook/assets/{Badge.stories-mu4nbODQ.js → Badge.stories-CwPkYUuY.js} +1 -1
  65. package/dist/storybook/assets/{Banner.stories-DMP2OXL9.js → Banner.stories-B7AhWymc.js} +1 -1
  66. package/dist/storybook/assets/{Button-xZDsWWL_.js → Button-fLz-Mqji.js} +1 -1
  67. package/dist/storybook/assets/{Button.stories-C4jM9Bim.js → Button.stories-Bj_cB5Tr.js} +1 -1
  68. package/dist/storybook/assets/{ButtonGroup.stories-zscaMCvE.js → ButtonGroup.stories-DMAr8q3A.js} +1 -1
  69. package/dist/storybook/assets/{Card.stories-CsV1xMbI.js → Card.stories-CouVkvTr.js} +1 -1
  70. package/dist/storybook/assets/{Celebrate.stories-D2mVlrqj.js → Celebrate.stories-Cai7aITx.js} +1 -1
  71. package/dist/storybook/assets/{Checkbox.stories-CAOPfsPn.js → Checkbox.stories-BTzuHih7.js} +1 -1
  72. package/dist/storybook/assets/{CircularProgress.stories-Dj44Wy1Q.js → CircularProgress.stories-DwiMDCrW.js} +1 -1
  73. package/dist/storybook/assets/{ClipboardMixin.stories-sMr91AkY.js → ClipboardMixin.stories-BTzKKsAG.js} +1 -1
  74. package/dist/storybook/assets/{Color-6BZIO3FS-Di40DCa8.js → Color-6BZIO3FS-z5x4axZs.js} +1 -1
  75. package/dist/storybook/assets/{Colors.stories-nUklULEf.js → Colors.stories-LjQN3QJP.js} +1 -1
  76. package/dist/storybook/assets/{CombinedEffects.stories-DHteudNU.js → CombinedEffects.stories-CcWkxBPD.js} +1 -1
  77. package/dist/storybook/assets/{ComponentStatesMixin-DC5hoSCf.js → ComponentStatesMixin-6JmalSeW.js} +1 -1
  78. package/dist/storybook/assets/{ComponentStatesMixin.stories-DyZXrUfS.js → ComponentStatesMixin.stories-wr7wl9D5.js} +1 -1
  79. package/dist/storybook/assets/{CopyToClipboard.stories-DKfUIVB6.js → CopyToClipboard.stories-CBL_GlzJ.js} +1 -1
  80. package/dist/storybook/assets/{Debounce.stories-C6iPHMJ-.js → Debounce.stories-DDW0347e.js} +1 -1
  81. package/dist/storybook/assets/{DocsRenderer-LL677BLK-BC-DluPS.js → DocsRenderer-LL677BLK-LHrG4h5r.js} +3 -3
  82. package/dist/storybook/assets/{Dropdown.stories-DY3LbbOm.js → Dropdown.stories-BixGKdVC.js} +1 -1
  83. package/dist/storybook/assets/{EmptyState.stories-Ec87tfLY.js → EmptyState.stories-DYCizkT5.js} +1 -1
  84. package/dist/storybook/assets/{EscaAvatar.stories-ZaaMKZqz.js → EscaAvatar.stories-IV0FybUu.js} +1 -1
  85. package/dist/storybook/assets/{Events.stories-DaTVivNG.js → Events.stories-9X1B5LFU.js} +1 -1
  86. package/dist/storybook/assets/{Heading.stories-B6jRenfp.js → Heading.stories-BWFKyeYP.js} +1 -1
  87. package/dist/storybook/assets/{HueRipple.stories-CnDz87pe.js → HueRipple.stories-KJySD4yc.js} +1 -1
  88. package/dist/storybook/assets/{Icon.stories-DH0mXw3h.js → Icon.stories-n4-_RBwe.js} +1 -1
  89. package/dist/storybook/assets/{IconButton.stories-CNtEEf3-.js → IconButton.stories--cc9Az0q.js} +1 -1
  90. package/dist/storybook/assets/{LinearProgress.stories-B7q0qeGc.js → LinearProgress.stories-CXISMQqr.js} +1 -1
  91. package/dist/storybook/assets/{Message.stories--ArrB33R.js → Message.stories-DCgZ9H2r.js} +1 -1
  92. package/dist/storybook/assets/{OnFindMixin.stories-Bu3Et43N.js → OnFindMixin.stories-DwYEl4q4.js} +1 -1
  93. package/dist/storybook/assets/{Pagination.stories-DL3nv05u.js → Pagination.stories-B8AqV3jI.js} +1 -1
  94. package/dist/storybook/assets/{Popover.stories-C1xiMRm0.js → Popover.stories-Dj8TUysk.js} +1 -1
  95. package/dist/storybook/assets/{ReadyMixin-CkFGSiXW.js → ReadyMixin-B1y8EBLz.js} +1 -1
  96. package/dist/storybook/assets/{RovingTabindexMixin.stories-DxABagoS.js → RovingTabindexMixin.stories-BTYV78Cy.js} +1 -1
  97. package/dist/storybook/assets/{Rtc.stories-DICg80iT.js → Rtc.stories-CiQ4OgEf.js} +1 -1
  98. package/dist/storybook/assets/{ScrollShadow.stories-YSVPDcG9.js → ScrollShadow.stories-BRpbl9WU.js} +1 -1
  99. package/dist/storybook/assets/{Switch.stories-UQoRYdvu.js → Switch.stories-Dfw56-LB.js} +1 -1
  100. package/dist/storybook/assets/{Tab.stories-aO-j5FR7.js → Tab.stories-DCIPSPwr.js} +1 -1
  101. package/dist/storybook/assets/{Tabs.stories-Vh5fj_rb.js → Tabs.stories-DrT2D2oW.js} +1 -1
  102. package/dist/storybook/assets/{Throttle.stories-DqQiG8mr.js → Throttle.stories-B5Y8K9s3.js} +1 -1
  103. package/dist/storybook/assets/{Tooltip.stories-DykL06JB.js → Tooltip.stories-CUjm8cuW.js} +1 -1
  104. package/dist/storybook/assets/{Upload.stories-BunAEUlO.js → Upload.stories-Dt7V8qIe.js} +1 -1
  105. package/dist/storybook/assets/{UploadItem.stories-CNR2IKsl.js → UploadItem.stories-DSXxGs8M.js} +1 -1
  106. package/dist/storybook/assets/{Welcome.stories-DuKEOEsw.js → Welcome.stories-BDFQb8oF.js} +1 -1
  107. package/dist/storybook/assets/{Widget.stories-B5WKvF2m.js → Widget.stories-CQnE1dST.js} +1 -1
  108. package/dist/storybook/assets/{WithTooltip-65CFNBJE-KIfM6hV3.js → WithTooltip-65CFNBJE-D1OYJPzp.js} +1 -1
  109. package/dist/storybook/assets/{blocks-BJtylb2_.js → blocks-Z0quNc1U.js} +5 -5
  110. package/dist/storybook/assets/{formatter-EIJCOSYU-DyJPXrAY.js → formatter-EIJCOSYU-DwWzDvJC.js} +1 -1
  111. package/dist/storybook/assets/if-defined-Dl8MuiCE.js +1 -0
  112. package/dist/storybook/assets/{iframe-BoW1X7a_.js → iframe-WTEmYHJj.js} +4 -4
  113. package/dist/storybook/assets/{index-9YgpSjWr.js → index-BvPCa7_B.js} +1 -1
  114. package/dist/storybook/assets/{onFind-BWxYoVUv.js → onFind-CqIRRMTv.js} +1 -1
  115. package/dist/storybook/assets/{onFind.stories-30rdWtPx.js → onFind.stories-C4PPQTaQ.js} +1 -1
  116. package/dist/storybook/assets/{onRemove.stories-B7qKCwA-.js → onRemove.stories-BGFCh6DN.js} +1 -1
  117. package/dist/storybook/assets/{onVisible.stories-_lsloFGV.js → onVisible.stories-4ni7syfJ.js} +1 -1
  118. package/dist/storybook/assets/{style-map-D7rS_uYZ.js → style-map-BhvFBtuB.js} +1 -1
  119. package/dist/storybook/assets/{syntaxhighlighter-ED5Y7EFY-mLC5--p6.js → syntaxhighlighter-ED5Y7EFY-D_cJwnoJ.js} +1 -1
  120. package/dist/storybook/iframe.html +1 -1
  121. package/dist/storybook/project.json +1 -1
  122. package/package.json +4 -1
  123. package/src/legacy/tool-ui/src/CodeMirror.css +9 -9
  124. package/src/legacy/tool-ui/src/ComboInput.css +4 -0
  125. package/src/legacy/tool-ui/src/Compat.css +5 -0
  126. package/src/legacy/tool-ui/src/ContentEdit.css +2 -1
  127. package/src/legacy/tool-ui/src/ContentInputGroup.css +4 -6
  128. package/src/legacy/tool-ui/src/Dialog.css +83 -26
  129. package/src/legacy/tool-ui/src/FileInput.css +1 -1
  130. package/src/legacy/tool-ui/src/Global.d.ts +2 -0
  131. package/src/legacy/tool-ui/src/ImageEditor.css +1 -1
  132. package/src/legacy/tool-ui/src/MenuView.css +10 -5
  133. package/src/legacy/tool-ui/src/Page.css +29 -6
  134. package/src/legacy/tool-ui/src/Popup.css +18 -1
  135. package/src/legacy/tool-ui/src/Revisions.css +6 -2
  136. package/src/legacy/tool-ui/src/SearchWidgetAdvanced.css +4 -13
  137. package/src/legacy/tool-ui/src/dialog/index.ts +10 -18
  138. package/src/legacy/tool-ui/src/main/webapp/dist/5598.315afb3723a27880f87c.js +2 -0
  139. package/src/legacy/tool-ui/src/main/webapp/dist/6086.82620005e5673191c44f.js +1 -0
  140. package/src/legacy/tool-ui/src/main/webapp/dist/{RTEProseMirror.fffd76fefb194ae6889b.js → RTEProseMirror.c51a5594e0f150018284.js} +7 -7
  141. package/src/legacy/tool-ui/src/main/webapp/dist/v4.05d6a78ae435b930dd53.css +3 -0
  142. package/src/legacy/tool-ui/src/main/webapp/dist/{v4.59ef78c7444a26d2fc6e.js → v4.d6a6409510307d938253.js} +4 -4
  143. package/src/legacy/tool-ui/src/main/webapp/dist/{v5.81bcf80e29f5d0b03f40.js → v5.ccf9a17a04d333b8bbce.js} +4 -4
  144. package/src/legacy/tool-ui/src/main/webapp/dist/v5.e1e83f5e0cd06ad0280c.css +5 -0
  145. package/src/legacy/tool-ui/src/main/webapp/v4/ComboInput.less +7 -0
  146. package/src/legacy/tool-ui/src/theme/Theme.ts +28 -0
  147. package/src/legacy/tool-ui/src/v5.ts +14 -7
  148. package/dist/storybook/assets/if-defined-DELMnuB4.js +0 -1
  149. package/src/legacy/tool-ui/src/main/webapp/dist/011a678e3efe41981754.png +0 -1
  150. package/src/legacy/tool-ui/src/main/webapp/dist/194137260531ee29a5f2.svg +0 -1
  151. package/src/legacy/tool-ui/src/main/webapp/dist/1e8408af1a34bdf61457.png +0 -1
  152. package/src/legacy/tool-ui/src/main/webapp/dist/44b38a404dec4643c46b.png +0 -1
  153. package/src/legacy/tool-ui/src/main/webapp/dist/4a4ee777ddc0d4cedee4.png +0 -1
  154. package/src/legacy/tool-ui/src/main/webapp/dist/5598.d84773ca53126661bdca.js +0 -2
  155. package/src/legacy/tool-ui/src/main/webapp/dist/6086.7ca02b827506f29db590.js +0 -1
  156. package/src/legacy/tool-ui/src/main/webapp/dist/c6e9c007f41bd4d26c20.png +0 -1
  157. package/src/legacy/tool-ui/src/main/webapp/dist/v4.b1e9f6ac0449331711fc.css +0 -3
  158. package/src/legacy/tool-ui/src/main/webapp/dist/v5.b8a1f40b189e4537117d.css +0 -5
  159. /package/src/legacy/tool-ui/src/main/webapp/dist/{5598.d84773ca53126661bdca.js.LICENSE.txt → 5598.315afb3723a27880f87c.js.LICENSE.txt} +0 -0
  160. /package/src/legacy/tool-ui/src/main/webapp/dist/{RTEProseMirror.fffd76fefb194ae6889b.js.LICENSE.txt → RTEProseMirror.c51a5594e0f150018284.js.LICENSE.txt} +0 -0
  161. /package/src/legacy/tool-ui/src/main/webapp/dist/{v4.59ef78c7444a26d2fc6e.js.LICENSE.txt → v4.d6a6409510307d938253.js.LICENSE.txt} +0 -0
  162. /package/src/legacy/tool-ui/src/main/webapp/dist/{v5.81bcf80e29f5d0b03f40.js.LICENSE.txt → v5.ccf9a17a04d333b8bbce.js.LICENSE.txt} +0 -0
@@ -1,5 +1,5 @@
1
1
  .CodeMirror {
2
- @apply h-auto rounded-lg border border-gray-300 bg-white !text-gray-900 transition hover:bg-gray-100;
2
+ @apply h-auto rounded-lg border border-gray-300 !bg-white !text-gray-900 transition hover:!bg-gray-100;
3
3
 
4
4
  /*
5
5
  Bound :has() invalidation. CM mutates inner DOM per keystroke; without
@@ -16,11 +16,11 @@
16
16
 
17
17
  .CodeMirror-scrollbar-filler,
18
18
  .CodeMirror-gutter-filler {
19
- @apply bg-white;
19
+ @apply !bg-white;
20
20
  }
21
21
 
22
22
  .CodeMirror-gutters {
23
- @apply border-e-gray-300 bg-gray-50;
23
+ @apply !border-e-gray-300 !bg-gray-50;
24
24
  }
25
25
 
26
26
  .CodeMirror-linenumber {
@@ -28,23 +28,23 @@
28
28
  }
29
29
 
30
30
  .CodeMirror-guttermarker {
31
- @apply text-gray-900;
31
+ @apply !text-gray-900;
32
32
  }
33
33
 
34
34
  .CodeMirror-guttermarker-subtle {
35
- @apply text-gray-500;
35
+ @apply !text-gray-500;
36
36
  }
37
37
 
38
38
  .CodeMirror-cursor {
39
- @apply border-s-[2px] border-s-primary-600;
39
+ @apply !border-s-[2px] !border-s-primary-600;
40
40
  }
41
41
 
42
42
  .CodeMirror div.CodeMirror-secondarycursor {
43
- @apply border-s-gray-200;
43
+ @apply !border-s-gray-200;
44
44
  }
45
45
 
46
46
  .cm-fat-cursor .CodeMirror-cursor {
47
- @apply bg-success-200;
47
+ @apply !bg-success-200;
48
48
  }
49
49
 
50
50
  .cm-fat-cursor-mark {
@@ -56,7 +56,7 @@
56
56
  }
57
57
 
58
58
  .CodeMirror-ruler {
59
- @apply border-s-gray-200;
59
+ @apply !border-s-gray-200;
60
60
  }
61
61
 
62
62
  .cm-s-default .cm-header {
@@ -143,6 +143,10 @@
143
143
  @apply hidden;
144
144
  }
145
145
 
146
+ .ComboInput-empty {
147
+ @apply px-4 py-2 text-sm text-gray-500;
148
+ }
149
+
146
150
  /* Caps height of uninitialized ComboInputs */
147
151
  select {
148
152
  @apply max-h-[2.25rem];
@@ -385,6 +385,11 @@ suggests. Example use case "pin" icon button in live blog posts */
385
385
  }
386
386
  }
387
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
+
388
393
  /* v4 things which shouldn't appear in v5 */
389
394
  .v4-only {
390
395
  @apply hidden;
@@ -367,8 +367,9 @@
367
367
  @apply !blokk;
368
368
  }
369
369
 
370
+ /* Hug the device width (plus borders) when it fits so the iframe renders unscaled. */
370
371
  & .PreviewFrame-typeDisplay {
371
- @apply [grid-area:preview] [grid-column:container-start/container-end];
372
+ @apply w-[min(100%,calc(var(--ContentEdit-previewWidth,100%)_+_2px))] justify-self-center [grid-area:preview] [grid-column:container-start/container-end];
372
373
  }
373
374
 
374
375
  & .PreviewFrame-typeControls .ComboInput:not(:has(~ .ComboInput)) {
@@ -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;
@@ -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
 
@@ -1,5 +1,5 @@
1
1
  .FileInput {
2
- @apply relative flex cursor-pointer flex-col items-center gap-3 rounded-lg border border-gray-300 px-6 py-4 before:btu-icon before:btu-icon-upload before:rounded-full before:bg-gray-100 before:p-2 before:text-primary-700 after:text-sm after:font-semibold after:text-primary-700 after:[content:attr(data-choose)] hover:border-gray-300 hover:bg-gray-100 hover:before:bg-gray-200 hover:before:text-gray-700 hover:after:underline hover:after:[content:attr(data-choose)];
2
+ @apply relative flex max-w-[540px] cursor-pointer flex-col items-center gap-3 rounded-lg border border-gray-300 px-6 py-4 before:btu-icon before:btu-icon-upload before:rounded-full before:bg-gray-100 before:p-2 before:text-primary-700 after:text-sm after:font-semibold after:text-primary-700 after:[content:attr(data-choose)] hover:border-gray-300 hover:bg-gray-100 hover:before:bg-gray-200 hover:before:text-gray-700 hover:after:underline hover:after:[content:attr(data-choose)];
3
3
 
4
4
  input[type='file'] {
5
5
  @apply absolute bottom-0 left-0 right-0 top-0 cursor-pointer border-0 p-0 opacity-0;
@@ -77,6 +77,8 @@ declare global {
77
77
  combo: {
78
78
  empty: string
79
79
  multi: string
80
+ noMatches: string
81
+ noOptions: string
80
82
  }
81
83
  createNew: string
82
84
  multiSort: string
@@ -79,7 +79,7 @@
79
79
  .is-imagePreview {
80
80
  --icon-button-w: 37px;
81
81
 
82
- @apply relative grid max-w-[calc(360px-theme(spacing.8))] items-center overflow-hidden [grid-template-areas:'preview_preview_preview''groups_open_edit''message_message_message'] [grid-template-columns:calc(100%-var(--icon-button-w)*2)_auto_auto] before:relative before:h-full before:rounded-t-lg before:border before:border-b-0 before:border-gray-300 before:[grid-area:preview];
82
+ @apply relative w-fit grid items-center overflow-hidden [grid-template-areas:'preview_preview_preview''groups_open_edit''message_message_message'] [grid-template-columns:calc(100%-var(--icon-button-w)*2)_auto_auto] before:relative before:h-full before:rounded-t-lg before:border before:border-b-0 before:border-gray-300 before:[grid-area:preview];
83
83
  }
84
84
 
85
85
  .ImageEditor-editToggle,
@@ -44,12 +44,17 @@
44
44
 
45
45
  /* SUBMENUS */
46
46
  .rte2-toolbar-submenu-2 {
47
- &:not(
48
- [data-rte-toolbar-submenu='Format'],
49
- [data-rte-toolbar-submenu='Embed'],
50
- [data-rte-toolbar-submenu='Substitutions']
47
+ /* Only these render an icon (or a bare chevron) instead of their name, so only these
48
+ can afford to collapse the label. Every other submenu name reaches the DOM verbatim
49
+ from @RichTextElement.Tag(menu = ...) and has no icon, so hiding it leaves nothing.
50
+ :is() rather than :where() to keep the specificity the sibling rule below assumes. */
51
+ &:is(
52
+ [data-rte-toolbar-submenu='Style'],
53
+ [data-rte-toolbar-submenu='Align'],
54
+ [data-rte-toolbar-submenu='Enhancements']
51
55
  )
52
- > button {
56
+ > button,
57
+ &.rte-overflow-btn > button {
53
58
  @apply btu-button-text-hidden;
54
59
  }
55
60
 
@@ -161,11 +161,12 @@
161
161
 
162
162
  > a {
163
163
  @apply grid auto-cols-[0px] grid-flow-col grid-cols-[max-content] items-center justify-center rounded-lg text-[0] @[80px]:grid-cols-[max-content_minmax(0,1fr)_max-content] max-md:grow;
164
+ }
164
165
 
165
- /* Displays site name if site switcher is missing (e.g. user has access to only 1 site) */
166
- .Page-siteName {
167
- @apply hidden @[80px]:col-[2/3] @[80px]:line-clamp-1 @[80px]:blokk @[80px]:truncate @[80px]:px-2 @[80px]:text-sm;
168
- }
166
+ /* Displays site name when no site switcher is present; at .Page-title level (not nested under
167
+ > a) because v5.ts moves .toolUserSite into .Page-title as a sibling of > a */
168
+ .Page-siteName {
169
+ @apply hidden @[80px]:col-[2/3] @[80px]:line-clamp-1 @[80px]:blokk @[80px]:truncate @[80px]:px-2 @[80px]:text-sm;
169
170
  }
170
171
 
171
172
  > a:hover a[target='siteSwitch'] {
@@ -232,8 +233,30 @@
232
233
  }
233
234
 
234
235
  .Page-header {
235
- @apply flex w-full items-center justify-end overflow-hidden border-b bg-white p-4 text-gray-700 max-md:gap-4 md:h-[var(--page-header-h)] md:flex-nowrap md:@container/page-header;
236
+ @apply flex w-full items-center justify-end overflow-hidden border-b p-4 text-[var(--Page-header-fg,theme(colors.gray.700))] max-md:gap-4 md:h-[var(--page-header-h)] md:flex-nowrap md:@container/page-header;
236
237
  grid-area: header;
238
+ /* Defaults to the original `bg-white` token; overridden by the V5 custom header color. */
239
+ background-color: var(--Page-header-bg, var(--btu-theme-white));
240
+ /*
241
+ srgb-linear (not oklch) so r/g/b are linear-light and 0.2126r+0.7152g+0.0722b is true WCAG
242
+ luminance — the black/white flip is then correct at any saturation. 0.198 is the white↔#171717
243
+ (≈linear 0.0086) crossover; *100000 makes the clamp a hard step. Unset --Page-header-bg makes
244
+ this invalid on purpose, so .Page-header falls back to gray-700. Needs relative-color syntax:
245
+ Chrome 119 / Safari 16.4 / Firefox 128.
246
+ */
247
+ --Page-header-fg: color(from var(--Page-header-bg) srgb-linear
248
+ clamp(0.0086, (0.198 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) * 100000, 1)
249
+ clamp(0.0086, (0.198 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) * 100000, 1)
250
+ clamp(0.0086, (0.198 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) * 100000, 1));
251
+ }
252
+
253
+ /*
254
+ currentColor so the icons follow the header's derived fg (gray-700 by default). Kept a low-
255
+ specificity element selector on purpose: the button component's per-state hover/pressed tokens
256
+ must still win over this rest-state override.
257
+ */
258
+ .Page-header button {
259
+ --button-fill-none-text-color: currentColor;
237
260
  }
238
261
 
239
262
  .Page-header > * {
@@ -901,7 +924,7 @@
901
924
  }
902
925
 
903
926
  .Page-create .ComboInput-label {
904
- --button-border-radius: 50%;
927
+ --button-border-radius: .5rem;
905
928
  @apply btu-button btu-button-text-hidden btu-button-fill-none btu-button-gray before:btu-icon before:btu-icon-plus;
906
929
  }
907
930
 
@@ -335,10 +335,27 @@
335
335
  }
336
336
 
337
337
  .Popup[name^='conversation-'],
338
- .Popup[name='toolUserSaveSearch'] {
338
+ .Popup[name='toolUserSaveSearch'],
339
+ .Popup[name='contentReportingStatus'],
340
+ .Popup.is-contentReportingStatus {
339
341
  @apply [--popup-h:auto];
340
342
  }
341
343
 
344
+ /* Report status download bar and form fields sit directly in the frame
345
+ (outside a Widget grid), so they need their own inset. The is-* class covers
346
+ the same page opened through the Past Report Results view popup, which uses
347
+ a generic objectId-edit frame (marked by ContentReporting.js). */
348
+ .Popup[name='contentReportingStatus'] .frame,
349
+ .Popup.is-contentReportingStatus .frame {
350
+ > .ContentReporting-status {
351
+ @apply pt-6;
352
+ }
353
+
354
+ > .CIG {
355
+ @apply px-6 pb-6;
356
+ }
357
+ }
358
+
342
359
  /* Available schedules popup */
343
360
  .frame[name='scheduleList'] {
344
361
  ul {
@@ -239,11 +239,15 @@
239
239
  }
240
240
 
241
241
  .Revisions-workflowTransition .Revisions-userLabel {
242
- @apply text-xs font-medium text-gray-500;
242
+ @apply inline;
243
+ }
244
+
245
+ .Revisions-workflowTransition .Revisions-userLabel::before {
246
+ @apply content-['_'];
243
247
  }
244
248
 
245
249
  .Revisions-workflowTransition .Revisions-userLabel > span {
246
- @apply me-0.5 min-w-max;
250
+ @apply me-0.5;
247
251
  }
248
252
 
249
253
  .Revisions-workflowComment {
@@ -1,17 +1,8 @@
1
- /*
2
- * Dialog.css assigns grid-template-rows: subgrid to all .has-ActionBarContent elements
3
- * via a deeply-nested selector at specificity (0,4,1). The Advanced Query Builder form
4
- * needs its own 4-row grid (header | scrollpane | 1fr spacer | ActionBar), so !important
5
- * is the only way to override it from outside Dialog.css.
6
- */
7
- .SearchWidgetAdvanced > form.has-ActionBarContent {
8
- grid-template-rows: min-content min-content 1fr min-content !important;
9
- align-items: stretch;
10
- height: 100%;
11
- }
12
-
13
1
  .SearchWidgetAdvanced > form {
14
- @apply pt-6;
2
+ /* 4-row grid: header | scrollpane | 1fr spacer | ActionBar. Columns come
3
+ from the Widget grid; Dialog.css exempts this widget from its popup
4
+ column layout so the grid here stays in charge. */
5
+ @apply col-[fullbleed-start/fullbleed-end] grid h-full grid-cols-subgrid items-stretch pt-6 [grid-template-rows:min-content_min-content_1fr_min-content];
15
6
 
16
7
  /* Explicit row assignments for the 4-row grid above.
17
8
  * Row 1: header (ComboInput + add button side by side)
@@ -308,14 +308,23 @@ export default class Dialog extends ComponentStatesMixin(
308
308
 
309
309
  popupContent.classList.add('has-ActionBar')
310
310
 
311
- // Mark ancestors of ActionBars that have substantive content
312
311
  actionBars.forEach((actionBar) => {
312
+ // Mark ancestors of ActionBars that have substantive content
313
313
  const hasContent = actionBar.querySelector(
314
314
  ':scope > *:not(.ImageEditor-closeButton)',
315
315
  )
316
316
  if (hasContent) {
317
317
  this._markAncestors(actionBar, 'has-ActionBarContent', popupContent)
318
318
  }
319
+
320
+ // Mark the element immediately before an ActionBar
321
+ const previous = actionBar.previousElementSibling
322
+ const isPrePublishScrollable =
323
+ previous?.classList.contains('fixedScrollable') &&
324
+ previous.closest('.Widget.PrePublish')
325
+ if (previous && !isPrePublishScrollable) {
326
+ previous.classList.add('before-ActionBar')
327
+ }
319
328
  })
320
329
 
321
330
  // Mark ancestors of status messages
@@ -326,23 +335,6 @@ export default class Dialog extends ComponentStatesMixin(
326
335
  messages.forEach((message) => {
327
336
  this._markAncestors(message, 'has-StatusMessage', dialog)
328
337
  })
329
-
330
- // Mark elements that appear immediately before an ActionBar
331
- const candidates = this._findInScope(
332
- scope,
333
- 'form, .TC, .AIChat-wrapper, .fixedScrollable',
334
- )
335
- candidates.forEach((element) => {
336
- const isBeforeActionBar =
337
- element.nextElementSibling?.classList.contains('ActionBar')
338
- const isPrePublishScrollable =
339
- element.classList.contains('fixedScrollable') &&
340
- element.closest('.Widget.PrePublish')
341
-
342
- if (isBeforeActionBar && !isPrePublishScrollable) {
343
- element.classList.add('before-ActionBar')
344
- }
345
- })
346
338
  }
347
339
 
348
340
  private async _handleClose(e?: Event): Promise<void> {