UNPKG

@sanity/visual-editing

Version:

[![npm stat](https://img.shields.io/npm/dm/@sanity/visual-editing.svg?style=flat-square)](https://npm-stat.com/charts.html?package=@sanity/visual-editing) [![npm version](https://img.shields.io/npm/v/@sanity/visual-editing.svg?style=flat-square)](https://

235 lines (232 loc) 8.64 kB
import { createContext, useContext } from "react"; import { jsx, jsxs } from "react/jsx-runtime"; import { c } from "react-compiler-runtime"; import { InsertMenu as InsertMenu$1 } from "@sanity/insert-menu"; import { Portal, Popover } from "@sanity/ui/_visual-editing"; import { css, styled } from "styled-components"; import { CubeIcon, StringIcon, NumberIcon, CheckmarkCircleIcon, BlockContentIcon, ThListIcon, ImageIcon } from "@sanity/icons"; function getNodeIcon(option) { if (!option) return /* @__PURE__ */ jsx(CubeIcon, {}); if (option.type === "string") return /* @__PURE__ */ jsx(StringIcon, {}); if (option.type === "number") return /* @__PURE__ */ jsx(NumberIcon, {}); const { value: node } = option; if ("icon" in option && option.icon) return /* @__PURE__ */ jsx("div", { dangerouslySetInnerHTML: { __html: option.icon } }); const { type } = node; if (type === "string") return /* @__PURE__ */ jsx(StringIcon, {}); if (type === "boolean") return /* @__PURE__ */ jsx(CheckmarkCircleIcon, {}); if (type === "number") return /* @__PURE__ */ jsx(NumberIcon, {}); if (type === "array" || type === "union") return (Array.isArray(node.of) ? node.of : [node.of]).some((n) => "name" in n && n.name === "block") ? /* @__PURE__ */ jsx(BlockContentIcon, {}) : /* @__PURE__ */ jsx(ThListIcon, {}); if (type === "object") { if (option.name === "image") return /* @__PURE__ */ jsx(ImageIcon, {}); if (option.name === "block") return /* @__PURE__ */ jsx(StringIcon, {}); } return /* @__PURE__ */ jsx(CubeIcon, {}); } const scrollBlockStyles = css` overflow-y: scroll; overscroll-behavior: contain; -ms-overflow-style: none; scrollbar-width: none; &:before { content: ''; display: block; height: calc(100% + 1px); position: absolute; top: 0; width: 100%; z-index: -1; } `, PortalContainer = styled.div` height: 100%; inset: 0; pointer-events: all; position: fixed; width: 100%; display: flex; justify-content: center; align-items: center; ${(props) => props.$blockScroll && scrollBlockStyles} `, PortalBackground = styled.div` background: transparent; height: 100%; inset: 0; position: absolute; width: 100%; `, PopoverPortal = (props) => { const $ = c(2); let t0; return $[0] !== props ? (t0 = /* @__PURE__ */ jsx(Portal, { children: /* @__PURE__ */ jsx(PopoverBackground, { ...props }) }), $[0] = props, $[1] = t0) : t0 = $[1], t0; }, PopoverBackground = (props) => { const $ = c(7), { children, onDismiss, setBoundaryElement, blockScroll: t0 } = props, blockScroll = t0 === void 0 ? !0 : t0, handleClick = _temp$1; let t1; $[0] !== onDismiss ? (t1 = /* @__PURE__ */ jsx(PortalBackground, { onMouseDownCapture: () => { onDismiss?.(); } }), $[0] = onDismiss, $[1] = t1) : t1 = $[1]; let t2; return $[2] !== blockScroll || $[3] !== children || $[4] !== setBoundaryElement || $[5] !== t1 ? (t2 = /* @__PURE__ */ jsxs(PortalContainer, { "data-sanity-overlay-element": !0, ref: setBoundaryElement, onClick: handleClick, $blockScroll: blockScroll, children: [ t1, children ] }), $[2] = blockScroll, $[3] = children, $[4] = setBoundaryElement, $[5] = t1, $[6] = t2) : t2 = $[6], t2; }; function _temp$1(event) { event.stopPropagation(); } function defineEvent(options) { return { type: "log", name: options.name, version: options.version, description: options.description, maxSampleRate: options.maxSampleRate, schema: void 0 }; } const events = { "Visual Editing Drag Sequence Completed": defineEvent({ name: "Visual Editing Drag Sequence Completed", description: "An array is successfully reordered using drag and drop.", version: 1 }), "Visual Editing Drag Minimap Enabled": defineEvent({ name: "Visual Editing Drag Minimap Enabled", description: "The zoomed-out minimap view is enabled during a drag sequence.", version: 1 }), "Visual Editing Context Menu Item Removed": defineEvent({ name: "Visual Editing Context Menu Item Removed", description: "An item is removed using the Context Menu.", version: 1 }), "Visual Editing Context Menu Item Duplicated": defineEvent({ name: "Visual Editing Context Menu Item Duplicated", description: "An item is duplicated using the Context Menu.", version: 1 }), "Visual Editing Context Menu Item Moved": defineEvent({ name: "Visual Editing Context Menu Item Moved", description: "An item is moved using the Context Menu.", version: 1 }), "Visual Editing Context Menu Item Inserted": defineEvent({ name: "Visual Editing Context Menu Item Inserted", description: "An item is inserted using the Context Menu.", version: 1 }), "Visual Editing Insert Menu Item Inserted": defineEvent({ name: "Visual Editing Insert Menu Item Inserted", description: "An item is inserted using the Insert Menu.", version: 1 }), "Visual Editing Overlay Clicked": defineEvent({ name: "Visual Editing Overlay Clicked", description: "An Overlay is clicked.", version: 1 }) }, TelemetryContext = createContext(void 0); function useTelemetry() { const context = useContext(TelemetryContext); if (!context) throw new Error("Telemetry context is missing"); return context; } const labels = { "insert-menu.filter.all-items": "All", "insert-menu.search.no-results": "No results", "insert-menu.search.placeholder": "Filter types\u2026", "insert-menu.toggle-grid-view.tooltip": "Toggle grid view", "insert-menu.toggle-list-view.tooltip": "Toggle list view" }, InsertMenu = (props) => { const $ = c(11), { node, onSelect } = props; let t0; $[0] !== node.options?.insertMenu ? (t0 = node.options?.insertMenu || {}, $[0] = node.options?.insertMenu, $[1] = t0) : t0 = $[1]; const insertMenuOptions = t0; let t1; $[2] !== insertMenuOptions.views ? (t1 = insertMenuOptions.views?.map(_temp), $[2] = insertMenuOptions.views, $[3] = t1) : t1 = $[3]; const views = t1; let t2; $[4] !== node.of ? (t2 = node.of.map(_temp2), $[4] = node.of, $[5] = t2) : t2 = $[5]; let t3; return $[6] !== insertMenuOptions || $[7] !== onSelect || $[8] !== t2 || $[9] !== views ? (t3 = /* @__PURE__ */ jsx(InsertMenu$1, { ...insertMenuOptions, labels, schemaTypes: t2, onSelect, views }), $[6] = insertMenuOptions, $[7] = onSelect, $[8] = t2, $[9] = views, $[10] = t3) : t3 = $[10], t3; }, InsertMenuPopover = (props) => { const $ = c(11), { node, onDismiss, onSelect, referenceElement } = props; let t0; $[0] !== node || $[1] !== onSelect ? (t0 = /* @__PURE__ */ jsx(InsertMenu, { node, onSelect }), $[0] = node, $[1] = onSelect, $[2] = t0) : t0 = $[2]; const popoverContent = t0, width = (node.options?.insertMenu || {}).views?.some(_temp3) ? 0 : void 0; let t1; $[3] === Symbol.for("react.memo_cache_sentinel") ? (t1 = ["bottom"], $[3] = t1) : t1 = $[3]; let t2; $[4] !== popoverContent || $[5] !== referenceElement || $[6] !== width ? (t2 = /* @__PURE__ */ jsx(Popover, { animate: !0, constrainSize: !0, content: popoverContent, fallbackPlacements: t1, open: !0, placement: "top", preventOverflow: !0, referenceElement, width }), $[4] = popoverContent, $[5] = referenceElement, $[6] = width, $[7] = t2) : t2 = $[7]; let t3; return $[8] !== onDismiss || $[9] !== t2 ? (t3 = /* @__PURE__ */ jsx(PopoverPortal, { onDismiss, children: t2 }), $[8] = onDismiss, $[9] = t2, $[10] = t3) : t3 = $[10], t3; }; function _temp(view) { return view.name === "grid" ? { ...view, previewImageUrl: (name) => view.previewImageUrls?.[name] } : view; } function _temp2(type) { return { ...type, icon: getNodeIcon(type) }; } function _temp3(view) { return view.name === "grid"; } const PointerEvents = (t0) => { const $ = c(10); let children, rest, style; $[0] !== t0 ? ({ children, style, ...rest } = t0, $[0] = t0, $[1] = children, $[2] = rest, $[3] = style) : (children = $[1], rest = $[2], style = $[3]); let t1; $[4] !== style ? (t1 = { ...style, pointerEvents: "all" }, $[4] = style, $[5] = t1) : t1 = $[5]; let t2; return $[6] !== children || $[7] !== rest || $[8] !== t1 ? (t2 = /* @__PURE__ */ jsx("div", { style: t1, "data-sanity-overlay-element": !0, ...rest, children }), $[6] = children, $[7] = rest, $[8] = t1, $[9] = t2) : t2 = $[9], t2; }; export { InsertMenu, InsertMenuPopover, PointerEvents, PopoverBackground, PopoverPortal, TelemetryContext, events, getNodeIcon, useTelemetry }; //# sourceMappingURL=PointerEvents.js.map