@frontify/guideline-blocks-settings 0.32.1 → 0.33.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 (100) hide show
  1. package/CHANGELOG.md +147 -0
  2. package/dist/components/Attachments/AttachmentItem.es.js +128 -109
  3. package/dist/components/Attachments/AttachmentItem.es.js.map +1 -1
  4. package/dist/components/Attachments/Attachments.es.js +9 -1
  5. package/dist/components/Attachments/Attachments.es.js.map +1 -1
  6. package/dist/components/Attachments/AttachmentsButtonTrigger.es.js +17 -9
  7. package/dist/components/Attachments/AttachmentsButtonTrigger.es.js.map +1 -1
  8. package/dist/components/BlockItemWrapper/BlockItemWrapper.es.js +38 -44
  9. package/dist/components/BlockItemWrapper/BlockItemWrapper.es.js.map +1 -1
  10. package/dist/components/BlockItemWrapper/Toolbar/AttachmentsToolbarButton/AttachmentsToolbarButton.es.js +33 -0
  11. package/dist/components/BlockItemWrapper/Toolbar/AttachmentsToolbarButton/AttachmentsToolbarButton.es.js.map +1 -0
  12. package/dist/components/BlockItemWrapper/Toolbar/AttachmentsToolbarButton/AttachmentsToolbarButtonTrigger.es.js +26 -0
  13. package/dist/components/BlockItemWrapper/Toolbar/AttachmentsToolbarButton/AttachmentsToolbarButtonTrigger.es.js.map +1 -0
  14. package/dist/components/BlockItemWrapper/Toolbar/BaseToolbarButton.es.js +28 -0
  15. package/dist/components/BlockItemWrapper/Toolbar/BaseToolbarButton.es.js.map +1 -0
  16. package/dist/components/BlockItemWrapper/Toolbar/DragHandleToolbarButton/DragHandleToolbarButton.es.js +35 -0
  17. package/dist/components/BlockItemWrapper/Toolbar/DragHandleToolbarButton/DragHandleToolbarButton.es.js.map +1 -0
  18. package/dist/components/BlockItemWrapper/Toolbar/FlyoutToolbarButton/FlyoutToolbarButton.es.js +44 -0
  19. package/dist/components/BlockItemWrapper/Toolbar/FlyoutToolbarButton/FlyoutToolbarButton.es.js.map +1 -0
  20. package/dist/components/BlockItemWrapper/Toolbar/MenuToolbarButton/MenuToolbarButton.es.js +25 -0
  21. package/dist/components/BlockItemWrapper/Toolbar/MenuToolbarButton/MenuToolbarButton.es.js.map +1 -0
  22. package/dist/components/BlockItemWrapper/Toolbar/MenuToolbarButton/ToolbarFlyoutMenu.es.js +29 -0
  23. package/dist/components/BlockItemWrapper/Toolbar/MenuToolbarButton/ToolbarFlyoutMenu.es.js.map +1 -0
  24. package/dist/components/BlockItemWrapper/Toolbar/Toolbar.es.js +11 -112
  25. package/dist/components/BlockItemWrapper/Toolbar/Toolbar.es.js.map +1 -1
  26. package/dist/components/BlockItemWrapper/Toolbar/ToolbarButton/ToolbarButton.es.js +12 -0
  27. package/dist/components/BlockItemWrapper/Toolbar/ToolbarButton/ToolbarButton.es.js.map +1 -0
  28. package/dist/components/BlockItemWrapper/Toolbar/ToolbarButtonTooltip.es.js +20 -0
  29. package/dist/components/BlockItemWrapper/Toolbar/ToolbarButtonTooltip.es.js.map +1 -0
  30. package/dist/components/BlockItemWrapper/Toolbar/context/DragPreviewContext.es.js +11 -0
  31. package/dist/components/BlockItemWrapper/Toolbar/context/DragPreviewContext.es.js.map +1 -0
  32. package/dist/components/BlockItemWrapper/Toolbar/context/MultiFlyoutContext.es.js +18 -0
  33. package/dist/components/BlockItemWrapper/Toolbar/context/MultiFlyoutContext.es.js.map +1 -0
  34. package/dist/components/BlockItemWrapper/Toolbar/helpers.es.js +1 -1
  35. package/dist/components/BlockItemWrapper/Toolbar/helpers.es.js.map +1 -1
  36. package/dist/components/BlockItemWrapper/Toolbar/hooks/useMultiFlyoutState.es.js +18 -0
  37. package/dist/components/BlockItemWrapper/Toolbar/hooks/useMultiFlyoutState.es.js.map +1 -0
  38. package/dist/helpers/mapColorPalettes.es.js +20 -8
  39. package/dist/helpers/mapColorPalettes.es.js.map +1 -1
  40. package/dist/index.cjs.js +3 -3
  41. package/dist/index.cjs.js.map +1 -1
  42. package/dist/index.d.ts +92 -27
  43. package/dist/index.es.js +205 -187
  44. package/dist/index.es.js.map +1 -1
  45. package/dist/index.umd.js +3 -3
  46. package/dist/index.umd.js.map +1 -1
  47. package/dist/styles.css +1 -1
  48. package/package.json +4 -2
  49. package/setupTests.ts +7 -2
  50. package/src/components/Attachments/AttachmentItem.tsx +21 -0
  51. package/src/components/Attachments/Attachments.spec.ct.tsx +20 -1
  52. package/src/components/Attachments/Attachments.tsx +8 -4
  53. package/src/components/Attachments/AttachmentsButtonTrigger.tsx +11 -3
  54. package/src/components/Attachments/types.ts +4 -2
  55. package/src/components/BlockItemWrapper/BlockItemWrapper.spec.ct.tsx +37 -38
  56. package/src/components/BlockItemWrapper/BlockItemWrapper.tsx +44 -48
  57. package/src/components/BlockItemWrapper/Toolbar/AttachmentsToolbarButton/AttachmentsToolbarButton.spec.tsx +96 -0
  58. package/src/components/BlockItemWrapper/Toolbar/AttachmentsToolbarButton/AttachmentsToolbarButton.tsx +42 -0
  59. package/src/components/BlockItemWrapper/Toolbar/AttachmentsToolbarButton/AttachmentsToolbarButtonTrigger.spec.tsx +44 -0
  60. package/src/components/BlockItemWrapper/Toolbar/AttachmentsToolbarButton/AttachmentsToolbarButtonTrigger.tsx +24 -0
  61. package/src/components/BlockItemWrapper/Toolbar/AttachmentsToolbarButton/index.ts +3 -0
  62. package/src/components/BlockItemWrapper/Toolbar/BaseToolbarButton.spec.tsx +40 -0
  63. package/src/components/BlockItemWrapper/Toolbar/BaseToolbarButton.tsx +37 -0
  64. package/src/components/BlockItemWrapper/Toolbar/DragHandleToolbarButton/DragHandleToolbarButton.spec.tsx +89 -0
  65. package/src/components/BlockItemWrapper/Toolbar/DragHandleToolbarButton/DragHandleToolbarButton.tsx +40 -0
  66. package/src/components/BlockItemWrapper/Toolbar/DragHandleToolbarButton/index.ts +3 -0
  67. package/src/components/BlockItemWrapper/Toolbar/FlyoutToolbarButton/FlyoutToolbarButton.spec.tsx +140 -0
  68. package/src/components/BlockItemWrapper/Toolbar/FlyoutToolbarButton/FlyoutToolbarButton.tsx +61 -0
  69. package/src/components/BlockItemWrapper/Toolbar/FlyoutToolbarButton/index.ts +3 -0
  70. package/src/components/BlockItemWrapper/Toolbar/MenuToolbarButton/MenuToolbarButton.spec.tsx +77 -0
  71. package/src/components/BlockItemWrapper/Toolbar/MenuToolbarButton/MenuToolbarButton.tsx +30 -0
  72. package/src/components/BlockItemWrapper/Toolbar/MenuToolbarButton/ToolbarFlyoutMenu.spec.tsx +63 -0
  73. package/src/components/BlockItemWrapper/Toolbar/MenuToolbarButton/ToolbarFlyoutMenu.tsx +40 -0
  74. package/src/components/BlockItemWrapper/Toolbar/MenuToolbarButton/index.ts +3 -0
  75. package/src/components/BlockItemWrapper/Toolbar/Toolbar.spec.tsx +189 -57
  76. package/src/components/BlockItemWrapper/Toolbar/Toolbar.tsx +29 -126
  77. package/src/components/BlockItemWrapper/Toolbar/ToolbarButton/ToolbarButton.spec.tsx +70 -0
  78. package/src/components/BlockItemWrapper/Toolbar/ToolbarButton/ToolbarButton.tsx +19 -0
  79. package/src/components/BlockItemWrapper/Toolbar/ToolbarButton/index.ts +3 -0
  80. package/src/components/BlockItemWrapper/Toolbar/ToolbarButtonTooltip.tsx +25 -0
  81. package/src/components/BlockItemWrapper/Toolbar/context/DragPreviewContext.tsx +15 -0
  82. package/src/components/BlockItemWrapper/Toolbar/context/MultiFlyoutContext.tsx +25 -0
  83. package/src/components/BlockItemWrapper/Toolbar/context/index.ts +4 -0
  84. package/src/components/BlockItemWrapper/Toolbar/helpers.ts +1 -1
  85. package/src/components/BlockItemWrapper/Toolbar/hooks/index.ts +3 -0
  86. package/src/components/BlockItemWrapper/Toolbar/hooks/useMultiFlyoutState.spec.tsx +59 -0
  87. package/src/components/BlockItemWrapper/Toolbar/hooks/useMultiFlyoutState.ts +24 -0
  88. package/src/components/BlockItemWrapper/Toolbar/index.ts +6 -0
  89. package/src/components/BlockItemWrapper/Toolbar/types.ts +10 -30
  90. package/src/components/BlockItemWrapper/types.ts +1 -2
  91. package/src/helpers/mapColorPalettes.spec.ts +14 -113
  92. package/src/helpers/mapColorPalettes.ts +51 -8
  93. package/src/hooks/useAttachments.spec.tsx +1 -0
  94. package/tsconfig.json +1 -1
  95. package/dist/components/BlockItemWrapper/Toolbar/ToolbarAttachments.es.js +0 -27
  96. package/dist/components/BlockItemWrapper/Toolbar/ToolbarAttachments.es.js.map +0 -1
  97. package/dist/components/BlockItemWrapper/Toolbar/ToolbarAttachmentsTrigger.es.js +0 -12
  98. package/dist/components/BlockItemWrapper/Toolbar/ToolbarAttachmentsTrigger.es.js.map +0 -1
  99. package/src/components/BlockItemWrapper/Toolbar/ToolbarAttachments.tsx +0 -29
  100. package/src/components/BlockItemWrapper/Toolbar/ToolbarAttachmentsTrigger.tsx +0 -14
package/dist/styles.css CHANGED
@@ -1 +1 @@
1
- *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(147 197 253 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(147 197 253 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.tw-pointer-events-none{pointer-events:none}.tw-pointer-events-auto{pointer-events:auto}.tw-absolute{position:absolute}.tw-relative{position:relative}.tw-bottom-\[calc\(100\%-4px\)\]{bottom:calc(100% - 4px)}.tw-left-0{left:0}.tw-right-\[-3px\]{right:-3px}.tw-top-full{top:100%}.tw-isolate{isolation:isolate}.tw-z-20{z-index:20}.tw-z-\[60\]{z-index:60}.tw-m-0{margin:0}.tw-my-4{margin-top:1rem;margin-bottom:1rem}.-tw-mr-2{margin-right:-.5rem}.tw-mr-2{margin-right:.5rem}.tw-mt-1{margin-top:.25rem}.tw-mt-3{margin-top:.75rem}.tw-mt-5{margin-top:1.25rem}.tw-mt-8{margin-top:2rem}.tw-flex{display:flex}.tw-inline-flex{display:inline-flex}.tw-h-0{height:0px}.tw-h-10{height:2.5rem}.tw-h-6{height:1.5rem}.tw-h-8{height:2rem}.tw-h-\[26px\]{height:26px}.tw-h-\[72px\]{height:72px}.tw-h-full{height:100%}.tw-min-h-\[10px\]{min-height:10px}.tw-w-0{width:0px}.tw-w-8{width:2rem}.tw-w-\[300px\]{width:300px}.tw-w-fit{width:-moz-fit-content;width:fit-content}.tw-w-full{width:100%}.tw-min-w-0{min-width:0px}.tw-min-w-\[400px\]{min-width:400px}.tw-flex-1{flex:1 1 0%}.tw-flex-auto{flex:1 1 auto}.tw-flex-none{flex:none}.tw-flex-shrink-0{flex-shrink:0}.tw-rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes tw-pulse{50%{opacity:.5}}.tw-animate-pulse{animation:tw-pulse 2s cubic-bezier(.4,0,.6,1) infinite}.\!tw-cursor-not-allowed{cursor:not-allowed!important}.tw-cursor-grab{cursor:grab}.tw-cursor-grabbing{cursor:grabbing}.tw-cursor-pointer{cursor:pointer}.tw-flex-col{flex-direction:column}.tw-items-start{align-items:flex-start}.tw-items-center{align-items:center}.tw-justify-end{justify-content:flex-end}.tw-justify-center{justify-content:center}.tw-justify-between{justify-content:space-between}.tw-gap-0{gap:0px}.tw-gap-0\.5{gap:.125rem}.tw-gap-1{gap:.25rem}.tw-gap-2{gap:.5rem}.tw-gap-3{gap:.75rem}.tw-gap-px{gap:1px}.tw-gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.tw-space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.25rem * var(--tw-space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--tw-space-x-reverse)))}.tw-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.tw-divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse: 0;border-right-width:calc(var(--line-width) * var(--tw-divide-x-reverse));border-left-width:calc(var(--line-width) * calc(1 - var(--tw-divide-x-reverse)))}.tw-divide-line-strong>:not([hidden])~:not([hidden]){border-color:var(--line-color-strong)}.tw-self-start{align-self:flex-start}.tw-overflow-hidden{overflow:hidden}.tw-overflow-y-auto{overflow-y:auto}.tw-text-ellipsis{text-overflow:ellipsis}.tw-whitespace-nowrap{white-space:nowrap}.tw-whitespace-pre-wrap{white-space:pre-wrap}.tw-rounded{border-radius:var(--radius)}.tw-rounded-full{border-radius:9999px}.tw-rounded-md{border-radius:.375rem}.tw-rounded-sm{border-radius:.125rem}.tw-border{border-width:var(--line-width)}.tw-border-b{border-bottom-width:var(--line-width)}.tw-border-b-4{border-bottom-width:4px}.tw-border-l-4{border-left-width:4px}.tw-border-t{border-top-width:var(--line-width)}.tw-border-t-4{border-top-width:4px}.tw-border-solid{border-style:solid}.tw-border-dashed{border-style:dashed}.\!tw-border-red-50{--tw-border-opacity: 1 !important;border-color:rgb(255 128 102 / var(--tw-border-opacity))!important}.tw-border-blank-state-line{--tw-border-opacity: 1;border-color:rgb(163 165 165 / var(--tw-border-opacity))}.tw-border-blank-state-line-hover{--tw-border-opacity: 1;border-color:rgb(26 28 28 / var(--tw-border-opacity))}.tw-border-line-strong{border-color:var(--line-color-strong)}.tw-border-b-line{border-bottom-color:var(--line-color)}.tw-border-b-transparent{border-bottom-color:transparent}.tw-border-t-black-10{--tw-border-opacity: 1;border-top-color:rgb(234 235 235 / var(--tw-border-opacity))}.tw-border-t-transparent{border-top-color:transparent}.tw-bg-base{background-color:var(--base-color)}.tw-bg-base-alt{background-color:var(--base-color-alt)}.tw-bg-blank-state-pressed-inverse{--tw-bg-opacity: 1;background-color:rgb(241 241 241 / var(--tw-bg-opacity))}.tw-bg-blank-state-shaded-inverse{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity))}.tw-bg-blank-state-weak-inverse{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.tw-bg-box-neutral-hover{background-color:var(--box-neutral-color-hover)}.tw-bg-box-neutral-pressed{background-color:var(--box-neutral-color-pressed)}.tw-bg-box-neutral-strong-inverse{background-color:var(--box-neutral-strong-inverse-color)}.tw-bg-box-selected-strong{background-color:var(--box-selected-strong-color)}.tw-bg-red-50{--tw-bg-opacity: 1;background-color:rgb(255 128 102 / var(--tw-bg-opacity))}.tw-bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.tw-p-1{padding:.25rem}.tw-p-1\.5{padding:.375rem}.tw-p-2{padding:.5rem}.tw-p-4{padding:1rem}.tw-p-7{padding:1.75rem}.tw-px-0{padding-left:0;padding-right:0}.tw-px-2{padding-left:.5rem;padding-right:.5rem}.tw-px-2\.5{padding-left:.625rem;padding-right:.625rem}.tw-px-5{padding-left:1.25rem;padding-right:1.25rem}.tw-px-px{padding-left:1px;padding-right:1px}.tw-py-0{padding-top:0;padding-bottom:0}.tw-py-2{padding-top:.5rem;padding-bottom:.5rem}.tw-py-3{padding-top:.75rem;padding-bottom:.75rem}.tw-pb-1{padding-bottom:.25rem}.tw-pb-1\.5{padding-bottom:.375rem}.tw-pl-12{padding-left:3rem}.tw-pl-14{padding-left:3.5rem}.tw-pl-3{padding-left:.75rem}.tw-pl-3\.5{padding-left:.875rem}.tw-pl-7{padding-left:1.75rem}.tw-pr-2{padding-right:.5rem}.tw-pr-2\.5{padding-right:.625rem}.tw-pr-3{padding-right:.75rem}.tw-pr-3\.5{padding-right:.875rem}.tw-pt-1{padding-top:.25rem}.tw-pt-1\.5{padding-top:.375rem}.tw-pt-5{padding-top:1.25rem}.tw-text-left{text-align:left}.tw-text-right{text-align:right}.tw-font-body{font-family:var(--body-family)}.tw-font-sans{font-family:Space Grotesk Frontify,Arial,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol}.tw-text-body-small{font-size:var(--body-size-small);line-height:var(--body-size-small-line-height)}.tw-text-s{font-size:.875rem;line-height:1rem}.tw-text-sm{font-size:.875rem;line-height:1.25rem}.tw-text-xs{font-size:.813rem;line-height:1rem}.tw-font-bold{font-weight:700}.tw-font-medium{font-weight:500}.tw-font-normal{font-weight:400}.tw-leading-4{line-height:1rem}.tw-leading-5{line-height:1.25rem}.tw-leading-none{line-height:1}.tw-text-blank-state-shaded{--tw-text-opacity: 1;color:rgb(114 116 116 / var(--tw-text-opacity))}.tw-text-box-neutral-inverse{color:var(--box-neutral-inverse-color)}.tw-text-box-neutral-inverse-pressed{color:var(--box-neutral-inverse-color-pressed)}.tw-text-box-neutral-strong{color:var(--box-neutral-strong-color)}.tw-text-box-selected-strong-inverse{color:var(--box-selected-strong-inverse-color)}.tw-text-red-60{--tw-text-opacity: 1;color:rgb(255 55 90 / var(--tw-text-opacity))}.tw-text-text{color:var(--text-color)}.tw-text-text-negative{color:var(--text-color-negative)}.tw-text-text-weak{color:var(--text-color-weak)}.tw-opacity-0{opacity:0}.tw-opacity-100{opacity:1}.tw-shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.tw-shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.tw-outline-none{outline:2px solid transparent;outline-offset:2px}.tw-outline{outline-style:solid}.tw-outline-1{outline-width:1px}.tw-outline-offset-1{outline-offset:1px}.tw-outline-offset-2{outline-offset:2px}.tw-outline-box-selected-inverse{outline-color:var(--box-selected-inverse-color)}.tw-outline-line{outline-color:var(--line-color)}.tw-outline-violet-60{outline-color:#825fff}.tw-transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.tw-transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.first\:tw-rounded-bl:first-child{border-bottom-left-radius:var(--radius)}.first\:tw-rounded-tl:first-child{border-top-left-radius:var(--radius)}.first\:tw-rounded-tr:first-child{border-top-right-radius:var(--radius)}.last\:tw-rounded-bl:last-child{border-bottom-left-radius:var(--radius)}.last\:tw-rounded-br:last-child{border-bottom-right-radius:var(--radius)}.last\:tw-rounded-tr:last-child{border-top-right-radius:var(--radius)}.focus-within\:tw-opacity-100:focus-within{opacity:1}.focus-within\:tw-outline:focus-within{outline-style:solid}.hover\:tw-border-blank-state-line-hover:hover{--tw-border-opacity: 1;border-color:rgb(26 28 28 / var(--tw-border-opacity))}.hover\:tw-bg-black-10:hover{--tw-bg-opacity: 1;background-color:rgb(234 235 235 / var(--tw-bg-opacity))}.hover\:tw-bg-blank-state-hover-inverse:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.hover\:tw-bg-box-neutral-hover:hover{background-color:var(--box-neutral-color-hover)}.hover\:tw-bg-box-neutral-strong-inverse-hover:hover{background-color:var(--box-neutral-strong-inverse-color-hover)}.hover\:tw-text-blank-state-hover:hover{--tw-text-opacity: 1;color:rgb(26 28 28 / var(--tw-text-opacity))}.hover\:tw-text-box-neutral-inverse-hover:hover{color:var(--box-neutral-inverse-color-hover)}.hover\:tw-outline:hover{outline-style:solid}.focus-visible\:tw-z-10:focus-visible{z-index:10}.focus-visible\:tw-opacity-100:focus-visible{opacity:1}.focus-visible\:tw-ring-blue:focus-visible{--tw-ring-opacity: 1;--tw-ring-color: rgb(94 158 214 / var(--tw-ring-opacity)) }.active\:tw-cursor-grabbing:active{cursor:grabbing}.active\:tw-border-blank-state-line-hover:active{--tw-border-opacity: 1;border-color:rgb(26 28 28 / var(--tw-border-opacity))}.active\:tw-bg-blank-state-pressed-inverse:active{--tw-bg-opacity: 1;background-color:rgb(241 241 241 / var(--tw-bg-opacity))}.active\:tw-bg-box-neutral-pressed:active{background-color:var(--box-neutral-color-pressed)}.active\:tw-bg-box-neutral-strong-inverse-pressed:active{background-color:var(--box-neutral-strong-inverse-color-pressed)}.active\:tw-text-blank-state-pressed:active{--tw-text-opacity: 1;color:rgb(8 8 8 / var(--tw-text-opacity))}.active\:tw-text-box-neutral-inverse-pressed:active{color:var(--box-neutral-inverse-color-pressed)}.tw-group:hover .group-hover\:tw-text-box-neutral-inverse-hover{color:var(--box-neutral-inverse-color-hover)}.tw-group:hover .group-hover\:tw-opacity-100{opacity:1}.tw-group:focus .group-focus\:tw-opacity-100{opacity:1}.\[\&\:not\(\:first-child\)\]\:tw-border-l-0:not(:first-child){border-left-width:0px}.\[\&\:not\(\:first-child\)\]\:tw-border-t-0:not(:first-child){border-top-width:0px}.\[\&\>\*\]\:tw-pointer-events-none>*{pointer-events:none}
1
+ *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(147 197 253 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(147 197 253 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.tw-pointer-events-none{pointer-events:none}.tw-pointer-events-auto{pointer-events:auto}.tw-absolute{position:absolute}.tw-relative{position:relative}.tw-bottom-\[calc\(100\%-4px\)\]{bottom:calc(100% - 4px)}.tw-left-0{left:0}.tw-right-\[-3px\]{right:-3px}.tw-top-full{top:100%}.tw-isolate{isolation:isolate}.tw-z-20{z-index:20}.tw-z-\[2\]{z-index:2}.tw-z-\[60\]{z-index:60}.tw-m-0{margin:0}.tw-my-4{margin-top:1rem;margin-bottom:1rem}.-tw-mr-2{margin-right:-.5rem}.tw-mr-2{margin-right:.5rem}.tw-mt-1{margin-top:.25rem}.tw-mt-3{margin-top:.75rem}.tw-mt-5{margin-top:1.25rem}.tw-mt-8{margin-top:2rem}.tw-flex{display:flex}.tw-inline-flex{display:inline-flex}.tw-h-0{height:0px}.tw-h-10{height:2.5rem}.tw-h-6{height:1.5rem}.tw-h-8{height:2rem}.tw-h-9{height:2.25rem}.tw-h-\[26px\]{height:26px}.tw-h-\[72px\]{height:72px}.tw-h-full{height:100%}.tw-min-h-\[10px\]{min-height:10px}.tw-w-0{width:0px}.tw-w-8{width:2rem}.tw-w-9{width:2.25rem}.tw-w-\[300px\]{width:300px}.tw-w-fit{width:-moz-fit-content;width:fit-content}.tw-w-full{width:100%}.tw-min-w-0{min-width:0px}.tw-min-w-\[400px\]{min-width:400px}.tw-flex-1{flex:1 1 0%}.tw-flex-auto{flex:1 1 auto}.tw-flex-none{flex:none}.tw-flex-shrink-0{flex-shrink:0}.tw-rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes tw-pulse{50%{opacity:.5}}.tw-animate-pulse{animation:tw-pulse 2s cubic-bezier(.4,0,.6,1) infinite}.\!tw-cursor-grab{cursor:grab!important}.\!tw-cursor-not-allowed{cursor:not-allowed!important}.tw-cursor-grab{cursor:grab}.tw-cursor-grabbing{cursor:grabbing}.tw-cursor-pointer{cursor:pointer}.tw-flex-col{flex-direction:column}.tw-items-start{align-items:flex-start}.tw-items-center{align-items:center}.tw-justify-end{justify-content:flex-end}.tw-justify-center{justify-content:center}.tw-justify-between{justify-content:space-between}.tw-gap-0{gap:0px}.tw-gap-0\.5{gap:.125rem}.tw-gap-1{gap:.25rem}.tw-gap-2{gap:.5rem}.tw-gap-3{gap:.75rem}.tw-gap-px{gap:1px}.tw-gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.tw-space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.25rem * var(--tw-space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--tw-space-x-reverse)))}.tw-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.tw-divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse: 0;border-right-width:calc(var(--line-width) * var(--tw-divide-x-reverse));border-left-width:calc(var(--line-width) * calc(1 - var(--tw-divide-x-reverse)))}.tw-divide-line-strong>:not([hidden])~:not([hidden]){border-color:var(--line-color-strong)}.tw-self-start{align-self:flex-start}.tw-overflow-hidden{overflow:hidden}.tw-overflow-y-auto{overflow-y:auto}.tw-text-ellipsis{text-overflow:ellipsis}.tw-whitespace-nowrap{white-space:nowrap}.tw-whitespace-pre-wrap{white-space:pre-wrap}.tw-rounded{border-radius:var(--radius)}.tw-rounded-full{border-radius:9999px}.tw-rounded-md{border-radius:.375rem}.tw-rounded-sm{border-radius:.125rem}.tw-border{border-width:var(--line-width)}.tw-border-b{border-bottom-width:var(--line-width)}.tw-border-b-4{border-bottom-width:4px}.tw-border-l-4{border-left-width:4px}.tw-border-t{border-top-width:var(--line-width)}.tw-border-t-4{border-top-width:4px}.tw-border-solid{border-style:solid}.tw-border-dashed{border-style:dashed}.\!tw-border-red-50{--tw-border-opacity: 1 !important;border-color:rgb(255 128 102 / var(--tw-border-opacity))!important}.tw-border-blank-state-line{--tw-border-opacity: 1;border-color:rgb(163 165 165 / var(--tw-border-opacity))}.tw-border-blank-state-line-hover{--tw-border-opacity: 1;border-color:rgb(26 28 28 / var(--tw-border-opacity))}.tw-border-button-border{border-color:var(--button-border-color)}.tw-border-line-strong{border-color:var(--line-color-strong)}.tw-border-b-line{border-bottom-color:var(--line-color)}.tw-border-b-transparent{border-bottom-color:transparent}.tw-border-t-black-10{--tw-border-opacity: 1;border-top-color:rgb(234 235 235 / var(--tw-border-opacity))}.tw-border-t-transparent{border-top-color:transparent}.tw-bg-base{background-color:var(--base-color)}.tw-bg-base-alt{background-color:var(--base-color-alt)}.tw-bg-blank-state-pressed-inverse{--tw-bg-opacity: 1;background-color:rgb(241 241 241 / var(--tw-bg-opacity))}.tw-bg-blank-state-shaded-inverse{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity))}.tw-bg-blank-state-weak-inverse{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.tw-bg-box-neutral-hover{background-color:var(--box-neutral-color-hover)}.tw-bg-box-neutral-pressed{background-color:var(--box-neutral-color-pressed)}.tw-bg-box-neutral-strong-inverse{background-color:var(--box-neutral-strong-inverse-color)}.tw-bg-box-selected-strong{background-color:var(--box-selected-strong-color)}.tw-bg-button-background{background-color:var(--button-background-color)}.tw-bg-button-background-pressed{background-color:var(--button-background-color-pressed)}.tw-bg-red-50{--tw-bg-opacity: 1;background-color:rgb(255 128 102 / var(--tw-bg-opacity))}.tw-bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.tw-p-1{padding:.25rem}.tw-p-1\.5{padding:.375rem}.tw-p-2{padding:.5rem}.tw-p-4{padding:1rem}.tw-p-7{padding:1.75rem}.tw-px-0{padding-left:0;padding-right:0}.tw-px-2{padding-left:.5rem;padding-right:.5rem}.tw-px-2\.5{padding-left:.625rem;padding-right:.625rem}.tw-px-5{padding-left:1.25rem;padding-right:1.25rem}.tw-px-px{padding-left:1px;padding-right:1px}.tw-py-0{padding-top:0;padding-bottom:0}.tw-py-2{padding-top:.5rem;padding-bottom:.5rem}.tw-py-3{padding-top:.75rem;padding-bottom:.75rem}.tw-pb-1{padding-bottom:.25rem}.tw-pb-1\.5{padding-bottom:.375rem}.tw-pl-12{padding-left:3rem}.tw-pl-14{padding-left:3.5rem}.tw-pl-3{padding-left:.75rem}.tw-pl-3\.5{padding-left:.875rem}.tw-pl-7{padding-left:1.75rem}.tw-pr-2{padding-right:.5rem}.tw-pr-2\.5{padding-right:.625rem}.tw-pr-3{padding-right:.75rem}.tw-pr-3\.5{padding-right:.875rem}.tw-pt-1{padding-top:.25rem}.tw-pt-1\.5{padding-top:.375rem}.tw-pt-5{padding-top:1.25rem}.tw-text-left{text-align:left}.tw-text-right{text-align:right}.tw-font-body{font-family:var(--body-family)}.tw-font-sans{font-family:Space Grotesk Frontify,Arial,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol}.tw-text-body-small{font-size:var(--body-size-small);line-height:var(--body-size-small-line-height)}.tw-text-s{font-size:.875rem;line-height:1rem}.tw-text-sm{font-size:.875rem;line-height:1.25rem}.tw-text-xs{font-size:.813rem;line-height:1rem}.tw-font-bold{font-weight:700}.tw-font-medium{font-weight:500}.tw-font-normal{font-weight:400}.tw-leading-4{line-height:1rem}.tw-leading-5{line-height:1.25rem}.tw-leading-none{line-height:1}.tw-text-blank-state-shaded{--tw-text-opacity: 1;color:rgb(114 116 116 / var(--tw-text-opacity))}.tw-text-box-neutral-inverse{color:var(--box-neutral-inverse-color)}.tw-text-box-neutral-inverse-pressed{color:var(--box-neutral-inverse-color-pressed)}.tw-text-box-neutral-strong{color:var(--box-neutral-strong-color)}.tw-text-box-selected-strong-inverse{color:var(--box-selected-strong-inverse-color)}.tw-text-red-60{--tw-text-opacity: 1;color:rgb(255 55 90 / var(--tw-text-opacity))}.tw-text-text{color:var(--text-color)}.tw-text-text-negative{color:var(--text-color-negative)}.tw-text-text-weak{color:var(--text-color-weak)}.tw-opacity-0{opacity:0}.tw-opacity-100{opacity:1}.tw-shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.tw-shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.tw-outline-none{outline:2px solid transparent;outline-offset:2px}.tw-outline{outline-style:solid}.tw-outline-1{outline-width:1px}.tw-outline-offset-1{outline-offset:1px}.tw-outline-offset-2{outline-offset:2px}.tw-outline-box-selected-inverse{outline-color:var(--box-selected-inverse-color)}.tw-outline-line{outline-color:var(--line-color)}.tw-outline-violet-60{outline-color:#825fff}.tw-transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.tw-transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.first\:tw-rounded-bl:first-child{border-bottom-left-radius:var(--radius)}.first\:tw-rounded-tl:first-child{border-top-left-radius:var(--radius)}.first\:tw-rounded-tr:first-child{border-top-right-radius:var(--radius)}.last\:tw-rounded-bl:last-child{border-bottom-left-radius:var(--radius)}.last\:tw-rounded-br:last-child{border-bottom-right-radius:var(--radius)}.last\:tw-rounded-tr:last-child{border-top-right-radius:var(--radius)}.focus-within\:tw-opacity-100:focus-within{opacity:1}.focus-within\:tw-outline:focus-within{outline-style:solid}.hover\:tw-border-blank-state-line-hover:hover{--tw-border-opacity: 1;border-color:rgb(26 28 28 / var(--tw-border-opacity))}.hover\:tw-bg-black-10:hover{--tw-bg-opacity: 1;background-color:rgb(234 235 235 / var(--tw-bg-opacity))}.hover\:tw-bg-blank-state-hover-inverse:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.hover\:tw-bg-box-neutral-hover:hover{background-color:var(--box-neutral-color-hover)}.hover\:tw-bg-box-neutral-strong-inverse-hover:hover{background-color:var(--box-neutral-strong-inverse-color-hover)}.hover\:tw-bg-button-background-hover:hover{background-color:var(--button-background-color-hover)}.hover\:tw-bg-button-background-pressed:hover{background-color:var(--button-background-color-pressed)}.hover\:tw-text-blank-state-hover:hover{--tw-text-opacity: 1;color:rgb(26 28 28 / var(--tw-text-opacity))}.hover\:tw-text-box-neutral-inverse-hover:hover{color:var(--box-neutral-inverse-color-hover)}.hover\:tw-outline:hover{outline-style:solid}.focus-visible\:tw-z-10:focus-visible{z-index:10}.focus-visible\:tw-opacity-100:focus-visible{opacity:1}.focus-visible\:tw-ring-blue:focus-visible{--tw-ring-opacity: 1;--tw-ring-color: rgb(94 158 214 / var(--tw-ring-opacity)) }.active\:tw-cursor-grabbing:active{cursor:grabbing}.active\:tw-border-blank-state-line-hover:active{--tw-border-opacity: 1;border-color:rgb(26 28 28 / var(--tw-border-opacity))}.active\:tw-bg-blank-state-pressed-inverse:active{--tw-bg-opacity: 1;background-color:rgb(241 241 241 / var(--tw-bg-opacity))}.active\:tw-bg-box-neutral-pressed:active{background-color:var(--box-neutral-color-pressed)}.active\:tw-bg-box-neutral-strong-inverse-pressed:active{background-color:var(--box-neutral-strong-inverse-color-pressed)}.active\:tw-bg-button-background-pressed:active{background-color:var(--button-background-color-pressed)}.active\:tw-text-blank-state-pressed:active{--tw-text-opacity: 1;color:rgb(8 8 8 / var(--tw-text-opacity))}.active\:tw-text-box-neutral-inverse-pressed:active{color:var(--box-neutral-inverse-color-pressed)}.tw-group:hover .group-hover\:tw-text-box-neutral-inverse-hover{color:var(--box-neutral-inverse-color-hover)}.tw-group:hover .group-hover\:tw-opacity-100{opacity:1}.tw-group:focus .group-focus\:tw-opacity-100{opacity:1}.\[\&\:not\(\:first-child\)\]\:tw-border-l-0:not(:first-child){border-left-width:0px}.\[\&\:not\(\:first-child\)\]\:tw-border-t-0:not(:first-child){border-top-width:0px}.\[\&\>\*\]\:tw-pointer-events-none>*{pointer-events:none}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@frontify/guideline-blocks-settings",
3
- "version": "0.32.1",
3
+ "version": "0.33.0",
4
4
  "description": "Provides types and helpers for the guideline block development",
5
5
  "sideEffects": false,
6
6
  "main": "dist/index.umd.js",
@@ -25,7 +25,9 @@
25
25
  "devDependencies": {
26
26
  "@babel/core": "^7.23.3",
27
27
  "@frontify/eslint-config-typescript": "^0.16.2",
28
+ "@testing-library/jest-dom": "^6.4.2",
28
29
  "@testing-library/react": "^14.1.2",
30
+ "@testing-library/user-event": "14.5.2",
29
31
  "@types/node": "^18.18.11",
30
32
  "@types/react": "^18.2.38",
31
33
  "@types/react-dom": "^18.2.16",
@@ -63,7 +65,7 @@
63
65
  "@udecode/plate": "^21.5.0",
64
66
  "slate": "^0.94.1",
65
67
  "slate-react": "^0.98.3",
66
- "@frontify/sidebar-settings": "^0.9.1"
68
+ "@frontify/sidebar-settings": "^0.9.2"
67
69
  },
68
70
  "peerDependencies": {
69
71
  "@frontify/app-bridge": "^3.0.0 || ^4.0.0-alpha.0",
package/setupTests.ts CHANGED
@@ -1,7 +1,11 @@
1
1
  /* (c) Copyright Frontify Ltd., all rights reserved. */
2
2
 
3
- import { afterEach, beforeAll, vi } from 'vitest';
4
- import { configure } from '@testing-library/react';
3
+ import * as matchers from '@testing-library/jest-dom/matchers';
4
+ import { cleanup, configure } from '@testing-library/react';
5
+ import { afterEach, beforeAll, expect, vi } from 'vitest';
6
+ import '@testing-library/jest-dom/vitest';
7
+
8
+ expect.extend(matchers);
5
9
 
6
10
  vi.stubGlobal('crypto', {
7
11
  getRandomValues: vi.fn(),
@@ -13,6 +17,7 @@ beforeAll(() => {
13
17
 
14
18
  afterEach(() => {
15
19
  vi.restoreAllMocks();
20
+ cleanup();
16
21
  });
17
22
 
18
23
  globalThis.structuredClone = (data: unknown) => JSON.parse(JSON.stringify(data));
@@ -8,10 +8,12 @@ import {
8
8
  ActionMenu,
9
9
  Button,
10
10
  ButtonEmphasis,
11
+ FOCUS_STYLE,
11
12
  Flyout,
12
13
  FlyoutPlacement,
13
14
  IconArrowCircleUp20,
14
15
  IconDocument24,
16
+ IconGrabHandle20,
15
17
  IconImage24,
16
18
  IconImageStack20,
17
19
  IconMusicNote24,
@@ -25,6 +27,7 @@ import {
25
27
  } from '@frontify/fondue';
26
28
  import { AttachmentItemProps, SortableAttachmentItemProps } from './types';
27
29
  import { joinClassNames } from '../../utilities';
30
+ import { useFocusRing } from '@react-aria/focus';
28
31
 
29
32
  const getDecorator = (type: string) => {
30
33
  if (type === 'IMAGE') {
@@ -43,6 +46,7 @@ export const AttachmentItem = forwardRef<HTMLButtonElement, AttachmentItemProps>
43
46
  {
44
47
  item,
45
48
  isEditing,
49
+ draggableProps,
46
50
  transformStyle,
47
51
  isDragging,
48
52
  isOverlay,
@@ -58,6 +62,8 @@ export const AttachmentItem = forwardRef<HTMLButtonElement, AttachmentItemProps>
58
62
  const [openFileDialog, { selectedFiles }] = useFileInput({ multiple: true, accept: 'image/*' });
59
63
  const [uploadFile, { results: uploadResults, doneAll }] = useAssetUpload();
60
64
 
65
+ const { focusProps, isFocusVisible } = useFocusRing();
66
+
61
67
  useEffect(() => {
62
68
  if (selectedFiles) {
63
69
  uploadFile(selectedFiles[0]);
@@ -111,6 +117,21 @@ export const AttachmentItem = forwardRef<HTMLButtonElement, AttachmentItemProps>
111
117
  isOverlay || selectedAsset?.id === item.id ? 'tw-opacity-100' : 'tw-opacity-0',
112
118
  ])}
113
119
  >
120
+ <button
121
+ {...focusProps}
122
+ {...draggableProps}
123
+ aria-label="Drag attachment"
124
+ className={joinClassNames([
125
+ ' tw-border-button-border tw-bg-button-background active:tw-bg-button-background-pressed tw-group tw-border tw-box-box tw-relative tw-flex tw-items-center tw-justify-center tw-outline-none tw-font-medium tw-rounded tw-h-9 tw-w-9 ',
126
+ isDragging || isOverlay
127
+ ? 'tw-cursor-grabbing tw-bg-button-background-pressed hover:tw-bg-button-background-pressed'
128
+ : 'tw-cursor-grab hover:tw-bg-button-background-hover',
129
+ isFocusVisible && FOCUS_STYLE,
130
+ isFocusVisible && 'tw-z-[2]',
131
+ ])}
132
+ >
133
+ <IconGrabHandle20 />
134
+ </button>
114
135
  <div data-test-id="attachments-actionbar-flyout">
115
136
  <Flyout
116
137
  placement={FlyoutPlacement.Right}
@@ -6,9 +6,10 @@ import { Attachments as AttachmentsComponent } from './Attachments';
6
6
  import { AttachmentsProps } from './types';
7
7
  import { SinonStub } from 'sinon';
8
8
 
9
- const FlyoutButtonSelector = '[data-test-id="attachments-flyout-button"]';
9
+ const FlyoutButtonSelector = '[data-test-id="attachments-button-trigger"]';
10
10
  const AssetInputSelector = '[data-test-id="asset-input-placeholder"]';
11
11
  const ActionBarSelector = '[data-test-id="attachments-actionbar"]';
12
+ const DragHandleSelector = '[data-test-id="attachments-actionbar"] > button';
12
13
  const FlyoutTriggerSelector = '[data-test-id="attachments-actionbar-flyout"] button';
13
14
  const AttachmentItemSelector = '[data-test-id="attachments-item"]';
14
15
  const MenuItemSelector = '[data-test-id="menu-item"]';
@@ -139,8 +140,26 @@ describe('Attachments', () => {
139
140
  cy.get(FlyoutButtonSelector).click();
140
141
  cy.realPress('Tab');
141
142
  cy.realPress('Tab');
143
+ cy.realPress('Tab');
142
144
  cy.get(FlyoutTriggerSelector).eq(0).should('have.class', 'focus-visible:tw-ring-blue');
143
145
  cy.get(FlyoutTriggerSelector).eq(0).type('{enter}');
144
146
  cy.get(MenuItemSelector).should('exist');
145
147
  });
148
+
149
+ it('reorders items using only keyboard events', () => {
150
+ const onSortStub = cy.stub();
151
+ mount(
152
+ <Attachments
153
+ appBridge={getAppBridgeBlockStub({ editorState: true })}
154
+ items={[{ ...AssetDummy.with(1), title: 'Moved item' }, AssetDummy.with(2), AssetDummy.with(3)]}
155
+ onSorted={onSortStub}
156
+ />,
157
+ );
158
+ cy.get(FlyoutButtonSelector).click();
159
+ cy.realPress('Tab');
160
+ cy.realPress('Tab');
161
+ cy.realPress('Tab');
162
+ cy.get(DragHandleSelector).eq(0).type(' {downarrow}{downarrow} ');
163
+ cy.get(AttachmentItemSelector).eq(1).should('contain.text', 'Moved item');
164
+ });
146
165
  });
@@ -1,6 +1,6 @@
1
1
  /* (c) Copyright Frontify Ltd., all rights reserved. */
2
2
 
3
- import { useEffect, useState } from 'react';
3
+ import { MutableRefObject, useEffect, useState } from 'react';
4
4
  import {
5
5
  DndContext,
6
6
  DragEndEvent,
@@ -159,11 +159,15 @@ export const Attachments = ({
159
159
  hug={false}
160
160
  fitContent
161
161
  legacyFooter={false}
162
- trigger={
163
- <TriggerComponent isFlyoutOpen={isFlyoutOpen}>
162
+ trigger={(triggerProps, triggerRef) => (
163
+ <TriggerComponent
164
+ isFlyoutOpen={isFlyoutOpen}
165
+ triggerProps={triggerProps}
166
+ triggerRef={triggerRef as MutableRefObject<HTMLButtonElement>}
167
+ >
164
168
  <div>{items.length > 0 ? items.length : 'Add'}</div>
165
169
  </TriggerComponent>
166
- }
170
+ )}
167
171
  >
168
172
  <div className="tw-w-[300px]" data-test-id="attachments-flyout-content">
169
173
  {internalItems.length > 0 && (
@@ -6,17 +6,25 @@ import { joinClassNames } from '../../utilities';
6
6
 
7
7
  import { type AttachmentsTriggerProps } from './types';
8
8
 
9
- export const AttachmentsButtonTrigger = ({ children, isFlyoutOpen }: AttachmentsTriggerProps) => (
10
- <div
9
+ export const AttachmentsButtonTrigger = ({
10
+ children,
11
+ isFlyoutOpen,
12
+ triggerProps,
13
+ triggerRef,
14
+ }: AttachmentsTriggerProps) => (
15
+ <button
11
16
  className={joinClassNames([
12
17
  'tw-flex tw-text-xs tw-font-body tw-items-center tw-gap-1 tw-rounded-full tw-outline tw-outline-1 tw-outline-offset-1 tw-p-1.5 tw-outline-line',
13
18
  isFlyoutOpen
14
19
  ? 'tw-bg-box-neutral-pressed tw-text-box-neutral-inverse-pressed'
15
20
  : 'tw-bg-base hover:tw-bg-box-neutral-hover active:tw-bg-box-neutral-pressed tw-text-box-neutral-inverse hover:tw-text-box-neutral-inverse-hover active:tw-text-box-neutral-inverse-pressed',
16
21
  ])}
22
+ {...triggerProps}
23
+ ref={triggerRef}
24
+ data-test-id="attachments-button-trigger"
17
25
  >
18
26
  <IconPaperclip16 />
19
27
  {children}
20
28
  <IconCaretDown12 />
21
- </div>
29
+ </button>
22
30
  );
@@ -1,11 +1,13 @@
1
1
  /* (c) Copyright Frontify Ltd., all rights reserved. */
2
2
 
3
3
  import { type AppBridgeBlock, type Asset } from '@frontify/app-bridge';
4
- import { type ReactNode } from 'react';
4
+ import { HTMLAttributes, MutableRefObject, ReactElement, type ReactNode } from 'react';
5
5
 
6
6
  export type AttachmentsTriggerProps = {
7
7
  children: ReactNode;
8
8
  isFlyoutOpen: boolean;
9
+ triggerProps: HTMLAttributes<HTMLButtonElement>;
10
+ triggerRef: MutableRefObject<HTMLButtonElement>;
9
11
  };
10
12
 
11
13
  export type AttachmentsProps = {
@@ -17,7 +19,7 @@ export type AttachmentsProps = {
17
19
  onUpload: (uploadedAttachments: Asset[]) => Promise<void>;
18
20
  onBrowse: (browserAttachments: Asset[]) => void;
19
21
  onSorted: (sortedAttachments: Asset[]) => void;
20
- triggerComponent?: (props: AttachmentsTriggerProps) => JSX.Element;
22
+ triggerComponent?: (props: AttachmentsTriggerProps) => ReactElement;
21
23
  } & ({ isOpen?: never; onOpenChange?: never } | { isOpen: boolean; onOpenChange: (isOpen: boolean) => void });
22
24
 
23
25
  export type AttachmentItemProps = SortableAttachmentItemProps & {
@@ -14,7 +14,7 @@ const ChildSelector = '[data-test-id="block-item-wrapper-child"]';
14
14
  describe('Block Item Wrapper', () => {
15
15
  it('should render the wrapper and the children', () => {
16
16
  mount(
17
- <BlockItemWrapper toolbarFlyoutItems={[]} toolbarItems={[]}>
17
+ <BlockItemWrapper toolbarItems={[]}>
18
18
  <div data-test-id="block-item-wrapper-child" className="tw-w-8 tw-h-8 tw-bg-red-50" />
19
19
  </BlockItemWrapper>,
20
20
  );
@@ -24,7 +24,7 @@ describe('Block Item Wrapper', () => {
24
24
 
25
25
  it('should render the outline class', () => {
26
26
  mount(
27
- <BlockItemWrapper toolbarFlyoutItems={[]} toolbarItems={[]}>
27
+ <BlockItemWrapper toolbarItems={[]}>
28
28
  <div data-test-id="block-item-wrapper-child" className="tw-w-8 tw-h-8 tw-bg-red-50" />
29
29
  </BlockItemWrapper>,
30
30
  );
@@ -33,7 +33,7 @@ describe('Block Item Wrapper', () => {
33
33
 
34
34
  it('should not render the outline class if the hide prop is set', () => {
35
35
  mount(
36
- <BlockItemWrapper toolbarFlyoutItems={[]} toolbarItems={[]} shouldHideWrapper>
36
+ <BlockItemWrapper toolbarItems={[]} shouldHideWrapper>
37
37
  <div data-test-id="block-item-wrapper-child" className="tw-w-8 tw-h-8 tw-bg-red-50" />
38
38
  </BlockItemWrapper>,
39
39
  );
@@ -43,10 +43,9 @@ describe('Block Item Wrapper', () => {
43
43
  it('should render the right amount of toolbar items', () => {
44
44
  mount(
45
45
  <BlockItemWrapper
46
- toolbarFlyoutItems={[]}
47
46
  toolbarItems={[
48
- { icon: <IconMagnifier16 />, onClick: cy.stub(), tooltip: 'Test tooltip' },
49
- { icon: <IconMagnifier16 />, onClick: cy.stub(), tooltip: 'Test tooltip' },
47
+ { type: 'button', icon: <IconMagnifier16 />, onClick: cy.stub(), tooltip: 'Test tooltip' },
48
+ { type: 'button', icon: <IconMagnifier16 />, onClick: cy.stub(), tooltip: 'Test tooltip' },
50
49
  ]}
51
50
  >
52
51
  <div data-test-id="block-item-wrapper-child" className="tw-w-8 tw-h-8 tw-bg-red-50" />
@@ -58,30 +57,33 @@ describe('Block Item Wrapper', () => {
58
57
  it('should render the flyout button with the right amount of menu items', () => {
59
58
  mount(
60
59
  <BlockItemWrapper
61
- toolbarFlyoutItems={[
62
- [
63
- {
64
- icon: <IconMagnifier16 />,
65
- onClick: cy.stub(),
66
- title: 'Test title',
67
- },
68
- ],
69
- [
70
- {
71
- icon: <IconMagnifier16 />,
72
- onClick: cy.stub(),
73
- title: 'Test title',
74
- },
75
- {
76
- icon: <IconMagnifier16 />,
77
- onClick: cy.stub(),
78
- title: 'Test title',
79
- },
80
- ],
81
- ]}
82
60
  toolbarItems={[
83
- { icon: <IconMagnifier16 />, onClick: cy.stub(), tooltip: 'Test tooltip' },
84
- { icon: <IconMagnifier16 />, onClick: cy.stub(), tooltip: 'Test tooltip' },
61
+ { type: 'button', icon: <IconMagnifier16 />, onClick: cy.stub(), tooltip: 'Test tooltip' },
62
+ { type: 'button', icon: <IconMagnifier16 />, onClick: cy.stub(), tooltip: 'Test tooltip' },
63
+ {
64
+ type: 'menu',
65
+ items: [
66
+ [
67
+ {
68
+ icon: <IconMagnifier16 />,
69
+ onClick: cy.stub(),
70
+ title: 'Test title',
71
+ },
72
+ ],
73
+ [
74
+ {
75
+ icon: <IconMagnifier16 />,
76
+ onClick: cy.stub(),
77
+ title: 'Test title',
78
+ },
79
+ {
80
+ icon: <IconMagnifier16 />,
81
+ onClick: cy.stub(),
82
+ title: 'Test title',
83
+ },
84
+ ],
85
+ ],
86
+ },
85
87
  ]}
86
88
  >
87
89
  <div data-test-id="block-item-wrapper-child" className="tw-mt-8 tw-w-8 tw-h-8 tw-bg-red-50" />
@@ -96,10 +98,9 @@ describe('Block Item Wrapper', () => {
96
98
  it('should render the outline if a toolbar button is focused', () => {
97
99
  mount(
98
100
  <BlockItemWrapper
99
- toolbarFlyoutItems={[]}
100
101
  toolbarItems={[
101
- { icon: <IconMagnifier16 />, onClick: cy.stub(), tooltip: 'Test tooltip' },
102
- { icon: <IconMagnifier16 />, onClick: cy.stub(), tooltip: 'Test tooltip' },
102
+ { type: 'button', icon: <IconMagnifier16 />, onClick: cy.stub(), tooltip: 'Test tooltip' },
103
+ { type: 'button', icon: <IconMagnifier16 />, onClick: cy.stub(), tooltip: 'Test tooltip' },
103
104
  ]}
104
105
  >
105
106
  <div data-test-id="block-item-wrapper-child" className="tw-w-8 tw-h-8 tw-bg-red-50" />
@@ -112,11 +113,10 @@ describe('Block Item Wrapper', () => {
112
113
  it('should render the toolbar if a button is focused', () => {
113
114
  mount(
114
115
  <BlockItemWrapper
115
- toolbarFlyoutItems={[]}
116
116
  shouldHideComponent={false}
117
117
  toolbarItems={[
118
- { icon: <IconMagnifier16 />, onClick: cy.stub(), tooltip: 'Test tooltip' },
119
- { icon: <IconMagnifier16 />, onClick: cy.stub(), tooltip: 'Test tooltip' },
118
+ { type: 'button', icon: <IconMagnifier16 />, onClick: cy.stub(), tooltip: 'Test tooltip' },
119
+ { type: 'button', icon: <IconMagnifier16 />, onClick: cy.stub(), tooltip: 'Test tooltip' },
120
120
  ]}
121
121
  >
122
122
  <div data-test-id="block-item-wrapper-child" className="tw-w-8 tw-h-8 tw-bg-red-50" />
@@ -129,10 +129,9 @@ describe('Block Item Wrapper', () => {
129
129
  it('should render the outline and the toolbar if enabled', () => {
130
130
  mount(
131
131
  <BlockItemWrapper
132
- toolbarFlyoutItems={[]}
133
132
  toolbarItems={[
134
- { icon: <IconMagnifier16 />, onClick: cy.stub(), tooltip: 'Test tooltip' },
135
- { icon: <IconMagnifier16 />, onClick: cy.stub(), tooltip: 'Test tooltip' },
133
+ { type: 'button', icon: <IconMagnifier16 />, onClick: cy.stub(), tooltip: 'Test tooltip' },
134
+ { type: 'button', icon: <IconMagnifier16 />, onClick: cy.stub(), tooltip: 'Test tooltip' },
136
135
  ]}
137
136
  shouldBeShown
138
137
  >
@@ -4,23 +4,23 @@ import { type ReactElement, useRef, useState } from 'react';
4
4
 
5
5
  import { joinClassNames } from '../../utilities';
6
6
 
7
- import { Toolbar, type ToolbarItem } from './Toolbar';
7
+ import { DEFAULT_MENU_BUTTON_ID, Toolbar, type ToolbarItem } from './Toolbar';
8
8
  import { type BlockItemWrapperProps } from './types';
9
+ import { DragPreviewContextProvider } from './Toolbar/context/DragPreviewContext';
10
+ import { MultiFlyoutContextProvider } from './Toolbar/context/MultiFlyoutContext';
9
11
 
10
12
  export const BlockItemWrapper = ({
11
13
  children,
12
- toolbarFlyoutItems,
13
14
  toolbarItems,
14
15
  shouldHideWrapper,
15
16
  shouldHideComponent = false,
16
- isDragging,
17
+ isDragging = false,
17
18
  shouldFillContainer,
18
19
  outlineOffset = 2,
19
20
  shouldBeShown = false,
20
21
  showAttachments = false,
21
22
  }: BlockItemWrapperProps): ReactElement => {
22
- const [isMenuFlyoutOpen, setIsMenuFlyoutOpen] = useState(shouldBeShown);
23
- const [isAttachmentFlyoutOpen, setIsAttachmentFlyoutOpen] = useState(false);
23
+ const [openFlyoutIds, setOpenFlyoutIds] = useState<string[]>(shouldBeShown ? [DEFAULT_MENU_BUTTON_ID] : []);
24
24
  const wrapperRef = useRef<HTMLDivElement>(null);
25
25
 
26
26
  if (shouldHideWrapper) {
@@ -30,51 +30,47 @@ export const BlockItemWrapper = ({
30
30
 
31
31
  const items = toolbarItems?.filter((item): item is ToolbarItem => item !== undefined);
32
32
 
33
- const shouldToolbarBeVisible = isMenuFlyoutOpen || isAttachmentFlyoutOpen || shouldBeShown;
33
+ const shouldToolbarBeVisible = openFlyoutIds.length > 0 || shouldBeShown;
34
34
 
35
35
  return (
36
- <div
37
- ref={wrapperRef}
38
- data-test-id="block-item-wrapper"
39
- style={{
40
- outlineOffset,
41
- }}
42
- className={joinClassNames([
43
- 'tw-relative tw-group tw-outline-1 tw-outline-box-selected-inverse',
44
- shouldFillContainer && 'tw-flex-1 tw-h-full tw-w-full',
45
- 'hover:tw-outline focus-within:tw-outline',
46
- shouldToolbarBeVisible && 'tw-outline',
47
- shouldHideComponent && 'tw-opacity-0',
48
- ])}
49
- >
50
- <div
51
- style={{
52
- right: -1 - outlineOffset,
53
- bottom: `calc(100% - ${2 + outlineOffset}px)`,
54
- }}
55
- className={joinClassNames([
56
- 'tw-pointer-events-none tw-absolute tw-bottom-[calc(100%-4px)] tw-right-[-3px] tw-w-full tw-opacity-0 tw-z-[60]',
57
- 'group-hover:tw-opacity-100 group-focus:tw-opacity-100 focus-within:tw-opacity-100',
58
- 'tw-flex tw-justify-end',
59
- shouldToolbarBeVisible && 'tw-opacity-100',
60
- ])}
61
- >
62
- <Toolbar
63
- flyoutMenu={{
64
- items: toolbarFlyoutItems,
65
- isOpen: isMenuFlyoutOpen,
66
- onOpenChange: setIsMenuFlyoutOpen,
36
+ <DragPreviewContextProvider isDragPreview={isDragging}>
37
+ <MultiFlyoutContextProvider openFlyoutIds={openFlyoutIds} setOpenFlyoutIds={setOpenFlyoutIds}>
38
+ <div
39
+ ref={wrapperRef}
40
+ data-test-id="block-item-wrapper"
41
+ style={{
42
+ outlineOffset,
67
43
  }}
68
- attachments={{
69
- isEnabled: showAttachments,
70
- isOpen: isAttachmentFlyoutOpen,
71
- onOpenChange: setIsAttachmentFlyoutOpen,
72
- }}
73
- items={items}
74
- isDragging={isDragging}
75
- />
76
- </div>
77
- {children}
78
- </div>
44
+ className={joinClassNames([
45
+ 'tw-relative tw-group tw-outline-1 tw-outline-box-selected-inverse',
46
+ shouldFillContainer && 'tw-flex-1 tw-h-full tw-w-full',
47
+ 'hover:tw-outline focus-within:tw-outline',
48
+ shouldToolbarBeVisible && 'tw-outline',
49
+ shouldHideComponent && 'tw-opacity-0',
50
+ ])}
51
+ >
52
+ <div
53
+ style={{
54
+ right: -1 - outlineOffset,
55
+ bottom: `calc(100% - ${2 + outlineOffset}px)`,
56
+ }}
57
+ className={joinClassNames([
58
+ 'tw-pointer-events-none tw-absolute tw-bottom-[calc(100%-4px)] tw-right-[-3px] tw-w-full tw-opacity-0 tw-z-[60]',
59
+ 'group-hover:tw-opacity-100 group-focus:tw-opacity-100 focus-within:tw-opacity-100',
60
+ 'tw-flex tw-justify-end',
61
+ shouldToolbarBeVisible && 'tw-opacity-100',
62
+ ])}
63
+ >
64
+ <Toolbar
65
+ attachments={{
66
+ isEnabled: showAttachments,
67
+ }}
68
+ items={items}
69
+ />
70
+ </div>
71
+ {children}
72
+ </div>
73
+ </MultiFlyoutContextProvider>
74
+ </DragPreviewContextProvider>
79
75
  );
80
76
  };
@@ -0,0 +1,96 @@
1
+ /* (c) Copyright Frontify Ltd., all rights reserved. */
2
+
3
+ import { AssetDummy, getAppBridgeBlockStub } from '@frontify/app-bridge';
4
+ import { fireEvent, render, waitFor } from '@testing-library/react';
5
+ import { beforeAll, describe, expect, it, vi } from 'vitest';
6
+
7
+ import { AttachmentsProvider } from '../../../../hooks/useAttachments';
8
+ import { DragPreviewContextProvider } from '../context/DragPreviewContext';
9
+ import { MultiFlyoutContextProvider } from '../context/MultiFlyoutContext';
10
+
11
+ import { AttachmentsToolbarButton } from './AttachmentsToolbarButton';
12
+
13
+ const TOOLBAR_BUTTON_ID = 'attachments-toolbar-button-trigger';
14
+ const FLYOUT_CONTENT_ID = 'attachments-flyout-content';
15
+ const TOOLTIP_ID = 'tooltip';
16
+
17
+ const TEST_FLYOUT_ID = 'flyout-id';
18
+ const ASSET_ID = 'attachments';
19
+
20
+ const STUB_WITH_THREE_ASSETS = getAppBridgeBlockStub({
21
+ blockId: 2,
22
+ blockAssets: { [ASSET_ID]: [AssetDummy.with(1), AssetDummy.with(2), AssetDummy.with(3)] },
23
+ editorState: true,
24
+ });
25
+
26
+ /**
27
+ * @vitest-environment happy-dom
28
+ */
29
+
30
+ describe('AttachmentsToolbarButton', () => {
31
+ beforeAll(() => {
32
+ vi.stubGlobal(
33
+ 'Worker',
34
+ class Worker {
35
+ constructor() {}
36
+ addEventListener() {}
37
+ terminate() {}
38
+ },
39
+ );
40
+ });
41
+ it('should disable tooltip and hide flyout when item is in drag preview context', async () => {
42
+ const { getByTestId, queryByTestId } = render(
43
+ <MultiFlyoutContextProvider openFlyoutIds={[TEST_FLYOUT_ID]} setOpenFlyoutIds={vi.fn()}>
44
+ <DragPreviewContextProvider isDragPreview>
45
+ <AttachmentsProvider appBridge={STUB_WITH_THREE_ASSETS} assetId={ASSET_ID}>
46
+ <AttachmentsToolbarButton flyoutId={TEST_FLYOUT_ID} />
47
+ </AttachmentsProvider>
48
+ </DragPreviewContextProvider>
49
+ </MultiFlyoutContextProvider>,
50
+ );
51
+
52
+ expect(getByTestId(TOOLTIP_ID)).toHaveClass('tw-opacity-0');
53
+
54
+ getByTestId(TOOLBAR_BUTTON_ID).focus();
55
+
56
+ await waitFor(() => {
57
+ expect(getByTestId(TOOLTIP_ID)).toHaveClass('tw-opacity-0');
58
+ expect(queryByTestId(FLYOUT_CONTENT_ID)).toBeNull();
59
+ });
60
+ });
61
+
62
+ it('should open flyout onClick', async () => {
63
+ const setOpenFlyoutIdsStub = vi.fn();
64
+ const { getByTestId } = render(
65
+ <MultiFlyoutContextProvider openFlyoutIds={[]} setOpenFlyoutIds={setOpenFlyoutIdsStub}>
66
+ <DragPreviewContextProvider isDragPreview>
67
+ <AttachmentsProvider appBridge={STUB_WITH_THREE_ASSETS} assetId={ASSET_ID}>
68
+ <AttachmentsToolbarButton flyoutId={TEST_FLYOUT_ID} />
69
+ </AttachmentsProvider>
70
+ </DragPreviewContextProvider>
71
+ </MultiFlyoutContextProvider>,
72
+ );
73
+
74
+ await fireEvent.click(getByTestId(TOOLBAR_BUTTON_ID));
75
+
76
+ expect(setOpenFlyoutIdsStub).toHaveBeenCalledOnce();
77
+ const dispatchedStateResult = setOpenFlyoutIdsStub.mock.lastCall[0]([]);
78
+ expect(dispatchedStateResult).toEqual([TEST_FLYOUT_ID]);
79
+ });
80
+
81
+ it('should open tooltip when item is focused', async () => {
82
+ const { getByTestId } = render(
83
+ <AttachmentsProvider appBridge={STUB_WITH_THREE_ASSETS} assetId={ASSET_ID}>
84
+ <AttachmentsToolbarButton />
85
+ </AttachmentsProvider>,
86
+ );
87
+
88
+ expect(getByTestId(TOOLTIP_ID)).toHaveClass('tw-opacity-0');
89
+
90
+ getByTestId(TOOLTIP_ID).focus();
91
+
92
+ await waitFor(() => {
93
+ expect(getByTestId(TOOLTIP_ID)).not.toHaveClass('tw-opacity-0');
94
+ });
95
+ });
96
+ });