From 06283e38b688ec22d85736edecf663b107519d28 Mon Sep 17 00:00:00 2001 From: Nikola Begedin Date: Tue, 21 Jun 2022 22:44:47 +0200 Subject: [PATCH] [REFACTOR] Extensible block - initial phase (#38) * [REFACTOR] Introduce common LiveBlock component * Remove unused code * Introduce common StaticBlock component * Update changelog * Fix incorrect block transform Any transform containing a space character ended up being applied too soon due to a "hack" space character being put into every new cell. * Add blank `.credo.exs` * Make ContentEditable less hacky Rely on building correct cells and selection in hook rather than backend placing in custom characters * Document ContentEditable.ts * Run build * Simplify spec * Revert page.spec * Fix tests * Revert block.scss --- .credo.exs | 1 + CHANGELOG.md | 6 + cypress/integration/page.spec.ts | 6 +- dist/index.css.map | 2 +- dist/index.js | 6 +- dist/index.js.map | 4 +- lib/philtre/block/code.ex | 13 +- lib/philtre/block/content_editable.ex | 63 ++++- lib/philtre/block/content_editable/cell.ex | 4 +- lib/philtre/block/table.ex | 13 +- lib/philtre/engine.ex | 43 +--- lib/philtre/live_block.ex | 28 +++ lib/philtre/serializer.ex | 24 +- lib/philtre/static_block.ex | 11 + lib/philtre/ui/page.ex | 23 +- lib/philtre/utils.ex | 3 - src/hooks/ContentEditable.ts | 253 ++++++++++++++++----- test/philtre/code_test.exs | 4 +- test/philtre/editor_test.exs | 20 +- test/philtre/table_test.exs | 4 +- 20 files changed, 344 insertions(+), 187 deletions(-) create mode 100644 .credo.exs create mode 100644 lib/philtre/live_block.ex create mode 100644 lib/philtre/static_block.ex diff --git a/.credo.exs b/.credo.exs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/.credo.exs @@ -0,0 +1 @@ + diff --git a/CHANGELOG.md b/CHANGELOG.md index 30b62b2..108a3fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ - [QA] Simplify Playground endpoint - [QA] Reorganize e2e tests around scopes +- [REFACTOR] Introduce common LiveBlock component +- [REFACTOR] Introduce common StaticBlock component +- [FIX] Transform being applied to soon due to placeholder space character in new cells +- [QA] Add blank `.credo.exs` +- [REFACTOR] Make ContentEditable less hacky +- [QA] Document ContentEditable ## 0.10.1 diff --git a/cypress/integration/page.spec.ts b/cypress/integration/page.spec.ts index 6dc520a..6659903 100644 --- a/cypress/integration/page.spec.ts +++ b/cypress/integration/page.spec.ts @@ -40,7 +40,7 @@ describe('ui.page', () => { }); // not the most robust of tests, as tab is achieved via custom plugin and - // typing withouth changing focus is not easily possible + // typing without changing focus is not easily possible it('can navigate focused blocks via tab and shift+tab', () => { visitNew(); section(0).focus().tab(); @@ -55,12 +55,12 @@ describe('ui.page', () => { block(1).type('{moveToEnd}{enter}'); block(2).should('exist'); section(2).should('have.attr', 'data-focused'); - block(2).type('{moveToEnd}bar{moveToStart}{backspace}'); + block(2).focus().type('bar').type('{moveToStart}').type('{backspace}'); section(1).should('have.attr', 'data-focused'); section(0).should('not.have.attr', 'data-focused'); - block(1).should('contain.text', 'paragraph. bar').tab({ shift: true }); + block(1).should('contain.text', 'paragraph.bar').tab({ shift: true }); section(1).should('not.have.attr', 'data-focused'); section(0).should('have.attr', 'data-focused'); }); diff --git a/dist/index.css.map b/dist/index.css.map index 8eba095..b6ebd8b 100644 --- a/dist/index.css.map +++ b/dist/index.css.map @@ -2,6 +2,6 @@ "version": 3, "sources": ["../node_modules/prismjs/themes/prism-okaidia.css", "../src/css/philtre.scss", "../src/css/page.scss", "../src/css/colors.scss", "../src/css/block.scss", "../src/css/code.scss", "../src/css/table.scss"], "sourcesContent": ["/**\n * okaidia theme for JavaScript, CSS and HTML\n * Loosely based on Monokai textmate theme by http://www.monokai.nl/\n * @author ocodia\n */\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tcolor: #f8f8f2;\n\tbackground: none;\n\ttext-shadow: 0 1px rgba(0, 0, 0, 0.3);\n\tfont-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\n\tfont-size: 1em;\n\ttext-align: left;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tword-wrap: normal;\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tpadding: 1em;\n\tmargin: .5em 0;\n\toverflow: auto;\n\tborder-radius: 0.3em;\n}\n\n:not(pre) > code[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tbackground: #272822;\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tpadding: .1em;\n\tborder-radius: .3em;\n\twhite-space: normal;\n}\n\n.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: #8292a2;\n}\n\n.token.punctuation {\n\tcolor: #f8f8f2;\n}\n\n.token.namespace {\n\topacity: .7;\n}\n\n.token.property,\n.token.tag,\n.token.constant,\n.token.symbol,\n.token.deleted {\n\tcolor: #f92672;\n}\n\n.token.boolean,\n.token.number {\n\tcolor: #ae81ff;\n}\n\n.token.selector,\n.token.attr-name,\n.token.string,\n.token.char,\n.token.builtin,\n.token.inserted {\n\tcolor: #a6e22e;\n}\n\n.token.operator,\n.token.entity,\n.token.url,\n.language-css .token.string,\n.style .token.string,\n.token.variable {\n\tcolor: #f8f8f2;\n}\n\n.token.atrule,\n.token.attr-value,\n.token.function,\n.token.class-name {\n\tcolor: #e6db74;\n}\n\n.token.keyword {\n\tcolor: #66d9ef;\n}\n\n.token.regex,\n.token.important {\n\tcolor: #fd971f;\n}\n\n.token.important,\n.token.bold {\n\tfont-weight: bold;\n}\n.token.italic {\n\tfont-style: italic;\n}\n\n.token.entity {\n\tcursor: help;\n}\n", null, null, null, null, null, null], - "mappings": "AAMA,6CAEC,cACA,gBACA,iCACA,8DACA,cACA,gBACA,gBACA,oBACA,kBACA,iBACA,gBAEA,gBACA,cACA,WAEA,qBACA,kBACA,iBACA,aAID,sBA/BA,0BAkCC,cAlCD,mBAsCA,uDAEC,mBAID,iCA5CA,gCA+CC,mBAGD,yDAIC,cAGD,mBACC,cAGD,iBACC,WAGD,wEAKC,cAGD,6BAEC,cAGD,0FAMC,cAGD,0GAMC,cAGD,kEAIC,cAGD,eACC,cAGD,8BAEC,cAGD,6BAEC,gBAED,cACC,kBAGD,cACC,YEzHD,cACE,gBAEA,aACA,sBACA,uBACA,SAEA,uBACE,aACA,WACA,+BACA,QAEA,wCACE,UAEA,WACA,kBACA,aACA,gCACA,QACA,mBACA,uBAEA,wBACA,4BAEA,+CACE,cACA,gBACA,YACA,aACA,kBACA,sBACA,aACA,mBACA,uBACA,eACA,WACA,YACA,iBDnCA,kBCsCA,wBACA,qCAEA,qDACE,mBACA,cAMJ,8CACE,UExDR,eHMQ,SGJN,eACA,YACA,aACA,oJHCM,aGCN,2BAEA,8BACE,qBAGF,iBACE,WAGF,qBACE,2BACA,mBAGF,8BACE,2BACA,mBAGF,kCACE,gBAGF,oCACE,kBAGF,gCACE,cACA,WAIJ,yBACE,cACA,iBACA,6BAGF,kBACE,sBACA,qBAGF,iBH9CQ,UINR,eACE,aACA,2BACA,oBACA,sBJEM,+BICN,mBACA,gBAEA,mIAIE,eAGF,4FJXM,mBIgBJ,8DACA,cACA,gBACA,gBACA,mBACA,uBACA,mBAGF,wCACE,UACA,kBACA,YACA,YACA,iBAEA,8CACE,aAGF,wDACE,qBC3CN,gBACE,gBACA,aACA,+BAII,wCACE,kBAEA,wEACE,kBACA,YACA,OACA,QAMR,8EAEE,kBAEA,wIACE,kBACA,QACA,MACA,SAIJ,kCACE,gBACA,YL5BI,aK+BJ,eAEA,qCAEA,wCACE,yBAGF,2CACE,yBACA,eAIJ,gDACE,mBAGF,6CACE,YACA,iBAGF,0CACE,gBAIJ,sBACE,iBACA,yBAEA,kDAEE,yBAGF,kDLpEM,UKwEJ,4DLxEI,mBK6EJ,oEACE,YL9EE,sBKiFF,aACA,oJACA,YACA,gBAKF,kCACE", + "mappings": "AAMA,6CAEC,cACA,gBACA,iCACA,8DACA,cACA,gBACA,gBACA,oBACA,kBACA,iBACA,gBAEA,gBACA,cACA,WAEA,qBACA,kBACA,iBACA,aAID,sBA/BA,0BAkCC,cAlCD,mBAsCA,uDAEC,mBAID,iCA5CA,gCA+CC,mBAGD,yDAIC,cAGD,mBACC,cAGD,iBACC,WAGD,wEAKC,cAGD,6BAEC,cAGD,0FAMC,cAGD,0GAMC,cAGD,kEAIC,cAGD,eACC,cAGD,8BAEC,cAGD,6BAEC,gBAED,cACC,kBAGD,cACC,YEzHD,cACE,gBAEA,aACA,sBACA,uBACA,SAEA,uBACE,aACA,WACA,+BACA,QAEA,wCACE,UAEA,WACA,kBACA,aACA,gCACA,QACA,mBACA,uBAEA,wBACA,4BAEA,+CACE,cACA,gBACA,YACA,aACA,kBACA,sBACA,aACA,mBACA,uBACA,eACA,WACA,YACA,iBDnCA,kBCsCA,wBACA,qCAEA,qDACE,mBACA,cAMJ,8CACE,UExDR,eHMQ,SGJN,eACA,YACA,aACA,oJHCM,aGCN,2BAEA,8BACE,qBAIF,iBACE,WAGF,qBACE,2BACA,mBAGF,8BACE,2BACA,mBAGF,kCACE,gBAGF,oCACE,kBAGF,gCACE,cACA,WAIJ,yBACE,cACA,iBACA,6BAGF,kBACE,sBACA,qBAGF,iBH/CQ,UINR,eACE,aACA,2BACA,oBACA,sBJEM,+BICN,mBACA,gBAEA,mIAIE,eAGF,4FJXM,mBIgBJ,8DACA,cACA,gBACA,gBACA,mBACA,uBACA,mBAGF,wCACE,UACA,kBACA,YACA,YACA,iBAEA,8CACE,aAGF,wDACE,qBC3CN,gBACE,gBACA,aACA,+BAII,wCACE,kBAEA,wEACE,kBACA,YACA,OACA,QAMR,8EAEE,kBAEA,wIACE,kBACA,QACA,MACA,SAIJ,kCACE,gBACA,YL5BI,aK+BJ,eAEA,qCAEA,wCACE,yBAGF,2CACE,yBACA,eAIJ,gDACE,mBAGF,6CACE,YACA,iBAGF,0CACE,gBAIJ,sBACE,iBACA,yBAEA,kDAEE,yBAGF,kDLpEM,UKwEJ,4DLxEI,mBK6EJ,oEACE,YL9EE,sBKiFF,aACA,oJACA,YACA,gBAKF,kCACE", "names": [] } diff --git a/dist/index.js b/dist/index.js index 1c9931d..345e416 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,7 +1,7 @@ -var de=Object.create;var Z=Object.defineProperty;var ge=Object.getOwnPropertyDescriptor;var fe=Object.getOwnPropertyNames;var pe=Object.getPrototypeOf,he=Object.prototype.hasOwnProperty;var me=(e,a)=>()=>(a||e((a={exports:{}}).exports,a),a.exports);var ve=(e,a,l,g)=>{if(a&&typeof a=="object"||typeof a=="function")for(let r of fe(a))!he.call(e,r)&&r!==l&&Z(e,r,{get:()=>a[r],enumerable:!(g=ge(a,r))||g.enumerable});return e};var be=(e,a,l)=>(l=e!=null?de(pe(e)):{},ve(a||!e||!e.__esModule?Z(l,"default",{value:e,enumerable:!0}):l,e));var G=me((Be,R)=>{var ye=typeof window<"u"?window:typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope?self:{};var u=function(e){var a=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,l=0,g={},r={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function n(t){return t instanceof p?new p(t.type,n(t.content),t.alias):Array.isArray(t)?t.map(n):t.replace(/&/g,"&").replace(/"u")return null;if("currentScript"in document&&1<2)return document.currentScript;try{throw new Error}catch(s){var n=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(s.stack)||[])[1];if(n){var t=document.getElementsByTagName("script");for(var i in t)if(t[i].src==n)return t[i]}return null}},isActive:function(n,t,i){for(var s="no-"+t;n;){var o=n.classList;if(o.contains(t))return!0;if(o.contains(s))return!1;n=n.parentElement}return!!i}},languages:{plain:g,plaintext:g,text:g,txt:g,extend:function(n,t){var i=r.util.clone(r.languages[n]);for(var s in t)i[s]=t[s];return i},insertBefore:function(n,t,i,s){s=s||r.languages;var o=s[n],d={};for(var f in o)if(o.hasOwnProperty(f)){if(f==t)for(var c in i)i.hasOwnProperty(c)&&(d[c]=i[c]);i.hasOwnProperty(f)||(d[f]=o[f])}var v=s[n];return s[n]=d,r.languages.DFS(r.languages,function(x,L){L===v&&x!=n&&(this[x]=d)}),d},DFS:function n(t,i,s,o){o=o||{};var d=r.util.objId;for(var f in t)if(t.hasOwnProperty(f)){i.call(t,f,t[f],s||f);var c=t[f],v=r.util.type(c);v==="Object"&&!o[d(c)]?(o[d(c)]=!0,n(c,i,null,o)):v==="Array"&&!o[d(c)]&&(o[d(c)]=!0,n(c,i,f,o))}}},plugins:{},highlightAll:function(n,t){r.highlightAllUnder(document,n,t)},highlightAllUnder:function(n,t,i){var s={callback:i,container:n,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};r.hooks.run("before-highlightall",s),s.elements=Array.prototype.slice.apply(s.container.querySelectorAll(s.selector)),r.hooks.run("before-all-elements-highlight",s);for(var o=0,d;d=s.elements[o++];)r.highlightElement(d,t===!0,s.callback)},highlightElement:function(n,t,i){var s=r.util.getLanguage(n),o=r.languages[s];r.util.setLanguage(n,s);var d=n.parentElement;d&&d.nodeName.toLowerCase()==="pre"&&r.util.setLanguage(d,s);var f=n.textContent,c={element:n,language:s,grammar:o,code:f};function v(L){c.highlightedCode=L,r.hooks.run("before-insert",c),c.element.innerHTML=c.highlightedCode,r.hooks.run("after-highlight",c),r.hooks.run("complete",c),i&&i.call(c.element)}if(r.hooks.run("before-sanity-check",c),d=c.element.parentElement,d&&d.nodeName.toLowerCase()==="pre"&&!d.hasAttribute("tabindex")&&d.setAttribute("tabindex","0"),!c.code){r.hooks.run("complete",c),i&&i.call(c.element);return}if(r.hooks.run("before-highlight",c),!c.grammar){v(r.util.encode(c.code));return}if(t&&e.Worker){var x=new Worker(r.filename);x.onmessage=function(L){v(L.data)},x.postMessage(JSON.stringify({language:c.language,code:c.code,immediateClose:!0}))}else v(r.highlight(c.code,c.grammar,c.language))},highlight:function(n,t,i){var s={code:n,grammar:t,language:i};if(r.hooks.run("before-tokenize",s),!s.grammar)throw new Error('The language "'+s.language+'" has no grammar.');return s.tokens=r.tokenize(s.code,s.grammar),r.hooks.run("after-tokenize",s),p.stringify(r.util.encode(s.tokens),s.language)},tokenize:function(n,t){var i=t.rest;if(i){for(var s in i)t[s]=i[s];delete t.rest}var o=new A;return k(o,o.head,n),F(n,o,t,o.head,0),C(o)},hooks:{all:{},add:function(n,t){var i=r.hooks.all;i[n]=i[n]||[],i[n].push(t)},run:function(n,t){var i=r.hooks.all[n];if(!(!i||!i.length))for(var s=0,o;o=i[s++];)o(t)}},Token:p};e.Prism=r;function p(n,t,i,s){this.type=n,this.content=t,this.alias=i,this.length=(s||"").length|0}p.stringify=function n(t,i){if(typeof t=="string")return t;if(Array.isArray(t)){var s="";return t.forEach(function(v){s+=n(v,i)}),s}var o={type:t.type,content:n(t.content,i),tag:"span",classes:["token",t.type],attributes:{},language:i},d=t.alias;d&&(Array.isArray(d)?Array.prototype.push.apply(o.classes,d):o.classes.push(d)),r.hooks.run("wrap",o);var f="";for(var c in o.attributes)f+=" "+c+'="'+(o.attributes[c]||"").replace(/"/g,""")+'"';return"<"+o.tag+' class="'+o.classes.join(" ")+'"'+f+">"+o.content+""};function m(n,t,i,s){n.lastIndex=t;var o=n.exec(i);if(o&&s&&o[1]){var d=o[1].length;o.index+=d,o[0]=o[0].slice(d)}return o}function F(n,t,i,s,o,d){for(var f in i)if(!(!i.hasOwnProperty(f)||!i[f])){var c=i[f];c=Array.isArray(c)?c:[c];for(var v=0;v=d.reach);T+=w.value.length,w=w.next){var $=w.value;if(t.length>n.length)return;if(!($ instanceof p)){var O=1,S;if(Y){if(S=m(j,T,n,X),!S||S.index>=n.length)break;var D=S.index,ue=S.index+S[0].length,_=T;for(_+=w.value.length;D>=_;)w=w.next,_+=w.value.length;if(_-=w.value.length,T=_,w.value instanceof p)continue;for(var M=w;M!==t.tail&&(_d.reach&&(d.reach=q);var P=w.prev;z&&(P=k(t,P,z),T+=z.length),H(t,P,O);var ce=new p(f,L?r.tokenize(I,L):I,oe,I);if(w=k(t,P,ce),V&&k(t,w,V),O>1){var N={cause:f+","+v,reach:q};F(n,t,i,w.prev,T,N),d&&N.reach>d.reach&&(d.reach=N.reach)}}}}}}function A(){var n={value:null,prev:null,next:null},t={value:null,prev:n,next:null};n.next=t,this.head=n,this.tail=t,this.length=0}function k(n,t,i){var s=t.next,o={value:i,prev:t,next:s};return t.next=o,s.prev=o,n.length++,o}function H(n,t,i){for(var s=t.next,o=0;o/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]};u.languages.markup.tag.inside["attr-value"].inside.entity=u.languages.markup.entity;u.languages.markup.doctype.inside["internal-subset"].inside=u.languages.markup;u.hooks.add("wrap",function(e){e.type==="entity"&&(e.attributes.title=e.content.replace(/&/,"&"))});Object.defineProperty(u.languages.markup.tag,"addInlined",{value:function(a,l){var g={};g["language-"+l]={pattern:/(^$)/i,lookbehind:!0,inside:u.languages[l]},g.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:g}};r["language-"+l]={pattern:/[\s\S]+/,inside:u.languages[l]};var p={};p[a]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return a}),"i"),lookbehind:!0,greedy:!0,inside:r},u.languages.insertBefore("markup","cdata",p)}});Object.defineProperty(u.languages.markup.tag,"addAttribute",{value:function(e,a){u.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[a,"language-"+a],inside:u.languages[a]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}});u.languages.html=u.languages.markup;u.languages.mathml=u.languages.markup;u.languages.svg=u.languages.markup;u.languages.xml=u.languages.extend("markup",{});u.languages.ssml=u.languages.xml;u.languages.atom=u.languages.xml;u.languages.rss=u.languages.xml;(function(e){var a=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+a.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+a.source+"$"),alias:"url"}}},selector:{pattern:RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|`+a.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:a,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var l=e.languages.markup;l&&(l.tag.addInlined("style","css"),l.tag.addAttribute("style","css"))})(u);u.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};u.languages.javascript=u.languages.extend("clike",{"class-name":[u.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+(/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source)+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/});u.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/;u.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:u.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:u.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:u.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:u.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:u.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/});u.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:u.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}});u.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}});u.languages.markup&&(u.languages.markup.tag.addInlined("script","javascript"),u.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript"));u.languages.js=u.languages.javascript;(function(){if(typeof u>"u"||typeof document>"u")return;Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var e="Loading\u2026",a=function(b,h){return"\u2716 Error "+b+" while fetching file: "+h},l="\u2716 Error: File does not exist or is empty",g={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},r="data-src-status",p="loading",m="loaded",F="failed",A="pre[data-src]:not(["+r+'="'+m+'"]):not(['+r+'="'+p+'"])';function k(b,h,y){var n=new XMLHttpRequest;n.open("GET",b,!0),n.onreadystatechange=function(){n.readyState==4&&(n.status<400&&n.responseText?h(n.responseText):n.status>=400?y(a(n.status,n.statusText)):y(l))},n.send(null)}function H(b){var h=/^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(b||"");if(h){var y=Number(h[1]),n=h[2],t=h[3];return n?t?[y,Number(t)]:[y,void 0]:[y,y]}}u.hooks.add("before-highlightall",function(b){b.selector+=", "+A}),u.hooks.add("before-sanity-check",function(b){var h=b.element;if(h.matches(A)){b.code="",h.setAttribute(r,p);var y=h.appendChild(document.createElement("CODE"));y.textContent=e;var n=h.getAttribute("data-src"),t=b.language;if(t==="none"){var i=(/\.(\w+)$/.exec(n)||[,"none"])[1];t=g[i]||i}u.util.setLanguage(y,t),u.util.setLanguage(h,t);var s=u.plugins.autoloader;s&&s.loadLanguages(t),k(n,function(o){h.setAttribute(r,m);var d=H(h.getAttribute("data-range"));if(d){var f=o.split(/\r\n?|\n/g),c=d[0],v=d[1]==null?f.length:d[1];c<0&&(c+=f.length),c=Math.max(0,Math.min(c-1,f.length)),v<0&&(v+=f.length),v=Math.max(0,Math.min(v,f.length)),o=f.slice(c,v).join(` -`),h.hasAttribute("data-start")||h.setAttribute("data-start",String(c+1))}y.textContent=o,u.highlightElement(y)},function(o){h.setAttribute(r,F),y.textContent=o})}}),u.plugins.fileHighlight={highlight:function(h){for(var y=(h||document).querySelectorAll(A),n=0,t;t=y[n++];)u.highlightElement(t)}};var C=!1;u.fileHighlight=function(){C||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),C=!0),u.plugins.fileHighlight.highlight.apply(this,arguments)}})()});var U=be(G(),1);Prism.languages.elixir={doc:{pattern:/@(?:doc|moduledoc)\s+(?:("""|''')[\s\S]*?\1|("|')(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2)/,inside:{attribute:/^@\w+/,string:/['"][\s\S]+/}},comment:{pattern:/#.*/,greedy:!0},regex:{pattern:/~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,greedy:!0},string:[{pattern:/~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,greedy:!0,inside:{}},{pattern:/("""|''')[\s\S]*?\1/,greedy:!0,inside:{}},{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{}}],atom:{pattern:/(^|[^:]):\w+/,lookbehind:!0,alias:"symbol"},module:{pattern:/\b[A-Z]\w*\b/,alias:"class-name"},"attr-name":/\b\w+\??:(?!:)/,argument:{pattern:/(^|[^&])&\d+/,lookbehind:!0,alias:"variable"},attribute:{pattern:/@\w+/,alias:"variable"},function:/\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|(?=\/\d))/,number:/\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,keyword:/\b(?:after|alias|and|case|catch|cond|def(?:callback|delegate|exception|impl|macro|module|n|np|p|protocol|struct)?|do|else|end|fn|for|if|import|not|or|quote|raise|require|rescue|try|unless|unquote|use|when)\b/,boolean:/\b(?:false|nil|true)\b/,operator:[/\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/,{pattern:/([^<])<(?!<)/,lookbehind:!0},{pattern:/([^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,%\[\]{}()]/},Prism.languages.elixir.string.forEach(function(e){e.inside={interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},rest:Prism.languages.elixir}}}});var E=e=>{let a=e.getAttribute("phx-target");if(!a)throw new Error('Target element does not have a "phx-target" attribute');return a};var J=e=>{let a=e.querySelector(".philtre__code__highlighted");if(!a)throw"Highlight container not found";return a},W=e=>{let a=e.dataset.language;if(!a)throw"Language not specified ";let l=J(e);l.classList.add(`language-${a}`),l.classList.add(`lang-${a}`)},Q=e=>{let a=e.querySelector(".philtre__code__editable");if(!a)throw"Editable container not found";return a},ee=e=>{let a=J(e),l=Q(e),g=l.value.endsWith(` +var me=Object.create;var W=Object.defineProperty;var ve=Object.getOwnPropertyDescriptor;var be=Object.getOwnPropertyNames;var ye=Object.getPrototypeOf,Ee=Object.prototype.hasOwnProperty;var xe=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var we=(e,t,l,g)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of be(t))!Ee.call(e,a)&&a!==l&&W(e,a,{get:()=>t[a],enumerable:!(g=ve(t,a))||g.enumerable});return e};var ke=(e,t,l)=>(l=e!=null?me(ye(e)):{},we(t||!e||!e.__esModule?W(l,"default",{value:e,enumerable:!0}):l,e));var Z=xe((Je,R)=>{var Ae=typeof window<"u"?window:typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope?self:{};var u=function(e){var t=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,l=0,g={},a={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function r(n){return n instanceof p?new p(n.type,r(n.content),n.alias):Array.isArray(n)?n.map(r):n.replace(/&/g,"&").replace(/"u")return null;if("currentScript"in document&&1<2)return document.currentScript;try{throw new Error}catch(s){var r=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(s.stack)||[])[1];if(r){var n=document.getElementsByTagName("script");for(var i in n)if(n[i].src==r)return n[i]}return null}},isActive:function(r,n,i){for(var s="no-"+n;r;){var o=r.classList;if(o.contains(n))return!0;if(o.contains(s))return!1;r=r.parentElement}return!!i}},languages:{plain:g,plaintext:g,text:g,txt:g,extend:function(r,n){var i=a.util.clone(a.languages[r]);for(var s in n)i[s]=n[s];return i},insertBefore:function(r,n,i,s){s=s||a.languages;var o=s[r],d={};for(var f in o)if(o.hasOwnProperty(f)){if(f==n)for(var c in i)i.hasOwnProperty(c)&&(d[c]=i[c]);i.hasOwnProperty(f)||(d[f]=o[f])}var v=s[r];return s[r]=d,a.languages.DFS(a.languages,function(x,L){L===v&&x!=r&&(this[x]=d)}),d},DFS:function r(n,i,s,o){o=o||{};var d=a.util.objId;for(var f in n)if(n.hasOwnProperty(f)){i.call(n,f,n[f],s||f);var c=n[f],v=a.util.type(c);v==="Object"&&!o[d(c)]?(o[d(c)]=!0,r(c,i,null,o)):v==="Array"&&!o[d(c)]&&(o[d(c)]=!0,r(c,i,f,o))}}},plugins:{},highlightAll:function(r,n){a.highlightAllUnder(document,r,n)},highlightAllUnder:function(r,n,i){var s={callback:i,container:r,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};a.hooks.run("before-highlightall",s),s.elements=Array.prototype.slice.apply(s.container.querySelectorAll(s.selector)),a.hooks.run("before-all-elements-highlight",s);for(var o=0,d;d=s.elements[o++];)a.highlightElement(d,n===!0,s.callback)},highlightElement:function(r,n,i){var s=a.util.getLanguage(r),o=a.languages[s];a.util.setLanguage(r,s);var d=r.parentElement;d&&d.nodeName.toLowerCase()==="pre"&&a.util.setLanguage(d,s);var f=r.textContent,c={element:r,language:s,grammar:o,code:f};function v(L){c.highlightedCode=L,a.hooks.run("before-insert",c),c.element.innerHTML=c.highlightedCode,a.hooks.run("after-highlight",c),a.hooks.run("complete",c),i&&i.call(c.element)}if(a.hooks.run("before-sanity-check",c),d=c.element.parentElement,d&&d.nodeName.toLowerCase()==="pre"&&!d.hasAttribute("tabindex")&&d.setAttribute("tabindex","0"),!c.code){a.hooks.run("complete",c),i&&i.call(c.element);return}if(a.hooks.run("before-highlight",c),!c.grammar){v(a.util.encode(c.code));return}if(n&&e.Worker){var x=new Worker(a.filename);x.onmessage=function(L){v(L.data)},x.postMessage(JSON.stringify({language:c.language,code:c.code,immediateClose:!0}))}else v(a.highlight(c.code,c.grammar,c.language))},highlight:function(r,n,i){var s={code:r,grammar:n,language:i};if(a.hooks.run("before-tokenize",s),!s.grammar)throw new Error('The language "'+s.language+'" has no grammar.');return s.tokens=a.tokenize(s.code,s.grammar),a.hooks.run("after-tokenize",s),p.stringify(a.util.encode(s.tokens),s.language)},tokenize:function(r,n){var i=n.rest;if(i){for(var s in i)n[s]=i[s];delete n.rest}var o=new A;return k(o,o.head,r),S(r,o,n,o.head,0),C(o)},hooks:{all:{},add:function(r,n){var i=a.hooks.all;i[r]=i[r]||[],i[r].push(n)},run:function(r,n){var i=a.hooks.all[r];if(!(!i||!i.length))for(var s=0,o;o=i[s++];)o(n)}},Token:p};e.Prism=a;function p(r,n,i,s){this.type=r,this.content=n,this.alias=i,this.length=(s||"").length|0}p.stringify=function r(n,i){if(typeof n=="string")return n;if(Array.isArray(n)){var s="";return n.forEach(function(v){s+=r(v,i)}),s}var o={type:n.type,content:r(n.content,i),tag:"span",classes:["token",n.type],attributes:{},language:i},d=n.alias;d&&(Array.isArray(d)?Array.prototype.push.apply(o.classes,d):o.classes.push(d)),a.hooks.run("wrap",o);var f="";for(var c in o.attributes)f+=" "+c+'="'+(o.attributes[c]||"").replace(/"/g,""")+'"';return"<"+o.tag+' class="'+o.classes.join(" ")+'"'+f+">"+o.content+""};function m(r,n,i,s){r.lastIndex=n;var o=r.exec(i);if(o&&s&&o[1]){var d=o[1].length;o.index+=d,o[0]=o[0].slice(d)}return o}function S(r,n,i,s,o,d){for(var f in i)if(!(!i.hasOwnProperty(f)||!i[f])){var c=i[f];c=Array.isArray(c)?c:[c];for(var v=0;v=d.reach);F+=w.value.length,w=w.next){var H=w.value;if(n.length>r.length)return;if(!(H instanceof p)){var I=1,T;if(j){if(T=m(V,F,r,Y),!T||T.index>=r.length)break;var D=T.index,pe=T.index+T[0].length,_=F;for(_+=w.value.length;D>=_;)w=w.next,_+=w.value.length;if(_-=w.value.length,F=_,w.value instanceof p)continue;for(var $=w;$!==n.tail&&(_d.reach&&(d.reach=K);var P=w.prev;B&&(P=k(n,P,B),F+=B.length),M(n,P,I);var he=new p(f,L?a.tokenize(O,L):O,ge,O);if(w=k(n,P,he),G&&k(n,w,G),I>1){var N={cause:f+","+v,reach:K};S(r,n,i,w.prev,F,N),d&&N.reach>d.reach&&(d.reach=N.reach)}}}}}}function A(){var r={value:null,prev:null,next:null},n={value:null,prev:r,next:null};r.next=n,this.head=r,this.tail=n,this.length=0}function k(r,n,i){var s=n.next,o={value:i,prev:n,next:s};return n.next=o,s.prev=o,r.length++,o}function M(r,n,i){for(var s=n.next,o=0;o/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]};u.languages.markup.tag.inside["attr-value"].inside.entity=u.languages.markup.entity;u.languages.markup.doctype.inside["internal-subset"].inside=u.languages.markup;u.hooks.add("wrap",function(e){e.type==="entity"&&(e.attributes.title=e.content.replace(/&/,"&"))});Object.defineProperty(u.languages.markup.tag,"addInlined",{value:function(t,l){var g={};g["language-"+l]={pattern:/(^$)/i,lookbehind:!0,inside:u.languages[l]},g.cdata=/^$/i;var a={"included-cdata":{pattern://i,inside:g}};a["language-"+l]={pattern:/[\s\S]+/,inside:u.languages[l]};var p={};p[t]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return t}),"i"),lookbehind:!0,greedy:!0,inside:a},u.languages.insertBefore("markup","cdata",p)}});Object.defineProperty(u.languages.markup.tag,"addAttribute",{value:function(e,t){u.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:u.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}});u.languages.html=u.languages.markup;u.languages.mathml=u.languages.markup;u.languages.svg=u.languages.markup;u.languages.xml=u.languages.extend("markup",{});u.languages.ssml=u.languages.xml;u.languages.atom=u.languages.xml;u.languages.rss=u.languages.xml;(function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|`+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var l=e.languages.markup;l&&(l.tag.addInlined("style","css"),l.tag.addAttribute("style","css"))})(u);u.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};u.languages.javascript=u.languages.extend("clike",{"class-name":[u.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+(/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source)+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/});u.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/;u.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:u.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:u.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:u.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:u.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:u.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/});u.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:u.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}});u.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}});u.languages.markup&&(u.languages.markup.tag.addInlined("script","javascript"),u.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript"));u.languages.js=u.languages.javascript;(function(){if(typeof u>"u"||typeof document>"u")return;Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var e="Loading\u2026",t=function(b,h){return"\u2716 Error "+b+" while fetching file: "+h},l="\u2716 Error: File does not exist or is empty",g={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},a="data-src-status",p="loading",m="loaded",S="failed",A="pre[data-src]:not(["+a+'="'+m+'"]):not(['+a+'="'+p+'"])';function k(b,h,y){var r=new XMLHttpRequest;r.open("GET",b,!0),r.onreadystatechange=function(){r.readyState==4&&(r.status<400&&r.responseText?h(r.responseText):r.status>=400?y(t(r.status,r.statusText)):y(l))},r.send(null)}function M(b){var h=/^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(b||"");if(h){var y=Number(h[1]),r=h[2],n=h[3];return r?n?[y,Number(n)]:[y,void 0]:[y,y]}}u.hooks.add("before-highlightall",function(b){b.selector+=", "+A}),u.hooks.add("before-sanity-check",function(b){var h=b.element;if(h.matches(A)){b.code="",h.setAttribute(a,p);var y=h.appendChild(document.createElement("CODE"));y.textContent=e;var r=h.getAttribute("data-src"),n=b.language;if(n==="none"){var i=(/\.(\w+)$/.exec(r)||[,"none"])[1];n=g[i]||i}u.util.setLanguage(y,n),u.util.setLanguage(h,n);var s=u.plugins.autoloader;s&&s.loadLanguages(n),k(r,function(o){h.setAttribute(a,m);var d=M(h.getAttribute("data-range"));if(d){var f=o.split(/\r\n?|\n/g),c=d[0],v=d[1]==null?f.length:d[1];c<0&&(c+=f.length),c=Math.max(0,Math.min(c-1,f.length)),v<0&&(v+=f.length),v=Math.max(0,Math.min(v,f.length)),o=f.slice(c,v).join(` +`),h.hasAttribute("data-start")||h.setAttribute("data-start",String(c+1))}y.textContent=o,u.highlightElement(y)},function(o){h.setAttribute(a,S),y.textContent=o})}}),u.plugins.fileHighlight={highlight:function(h){for(var y=(h||document).querySelectorAll(A),r=0,n;n=y[r++];)u.highlightElement(n)}};var C=!1;u.fileHighlight=function(){C||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),C=!0),u.plugins.fileHighlight.highlight.apply(this,arguments)}})()});var J=ke(Z(),1);Prism.languages.elixir={doc:{pattern:/@(?:doc|moduledoc)\s+(?:("""|''')[\s\S]*?\1|("|')(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2)/,inside:{attribute:/^@\w+/,string:/['"][\s\S]+/}},comment:{pattern:/#.*/,greedy:!0},regex:{pattern:/~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,greedy:!0},string:[{pattern:/~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,greedy:!0,inside:{}},{pattern:/("""|''')[\s\S]*?\1/,greedy:!0,inside:{}},{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{}}],atom:{pattern:/(^|[^:]):\w+/,lookbehind:!0,alias:"symbol"},module:{pattern:/\b[A-Z]\w*\b/,alias:"class-name"},"attr-name":/\b\w+\??:(?!:)/,argument:{pattern:/(^|[^&])&\d+/,lookbehind:!0,alias:"variable"},attribute:{pattern:/@\w+/,alias:"variable"},function:/\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|(?=\/\d))/,number:/\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,keyword:/\b(?:after|alias|and|case|catch|cond|def(?:callback|delegate|exception|impl|macro|module|n|np|p|protocol|struct)?|do|else|end|fn|for|if|import|not|or|quote|raise|require|rescue|try|unless|unquote|use|when)\b/,boolean:/\b(?:false|nil|true)\b/,operator:[/\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/,{pattern:/([^<])<(?!<)/,lookbehind:!0},{pattern:/([^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,%\[\]{}()]/},Prism.languages.elixir.string.forEach(function(e){e.inside={interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},rest:Prism.languages.elixir}}}});var E=e=>{let t=e.getAttribute("phx-target");if(!t)throw new Error('Target element does not have a "phx-target" attribute');return t};var Q=e=>{let t=e.querySelector(".philtre__code__highlighted");if(!t)throw"Highlight container not found";return t},U=e=>{let t=e.dataset.language;if(!t)throw"Language not specified ";let l=Q(e);l.classList.add(`language-${t}`),l.classList.add(`lang-${t}`)},ee=e=>{let t=e.querySelector(".philtre__code__editable");if(!t)throw"Editable container not found";return t},te=e=>{let t=Q(e),l=ee(e),g=l.value.endsWith(` `)?l.value.concat(` -`):l.value;a.innerHTML=g,U.default.highlightElement(a)},Ee=(e,a)=>{let l=Q(e);l.addEventListener("keypress",g=>{g.key==="Enter"&&g.shiftKey&&(g.preventDefault(),a.pushEventTo(E(e),"add_block"))}),l.addEventListener("input",()=>{ee(e),a.pushEventTo(E(e),"update",{value:l.value})})},xe={mounted(){W(this.el),Ee(this.el,this),ee(this.el)},updated(){W(this.el)}};var te=e=>"dataset"in e&&e.dataset.cellId?e:"dataset"in e&&"block"in e.dataset?e.querySelector("[data-cell-id]"):e.parentElement?.dataset.cellId?e.parentElement:null,we=e=>Array.prototype.indexOf.call(e.parentNode?.children||[],e),ke=()=>{let e=document.getSelection();if(!e)return!1;let a=e.anchorNode;if(!a)return!1;let l=a.nodeType===Node.TEXT_NODE?a.parentNode:a;return l?we(l)===0&&e.anchorOffset==0:!1},B=()=>{let e=document.getSelection();if(!e||!e.anchorNode||!e.focusNode)return;let a=te(e.anchorNode),l=te(e.focusNode);if(!a||!l)return null;let g=a.dataset.cellId,r=l.dataset.cellId,[p,m]=e.anchorOffset{let a=e.querySelectorAll("[data-cell-id]");return Array.from(a).map(l=>{let g=[];return l.classList.contains("strong")&&g.push("strong"),l.classList.contains("italic")&&g.push("italic"),l.classList.contains("br")&&g.push("br"),{id:l.dataset.cellId||"",text:l.innerText.replace("\xA0"," "),modifiers:g}})},Fe=e=>{if(e.key==="Backspace"&&ke())return"backspace_from_start";if(e.shiftKey&&e.key==="Enter"&&!e.metaKey)return"split_line";if(e.key==="Enter")return"split_block";if(e.metaKey&&!e.shiftKey&&!e.altKey&&e.key==="b")return"toggle.bold";if(e.metaKey&&!e.shiftKey&&!e.altKey&&e.key==="i")return"toggle.italic"},ne=e=>{let{selectionStartId:a,selectionEndId:l,selectionStartOffset:g,selectionEndOffset:r}=e.dataset;if(!a||!l||!g||!r)return;e.focus();let p=e.ownerDocument.getSelection();if(!p)return;p.removeAllRanges();let m=document.createRange(),F=e.querySelector(`[data-cell-id="${a}"]`);if(!F)return;let A=parseInt(g);F.childNodes[0]||F.appendChild(document.createTextNode("")),m.setStart(F.childNodes[0],A);let k=e.querySelector(`[data-cell-id="${l}"]`);if(!k)return;let H=parseInt(r);m.setEnd(k.childNodes[0],H),p.addRange(m)},Se={mounted(){let e=this.el,a=null,l=null;e.addEventListener("input",()=>{a&&clearTimeout(a);let g="update",r=E(this.el);l=new Promise(p=>{let m=Ae(e),A={selection:B(),cells:m};a=window.setTimeout(async()=>{this.pushEventTo(r,g,A,()=>{a=null,l=null,p()})},300)})}),e.addEventListener("keydown",async g=>{let r=Fe(g);if(!r)return;g.preventDefault();let p=B();l&&r&&await l,this.pushEventTo(E(e),r,{selection:p})}),e.addEventListener("paste",g=>{g.preventDefault();let r=E(e);this.pushEventTo(r,"paste_blocks",{selection:B()})}),ne(e)},updated(){ne(this.el)}};var Te={mounted(){document.addEventListener("keydown",e=>{if(e.key==="z"&&e.metaKey&&e.shiftKey){this.pushEventTo(E(this.el),"redo"),e.preventDefault();return}if(e.key==="z"&&e.metaKey){this.pushEventTo(E(this.el),"undo"),e.preventDefault();return}e.key==="y"&&e.metaKey&&(this.pushEventTo(E(this.el),"redo"),e.preventDefault())})}};var Le=(e,a)=>{let l=e.getBoundingClientRect(),g=a.getBoundingClientRect();return!(l.top>g.bottom||l.rightg.right)},_e=e=>{document.addEventListener("copy",a=>{let l=document.querySelectorAll(".philtre__editor [data-selected]");l.length!==0&&(a.preventDefault(),e.pushEventTo(E(e.el),"copy_blocks",{block_ids:Array.from(l).map(g=>g.id)}))})},$e=e=>Math.abs(e.toX-e.fromX),He=e=>Math.abs(e.toY-e.fromY),re=e=>Math.min(e.fromX,e.toX),ie=e=>Math.min(e.fromY,e.toY),Me=e=>{e.style.display="none",e.style.background="rgba(0,0,255,0.1)",e.style.position="fixed",e.style.display="block"},Ce=(e,a)=>{e.style.left=`${re(a)}px`,e.style.top=`${ie(a)}px`,e.style.width=`${$e(a)}px`,e.style.height=`${He(a)}px`},Oe=(e,a)=>{e.style.left=`${re(a)}px`,e.style.top=`${ie(a)}px`,e.style.width="0px",e.style.height="0px"},De=e=>{e.style.display="none"},ae=20,Ie=e=>Math.abs(e.fromX-e.toX)>ae&&Math.abs(e.fromY-e.toY)>ae,Pe={mounted(){_e(this);let e=this.el,a={fromX:0,fromY:0,toX:0,toY:0,selecting:!1};document.addEventListener("mousedown",l=>{l.button===0&&(a.selecting=!0,a.fromX=l.x,a.fromY=l.y,Me(e))}),document.addEventListener("mousemove",l=>{!a.selecting||(a.toX=l.x,a.toY=l.y,Ce(e,a))}),document.addEventListener("mouseup",l=>{if(!a.selecting||(a.toX=l.x,a.toY=l.y,a.selecting=!1,!Ie(a)))return;let g=document.querySelectorAll("[data-block]"),p={block_ids:Array.from(g).filter(m=>Le(m,e)).map(m=>m.id)};Oe(e,a),De(e),this.pushEventTo(E(this.el),"select_blocks",p)})}};var K=e=>{let a=e.querySelector("[data-block]");if(!a)throw new Error("Section does not contain a block");return a},se=e=>{if(!("focused"in e.dataset))return;let a=K(e);a.id!==document.activeElement?.id&&a.focus()},Re={mounted(){let e=this.el,a=E(this.el),l=()=>this.pushEventTo(E(e),"focus_current",{block_id:K(e).id}),g=()=>this.pushEventTo(a,"focus_previous"),r=()=>this.pushEventTo(a,"focus_next");e.addEventListener("keydown",m=>{m.key==="Tab"&&(m.metaKey||(m.preventDefault(),m.shiftKey?g():r()))}),K(e).addEventListener("focus",()=>{"focused"in e.dataset||l()}),new MutationObserver(m=>{let A=Array.from(m).map(k=>Array.from(k.addedNodes)).flat().find(k=>"dataset"in k&&"block"in k.dataset);!A||"focused"in e.dataset||document.activeElement?.id===A.id&&l()}).observe(e,{subtree:!1,childList:!0}),se(this.el)},updated(){se(this.el)}};export{Re as BlockNavigation,xe as Code,Se as ContentEditable,Te as History,Pe as Selection}; +`):l.value;t.innerHTML=g,J.default.highlightElement(t)},Se=(e,t)=>{let l=ee(e);l.addEventListener("keypress",g=>{g.key==="Enter"&&g.shiftKey&&(g.preventDefault(),t.pushEventTo(E(e),"add_block"))}),l.addEventListener("input",()=>{te(e),t.pushEventTo(E(e),"update",{value:l.value})})},Te={mounted(){U(this.el),Se(this.el,this),te(this.el)},updated(){U(this.el)}};var ne=e=>e===null?null:"dataset"in e&&e.dataset.cellId?e:"dataset"in e&&"block"in e.dataset?e.querySelector("[data-cell-id]"):e.parentElement?.dataset.cellId?e.parentElement:null,Fe=e=>{let t=q(e),l=oe(e);return t.start_id===l[0].id&&t.start_offset===0},Le=e=>e.nodeType===e.ELEMENT_NODE,z=e=>!e||!Le(e)||!e.dataset.cellId?null:e.dataset.cellId,_e="\xA0",ae=e=>e.replace(_e," "),ie=e=>{let t=Array.from(e.querySelectorAll("[data-cell-id]"));return t.length===0||t.length===1&&t[0].innerText===""&&e.innerText!==""},He=e=>{let t=e.querySelector("[data-cell-id]"),l=z(t),g=e.innerText.length;return!t||!l?{start_id:e.id,end_id:e.id,start_offset:g,end_offset:g}:{start_id:l,start_offset:g,end_id:l,end_offset:g}},Me=()=>{let e=document.getSelection();if(!e)throw new Error("No selection during update");let t=ne(e.anchorNode),l=z(t),g=ne(e.focusNode),a=z(g);if(!l||!a)throw new Error("Invalid selection");let[p,m]=e.anchorOffsetie(e)?He(e):Me(),se=e=>Array.from(e.querySelectorAll("[data-cell-id]")),$e=e=>{let t=se(e),l=t.length===0?e.id:z(t[0]);if(!l)throw new Error("Completely invalid block");let g=ae(e.innerText);return[{id:l,text:g,modifiers:[]}]},Ce=e=>{let t=[];return e.classList.contains("strong")&&t.push("strong"),e.classList.contains("italic")&&t.push("italic"),e.classList.contains("br")&&t.push("br"),{id:e.dataset.cellId||"",text:ae(e.innerText),modifiers:t}},Ie=e=>se(e).map(t=>Ce(t)),oe=e=>ie(e)?$e(e):Ie(e),De=(e,t)=>{if(e.key==="Backspace"&&Fe(t))return"backspace_from_start";if(e.shiftKey&&e.key==="Enter"&&!e.metaKey)return"split_line";if(e.key==="Enter")return"split_block";if(e.metaKey&&!e.shiftKey&&!e.altKey&&e.key==="b")return"toggle.bold";if(e.metaKey&&!e.shiftKey&&!e.altKey&&e.key==="i")return"toggle.italic"},re=e=>{let{selectionStartId:t,selectionEndId:l,selectionStartOffset:g,selectionEndOffset:a}=e.dataset;if(!t||!l||!g||!a||(e.focus(),e.innerText===""))return;let p=e.ownerDocument.getSelection();if(!p)return;p.removeAllRanges();let m=document.createRange(),S=e.querySelector(`[data-cell-id="${t}"]`);if(!S)return;let A=parseInt(g);S.childNodes[0]||S.appendChild(document.createTextNode("")),m.setStart(S.childNodes[0],A);let k=e.querySelector(`[data-cell-id="${l}"]`);if(!k)return;let M=parseInt(a);m.setEnd(k.childNodes[0],M),p.addRange(m)},Oe={mounted(){let e=this.el,t=null,l=null;e.addEventListener("input",()=>{t&&clearTimeout(t);let g="update",a=E(this.el);l=new Promise(p=>{let m=oe(e),A={selection:q(e),cells:m};t=window.setTimeout(async()=>{this.pushEventTo(a,g,A,()=>{t=null,l=null,p()})},50)})}),e.addEventListener("keydown",async g=>{let a=De(g,e);if(!a)return;g.preventDefault(),l&&a&&await l;let p=q(e);this.pushEventTo(E(e),a,{selection:p})}),e.addEventListener("paste",g=>{g.preventDefault();let a=E(e);this.pushEventTo(a,"paste_blocks",{selection:q(e)})}),re(e)},updated(){re(this.el)}};var Pe={mounted(){document.addEventListener("keydown",e=>{if(e.key==="z"&&e.metaKey&&e.shiftKey){this.pushEventTo(E(this.el),"redo"),e.preventDefault();return}if(e.key==="z"&&e.metaKey){this.pushEventTo(E(this.el),"undo"),e.preventDefault();return}e.key==="y"&&e.metaKey&&(this.pushEventTo(E(this.el),"redo"),e.preventDefault())})}};var Re=(e,t)=>{let l=e.getBoundingClientRect(),g=t.getBoundingClientRect();return!(l.top>g.bottom||l.rightg.right)},qe=e=>{document.addEventListener("copy",t=>{let l=document.querySelectorAll(".philtre__editor [data-selected]");l.length!==0&&(t.preventDefault(),e.pushEventTo(E(e.el),"copy_blocks",{block_ids:Array.from(l).map(g=>g.id)}))})},ze=e=>Math.abs(e.toX-e.fromX),Be=e=>Math.abs(e.toY-e.fromY),ue=e=>Math.min(e.fromX,e.toX),ce=e=>Math.min(e.fromY,e.toY),Ke=e=>{e.style.display="none",e.style.background="rgba(0,0,255,0.1)",e.style.position="fixed",e.style.display="block"},Ne=(e,t)=>{e.style.left=`${ue(t)}px`,e.style.top=`${ce(t)}px`,e.style.width=`${ze(t)}px`,e.style.height=`${Be(t)}px`},Xe=(e,t)=>{e.style.left=`${ue(t)}px`,e.style.top=`${ce(t)}px`,e.style.width="0px",e.style.height="0px"},Ye=e=>{e.style.display="none"},le=20,je=e=>Math.abs(e.fromX-e.toX)>le&&Math.abs(e.fromY-e.toY)>le,Ve={mounted(){qe(this);let e=this.el,t={fromX:0,fromY:0,toX:0,toY:0,selecting:!1};document.addEventListener("mousedown",l=>{l.button===0&&(t.selecting=!0,t.fromX=l.x,t.fromY=l.y,Ke(e))}),document.addEventListener("mousemove",l=>{!t.selecting||(t.toX=l.x,t.toY=l.y,Ne(e,t))}),document.addEventListener("mouseup",l=>{if(!t.selecting||(t.toX=l.x,t.toY=l.y,t.selecting=!1,!je(t)))return;let g=document.querySelectorAll("[data-block]"),p={block_ids:Array.from(g).filter(m=>Re(m,e)).map(m=>m.id)};Xe(e,t),Ye(e),this.pushEventTo(E(this.el),"select_blocks",p)})}};var X=e=>{let t=e.querySelector("[data-block]");if(!t)throw new Error("Section does not contain a block");return t},de=e=>{if(!("focused"in e.dataset))return;let t=X(e);t.id!==document.activeElement?.id&&t.focus()},Ge={mounted(){let e=this.el,t=E(this.el),l=()=>this.pushEventTo(E(e),"focus_current",{block_id:X(e).id}),g=()=>this.pushEventTo(t,"focus_previous"),a=()=>this.pushEventTo(t,"focus_next");e.addEventListener("keydown",m=>{m.key==="Tab"&&(m.metaKey||(m.preventDefault(),m.shiftKey?g():a()))}),X(e).addEventListener("focus",()=>{"focused"in e.dataset||l()}),new MutationObserver(m=>{let A=Array.from(m).map(k=>Array.from(k.addedNodes)).flat().find(k=>"dataset"in k&&"block"in k.dataset);!A||"focused"in e.dataset||document.activeElement?.id===A.id&&l()}).observe(e,{subtree:!1,childList:!0}),de(this.el)},updated(){de(this.el)}};export{Ge as BlockNavigation,Te as Code,Oe as ContentEditable,Pe as History,Ve as Selection}; /** * Prism: Lightweight, robust, elegant syntax highlighting * diff --git a/dist/index.js.map b/dist/index.js.map index 780d018..43a46e2 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../node_modules/prismjs/prism.js", "../src/hooks/Code.ts", "../node_modules/prismjs/components/prism-elixir.min.js", "../src/hooks/utils.ts", "../src/hooks/ContentEditable.ts", "../src/hooks/History.ts", "../src/hooks/Selection.ts", "../src/hooks/BlockNavigation.ts"], - "sourcesContent": ["\n/* **********************************************\n Begin prism-core.js\n********************************************** */\n\n/// \n\nvar _self = (typeof window !== 'undefined')\n\t? window // if in browser\n\t: (\n\t\t(typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope)\n\t\t\t? self // if in worker\n\t\t\t: {} // if in node js\n\t);\n\n/**\n * Prism: Lightweight, robust, elegant syntax highlighting\n *\n * @license MIT \n * @author Lea Verou \n * @namespace\n * @public\n */\nvar Prism = (function (_self) {\n\n\t// Private helper vars\n\tvar lang = /(?:^|\\s)lang(?:uage)?-([\\w-]+)(?=\\s|$)/i;\n\tvar uniqueId = 0;\n\n\t// The grammar object for plaintext\n\tvar plainTextGrammar = {};\n\n\n\tvar _ = {\n\t\t/**\n\t\t * By default, Prism will attempt to highlight all code elements (by calling {@link Prism.highlightAll}) on the\n\t\t * current page after the page finished loading. This might be a problem if e.g. you wanted to asynchronously load\n\t\t * additional languages or plugins yourself.\n\t\t *\n\t\t * By setting this value to `true`, Prism will not automatically highlight all code elements on the page.\n\t\t *\n\t\t * You obviously have to change this value before the automatic highlighting started. To do this, you can add an\n\t\t * empty Prism object into the global scope before loading the Prism script like this:\n\t\t *\n\t\t * ```js\n\t\t * window.Prism = window.Prism || {};\n\t\t * Prism.manual = true;\n\t\t * // add a new