@frontify/guideline-blocks-settings 0.32.1 → 0.32.2
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.
- package/CHANGELOG.md +40 -0
- package/dist/components/Attachments/AttachmentItem.es.js +128 -109
- package/dist/components/Attachments/AttachmentItem.es.js.map +1 -1
- package/dist/components/Attachments/Attachments.es.js +9 -1
- package/dist/components/Attachments/Attachments.es.js.map +1 -1
- package/dist/components/Attachments/AttachmentsButtonTrigger.es.js +17 -9
- package/dist/components/Attachments/AttachmentsButtonTrigger.es.js.map +1 -1
- package/dist/components/BlockItemWrapper/BlockItemWrapper.es.js +37 -39
- package/dist/components/BlockItemWrapper/BlockItemWrapper.es.js.map +1 -1
- package/dist/components/BlockItemWrapper/Toolbar/AttachmentsToolbarButton/AttachmentsToolbarButton.es.js +33 -0
- package/dist/components/BlockItemWrapper/Toolbar/AttachmentsToolbarButton/AttachmentsToolbarButton.es.js.map +1 -0
- package/dist/components/BlockItemWrapper/Toolbar/AttachmentsToolbarButton/AttachmentsToolbarButtonTrigger.es.js +26 -0
- package/dist/components/BlockItemWrapper/Toolbar/AttachmentsToolbarButton/AttachmentsToolbarButtonTrigger.es.js.map +1 -0
- package/dist/components/BlockItemWrapper/Toolbar/BaseToolbarButton.es.js +28 -0
- package/dist/components/BlockItemWrapper/Toolbar/BaseToolbarButton.es.js.map +1 -0
- package/dist/components/BlockItemWrapper/Toolbar/DragHandleToolbarButton/DragHandleToolbarButton.es.js +35 -0
- package/dist/components/BlockItemWrapper/Toolbar/DragHandleToolbarButton/DragHandleToolbarButton.es.js.map +1 -0
- package/dist/components/BlockItemWrapper/Toolbar/FlyoutToolbarButton/FlyoutToolbarButton.es.js +44 -0
- package/dist/components/BlockItemWrapper/Toolbar/FlyoutToolbarButton/FlyoutToolbarButton.es.js.map +1 -0
- package/dist/components/BlockItemWrapper/Toolbar/MenuToolbarButton/MenuToolbarButton.es.js +25 -0
- package/dist/components/BlockItemWrapper/Toolbar/MenuToolbarButton/MenuToolbarButton.es.js.map +1 -0
- package/dist/components/BlockItemWrapper/Toolbar/MenuToolbarButton/ToolbarFlyoutMenu.es.js +29 -0
- package/dist/components/BlockItemWrapper/Toolbar/MenuToolbarButton/ToolbarFlyoutMenu.es.js.map +1 -0
- package/dist/components/BlockItemWrapper/Toolbar/Toolbar.es.js +13 -110
- package/dist/components/BlockItemWrapper/Toolbar/Toolbar.es.js.map +1 -1
- package/dist/components/BlockItemWrapper/Toolbar/ToolbarButton/ToolbarButton.es.js +12 -0
- package/dist/components/BlockItemWrapper/Toolbar/ToolbarButton/ToolbarButton.es.js.map +1 -0
- package/dist/components/BlockItemWrapper/Toolbar/ToolbarButtonTooltip.es.js +20 -0
- package/dist/components/BlockItemWrapper/Toolbar/ToolbarButtonTooltip.es.js.map +1 -0
- package/dist/components/BlockItemWrapper/Toolbar/context/DragPreviewContext.es.js +11 -0
- package/dist/components/BlockItemWrapper/Toolbar/context/DragPreviewContext.es.js.map +1 -0
- package/dist/components/BlockItemWrapper/Toolbar/context/MultiFlyoutContext.es.js +18 -0
- package/dist/components/BlockItemWrapper/Toolbar/context/MultiFlyoutContext.es.js.map +1 -0
- package/dist/components/BlockItemWrapper/Toolbar/helpers.es.js +1 -1
- package/dist/components/BlockItemWrapper/Toolbar/helpers.es.js.map +1 -1
- package/dist/components/BlockItemWrapper/Toolbar/hooks/useMultiFlyoutState.es.js +18 -0
- package/dist/components/BlockItemWrapper/Toolbar/hooks/useMultiFlyoutState.es.js.map +1 -0
- package/dist/helpers/mapColorPalettes.es.js +20 -8
- package/dist/helpers/mapColorPalettes.es.js.map +1 -1
- package/dist/index.cjs.js +3 -3
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +57 -23
- package/dist/index.es.js +195 -185
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +3 -3
- package/dist/index.umd.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +2 -1
- package/setupTests.ts +7 -2
- package/src/components/Attachments/AttachmentItem.tsx +21 -0
- package/src/components/Attachments/Attachments.spec.ct.tsx +20 -1
- package/src/components/Attachments/Attachments.tsx +8 -4
- package/src/components/Attachments/AttachmentsButtonTrigger.tsx +11 -3
- package/src/components/Attachments/types.ts +4 -2
- package/src/components/BlockItemWrapper/BlockItemWrapper.tsx +47 -47
- package/src/components/BlockItemWrapper/Toolbar/AttachmentsToolbarButton/AttachmentsToolbarButton.spec.tsx +96 -0
- package/src/components/BlockItemWrapper/Toolbar/AttachmentsToolbarButton/AttachmentsToolbarButton.tsx +42 -0
- package/src/components/BlockItemWrapper/Toolbar/AttachmentsToolbarButton/AttachmentsToolbarButtonTrigger.spec.tsx +44 -0
- package/src/components/BlockItemWrapper/Toolbar/AttachmentsToolbarButton/AttachmentsToolbarButtonTrigger.tsx +24 -0
- package/src/components/BlockItemWrapper/Toolbar/AttachmentsToolbarButton/index.ts +3 -0
- package/src/components/BlockItemWrapper/Toolbar/BaseToolbarButton.spec.tsx +40 -0
- package/src/components/BlockItemWrapper/Toolbar/BaseToolbarButton.tsx +37 -0
- package/src/components/BlockItemWrapper/Toolbar/DragHandleToolbarButton/DragHandleToolbarButton.spec.tsx +89 -0
- package/src/components/BlockItemWrapper/Toolbar/DragHandleToolbarButton/DragHandleToolbarButton.tsx +39 -0
- package/src/components/BlockItemWrapper/Toolbar/DragHandleToolbarButton/index.ts +3 -0
- package/src/components/BlockItemWrapper/Toolbar/FlyoutToolbarButton/FlyoutToolbarButton.spec.tsx +140 -0
- package/src/components/BlockItemWrapper/Toolbar/FlyoutToolbarButton/FlyoutToolbarButton.tsx +61 -0
- package/src/components/BlockItemWrapper/Toolbar/FlyoutToolbarButton/index.ts +3 -0
- package/src/components/BlockItemWrapper/Toolbar/MenuToolbarButton/MenuToolbarButton.spec.tsx +77 -0
- package/src/components/BlockItemWrapper/Toolbar/MenuToolbarButton/MenuToolbarButton.tsx +30 -0
- package/src/components/BlockItemWrapper/Toolbar/MenuToolbarButton/ToolbarFlyoutMenu.spec.tsx +63 -0
- package/src/components/BlockItemWrapper/Toolbar/MenuToolbarButton/ToolbarFlyoutMenu.tsx +40 -0
- package/src/components/BlockItemWrapper/Toolbar/MenuToolbarButton/index.ts +3 -0
- package/src/components/BlockItemWrapper/Toolbar/Toolbar.spec.tsx +50 -53
- package/src/components/BlockItemWrapper/Toolbar/Toolbar.tsx +24 -126
- package/src/components/BlockItemWrapper/Toolbar/ToolbarButton/ToolbarButton.spec.tsx +70 -0
- package/src/components/BlockItemWrapper/Toolbar/ToolbarButton/ToolbarButton.tsx +19 -0
- package/src/components/BlockItemWrapper/Toolbar/ToolbarButton/index.ts +3 -0
- package/src/components/BlockItemWrapper/Toolbar/ToolbarButtonTooltip.tsx +25 -0
- package/src/components/BlockItemWrapper/Toolbar/context/DragPreviewContext.tsx +15 -0
- package/src/components/BlockItemWrapper/Toolbar/context/MultiFlyoutContext.tsx +25 -0
- package/src/components/BlockItemWrapper/Toolbar/helpers.ts +1 -1
- package/src/components/BlockItemWrapper/Toolbar/hooks/useMultiFlyoutState.spec.tsx +59 -0
- package/src/components/BlockItemWrapper/Toolbar/hooks/useMultiFlyoutState.ts +24 -0
- package/src/components/BlockItemWrapper/Toolbar/index.ts +4 -0
- package/src/components/BlockItemWrapper/Toolbar/types.ts +8 -27
- package/src/helpers/mapColorPalettes.spec.ts +14 -113
- package/src/helpers/mapColorPalettes.ts +51 -8
- package/src/hooks/useAttachments.spec.tsx +1 -0
- package/tsconfig.json +1 -1
- package/dist/components/BlockItemWrapper/Toolbar/ToolbarAttachments.es.js +0 -27
- package/dist/components/BlockItemWrapper/Toolbar/ToolbarAttachments.es.js.map +0 -1
- package/dist/components/BlockItemWrapper/Toolbar/ToolbarAttachmentsTrigger.es.js +0 -12
- package/dist/components/BlockItemWrapper/Toolbar/ToolbarAttachmentsTrigger.es.js.map +0 -1
- package/src/components/BlockItemWrapper/Toolbar/ToolbarAttachments.tsx +0 -29
- 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.
|
|
3
|
+
"version": "0.32.2",
|
|
4
4
|
"description": "Provides types and helpers for the guideline block development",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"main": "dist/index.umd.js",
|
|
@@ -25,6 +25,7 @@
|
|
|
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",
|
|
29
30
|
"@types/node": "^18.18.11",
|
|
30
31
|
"@types/react": "^18.2.38",
|
package/setupTests.ts
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
/* (c) Copyright Frontify Ltd., all rights reserved. */
|
|
2
2
|
|
|
3
|
-
import
|
|
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-
|
|
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
|
|
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 = ({
|
|
10
|
-
|
|
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
|
-
</
|
|
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) =>
|
|
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 & {
|
|
@@ -4,8 +4,10 @@ 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,
|
|
@@ -13,14 +15,13 @@ export const BlockItemWrapper = ({
|
|
|
13
15
|
toolbarItems,
|
|
14
16
|
shouldHideWrapper,
|
|
15
17
|
shouldHideComponent = false,
|
|
16
|
-
isDragging,
|
|
18
|
+
isDragging = false,
|
|
17
19
|
shouldFillContainer,
|
|
18
20
|
outlineOffset = 2,
|
|
19
21
|
shouldBeShown = false,
|
|
20
22
|
showAttachments = false,
|
|
21
23
|
}: BlockItemWrapperProps): ReactElement => {
|
|
22
|
-
const [
|
|
23
|
-
const [isAttachmentFlyoutOpen, setIsAttachmentFlyoutOpen] = useState(false);
|
|
24
|
+
const [openFlyoutIds, setOpenFlyoutIds] = useState<string[]>(shouldBeShown ? [DEFAULT_MENU_BUTTON_ID] : []);
|
|
24
25
|
const wrapperRef = useRef<HTMLDivElement>(null);
|
|
25
26
|
|
|
26
27
|
if (shouldHideWrapper) {
|
|
@@ -30,51 +31,50 @@ export const BlockItemWrapper = ({
|
|
|
30
31
|
|
|
31
32
|
const items = toolbarItems?.filter((item): item is ToolbarItem => item !== undefined);
|
|
32
33
|
|
|
33
|
-
const shouldToolbarBeVisible =
|
|
34
|
+
const shouldToolbarBeVisible = openFlyoutIds.length > 0 || shouldBeShown;
|
|
34
35
|
|
|
35
36
|
return (
|
|
36
|
-
<
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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,
|
|
37
|
+
<DragPreviewContextProvider isDragPreview={isDragging}>
|
|
38
|
+
<MultiFlyoutContextProvider openFlyoutIds={openFlyoutIds} setOpenFlyoutIds={setOpenFlyoutIds}>
|
|
39
|
+
<div
|
|
40
|
+
ref={wrapperRef}
|
|
41
|
+
data-test-id="block-item-wrapper"
|
|
42
|
+
style={{
|
|
43
|
+
outlineOffset,
|
|
67
44
|
}}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
45
|
+
className={joinClassNames([
|
|
46
|
+
'tw-relative tw-group tw-outline-1 tw-outline-box-selected-inverse',
|
|
47
|
+
shouldFillContainer && 'tw-flex-1 tw-h-full tw-w-full',
|
|
48
|
+
'hover:tw-outline focus-within:tw-outline',
|
|
49
|
+
shouldToolbarBeVisible && 'tw-outline',
|
|
50
|
+
shouldHideComponent && 'tw-opacity-0',
|
|
51
|
+
])}
|
|
52
|
+
>
|
|
53
|
+
<div
|
|
54
|
+
style={{
|
|
55
|
+
right: -1 - outlineOffset,
|
|
56
|
+
bottom: `calc(100% - ${2 + outlineOffset}px)`,
|
|
57
|
+
}}
|
|
58
|
+
className={joinClassNames([
|
|
59
|
+
'tw-pointer-events-none tw-absolute tw-bottom-[calc(100%-4px)] tw-right-[-3px] tw-w-full tw-opacity-0 tw-z-[60]',
|
|
60
|
+
'group-hover:tw-opacity-100 group-focus:tw-opacity-100 focus-within:tw-opacity-100',
|
|
61
|
+
'tw-flex tw-justify-end',
|
|
62
|
+
shouldToolbarBeVisible && 'tw-opacity-100',
|
|
63
|
+
])}
|
|
64
|
+
>
|
|
65
|
+
<Toolbar
|
|
66
|
+
flyoutMenu={{
|
|
67
|
+
items: toolbarFlyoutItems,
|
|
68
|
+
}}
|
|
69
|
+
attachments={{
|
|
70
|
+
isEnabled: showAttachments,
|
|
71
|
+
}}
|
|
72
|
+
items={items}
|
|
73
|
+
/>
|
|
74
|
+
</div>
|
|
75
|
+
{children}
|
|
76
|
+
</div>
|
|
77
|
+
</MultiFlyoutContextProvider>
|
|
78
|
+
</DragPreviewContextProvider>
|
|
79
79
|
);
|
|
80
80
|
};
|
|
@@ -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
|
+
});
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/* (c) Copyright Frontify Ltd., all rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { useMemoizedId } from '@frontify/fondue';
|
|
4
|
+
|
|
5
|
+
import { useAttachmentsContext } from '../../../../hooks';
|
|
6
|
+
import { Attachments } from '../../../Attachments';
|
|
7
|
+
import { useMultiFlyoutState } from '../hooks/useMultiFlyoutState';
|
|
8
|
+
|
|
9
|
+
import { AttachmentsToolbarButtonTrigger } from './AttachmentsToolbarButtonTrigger';
|
|
10
|
+
import { useDragPreviewContext } from '../context/DragPreviewContext';
|
|
11
|
+
|
|
12
|
+
export const DEFAULT_ATTACHMENTS_BUTTON_ID = 'attachments';
|
|
13
|
+
|
|
14
|
+
type AttachmentsToolbarButtonProps = { flyoutId?: string };
|
|
15
|
+
|
|
16
|
+
export const AttachmentsToolbarButton = ({
|
|
17
|
+
flyoutId = DEFAULT_ATTACHMENTS_BUTTON_ID,
|
|
18
|
+
}: AttachmentsToolbarButtonProps) => {
|
|
19
|
+
const id = useMemoizedId(flyoutId);
|
|
20
|
+
|
|
21
|
+
const { appBridge, attachments, onAttachmentsAdd, onAttachmentDelete, onAttachmentReplace, onAttachmentsSorted } =
|
|
22
|
+
useAttachmentsContext();
|
|
23
|
+
|
|
24
|
+
const { isOpen, onOpenChange } = useMultiFlyoutState(id);
|
|
25
|
+
const isDragPreview = useDragPreviewContext();
|
|
26
|
+
|
|
27
|
+
return (
|
|
28
|
+
<Attachments
|
|
29
|
+
onUpload={onAttachmentsAdd}
|
|
30
|
+
onDelete={onAttachmentDelete}
|
|
31
|
+
onReplaceWithBrowse={onAttachmentReplace}
|
|
32
|
+
onReplaceWithUpload={onAttachmentReplace}
|
|
33
|
+
onSorted={onAttachmentsSorted}
|
|
34
|
+
onBrowse={onAttachmentsAdd}
|
|
35
|
+
items={attachments}
|
|
36
|
+
appBridge={appBridge}
|
|
37
|
+
triggerComponent={AttachmentsToolbarButtonTrigger}
|
|
38
|
+
isOpen={isOpen && !isDragPreview}
|
|
39
|
+
onOpenChange={onOpenChange}
|
|
40
|
+
/>
|
|
41
|
+
);
|
|
42
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/* (c) Copyright Frontify Ltd., all rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { cleanup, fireEvent, render } from '@testing-library/react';
|
|
4
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
5
|
+
import { AttachmentsToolbarButtonTrigger } from './AttachmentsToolbarButtonTrigger';
|
|
6
|
+
import { MutableRefObject } from 'react';
|
|
7
|
+
|
|
8
|
+
const BUTTON_ID = 'attachments-toolbar-button-trigger';
|
|
9
|
+
|
|
10
|
+
describe('AttachmentsToolbarButtonTrigger', () => {
|
|
11
|
+
afterEach(() => {
|
|
12
|
+
cleanup();
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('should apply active styles when flyout is open', async () => {
|
|
16
|
+
const { getByTestId } = render(
|
|
17
|
+
<AttachmentsToolbarButtonTrigger
|
|
18
|
+
isFlyoutOpen
|
|
19
|
+
triggerProps={{}}
|
|
20
|
+
triggerRef={{} as MutableRefObject<HTMLButtonElement>}
|
|
21
|
+
>
|
|
22
|
+
Button
|
|
23
|
+
</AttachmentsToolbarButtonTrigger>,
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
expect(getByTestId(BUTTON_ID)).toHaveClass('tw-text-box-neutral-inverse-pressed');
|
|
27
|
+
});
|
|
28
|
+
it('should forward trigger props to button', async () => {
|
|
29
|
+
const onPointerUpStub = vi.fn();
|
|
30
|
+
|
|
31
|
+
const { getByTestId } = render(
|
|
32
|
+
<AttachmentsToolbarButtonTrigger
|
|
33
|
+
isFlyoutOpen={false}
|
|
34
|
+
triggerProps={{ onPointerUp: onPointerUpStub }}
|
|
35
|
+
triggerRef={{} as MutableRefObject<HTMLButtonElement>}
|
|
36
|
+
>
|
|
37
|
+
Button
|
|
38
|
+
</AttachmentsToolbarButtonTrigger>,
|
|
39
|
+
);
|
|
40
|
+
await fireEvent.pointerUp(getByTestId(BUTTON_ID));
|
|
41
|
+
|
|
42
|
+
expect(onPointerUpStub).toHaveBeenCalledOnce();
|
|
43
|
+
});
|
|
44
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/* (c) Copyright Frontify Ltd., all rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { IconCaretDown12, IconPaperclip16 } from '@frontify/fondue';
|
|
4
|
+
import { type AttachmentsTriggerProps } from '../../../Attachments/types';
|
|
5
|
+
|
|
6
|
+
import { BaseToolbarButton } from '../BaseToolbarButton';
|
|
7
|
+
|
|
8
|
+
export const AttachmentsToolbarButtonTrigger = ({
|
|
9
|
+
children,
|
|
10
|
+
isFlyoutOpen,
|
|
11
|
+
triggerProps,
|
|
12
|
+
triggerRef,
|
|
13
|
+
}: AttachmentsTriggerProps) => (
|
|
14
|
+
<BaseToolbarButton
|
|
15
|
+
forceActiveStyle={isFlyoutOpen}
|
|
16
|
+
data-test-id="attachments-toolbar-button-trigger"
|
|
17
|
+
{...triggerProps}
|
|
18
|
+
ref={triggerRef}
|
|
19
|
+
>
|
|
20
|
+
<IconPaperclip16 />
|
|
21
|
+
{children}
|
|
22
|
+
<IconCaretDown12 />
|
|
23
|
+
</BaseToolbarButton>
|
|
24
|
+
);
|