').append(selectedText).html();
// Also select the tag
if(text.nodeType === Node.TEXT_NODE){
text = text.parentNode;
}
if (text.innerHTML === selectedText && text != t.editor[0]) {
var ele = jQuery(text);
if('tag' in btn){
// Replace tag
}else if('style' in btn){
var style = {};
style[btn.style] = value;
ele.css(style);
}else if('atts' in btn){
// Add attribute or toggle the element
}
} else {
// TODO for toggle tags and add tags
var html = jQuery('
' + selectedText + '');
// Remove style from all childrend
var style = {};
style[btn.style] = '';
html.find('[style]').css(style);
// TODO: remove span element that have no atts
var node = html[0];
var firstInsertedNode = node.firstChild;
var lastInsertedNode = node.lastChild;
t.range.deleteContents();
t.range.insertNode(node);
if(firstInsertedNode) {
t.range.setStartBefore(firstInsertedNode);
t.range.setEndAfter(lastInsertedNode);
}
// Is previous element empty?
var prev = jQuery(node).prev();
if( prev.length > 0 && prev.is(':empty') ){
prev.remove();
}
}
sel.removeAllRanges();
sel.addRange(t.range);
}
formatBlock(value){
var t = this,
format = t.currentFormat,
btn = t.handlers[format],
startNode = t.range.startContainer,
endNode = t.range.endContainer;
if( startNode.nodeType == Node.TEXT_NODE && startNode.parentNode != t.editor[0] ){
startNode = startNode.parentNode;
}
if( endNode.nodeType == Node.TEXT_NODE && endNode.parentNode != t.editor[0] ){
endNode = endNode.parentNode;
}
// TODO: only for seleced content
// Wrap text nodes in span for easier processing
t.editor.contents().filter(function () {
return this.nodeType === 3 && this.nodeValue.trim().length > 0;
}).wrap('
');
var isLineEnd = function(lEle){
return lEle == null || lEle.nodeName == 'BR' || t.isline(lEle);
}
var wrapLine = function(pLine){
var pLine = jQuery(pLine),
lineFele,
lineEele,
finalP;
// Get Parent Element
if(pLine.parentsUntil(t.editor).length > 0){
pLine = pLine.parentsUntil(t.editor).last();
}
if(t.isline(pLine)){
return pLine;
}
// Get line first element
if(isLineEnd(pLine[0].previousSibling)){
lineFele = pLine;
}else{
lineFele = pLine.prevAll().filter(function(){
return isLineEnd(this.previousSibling);
}).first();
}
// Get line last element
if(isLineEnd(lineFele[0].nextSibling)){
lineEele = lineFele;
}else{
lineEele = lineFele.nextAll().filter(function(){
return isLineEnd(this.nextSibling);
}).first();
}
// Wrap all with p tag
if(lineFele.is(lineEele)){
finalP = lineFele.wrap('
').parent()
}else{
finalP = lineFele.nextUntil(lineEele.next()).addBack().wrapAll('
').parent();
}
finalP.next('br').remove();
return finalP;
}
// Get start block lavel elements
var $sNode = jQuery(t.blockNode(startNode));
if($sNode.is(t.editor)){
$sNode = wrapLine(startNode);
}
var $eNode = jQuery(t.blockNode(endNode));
if($eNode.is(t.editor)){
$eNode = wrapLine(endNode);
}
var $oldEle = $sNode;
if(! $sNode.is($eNode) ){
var findEnd = false;
var addElement = function(addEle){
if(addEle[0].nodeName == 'UL' || addEle[0].nodeName == 'OL') {
addEle.children().each(function(){
$oldEle = $oldEle.add(jQuery(this));
});
return;
}
$oldEle = $oldEle.add(addEle);
}
var wrapAllEle = function(nextEle){
if(nextEle.is($eNode) || nextEle.find($eNode).length > 0){
findEnd = true;
return;
}
if(nextEle.length < 1){
return;
}
if(!t.isline(nextEle[0])){
nextEle = wrapLine(nextEle);
}
addElement(nextEle);
wrapAllEle( nextEle.next() );
}
wrapAllEle($sNode.next());
// Is start Element have a another parent
var pars = $sNode.parentsUntil(t.editor);
pars.each(function(){
var $par = jQuery(this);
wrapAllEle($par.next());
});
if( pars.length > 0 ){
$sNode = pars.last();
}
var nextEnd = $sNode.nextAll().filter(function(){
return jQuery(this).is($eNode) || jQuery(this).find($eNode).length > 0;
}).first();
// Add elements
if( nextEnd.length > 0 ){
var $nextEle = $sNode.nextUntil(nextEnd);
$nextEle.each(function(){
var ulEle = jQuery(this);
if($oldEle.has(ulEle)) return;
addElement(ulEle);
});
}
// Add end element
if(nextEnd.length > 0 && !nextEnd.is($eNode) && (nextEnd[0].nodeName == 'UL' || nextEnd[0].nodeName == 'OL')){
nextEnd.children().each(function(){
var li = jQuery(this);
$oldEle = $oldEle.add(li);
if(li.is($eNode) || li.find($eNode).length > 0) return false;
});
}else{
$oldEle = $oldEle.add($eNode);
}
}
if('style' in btn){
var style = {};
style[btn.style] = value;
$oldEle.css(style);
}else if('atts' in btn){
// Add attribute or toggle the element
var attr = {};
attr[btn.atts] = value;
$oldEle.attr(attr);
}else{
// Replace tag
var tag = value.toLowerCase();
// need to find all block ele and replace this
$oldEle.each( function(){
var $cEle = jQuery(this);
if($cEle.is(t.editor)){
return;
}
// Is List element
if($cEle.css('display') == 'list-item'){
if( t.isline($cEle[0].firstChild)){
$cEle.children().each(function(){
var liChild = jQuery(this);
if(t.isline(liChild[0])){
t.replaceTag(liChild, tag, true);
return;
}
// TODO: Check and need to correct
liChild.wrap('<' + tag + '/>');
liChild.next('br').remove();
});
return
}
$cEle.contents().wrapAll('<' + tag + '/>');
return;
}
t.replaceTag($cEle, tag, true);
});
}
// Get rid of pen temporary span's
jQuery('[data-pts]', t.editor).contents().unwrap();
t.semanticCode();
t.restoreRange();
}
blockNode( node ){
var t = this;
while( !t.isline(node) && node != t.editor[0] ) {
node = node.parentNode;
}
return node;
}
isline(node){
if (node.nodeType !== Node.ELEMENT_NODE) return false;
if (node.childNodes.length === 0) return false; // Exclude embed blocks
var style = window.getComputedStyle(node);
return ['block', 'list-item'].indexOf(style.display) > -1;
}
replaceTag(ele, tag, copyAttr){
ele.wrap('<' + tag + '/>');
var par = ele.parent();
if(copyAttr){
jQuery.each(ele.prop('attributes'), function () {
par.attr(this.name, this.value);
});
}
ele.contents().unwrap();
return par;
}
semanticCode(){
var t = this;
t.semanticTag('b');
t.semanticTag('i');
t.semanticTag('s');
t.semanticTag('strike');
t.semanticTag('div', true);
}
semanticTag(oldTag, copyAttributes){
var t = this;
var newTag;
if(t.semantic != null && typeof t.semantic === 'object' && t.semantic.hasOwnProperty(oldTag)){
newTag = t.semantic[oldTag];
} else if (t.DEFAULT_SEMANTIC_MAP.hasOwnProperty(oldTag)) {
newTag = t.DEFAULT_SEMANTIC_MAP[oldTag];
} else {
return;
}
jQuery(oldTag, t.editor).each(function () {
var $oldTag = jQuery(this);
if($oldTag.contents().length === 0) {
return false;
}
t.replaceTag($oldTag, newTag, copyAttributes);
});
}
addEvents(){
// Add Events
var t = this,
editor = t.editor,
ctrl = false,
debounceButtonStatus;
var showToolBar = function(){
var jEle = t.penHolder.children(':visible');
if(jEle.length < 1){
jEle = t.toolbar;
}
t.showPen(jEle);
};
// Save rage
editor.on('focusout', function(e){
if(t.destroyEd){
t.editor.removeClass('pagelayer-pen-focused');
t.range = null;
return;
}
t.saveRange();
});
// Prevent to hide toolbar
t.penHolder.on('mousedown', function(e){
// TODO: taget only require Element
t.destroyEd = false;
});
// On editor blur
editor.on('blur', function(){
if(!t.destroyEd){
return;
}
t.destroy();
});
editor.on('keydown', function(){
t.penHolder.hide();
});
editor.on('mousedown', function(){
if(t.editor.attr('contenteditable') == 'true'){
t.showPen();
}
});
editor.on('mouseup keyup keydown', function(e){
if ((!e.ctrlKey && !e.metaKey) || e.altKey) {
setTimeout(function () { // "hold on" to the ctrl key for 50ms
ctrl = false;
}, 50);
}
clearTimeout(debounceButtonStatus);
debounceButtonStatus = setTimeout(function () {
t.updateButtonStatus();
}, 50);
});
// Set focus on editor
editor.on('click', function(e){
if(t.editor.hasClass('pagelayer-pen-focused')){
return;
}
t.editor.attr('contenteditable', 'true');
t.editor.focus();
});
// Set focus on editor
editor.on('focus', function(){
t.destroyEd = true;
t.addToolbar();
t.showPen();
t.editor.addClass('pagelayer-pen-focused');
jQuery(window).unbind('scroll.penToobar');
jQuery(window).on('scroll.penToobar', showToolBar);
jQuery(document).unbind('mousemove.penToobar');
jQuery(document).on('mousemove.penToobar', showToolBar);
});
t.semanticCode();
}
destroy(){
var t = this;
//t.editor.attr('contenteditable', '');
t.penHolder.hide();
// Removing event listeners
jQuery(document).unbind('mousemove.penToobar');
jQuery(window).unbind('scroll.penToobar');
}
hasFocus(){
var t = this;
return (
t.doc.activeElement === t.editor ||
t.contains( t.editor[0], t.doc.activeElement)
);
}
contains(parent, descendant) {
try {
// Firefox inserts inaccessible nodes around video elements
descendant.parentNode; // eslint-disable-line no-unused-expressions
} catch (e) {
return false;
}
return parent.contains(descendant);
}
saveRange(){
var t = this,
selection = t.doc.getSelection();
t.range = null;
if (!selection || !selection.rangeCount) {
return;
}
var savedRange = t.range = selection.getRangeAt(0),
range = t.doc.createRange(),
rangeStart;
range.selectNodeContents(t.editor[0]);
range.setEnd(savedRange.startContainer, savedRange.startOffset);
rangeStart = (range + '').length;
t.metaRange = {
start: rangeStart,
end: rangeStart + (savedRange + '').length
};
}
restoreRange(){
var t = this,
metaRange = t.metaRange,
savedRange = t.range,
selection = t.doc.getSelection(),
range;
if(!savedRange){
return;
}
if(metaRange && metaRange.start !== metaRange.end){ // Algorithm from http://jsfiddle.net/WeWy7/3/
var charIndex = 0,
nodeStack = [t.editor[0]],
node,
foundStart = false,
stop = false;
range = t.doc.createRange();
while(!stop && (node = nodeStack.pop())){
if (node.nodeType === 3){
var nextCharIndex = charIndex + node.length;
if (!foundStart && metaRange.start >= charIndex && metaRange.start <= nextCharIndex) {
range.setStart(node, metaRange.start - charIndex);
foundStart = true;
}
if (foundStart && metaRange.end >= charIndex && metaRange.end <= nextCharIndex) {
range.setEnd(node, metaRange.end - charIndex);
stop = true;
}
charIndex = nextCharIndex;
} else {
var cn = node.childNodes,
i = cn.length;
while (i > 0) {
i -= 1;
nodeStack.push(cn[i]);
}
}
}
}
selection.removeAllRanges();
selection.addRange(range || savedRange);
}
getRange(){
var t = this;
var selection = t.doc.getSelection();
if (selection == null || selection.rangeCount <= 0) return null;
var range = selection.getRangeAt(0);
if(range == null) return null;
return range;
}
getRangeText(range){
return range + '';
}
focus(){
var t = this;
if(t.hasFocus()) return;
t.editor.click();
t.editor.focus();
t.restoreRange();
}
getBounds(range){
var rect = range.getBoundingClientRect();
return {
bottom: rect.top + rect.height,
height: rect.height,
left: rect.left,
right: rect.right,
top: rect.top,
width: 0
};
}
showPen(jEle){
var t = this;
jEle = jEle || jQuery(t.toolbar);
var toolBar = jQuery(t.penHolder);
var tooltipHeight = parseInt(toolBar.css('height'));
var range = null;
if(! t.hasFocus() && t.range != null){
range = t.range;
}else{
range = t.getRange();
}
if(range == null){
toolBar.hide();
return;
}
// Set left of toolbar
var editorOffset = t.editor[0].getBoundingClientRect();
var editorTop = editorOffset.top;
var editorLeft = editorOffset.left;
var editorbottom = editorTop + editorOffset.height - tooltipHeight;
var toolBarTop = editorTop - 10;
var bound = t.getBounds(range);
if(bound.height == 0 && bound.top == 0 && bound.left == 0){
toolBar.hide();
return;
}
var boundTop = bound.top - 15;
// Set top of toolbar
if( boundTop - tooltipHeight < 0 && bound.bottom > -5){
toolBarTop = bound.bottom + tooltipHeight + 15;
}else if( editorbottom - 30 < 0 ){
toolBarTop = editorbottom + 20;
}else if( toolBarTop - tooltipHeight < 0 ){
toolBarTop = tooltipHeight + 10;
}
// Show Toolbar
toolBar.children().hide();
toolBar.show();
jEle.show();
// Set top of toolbar
toolBar.css('top', toolBarTop);
// Set left of toobar
var docW = jQuery(window).width() - 10;
var toolW = toolBar.width();
var edW = t.editor.width();
if(toolW > edW){
editorLeft = editorLeft - (toolW - edW) / 2
}
toolBar.css('left', editorLeft+'px');
var tooltipLeft = toolBar.offset().left;
if(tooltipLeft < 0){
toolBar.css('left', '1px');
}
var toolRight = tooltipLeft + toolW;
if(docW < toolRight){
toolBar.css('left', tooltipLeft - (toolRight - docW)+'px');
}
}
getContent(){
var editor = this.editor;
var html = editor.html();
return html;
}
setContent(html){
var t = this;
html = html || '';
t.editor.html(html);
t.editor.trigger('input');
}
updateButtonStatus(){
var t = this,
toolbar = jQuery(t.toolbar),
tags = t.getTagsRecursive(t.doc.getSelection().focusNode),
activeClasses = 'pagelayer-pen-active';
jQuery('.' + activeClasses, toolbar).removeClass(activeClasses);
jQuery.each(tags, function (i, tag){
var btnName;
if(pagelayer_is_string(tag)){
btnName = t.tagToButton[tag.toLowerCase()];
}else{
btnName = t.tagToButton[Object.keys(tag)[0].toLowerCase()]
}
var $btn = jQuery('[data-format="'+btnName+'"]', toolbar);
if($btn.length < 1){
return;
}
if($btn.find('.pagelayer-pen-picker-label').length > 0){
$btn.find('.pagelayer-pen-picker-label').addClass(activeClasses);
return;
}
$btn.addClass(activeClasses);
});
}
getTagsRecursive(element, tags) {
var t = this;
var jEle = jQuery(element);
tags = tags || (element && element.tagName ? [element.tagName] : []);
if (element && element.parentNode) {
element = element.parentNode;
} else {
return tags;
}
var tag = element.tagName;
// Is this editor
if (tag === 'DIV') {
return tags;
}
// TODO: for all block element
if (tag === 'P' && element.style.textAlign !== '') {
tags.push(element.style.textAlign);
}
jQuery.each(t.tagHandlers, function (i, tagHandler) {
tags = tags.concat(tagHandler(element, t));
});
tags.push(tag);
var styles = jEle.attr('style');
if(!pagelayer_empty(styles)){
var styles = styles.split(';');
jQuery.each(styles, function(i, style){
style = style.split(':');
var ss = String(style[0]).trim();
var vv = String(style[1]).trim();
if(pagelayer_empty(ss) || ss in tags && !pagelayer_empty(tags[ss])){
return;
}
var obj = {};
obj[ss] = vv;
tags.push(obj);
});
}
return t.getTagsRecursive(element, tags).filter(function (tag) {
return tag != null;
});
}
buildDropdown(select){
var t = this;
var fixIcon = '';
select = jQuery(select);
var format = select.data('format');
var selAtts = '';
var options = '';
var optId = `pagelayer-pen-picker-options-${t.optionsCounter}`;
t.optionsCounter += 1;
Array.from(select[0].attributes).forEach(item => {
selAtts += ' '+item.name+'="'+ item.value +'"';
});
Array.from(select[0].options).forEach(option => {
var attrs = '';
var val = '';
var itemInner = '';
if(option.hasAttribute('value')){
val = option.getAttribute('value');
attrs += ' data-value="'+val+'"';
}
if(option.textContent){
attrs += ' data-label="'+option.textContent+'"';
}
// Set icon
if('icon' in t.handlers[format] && typeof t.handlers[format]['icon'] == 'object' && !pagelayer_empty(t.handlers[format]['icon'][val])){
itemInner = t.handlers[format]['icon'][val];
}
options += `
${itemInner}`;
});
if('fixIcon' in t.handlers[format]){
fixIcon = t.handlers[format]['fixIcon'];
}
var customInpute = '';
if('customInpute' in t.handlers[format] && !pagelayer_empty(t.handlers[format]['customInpute'])){
customInpute = '
';
}
var container = jQuery(`
${fixIcon}
${options}
${customInpute}
`);
container.addClass('pagelayer-pen-picker');
select.before(container);
select.hide();
var close = function(cEle){
cEle.removeClass('pagelayer-pen-expanded');
cEle.find('.pagelayer-pen-picker-label').attr('aria-expanded', 'false');
cEle.find('.pagelayer-pen-picker-options').attr('aria-hidden', 'true');
}
var selectItem = function(item, trigger = false){
var selected = container.find('.pagelayer-pen-selected');
var label = container.find('.pagelayer-pen-picker-label');
var val = '';
if (item === selected) return;
if (selected != null) {
selected.removeClass('pagelayer-pen-selected');
}
if(item == null) return;
item.classList.add('pagelayer-pen-selected');
select.selectedIndex = Array.from(item.parentNode.children).indexOf(
item,
);
if (item.hasAttribute('data-value')) {
val = item.getAttribute('data-value');
label.attr('data-value', val);
} else {
label.attr('data-value', val);
}
if (item.hasAttribute('data-label')) {
label.attr('data-label', item.getAttribute('data-label'));
} else {
label.attr('data-label', '');
}
if(!fixIcon){
label.html(item.innerHTML);
}
if(trigger) {
select.val(val);
select.trigger('change');
close(container);
}
}
var toggleAriaAttribute = function(element, attribute) {
element.setAttribute(
attribute,
!(element.getAttribute(attribute) === 'true'),
);
}
var togglePicker = function() {
container.toggleClass('pagelayer-pen-expanded');
// Toggle aria-expanded and aria-hidden to make the picker accessible
toggleAriaAttribute(container.find('.pagelayer-pen-picker-label')[0], 'aria-expanded');
toggleAriaAttribute(container.find('.pagelayer-pen-picker-options')[0], 'aria-hidden');
}
container.find('.pagelayer-pen-picker-item').on('click', function(){
selectItem(this, true);
close(container);
});
container.find('.pagelayer-pen-picker-label').on('click', function(){
togglePicker();
});
container.find('.pagelayer-pen-custom-input').on('focusout keydown', function(e){
if(e.type == 'keydown' && e.keyCode != 13){
return;
}
e.preventDefault();
var val = jQuery(this).val();
if(pagelayer_empty(val)){
return;
}
var opt = select.find('option.pagelayer-pen-custom-value');
if(opt.length < 1){
select.append('
');
opt = select.find('option.pagelayer-pen-custom-value');
}
opt.val(val);
select.val(val);
select.trigger('change');
close(container);
});
jQuery(t.toolbar).on('mousedown', function(e){
var tEle = jQuery(this);
var target = jQuery(e.target);
var tPicker = target.closest('.pagelayer-pen-picker');
if(target.closest('.pagelayer-pen-picker-item').length > 0) return;
tEle.find('.pagelayer-pen-picker.pagelayer-pen-expanded').each(function(){
var picker = jQuery(this);
if(tPicker.length > 0 && tPicker.is(picker))return;
close(picker);
});
});
// TODO need to correct this function update the select
container.on('update', function(){
var item = container.find('.pagelayer-pen-selected');
if(item.length < 1){
item = container.find('.pagelayer-pen-picker-item').first();
}
selectItem(item[0]);
});
container.trigger('update');
return container;
}
buildColorBtnHandler(item){
var t = this;
var select = t.buildDropdown(item);
var format = select.data('format');
// Set color
select.find('.pagelayer-pen-picker-item').each(function(){
var opt = jQuery(this);
var color = opt.data('value');
opt.css({'background': color});
// TODO remove this and add on selecttion
opt.on('click', function(){
if(format == 'color'){
opt.closest('.pagelayer-pen-picker-label').css({'text-color': color});
}else{
opt.closest('.pagelayer-pen-picker-label').css({'background-color': color});
}
});
});
}
buildfontBtnHandler(item){
var t = this;
var select = t.buildDropdown(item);
jQuery(item).on('change', function(){
pagelayer_link_font_family(jQuery(this));
});
}
setLinkHandler(){
var t = this,
documentSelection = t.doc.getSelection(),
node = documentSelection.focusNode,
text = new XMLSerializer().serializeToString(documentSelection.getRangeAt(0).cloneContents()),
url = '',
linkBtn = 'Link',
unlinkBtn = 'Cancel';
while (['A', 'DIV'].indexOf(node.nodeName) < 0) {
node = node.parentNode;
}
if(node && node.nodeName === 'A'){
var $a = jQuery(node);
url = $a.attr('href');
}
if(!pagelayer_empty(url)){
linkBtn = 'Update';
unlinkBtn = 'Unlink';
}
t.saveRange();
var tooltip = this.addContainer('pagelayer-pen-link-tooltip');
t.linkTooltip = tooltip;
var html = '
'+linkBtn+''+unlinkBtn+'';
tooltip.html(html);
var input = tooltip.find('input[name="url"]');
// Keep saving old range
var metaRange = t.metaRange;
var savedRange = t.range;
var restoreRange = function(){
t.metaRange = metaRange;
t.range = savedRange;
t.restoreRange();
}
t.linkTooltip.find('.pagelayer-pen-link-btn').on('click', function(){
var url = input.val();
restoreRange();
t.execCmd('createLink', url, true );
t.editor.trigger('input');
t.showPen();
});
t.linkTooltip.find('.pagelayer-pen-unlink-btn').on('click', function(){
restoreRange();
if(unlinkBtn == 'Unlink'){
t.execCmd('unlink', undefined, undefined, true);
}
t.showPen();
});
t.showPen(t.linkTooltip);
}
imageBtnHandler(){
var t = this;
t.destroyEd = false;
t.destroy();
var frame = pagelayer_select_frame('image');
// On select update the stuff
frame.on({'select': function(){
var state = frame.state();
var url = '', alt = '', id = '';
// External URL
if('props' in state){
url = state.props.attributes.url;
alt = state.props.attributes.alt;
// Internal from gallery
}else{
var attachment = frame.state().get('selection').first().toJSON();
//console.log(attachment);
// Set the new and URL
url = attachment.url;
alt = attachment.alt;
id = attachment.id;
}
t.editor.click();
t.restoreRange();
t.execCmd('insertImage', url, false, true);
var $img = jQuery('img[src="' + url + '"]:not([alt])', t.editor);
$img.attr('alt', alt);
$img.attr('pl-media-id', id);
}
});
frame.open();
}
viewHTMLBtnHandler(param){
var t = this;
var html = t.getContent();
t.destroyEd = false;
t.destroy();
// Add Container
var HTMLviewer = jQuery('.pagelayer-pen-html-viewer');
if(HTMLviewer.length < 1){
jQuery('body').append('
'+
'
'+
'
'+
'
'+
''+
''+
'
'+
'
'+
'
');
HTMLviewer = jQuery('.pagelayer-pen-html-viewer');
}
HTMLviewer.find('.pagelayer-pen-html-area').val(html);
HTMLviewer.show();
HTMLviewer.find('.pagelayer-pen-html-btn-update').unbind('click');
HTMLviewer.find('.pagelayer-pen-html-btn-update').on('click', function(){
var html = HTMLviewer.find('.pagelayer-pen-html-area').val();
t.range = null;
t.editor.click();
t.setContent(html);
t.editor.trigger('focus');
HTMLviewer.hide();
});
HTMLviewer.find('.pagelayer-pen-html-btn-cancel').unbind('click');
HTMLviewer.find('.pagelayer-pen-html-btn-cancel').on('click', function(){
t.editor.click();
t.focus();
HTMLviewer.hide();
});
}
}
{"id":26746,"date":"2025-01-02T05:30:00","date_gmt":"2025-01-02T00:00:00","guid":{"rendered":"https:\/\/lawanalysiswithrahul.in\/?p=26746"},"modified":"2025-01-02T11:23:32","modified_gmt":"2025-01-02T05:53:32","slug":"the-rise-of-at-home-microneedling-devices-drpen-and-beyond","status":"publish","type":"post","link":"https:\/\/lawanalysiswithrahul.in\/2025\/01\/02\/the-rise-of-at-home-microneedling-devices-drpen-and-beyond\/","title":{"rendered":"The Rise of At-Home Microneedling Devices DrPen and Beyond"},"content":{"rendered":"
Microneedling has gained significant popularity in recent years as a non-invasive skincare treatment designed to improve skin texture, reduce the appearance of scars, and stimulate collagen production. Traditionally performed by dermatologists and licensed professionals, microneedling involves using a device with fine needles to create controlled micro-injuries in the skin, prompting the body\u2019s natural healing response. The advent of at-home microneedling devices, such as the Dr.Pen, has allowed users to achieve similar results in the comfort of their own homes.<\/p>\n
What is Microneedling?<\/h2>\n
Microneedling, also known as collagen induction therapy, is a minimally invasive cosmetic procedure that involves the use of fine needles to create thousands of tiny, controlled micro-injuries on the skin’s surface. This process triggers the body\u2019s natural healing response, stimulating collagen and elastin production, which are essential for maintaining youthful, healthy skin.<\/p>\n
The primary goal of microneedling is to improve the appearance of various skin issues, including fine lines, wrinkles, acne scars, large pores, and overall skin texture. As the skin heals, it becomes firmer, smoother, and more even-toned, leading to a rejuvenated and revitalized complexion.<\/p>\n
Microneedling can be performed in a professional setting by dermatologists or licensed aestheticians, who use specialized devices for precision and safety. However, with the advent of at-home microneedling devices like Dr. Pen, more individuals are exploring the benefits of this popular treatment in the comfort of their own homes.<\/p>\n
At-home microneedling kits typically feature smaller needle lengths than professional devices, <\/a> making them safer for personal use while still allowing users to reap the benefits of enhanced skin texture and improved product absorption. These devices often come with serums or topical treatments that can be applied before or after the procedure to boost results and nourish the skin.<\/p>\nIt’s essential to note that while at-home microneedling has gained popularity, proper research and adherence to safety protocols are crucial to avoid complications. Users should familiarize themselves with best practices, including sterilizing equipment, ensuring skin cleanliness, and following post-treatment care guidelines to achieve optimal results while minimizing risks.<\/p>\n
FAQ Section<\/h2>\n
FAQ Section: The Rise of At-Home Microneedling Devices: Dr.Pen and Beyond<\/p>\n
1. What is microneedling and how does it work?<\/p>\n
– Microneedling, also known as collagen induction therapy, is a minimally invasive procedure that involves using a device equipped with fine needles to create micro-injuries in the skin. These micro-injuries stimulate the body’s natural healing process, promoting collagen production and skin rejuvenation. At-home microneedling devices, like Dr.Pen, allow users to achieve similar benefits in the comfort of their own home.<\/p>\n
2. Are at-home microneedling devices safe?<\/p>\n
– Generally, at-home microneedling devices are safe when used as directed. However, it\u2019s crucial to follow the manufacturer\u2019s instructions carefully, as improper use can lead to skin irritation, infection, or adverse effects. Always start with a clean face and ensure that your device is sterilized. If you have skin concerns or conditions, consult with a dermatologist before starting any microneedling regimen.<\/p>\n
3. What are the benefits of using at-home microneedling devices?<\/p>\n
– At-home microneedling devices offer various benefits, including improved skin texture, reduction in the appearance of scars, fine lines, and wrinkles, enhanced product absorption (such as serums), and a boost in overall skin tone. Regular use can promote a radiant complexion and rejuvenated skin.<\/p>\n
4. How often should I use my at-home microneedling device?<\/p>\n
– Frequency can vary depending on the device and your skin\u2019s sensitivity. However, most experts recommend microneedling once every 4 to 6 weeks for optimal results. It is essential to give your skin enough time to heal between sessions.<\/p>\n
5. Can I use topical products before or after microneedling?<\/p>\n
– Yes, using topical products can enhance the results of microneedling. Applying a serum or hyaluronic acid immediately after your session can help hydrate and soothe the skin. However, avoid products that contain active ingredients such as retinol or acids right before or after microneedling, as they may cause irritation.<\/p>\n
6. What should I do after using my at-home microneedling device?<\/p>\n
– After microneedling, your skin may be red and sensitive, similar to a mild sunburn. It’s essential to avoid makeup, sun exposure, and vigorous exercise for 24 hours post-treatment. Hydrate your skin with a gentle moisturizer or serum and consider using sunscreen to protect your skin from UV rays during the healing process.<\/p>\n
7. Where can I buy at-home microneedling devices?<\/p>\n
– At-home microneedling devices like Dr.Pen can be purchased from various online retailers, beauty supply stores, and some dermatology clinics. Be sure to choose a reputable seller and check for customer reviews to ensure you\u2019re getting a quality product.<\/p>\n
8. Are results from at-home microneedling devices permanent?<\/p>\n
– The results of microneedling can be long-lasting, but they aren\u2019t permanent. Maintenance treatments are often recommended to preserve the effects, as collagen production reduces over time. Regular use of your microneedling device can help sustain your results and keep your skin looking vibrant.<\/p>\n
By addressing these common questions, consumers can feel more informed about using at-home microneedling devices, enabling them to make educated decisions on their skincare journeys.<\/p>\n
Alternatives to Dr. Pen<\/h2>\n
While Dr. Pen has become one of the most recognized names in the at-home microneedling space, there are several other alternatives that users might consider for their skincare routine. These devices and brands offer unique features, varying needle depths, and distinct designs to meet different skincare needs and preferences.<\/p>\n
1. Microneedle Pens: Brands like BeautyBio’s GloPRO and Morpheus8 provide excellent alternatives. BeautyBio\u2019s device is designed for both face and body treatment, using their patented microtip technology. Morpheus8 offers a deeper penetration into the dermis, delivering more results for those who need extra rejuvenation.<\/p>\n
2. Roller-Based Systems: SkinRoller and Koi Beauty offer microneedling rollers that utilize a manual approach. While they may not reach the same depth as the electronic devices, they are great for beginners or those looking for a gentler option. These rollers are also typically more affordable and easier to use, making them accessible for those just starting their microneedling journey.<\/p>\n
3. Automated Microneedlers: Products like Zenith Dermaroller and Stemi Pen are also gaining popularity. These automated devices claim to provide faster and more efficient treatments compared to manual options. They often come with adjustable needle depths, allowing you to customize your experience based on your skincare goals.<\/p>\n
4. Combination Devices: Some brands, such as iGrow, combine microneedling with LED light therapy, which can enhance skin healing and rejuvenation. This multifaceted approach may appeal to those looking to tackle multiple skin issues simultaneously.<\/p>\n
5. Affordability and Value Models: Brands like Trophy Skin and Dermaflash focus on providing good quality at a lower price point. These options usually come with solid educational resources and customer support, making them great options for beginners who want reliability without breaking the bank.<\/p>\n
When considering an alternative to Dr. Pen or any microneedling device, it\u2019s essential to take into account your skin type, desired results, and budget. Research and reviews can provide insights into performance and safety, ensuring you choose the best product for your at-home skincare routine. Regardless of the device you choose, always remember to prioritize skin health and perform adequate research to maximize the benefits of microneedling.<\/p>\n","protected":false},"excerpt":{"rendered":"
Microneedling has gained significant popularity in recent years as a non-invasive skincare treatment designed to improve skin texture, reduce the appearance of scars, and stimulate collagen production. Traditionally performed by dermatologists and licensed professionals, microneedling involves using a device with fine needles to create controlled micro-injuries in the skin, prompting the body\u2019s natural healing response. The advent of at-home microneedling […]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[232],"tags":[],"class_list":["post-26746","post","type-post","status-publish","format-standard","hentry","category-blog"],"yoast_head":"\n
The Rise of At-Home Microneedling Devices DrPen and Beyond - Law Analysis with Rahul<\/title>\n\n\n\n\n\n\n\n\n\n\n\n\n\t\n\t\n\t\n