import SiteTemplates from '../organisms/site-templates';
import { AddNewButton, Grid } from '@elementor/app-ui';
import useFeatureLock from 'elementor-pro-app/hooks/use-feature-lock';
export default function Templates() {
const { isLocked, ConnectButton } = useFeatureLock( 'site-editor' );
return (
{ __( 'Your Site\'s Global Parts', 'elementor-pro' ) }
{
isLocked
?
:
}
);
}
DigitalOcean
import { useContentHighlight } from '@draft/hooks/useContentHighlight';
import { store as blockEditorStore } from '@wordpress/block-editor';
import { createBlock, pasteHandler } from '@wordpress/blocks';
import {
__experimentalDivider as Divider,
MenuGroup,
MenuItem,
} from '@wordpress/components';
import { dispatch, select, useDispatch, useSelect } from '@wordpress/data';
import { useEffect } from '@wordpress/element';
import { __, isRTL } from '@wordpress/i18n';
import {
addSubmenu,
Icon,
insertAfter,
replace,
rotateLeft,
trash,
} from '@wordpress/icons';
export const InsertMenu = ({
prompt,
completion,
loading,
setPrompt,
setInputText,
}) => {
const { toggleHighlight, toggleInsertionPoint } = useContentHighlight();
const { insertBlocks, replaceBlocks } = useDispatch(blockEditorStore);
const {
getSelectedBlock,
getSelectedBlockClientIds,
getBlockRootClientId,
getBlockIndex,
getBlock,
} = useSelect((select) => select(blockEditorStore), []);
const selectedBlock = getSelectedBlock();
const selectedBlockIds = getSelectedBlockClientIds();
const canReplaceContent = () => {
const firstBlock = selectedBlock
? selectedBlock
: getBlock(selectedBlockIds[0]);
if (!firstBlock) return false;
// If it's a header or a p, we can replace the content
// TODO: support more?
const unsupported = ['core/list-item', 'core/button'];
if (unsupported.includes(firstBlock?.name)) {
// Can we support the same block?
const blocks = plainTextToBlocks(completion);
return blocks[0]?.name === firstBlock?.name;
}
return true;
};
const canInsertAfter = () => {
const firstBlock = selectedBlock
? selectedBlock
: getBlock(selectedBlockIds[0]);
if (!firstBlock) return true;
// TODO: more? or should we go up to the parent?
const unsupported = ['core/list-item', 'core/button'];
return !unsupported.includes(firstBlock?.name);
};
const plainTextToBlocks = (plainText) => {
const blocks = pasteHandler({ plainText: plainText });
if (!Array.isArray(blocks)) {
return [createBlock('core/paragraph', { content: blocks })];
}
return blocks;
};
const insertCompletion = async ({ replaceContent = false, position }) => {
setPrompt({ text: '', promptType: '', systemMessageKey: '' });
const targetBlockId = selectedBlock
? selectedBlock?.clientId
: selectedBlockIds[0];
const targetBlock = getBlock(targetBlockId);
const renderingModes =
select('core/preferences').get('core', 'renderingModes') || {};
const currentTheme = select('core').getCurrentTheme()?.stylesheet;
const isTemplateShown =
renderingModes?.[currentTheme]?.page === 'template-locked';
const { set: setPreference } = dispatch('core/preferences');
const setRenderingMode = (mode) =>
setPreference('core', 'renderingModes', {
...renderingModes,
[currentTheme]: { ...(renderingModes[currentTheme] || {}), page: mode },
});
const blocks = plainTextToBlocks(completion);
try {
if (!targetBlockId || position === 'end') {
if (isTemplateShown) {
setRenderingMode('post-only');
await new Promise((resolve) => requestAnimationFrame(resolve));
}
insertBlocks(blocks);
return;
}
if (position === 'top') {
if (isTemplateShown) {
setRenderingMode('post-only');
await new Promise((resolve) => requestAnimationFrame(resolve));
}
insertBlocks(blocks, 0);
return;
}
} finally {
if (isTemplateShown) setRenderingMode('template-locked');
}
const targetIsEmpty = targetBlock?.attributes?.content === '';
const parentBlockId = getBlockRootClientId(targetBlockId);
const blockIndex = getBlockIndex(selectedBlockIds.at(-1), parentBlockId);
if (!replaceContent && !targetIsEmpty) {
// Multiple blocks are selected, insert after
insertBlocks(blocks, blockIndex + 1, parentBlockId);
return;
}
const bothHaveContent = (one, two) =>
Object.hasOwn(one?.attributes, 'content') &&
Object.hasOwn(two?.attributes, 'content');
// If both have content, and it's only one block, they can be merged
const mergeable =
blocks.length === 1 && bothHaveContent(targetBlock, blocks[0]);
// Apply formatting to all the blocks
const formattedBlocks = blocks.map((incomingBlock) => ({
...incomingBlock,
name: mergeable ? targetBlock.name : incomingBlock.name,
attributes: {
...targetBlock.attributes,
content:
// If they both have content, they can merge and give it to the incoing block
// otherwise just default to the existing block content
bothHaveContent(incomingBlock, targetBlock)
? incomingBlock?.attributes?.content
: incomingBlock?.attributes?.content,
},
}));
// TODO: some blocks are harder to replace, like list items
// Should we climb up to the parent in this case?
// See notes in canReplaceContent() above
replaceBlocks(selectedBlockIds, formattedBlocks);
};
const discard = () => {
setInputText('');
setPrompt({ text: '', promptType: '', systemMessageKey: '' });
};
const retry = () => {
setInputText('');
setPrompt({ text: '', promptType: '', systemMessageKey: '' });
setTimeout(() => setPrompt(prompt));
};
useEffect(() => {
return () => {
toggleHighlight(selectedBlockIds, { isHighlighted: false });
};
}, [selectedBlockIds, toggleHighlight]);
return (
);
};
"use strict";(self.webpackChunkelementor=self.webpackChunkelementor||[]).push([[5793],{65793:e=>{e.exports={}}}]);/*! elementor-pro - v3.33.0 - 11-11-2025 */
.e-lottie__container{display:inline-block;max-width:var(--lottie-container-max-width);opacity:var(--lottie-container-opacity);width:var(--lottie-container-width)}.e-lottie__container:hover{opacity:var(--lottie-container-opacity-hover);transition-duration:var(--lottie-container-transition-duration-hover)}.e-lottie__container svg,.e-lottie__container svg *{transition:none!important}.e-lottie__caption{color:var(--caption-color);margin-top:var(--caption-margin-top);text-align:var(--caption-text-align)}
Uydu Yayını « Room Features « Dadak Thermal
@keyframes elementor-animation-bob{0%{transform:translateY(-8px)}50%{transform:translateY(-4px)}100%{transform:translateY(-8px)}}@keyframes elementor-animation-bob-float{100%{transform:translateY(-8px)}}.elementor-animation-bob:active,.elementor-animation-bob:focus,.elementor-animation-bob:hover{animation-name:elementor-animation-bob-float,elementor-animation-bob;animation-duration:.3s,1.5s;animation-delay:0s,.3s;animation-timing-function:ease-out,ease-in-out;animation-iteration-count:1,infinite;animation-fill-mode:forwards;animation-direction:normal,alternate}