Merge branch 'main' into feature/suggestions

This commit is contained in:
Philipp Kühn 2021-01-14 20:01:56 +01:00
commit 83b3de8711
63 changed files with 1137 additions and 361 deletions

View File

@ -27,7 +27,7 @@ jobs:
- uses: actions/checkout@v2.3.4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v2.1.3
uses: actions/setup-node@v2.1.4
with:
node-version: ${{ matrix.node-version }}
@ -83,7 +83,7 @@ jobs:
- uses: actions/checkout@v2.3.4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v2.1.3
uses: actions/setup-node@v2.1.4
with:
node-version: ${{ matrix.node-version }}
@ -98,7 +98,7 @@ jobs:
browser: chrome
- name: Export screenshots (on failure only)
uses: actions/upload-artifact@v2.2.1
uses: actions/upload-artifact@v2.2.2
if: failure()
with:
name: cypress-screenshots
@ -106,7 +106,7 @@ jobs:
retention-days: 7
- name: Export screen recordings (on failure only)
uses: actions/upload-artifact@v2.2.1
uses: actions/upload-artifact@v2.2.2
if: failure()
with:
name: cypress-videos
@ -138,7 +138,7 @@ jobs:
- uses: actions/checkout@v2.3.4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v2.1.3
uses: actions/setup-node@v2.1.4
with:
node-version: ${{ matrix.node-version }}

View File

@ -27,7 +27,7 @@
"simplify-js": "^1.2.4",
"vue-github-button": "^1.1.2",
"vue-live": "^1.16.0",
"y-indexeddb": "^9.0.5",
"y-indexeddb": "^9.0.6",
"y-webrtc": "^10.1.7",
"y-websocket": "^1.3.8",
"yjs": "^13.4.7"
@ -40,6 +40,6 @@
"node-sass": "^5.0.0",
"sass-loader": "^10.0.3",
"style-resources-loader": "^1.4.1",
"ts-loader": "^8.0.11"
"ts-loader": "^8.0.14"
}
}

View File

@ -9,6 +9,9 @@
border-bottom-width: 0;
color: $colorBlack;
background-color: $colorWhite;
max-height: 50rem;
overflow: auto;
scroll-behavior: smooth;
}
&__source {

View File

@ -1,4 +1,152 @@
export const content = `
<h1>Example</h1>
<p>TODO</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras turpis leo, placerat vitae ultricies interdum, semper quis urna. In dolor est, placerat vestibulum velit eleifend, finibus viverra risus. Vestibulum eleifend massa vitae ultricies laoreet. Integer maximus dolor sapien. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus metus magna, tincidunt in libero et, interdum tempus ligula. Curabitur nunc urna, sodales vel vestibulum quis, sodales non nunc. Quisque pharetra urna ultrices, accumsan augue eu, aliquet elit. Cras ut venenatis justo, eget sagittis risus. Duis vehicula enim non varius sollicitudin.</p>
<p>Ut nulla sapien, rhoncus ac erat ac, dignissim fermentum nibh. Nunc varius turpis at augue interdum efficitur pellentesque a nisi. Integer in aliquam tellus, in condimentum libero. Aenean maximus dolor sit amet urna sodales, at facilisis augue tempor. Ut pretium nisi in dui pellentesque vulputate. Nulla nec elementum odio. Etiam finibus, massa in porta convallis, diam tellus efficitur mauris, ac luctus justo odio a ex. In varius lacus elit, ac dapibus nisl dictum non. Aenean a erat vitae erat porta congue. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla nec arcu sem. Sed pulvinar mi eu venenatis auctor. In aliquet, neque in mattis auctor, nunc nunc pellentesque leo, eget dapibus velit libero sit amet magna. Morbi vestibulum, odio vel elementum cursus, eros mi tempus nulla, id faucibus lorem eros vel eros. Aliquam erat volutpat. Pellentesque laoreet quis orci in porttitor.</p>
<p>Nam vitae ultrices ex. Sed rutrum purus et enim pharetra, ut aliquam nunc accumsan. Ut eu aliquam nunc, ac elementum tellus. Vivamus porttitor mi augue, sed rutrum elit dictum in. Vestibulum porta sodales orci, non dictum lacus. Maecenas a est eu quam imperdiet tincidunt. Ut posuere, lorem sit amet hendrerit tempor, turpis ante sagittis ante, non bibendum ipsum diam sed tellus.</p>
<p>Vivamus fringilla arcu sit amet sapien dapibus pulvinar. Sed tempus nec lacus in scelerisque. Suspendisse vel vestibulum mauris, condimentum porttitor lacus. Nunc finibus vel sapien eget lobortis. Praesent auctor, neque vel eleifend vestibulum, mi risus facilisis leo, vitae dictum ligula tellus quis erat. Quisque volutpat tempor sapien a commodo. Mauris vehicula, diam ac vulputate semper, justo tortor vestibulum nibh, nec interdum lacus lorem et massa. Donec eu ex urna. Praesent scelerisque feugiat nisl non consequat. Vivamus in pretium nibh. Vivamus fringilla purus at nisi varius, sit amet congue nisl pharetra. Aliquam erat volutpat.</p>
<p>Nullam ultrices eros dolor, ut consequat ex eleifend at. Cras eleifend venenatis ligula in volutpat. Sed mollis felis a eleifend porttitor. Proin a diam sem. Etiam eu velit mi. Proin quis elit eget urna maximus gravida sed nec nunc. In blandit efficitur neque eget feugiat.</p>
<p>Integer sit amet consequat sem. Curabitur suscipit arcu a ex tristique rhoncus. Ut id tincidunt augue. Suspendisse volutpat iaculis elit, ut fringilla mauris laoreet hendrerit. Aenean malesuada purus commodo leo maximus rutrum. Donec id sapien augue. Donec in aliquam nisl. Phasellus eget cursus augue. Pellentesque tincidunt lacus urna, varius dignissim dolor dignissim nec. Sed at laoreet dui. Ut varius lectus sit amet ligula euismod, ac eleifend felis efficitur. Proin a nunc sed eros dignissim mattis ut vitae libero.</p>
<p>Maecenas et hendrerit mi. Nam id sodales leo. In et semper dolor. Morbi pellentesque, justo a condimentum aliquam, nunc purus mollis urna, ac viverra augue tellus sed urna. Mauris vestibulum rutrum erat, pharetra ultricies quam finibus sed. Mauris a laoreet ante, ut dictum augue. Duis dolor neque, consectetur eleifend elementum in, lacinia id sapien.</p>
<p>Maecenas ullamcorper vehicula sapien at tristique. Mauris eget nisi a sapien laoreet blandit a eu velit. Curabitur pellentesque sollicitudin purus. Proin eu commodo ligula, a sagittis lorem. Suspendisse aliquet sollicitudin diam, ac placerat lectus. In sit amet urna eget turpis iaculis scelerisque nec ac lorem. Etiam at magna rhoncus, molestie tellus a, ornare sapien. Phasellus quis velit in turpis vulputate pretium in a mi.</p>
<p>Morbi eget nunc at elit ultrices rutrum quis a dolor. Curabitur id quam vel elit rhoncus molestie vitae in purus. Proin vehicula magna a tellus imperdiet, non ultrices dolor tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Sed commodo ex ac tortor suscipit ultrices non vel mauris. Fusce a molestie felis, ut eleifend felis. Nunc odio urna, vulputate vitae dignissim ut, mattis accumsan lectus. Curabitur vel velit purus. Nunc volutpat, augue sed pretium euismod, magna sapien elementum purus, eget tincidunt leo purus eget leo. Integer iaculis arcu sit amet venenatis sagittis. Aenean vitae massa a mauris sodales dignissim.</p>
<p>Curabitur tempor ornare sagittis. Quisque maximus, elit ac lacinia vehicula, mi elit pretium elit, in eleifend massa turpis non arcu. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras molestie finibus metus at porttitor. Pellentesque a facilisis justo. Vivamus molestie ante elit, id suscipit sapien rutrum eget. Maecenas tellus ligula, pretium quis nisi sed, finibus egestas nisl. Sed non metus maximus, blandit ex eget, aliquet tellus. Sed a blandit purus, ut aliquet erat. Fusce tincidunt tortor sapien, quis porta ante venenatis quis. In varius, purus id malesuada finibus, risus lorem lobortis orci, vitae congue lectus ante ut nunc. Mauris hendrerit mollis condimentum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vivamus non urna id sapien finibus mattis. Integer vitae eros dolor.</p>
<p>Phasellus scelerisque mi non ultricies sagittis. Proin in fringilla mauris. Duis quis porta tortor, at fringilla nisl. Sed at varius urna. Donec vitae luctus lectus. Suspendisse blandit massa ut porta convallis. Mauris lobortis lobortis sem, et congue elit consectetur et. Ut posuere eu urna id laoreet. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Donec at sapien vel ante semper rutrum vitae nec justo. Vivamus pulvinar magna a leo hendrerit, vitae aliquam magna vulputate. Suspendisse potenti.</p>
<p>Suspendisse quis sapien quam. Nam fermentum est orci, at maximus magna scelerisque vel. Quisque interdum eleifend interdum. Donec malesuada nulla arcu, ac dapibus urna lobortis vel. Vestibulum nisl nulla, gravida in turpis ut, hendrerit sollicitudin nibh. Ut metus lectus, mattis quis volutpat quis, fringilla egestas enim. Integer lobortis, ante vestibulum condimentum ullamcorper, dolor justo dignissim nunc, vel lacinia massa augue sit amet metus. Etiam non molestie sem. Nullam sodales aliquet mattis. Donec sit amet dui at leo feugiat ornare. Donec mi odio, volutpat vitae risus porta, semper egestas arcu.</p>
<p>Quisque imperdiet scelerisque elit. In non accumsan tortor, sed lacinia felis. Ut et molestie neque, at tristique urna. Fusce malesuada lorem eget sem finibus, auctor eleifend tortor finibus. Quisque sed luctus turpis. Integer ullamcorper ornare dolor, id vulputate augue consectetur ac. Donec dapibus euismod iaculis. Quisque ac mollis turpis.</p>
<p>Phasellus imperdiet ultrices turpis, in rhoncus nulla tempor vel. Aliquam posuere pulvinar nulla sit amet consectetur. Morbi nulla erat, cursus a vulputate sit amet, placerat eu dolor. Cras sagittis nibh auctor nunc sagittis pellentesque. Donec et dolor non ligula lacinia sollicitudin. Cras ac augue purus. Sed nisl elit, porta a congue in, finibus eget justo. Duis commodo imperdiet justo. Pellentesque sit amet elit ut orci rutrum faucibus. Vestibulum vitae lacus porta, feugiat metus efficitur, dictum augue.</p>
<p>Phasellus nec lacus purus. In feugiat erat congue leo bibendum, vel maximus enim sagittis. Fusce id imperdiet quam. Cras blandit, tortor et rhoncus feugiat, felis mauris dictum ligula, facilisis suscipit dolor justo eu tellus. Sed volutpat massa ac lectus sodales interdum. Integer sit amet sem ut tortor feugiat finibus nec et ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean pretium hendrerit nisi, vitae eleifend elit varius sed. Nam nunc dolor, dapibus a dictum non, posuere eu nunc. Vestibulum fermentum pharetra nibh. Quisque tempus odio ac felis bibendum, sit amet pharetra ex egestas. Pellentesque facilisis risus sit amet lorem feugiat auctor.</p>
<p>Donec quis nisi eu erat fringilla sodales in ut risus. Proin diam elit, commodo lacinia odio vel, efficitur mattis justo. Fusce vitae enim tortor. In eget dolor at felis congue imperdiet. Integer eu ex non urna porttitor imperdiet. Pellentesque ante diam, vestibulum ut ex ut, lacinia rutrum velit. Integer ultrices mattis velit quis malesuada. Mauris venenatis nisi erat, id facilisis ligula aliquam et. Suspendisse rhoncus, odio sit amet sagittis fringilla, nibh felis tincidunt justo, nec placerat ipsum urna vel ex. Suspendisse arcu ipsum, finibus ac odio nec, dapibus sollicitudin tortor. Praesent interdum condimentum faucibus. Proin rutrum mi sed ante dictum viverra. Maecenas egestas, quam et venenatis porta, dolor lectus elementum sem, at ornare magna mauris sed mi. Aenean euismod aliquam neque, id sagittis sapien rhoncus vel.</p>
<p>Vivamus eget felis eget dolor euismod suscipit. Fusce maximus sagittis ipsum, non sodales enim facilisis in. Praesent pulvinar lectus quis nisl congue, vitae egestas libero elementum. Phasellus consectetur nec risus sed ornare. Curabitur maximus placerat dolor. Pellentesque quis tempor sapien. Integer feugiat pretium nulla at vulputate. Mauris imperdiet nisl eget lectus fermentum accumsan. Integer iaculis iaculis libero, non tincidunt ipsum vehicula quis. Phasellus tellus justo, dignissim et est a, sodales sagittis libero. In scelerisque orci nec facilisis bibendum. Morbi sodales, lorem sed dapibus vulputate, magna justo mollis justo, id gravida turpis nibh non diam. Aenean vulputate justo vel neque molestie fringilla. Donec pellentesque, sapien suscipit feugiat aliquam, augue ligula gravida metus, sed bibendum nunc sem ac lorem. Suspendisse vitae accumsan ipsum. Curabitur aliquam leo ex.</p>
<p>Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Sed tristique felis enim, in auctor leo semper id. Aliquam a porta dui, ut bibendum dolor. Etiam tortor nisi, efficitur sit amet suscipit non, convallis tristique nisi. Ut nec justo pellentesque ex rhoncus laoreet. Nam posuere orci eget ipsum sollicitudin accumsan. Quisque in dolor nec eros cursus consectetur id vel ipsum. Nam convallis, ante vel vulputate bibendum, elit ligula laoreet ipsum, id venenatis est nisl eget purus. Nunc id luctus metus.</p>
<p>Sed faucibus urna felis, sit amet posuere urna porta at. Proin dictum tempus sapien, sit amet fermentum magna laoreet sit amet. Phasellus ac rhoncus elit. Suspendisse sed massa vel enim ultrices aliquam. Integer a lectus massa. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed laoreet orci sed dolor lobortis, vitae laoreet justo laoreet. Nam iaculis lacinia mauris et vestibulum. Quisque imperdiet dolor convallis interdum varius. Donec eget neque dolor. Quisque consequat ultricies nulla, a tincidunt nunc dignissim et. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. In augue eros, maximus non neque id, fermentum accumsan orci.</p>
<p>Quisque ut nisi id erat sollicitudin tristique volutpat et diam. Pellentesque euismod ex ac lectus pulvinar, nec blandit ipsum elementum. Quisque commodo, turpis et fringilla pretium, ipsum turpis bibendum eros, sit amet tincidunt urna lectus at felis. Nullam ullamcorper arcu enim, eget bibendum augue vestibulum id. Nullam facilisis, diam non venenatis pharetra, urna justo convallis augue, et lobortis nisi odio et magna. Aliquam sodales lectus nec gravida imperdiet. Vestibulum quis diam eget nibh imperdiet luctus eleifend eget mauris.</p>
<p>Donec varius dui a sodales commodo. Aliquam fermentum fringilla velit sit amet ullamcorper. Sed non leo pretium, pellentesque diam et, bibendum augue. Praesent quam ipsum, condimentum eget convallis a, ultrices at tellus. Nunc fermentum massa non dui semper interdum. Quisque feugiat consectetur tellus sed fermentum. Duis sem enim, gravida in erat eu, placerat tristique neque. Mauris libero sapien, ullamcorper id elit at, facilisis suscipit nunc. Integer lorem tellus, ultricies id iaculis fermentum, lacinia vitae metus. Pellentesque in lectus pretium arcu suscipit imperdiet. Vivamus id laoreet tortor. Curabitur augue nisi, iaculis ac faucibus eget, tempor quis eros.</p>
<p>Suspendisse libero lacus, rutrum ut semper suscipit, facilisis eu ante. Nullam consequat tempor nisi, vitae placerat libero suscipit in. Nullam ut erat finibus elit venenatis porttitor condimentum sed ante. Donec sed euismod sapien. Cras maximus nulla ex, sit amet pretium erat sodales eu. Curabitur lectus felis, porta quis est id, hendrerit consequat eros. Curabitur auctor, est in sodales efficitur, justo diam sollicitudin lacus, nec ornare felis velit vitae magna. Cras ullamcorper pulvinar massa quis semper. Ut rhoncus turpis eu eros gravida dignissim. Quisque facilisis leo vitae dignissim feugiat. Aliquam sagittis, turpis non porta viverra, purus augue euismod ante, ultrices molestie ligula massa sed arcu. In neque tellus, dictum eget facilisis et, gravida in mi.</p>
<p>In hac habitasse platea dictumst. Nam quis tellus nec est vulputate auctor at in elit. Phasellus quis efficitur lacus. Nunc eget tempus est. Aliquam eget nisi in quam molestie vestibulum. Nunc sollicitudin massa ut justo imperdiet auctor. Nullam venenatis elementum vulputate.</p>
<p>Nulla sed pharetra turpis. Aenean rutrum sem quis nunc viverra ornare. Integer purus enim, ornare sit amet pulvinar vitae, egestas id massa. Praesent condimentum efficitur sagittis. Nullam bibendum nibh enim, eu semper sapien pellentesque quis. Sed lobortis, elit ac vulputate interdum, risus sem hendrerit sapien, ac pharetra dui sem id sem. Pellentesque elementum interdum elementum. Cras dapibus non velit ut vulputate. Nam auctor at tortor vel congue. Nulla vel nisi et augue pretium pretium. Nunc quis metus non mi posuere ultricies. Cras viverra felis id feugiat ornare. Sed sapien nulla, vulputate ac dignissim non, mattis eu lorem.</p>
<p>Ut luctus volutpat euismod. Quisque libero felis, euismod ac metus vitae, sollicitudin finibus justo. Sed consequat turpis tempor, placerat diam et, elementum augue. Integer vel venenatis tellus. Donec ut dolor accumsan, aliquet libero sit amet, ornare nisi. Nam id cursus ante. Sed vitae posuere risus. Pellentesque fringilla lectus vel ante vestibulum porttitor. Duis maximus mi purus, vel ullamcorper tellus laoreet eget.</p>
<p>Sed et ligula ut lectus euismod tempus quis sed sapien. Phasellus varius pellentesque malesuada. Maecenas sit amet lorem neque. Nam maximus nisi vitae erat feugiat, ac finibus sapien auctor. Quisque accumsan felis at fringilla molestie. Duis leo diam, tincidunt et ultrices at, elementum ut augue. Vestibulum lobortis lorem iaculis ipsum consequat, at condimentum lacus semper. Aliquam velit dui, ultrices vel tellus lacinia, semper aliquet eros. Pellentesque rhoncus dolor nec leo aliquam, vitae lobortis mauris tempor. Praesent lacinia lectus in nisl hendrerit laoreet. Proin efficitur dui diam, sed vulputate eros pharetra eu. Mauris id justo sit amet dui porttitor tincidunt. Donec vitae arcu at lacus ultrices porta. Suspendisse potenti. Nulla blandit hendrerit felis, et dignissim ex fermentum vel.</p>
<p>Quisque aliquet, nisl ut ullamcorper hendrerit, magna ex consectetur nisi, sed mattis purus lacus eu neque. Etiam in lacus et dolor dignissim porta eget ac ligula. Nulla eu enim eget ante pretium porttitor. Nullam fringilla rhoncus ipsum id volutpat. Integer at quam quis purus varius finibus id vitae metus. Cras varius gravida eros nec egestas. Praesent pharetra, justo nec pulvinar tempus, erat ante tempus eros, vel fermentum metus ex vitae ante. Sed bibendum, lorem eu rhoncus maximus, lorem neque aliquam velit, at vestibulum diam risus at nibh. Maecenas sit amet egestas erat, eu molestie purus.</p>
<p>Vivamus viverra, sapien sit amet vestibulum gravida, eros urna sodales odio, eu tincidunt quam diam ut mi. Morbi posuere nibh ex, in eleifend dolor elementum ut. Vestibulum eu odio eu dolor gravida consequat. Quisque in nisl ac ligula vulputate sodales. Suspendisse rutrum lacus sit amet tincidunt porttitor. Pellentesque ut quam quis nulla ullamcorper tincidunt. Suspendisse eget accumsan neque. Aenean dictum libero vel suscipit tristique. Vivamus dictum vel quam sed congue. Sed pulvinar ut mauris non molestie. Pellentesque fermentum massa in auctor ultricies. Praesent ac feugiat nulla, ut ultricies purus. Nulla mollis posuere sem et euismod.</p>
<p>Nam pellentesque sapien fringilla ex efficitur venenatis. Integer vitae nulla tempus, egestas ante at, semper mauris. Ut at nisi eu ante tempus interdum id eget nunc. Cras venenatis facilisis dolor, sit amet mattis felis congue sit amet. Suspendisse potenti. Praesent risus lacus, imperdiet at magna eget, elementum condimentum nulla. Fusce at leo vitae dui porta feugiat. Nunc ut ornare lorem. Suspendisse eu elementum ante. Praesent efficitur ultrices tellus at fringilla.</p>
<p>Integer id urna rhoncus, elementum tellus quis, dignissim quam. Nulla nec laoreet turpis. Nulla elit mauris, interdum in purus quis, hendrerit rhoncus nulla. Aliquam sit amet fringilla turpis, sed commodo nisl. Vestibulum pellentesque risus vitae lacus efficitur, a rutrum nulla volutpat. Donec sagittis at lectus vitae pharetra. Suspendisse potenti. Fusce eget fermentum quam. Sed eu pharetra nisi, vitae laoreet massa. Praesent eu pulvinar nisl. Vestibulum vitae faucibus nunc, nec fringilla nulla. Phasellus aliquam felis sed viverra egestas. Pellentesque augue urna, volutpat ut ex eget, feugiat tempus neque. Nulla sed purus lobortis, tincidunt nunc elementum, mattis eros. Curabitur a ipsum nisl.</p>
<p>Etiam eget risus neque. Etiam sollicitudin congue est, vitae sodales orci dictum id. Ut in malesuada felis. Praesent id diam quis nunc dapibus lobortis. Sed eu ex mi. Praesent sed ornare nulla. Praesent elementum velit consectetur lectus mattis, nec placerat sapien hendrerit. Curabitur nec arcu iaculis ipsum cursus fermentum. Nam maximus neque ac arcu porttitor, ac rutrum ante blandit. Mauris ullamcorper vehicula quam eget iaculis.</p>
<p>Maecenas posuere mi ante, vel finibus nisl aliquam luctus. Aenean in justo eu est maximus tempor eu vel sapien. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc arcu dolor, sagittis vel sapien eu, pharetra lobortis sem. Sed in pretium odio, et maximus augue. Nullam ultricies sapien vitae mauris congue fermentum. Cras et tristique lacus. Duis posuere, metus sit amet faucibus facilisis, felis massa aliquet diam, vitae dignissim ipsum velit ac elit. Suspendisse et auctor ligula, ut dignissim arcu. Sed scelerisque erat at pellentesque dictum. Etiam ac risus at odio venenatis dictum. Aenean commodo, enim ac rutrum blandit, metus dolor lacinia magna, vitae tempus mi diam eu erat. Sed at ornare lorem.</p>
<p>Nulla varius efficitur nunc, quis posuere orci hendrerit ac. Nam vitae justo mollis, vestibulum nibh non, fringilla ante. Aenean porttitor nisl nec fermentum vestibulum. Ut pulvinar id quam eu sagittis. Phasellus lobortis, tortor faucibus egestas auctor, justo eros ultricies ligula, nec efficitur lectus ante sit amet felis. Duis cursus, leo ut rutrum dignissim, mauris metus lacinia mi, cursus cursus arcu elit sit amet elit. Integer eleifend scelerisque tincidunt. Morbi vitae leo tortor. Curabitur venenatis tempor diam nec blandit. Etiam blandit eros massa. Vivamus egestas nunc est, at dignissim neque convallis vel. Donec sit amet dictum odio. Nulla non ante nec sem aliquam efficitur. Etiam ullamcorper ultrices nisi, vitae laoreet metus venenatis ac.</p>
<p>Aliquam placerat mauris vitae sem cursus, ac mattis nunc rutrum. Aenean semper neque sed enim ornare pharetra. Nulla non tristique enim, ac dictum tortor. Donec laoreet aliquam orci, id vulputate arcu congue ac. Sed tempus tristique eros in imperdiet. In aliquam metus sit amet tortor semper interdum. Suspendisse potenti. Fusce pulvinar velit quam, gravida feugiat ex dapibus sed. Morbi varius hendrerit risus, at mollis augue feugiat ac. Sed et erat fringilla, hendrerit dolor et, pulvinar ante.</p>
<p>Ut mattis sapien eu mi dictum, at vestibulum metus lobortis. Ut faucibus enim nec sollicitudin tincidunt. Ut vel risus molestie, feugiat lacus in, hendrerit lorem. Donec risus dui, porttitor sit amet consectetur sit amet, pulvinar in tellus. Suspendisse feugiat ligula lacus, eu laoreet eros ultricies ut. Quisque pulvinar sit amet leo vel consequat. In mollis, enim id ornare pulvinar, nisl lectus varius mauris, quis fermentum ante diam ac justo. Sed pharetra elit sit amet mattis vestibulum. Proin vel maximus dui. Nulla dictum odio non laoreet bibendum. Fusce tincidunt pharetra libero, nec bibendum nisi maximus non. Curabitur vel egestas lectus. Proin nec sem ligula. Curabitur aliquam nisl ac metus rhoncus mollis. Pellentesque tempor orci eget nibh mattis mollis. Vestibulum ac maximus quam.</p>
<p>Donec sed tortor non neque maximus tincidunt vel vitae tellus. Praesent fringilla convallis ex, vehicula eleifend lectus efficitur at. Cras non mattis diam. Integer convallis est aliquam urna convallis pharetra. Vestibulum vitae nisl at nisl dapibus molestie. Curabitur interdum tortor non fringilla maximus. Aliquam sagittis augue elit, sit amet dictum dolor condimentum ut.</p>
<p>Nullam aliquam ligula eu volutpat convallis. Fusce at laoreet felis. In hac habitasse platea dictumst. Aenean vitae viverra erat, ac pharetra est. Nullam vel magna dui. Proin eu varius tortor. Etiam sed porttitor libero. Cras eget augue nibh. Nulla iaculis pretium enim nec consequat. Nunc id tempus erat, non sodales velit. Phasellus leo risus, gravida sed justo sit amet, vestibulum pretium nulla. Nullam finibus ornare convallis.</p>
<p>Etiam in efficitur felis. Vivamus egestas facilisis augue at dictum. Proin tristique venenatis tellus vel convallis. Ut ipsum mauris, hendrerit at tempus vitae, pretium nec felis. Donec vitae euismod est. Nunc ut magna mi. Sed vel tristique purus. Donec eleifend auctor lobortis.</p>
<p>Etiam a mollis dui, sit amet luctus purus. Proin dapibus vehicula urna, eget tincidunt mauris ultrices eu. Nulla ac quam eu quam volutpat porttitor. Mauris bibendum, tellus nec egestas blandit, mi neque interdum quam, non volutpat metus arcu eu ante. Maecenas a accumsan mi, ut ullamcorper elit. Vivamus tellus libero, mattis a turpis cursus, suscipit aliquam neque. Morbi facilisis vel mi vel varius. Aliquam magna lectus, lobortis ut purus nec, ullamcorper pharetra magna. Curabitur vulputate, risus et luctus efficitur, massa mauris aliquam enim, consectetur accumsan lorem nisi ut augue. Cras eleifend auctor lorem at fringilla. Pellentesque quis felis quam.</p>
<p>Quisque sodales scelerisque mauris at commodo. Pellentesque volutpat nisi mi, vel feugiat metus bibendum eget. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Fusce cursus lectus id est scelerisque scelerisque. Integer convallis sit amet ipsum at iaculis. Nam sed sem dui. Mauris non tempus tortor.</p>
<p>Nam at placerat erat. Maecenas egestas pharetra nibh, et facilisis nunc convallis id. Donec convallis sodales ipsum. Vestibulum non nisi ac orci dictum iaculis at at neque. Pellentesque suscipit leo turpis, eget tempor odio pharetra at. Sed leo arcu, pellentesque sed sagittis id, mattis non massa. In eget dui finibus, volutpat quam sed, fringilla leo. Donec fringilla malesuada consequat. Duis non nulla ac massa venenatis congue non nec neque. Donec tincidunt arcu vel leo ullamcorper, non dapibus nisi imperdiet.</p>
<p>Sed consequat ex nec fringilla interdum. Fusce sollicitudin, odio ut blandit feugiat, sapien eros aliquam magna, in consequat enim arcu scelerisque mauris. Nunc euismod felis vel ipsum pretium, in interdum tellus posuere. Nullam eget fringilla orci, vel ullamcorper metus. Maecenas vehicula, nulla sit amet tincidunt dictum, ipsum est interdum lacus, vel dictum velit libero id ex. Etiam mollis nec tortor at pretium. Nullam vitae euismod leo. Suspendisse potenti. Vestibulum eu nisi eget augue maximus vulputate vitae vel nisl. Pellentesque faucibus, elit quis vehicula sodales, nibh turpis efficitur sem, sit amet eleifend sem enim porttitor ligula. Nam vitae tellus id leo interdum eleifend.</p>
<p>Sed nunc dolor, pharetra ac laoreet a, elementum vitae ipsum. Integer dapibus nisi quis nisi tempor ullamcorper. In condimentum velit libero, cursus facilisis est sodales sed. Proin sed sollicitudin leo. In id metus vel dolor iaculis scelerisque. Quisque eu mi elementum, facilisis mauris bibendum, condimentum risus. Aliquam euismod, sapien at hendrerit fermentum, diam est aliquam turpis, nec pulvinar est ex eu sem. Integer eleifend ligula ac porta suscipit. Sed eros nibh, vulputate vitae placerat a, semper nec diam.</p>
<p>Sed gravida tortor massa, a vestibulum velit cursus vitae. Pellentesque sodales ligula est, eget convallis ligula blandit ut. Phasellus ac rhoncus odio. Quisque non efficitur sem. Quisque pharetra viverra maximus. Pellentesque sodales nunc eget massa elementum, ac placerat libero mattis. In porttitor ultricies sem, eu sagittis nisl luctus sit amet. Praesent dapibus mi vitae urna aliquet, nec semper sem efficitur. Sed vel orci eu nisl tempor mollis a sed tellus. Pellentesque vel laoreet lorem, eget facilisis ex. Aliquam blandit nunc at leo faucibus tincidunt. Duis finibus porttitor turpis et tincidunt. Cras sed augue condimentum ligula porttitor facilisis. Vestibulum semper sapien nibh, eget imperdiet sapien aliquet quis. Integer eleifend ipsum sed dolor convallis, et cursus purus convallis.</p>
<p>Vestibulum commodo fermentum laoreet. Nam vel justo quis risus eleifend imperdiet id quis risus. Nulla sit amet semper eros. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Curabitur eget nulla finibus sapien hendrerit auctor. Fusce laoreet porta nisi id convallis. Morbi molestie pellentesque elit, at posuere elit porta non.</p>
<p>Vivamus bibendum, nibh eget lobortis maximus, lectus leo bibendum orci, vitae maximus dui orci vitae purus. Praesent mattis nisi cursus nisi imperdiet tempor. Aliquam massa lacus, volutpat id est eu, sagittis blandit ex. Duis eu hendrerit justo. Nam volutpat cursus ex, et tempus diam ullamcorper dapibus. Mauris id finibus felis. Suspendisse efficitur pretium nunc, id pharetra sem consectetur non. Nam tempus odio tortor, at varius tellus efficitur at. Fusce maximus non eros ac venenatis. Fusce imperdiet at turpis nec sollicitudin. Fusce justo est, luctus id orci vel, accumsan tempor ipsum.</p>
<p>Phasellus vel semper velit. Phasellus faucibus consectetur diam, quis luctus ipsum pretium at. Mauris sit amet ultricies quam. Morbi ac ornare lorem, eu pellentesque mi. Nam ultrices dolor at enim fermentum pharetra. Ut ac posuere lectus. Morbi ullamcorper urna sed molestie volutpat. Curabitur porta cursus velit, et porta ligula sodales sed. Donec tincidunt est ac gravida luctus. Praesent sed purus elementum, varius arcu laoreet, sagittis dolor. Integer cursus diam dui, vitae condimentum lectus vestibulum a. Maecenas vitae enim urna. Vestibulum vel malesuada leo. In hac habitasse platea dictumst.</p>
<p>Integer vitae nisi lorem. Praesent luctus ullamcorper urna, sed tempor erat maximus vitae. Morbi vestibulum nisi dapibus iaculis hendrerit. In quis ligula id mi laoreet molestie sed in elit. Donec at leo dui. Vivamus sit amet placerat urna. Nunc facilisis commodo mauris, ut scelerisque leo luctus eget. Donec sed sem ut tellus malesuada rhoncus. Nulla condimentum fringilla elit, id mollis erat mollis eget. Vestibulum hendrerit massa at egestas bibendum. Donec fermentum nibh non nisl tincidunt, at porta massa vulputate. Sed euismod magna vitae nibh ultricies vehicula. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>
<p>Proin tincidunt eros sed elit vulputate, id tincidunt sem maximus. In blandit sed metus nec aliquet. Duis bibendum, neque ut malesuada pharetra, felis lectus mollis dui, sed mollis urna ex at ligula. Vivamus vel ex erat. Phasellus tempor imperdiet tortor eget imperdiet. Aliquam semper quam quis felis ultrices, ac congue lorem ultrices. Suspendisse metus justo, ultrices eu erat vitae, ornare consectetur ligula. Mauris eleifend imperdiet ante, ut suscipit eros varius a. Sed pulvinar sollicitudin magna, id tincidunt risus dignissim id.</p>
<p>Maecenas feugiat ullamcorper augue, eu porta lacus cursus ac. Fusce pretium at metus sit amet fermentum. Donec auctor lectus non ligula pulvinar, non faucibus erat ultrices. Nunc sit amet nisl elit. Morbi aliquam odio vitae aliquet rhoncus. Suspendisse justo nulla, aliquet quis massa id, laoreet commodo enim. Etiam sed risus lorem. Sed justo massa, cursus eget felis eu, commodo mollis ante.</p>
<p>Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nunc dictum metus ex, quis sodales lorem facilisis vel. Sed condimentum dictum sagittis. Nullam sagittis diam felis, vitae laoreet neque tincidunt quis. Maecenas viverra sed urna ut vestibulum. Suspendisse diam quam, dignissim nec elit sed, congue luctus ligula. Proin aliquam, orci eget viverra ornare, metus sapien gravida libero, sit amet lacinia velit lectus eget ante. Phasellus id nisl in urna euismod euismod. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Integer mauris libero, scelerisque eu posuere et, tempor imperdiet justo. Vestibulum non massa ut nibh accumsan scelerisque interdum sit amet libero. Etiam ut elit ac ante sagittis pellentesque a eu velit.</p>
<p>Vivamus in est nec nisl varius elementum. Donec id nisi eu eros convallis egestas. Sed vitae ligula lacinia magna fringilla vulputate. Morbi nibh purus, malesuada nec purus sed, commodo commodo nisl. Praesent pharetra tellus lacus, et sodales elit condimentum non. Vivamus a ornare lectus. Sed sodales aliquam sodales. Fusce ultrices, sapien eget condimentum euismod, nunc tellus convallis ex, vitae tempor enim diam at velit. Pellentesque at egestas velit. Pellentesque a ullamcorper turpis, dictum maximus eros.</p>
<p>Etiam vel est tempor, tristique nunc eu, aliquam orci. Proin sem dui, volutpat sed auctor nec, pharetra et purus. Donec aliquam lobortis purus ut pharetra. Mauris at sapien sit amet metus auctor euismod vitae a nunc. Aenean aliquam purus felis, nec bibendum lorem rutrum ut. Donec sed dignissim justo. Sed fringilla sollicitudin felis, malesuada aliquet nulla. Sed at sem gravida, placerat magna a, rhoncus magna. Ut vitae sodales nibh, maximus vulputate dolor.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur sit amet sodales metus, ut maximus risus. Aliquam accumsan, massa in varius feugiat, tortor elit aliquet erat, ut consectetur sem ex et orci. Nunc vel pellentesque orci. Vestibulum non augue tristique sapien sagittis iaculis at quis massa. Maecenas nec fermentum augue. Quisque quis vestibulum arcu. Nam hendrerit sem ipsum, sed elementum neque viverra at. Vivamus mattis vehicula eleifend. Aenean viverra nisi quis sagittis ullamcorper. Fusce hendrerit finibus massa nec imperdiet. Praesent suscipit, purus nec dapibus maximus, ante dui dapibus dolor, et vehicula tortor odio id diam. Nullam a odio id est laoreet elementum luctus viverra magna.</p>
<p>Nunc ligula mi, eleifend id nulla nec, placerat gravida odio. Fusce ac vulputate est. Integer non purus ac urna congue cursus nec vitae neque. Pellentesque hendrerit velit libero, et cursus quam dictum efficitur. In sagittis et lectus sed consequat. Proin ut gravida eros. Vestibulum in dignissim neque. Etiam placerat dapibus lorem sit amet congue. Integer id velit vitae eros pharetra egestas sed non velit. Aenean eget tristique eros. Ut vitae arcu pharetra, tristique nibh id, ultricies justo. Etiam porttitor neque arcu, eget sollicitudin nibh laoreet eu. Duis nec purus eu erat feugiat blandit nec eget nibh.</p>
<p>Aenean scelerisque diam egestas tortor rutrum, eu rhoncus ipsum porta. Etiam vel eros eget lorem cursus efficitur id at lacus. Sed pulvinar ante et lectus sollicitudin dictum. Pellentesque vel interdum lectus. Mauris vulputate et odio sed dapibus. Donec tortor tellus, sodales eu dui quis, consequat mollis nunc. Nunc vel augue neque. Vestibulum urna diam, dignissim in dolor imperdiet, semper iaculis tellus. Nunc ac sem urna. Nullam efficitur, tortor ut sagittis hendrerit, dolor diam posuere lorem, id rutrum ex leo a lacus. Pellentesque molestie, risus quis condimentum posuere, quam nulla blandit erat, quis viverra augue justo faucibus erat. Vestibulum sed rutrum arcu. Nunc dui mi, blandit a tortor vel, laoreet volutpat mi. Aenean dapibus mauris ut elit mollis, sit amet congue est porttitor. Vivamus nec purus justo.</p>
<p>Nam nec dui et felis tristique posuere nec quis justo. Suspendisse fringilla nibh a ex tempor finibus. Etiam pretium nulla sem. Etiam ac augue bibendum, blandit ipsum vel, gravida dolor. Curabitur pellentesque orci tincidunt, lacinia felis quis, porttitor mauris. Nullam semper eleifend ante sodales molestie. Duis vitae turpis vel ante lobortis rutrum. Sed ut arcu facilisis, congue est eu, pharetra tellus. Nullam odio metus, scelerisque a quam id, pharetra blandit dolor. Integer ut sollicitudin ligula, eu condimentum ante. In non lectus ex. Praesent efficitur bibendum lacus in faucibus. Donec feugiat fringilla arcu.</p>
<p>Phasellus quis tortor eu arcu aliquam viverra. In ut odio interdum, feugiat purus a, convallis diam. Mauris non sapien enim. Nunc gravida nibh elementum, dictum dolor in, tempus neque. Nullam pretium nunc quis maximus malesuada. Fusce in tincidunt quam, eu porttitor arcu. Nunc ornare in magna et facilisis. Mauris accumsan ex ac scelerisque dignissim. Praesent libero massa, congue nec massa et, pulvinar facilisis felis. Aliquam tristique mauris vitae dui consectetur molestie. Donec ac lectus lacus. Aliquam eu augue quis eros volutpat iaculis.</p>
<p>Mauris nec accumsan arcu, eu porttitor dolor. Nunc scelerisque pellentesque nisi sed mollis. Integer quis tincidunt sapien. Pellentesque a elit in eros interdum efficitur quis vel arcu. Mauris malesuada nunc lacus, ac auctor mauris lobortis non. Etiam sit amet ullamcorper mi. Vivamus a volutpat lorem. Donec at velit tristique, consectetur nunc vitae, condimentum mauris. Pellentesque molestie lectus ac purus finibus condimentum. Etiam luctus lectus vitae maximus consequat. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Morbi hendrerit risus a odio auctor pellentesque. Suspendisse potenti. Phasellus at ante felis. Nam mattis scelerisque bibendum. Sed vel ornare orci.</p>
<p>Duis a euismod quam. Suspendisse non massa mi. Morbi sed tellus egestas, semper felis eu, dignissim justo. Phasellus sollicitudin eu orci eget condimentum. In hac habitasse platea dictumst. Aliquam erat volutpat. Quisque sit amet lacinia ante, ac vehicula mauris. Donec aliquam in augue ut vestibulum.</p>
<p>Vivamus efficitur sapien nec mi vulputate, vel eleifend turpis consectetur. Duis quis massa mattis felis faucibus egestas. Donec lobortis leo eu arcu gravida, a vestibulum neque tristique. Vivamus in rhoncus mi. Curabitur ipsum diam, sollicitudin in massa in, viverra lacinia ante. Fusce cursus orci ipsum, non semper neque consequat imperdiet. Donec in lorem vel enim vestibulum sagittis at quis tortor. Suspendisse potenti. Praesent lobortis, eros ut molestie tristique, tortor ante suscipit nibh, a semper felis nibh vel purus. Integer in congue ligula.</p>
<p>Aliquam ultrices at purus ac luctus. Proin finibus metus est, non egestas purus dapibus sit amet. Maecenas dapibus, urna ac accumsan sagittis, metus ipsum rutrum dolor, a elementum justo odio ut massa. Nullam sollicitudin ipsum sagittis, venenatis purus non, elementum ligula. Donec quis lacus sem. Fusce pulvinar turpis ut leo facilisis, ac varius lacus lacinia. Quisque viverra augue ut leo gravida porttitor. Maecenas ullamcorper ante sed purus rhoncus tempor. Mauris dictum tellus vitae iaculis facilisis. Cras dignissim at purus id vehicula.</p>
<p>Mauris iaculis ultricies nibh, in aliquet odio mattis ut. Proin consectetur blandit risus sit amet aliquam. Vestibulum a urna vestibulum, bibendum dui luctus, facilisis ante. Nullam efficitur tristique enim. Maecenas justo tellus, scelerisque quis blandit at, aliquam vel tortor. Duis nec elit ligula. Pellentesque luctus malesuada tortor, et faucibus velit convallis ut.</p>
<p>Morbi ac velit vitae risus aliquam vestibulum a et purus. Sed fringilla euismod erat, quis dapibus arcu efficitur nec. Cras mollis sed turpis maximus maximus. Donec vitae ligula id libero lacinia interdum vel sed massa. Maecenas elementum nunc justo, porttitor suscipit ex imperdiet vel. Nullam accumsan tincidunt ligula, ut venenatis augue sodales eu. Phasellus vestibulum vehicula urna, in lobortis elit vulputate ut. Morbi vulputate convallis mauris, nec eleifend quam dictum ut. Nam dictum turpis eu imperdiet lobortis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam luctus cursus ante, a malesuada ex tincidunt et. Fusce consectetur est vel orci volutpat vulputate. Suspendisse congue dictum nisi quis commodo. Pellentesque molestie, nunc in interdum hendrerit, massa sapien fringilla sapien, eu feugiat enim est eu dolor. Phasellus quam lectus, luctus id justo id, lacinia gravida sapien.</p>
<p>Quisque suscipit interdum massa, eget facilisis neque tempor eu. Quisque eu ante at enim ullamcorper aliquam. Nullam at lacus metus. Aenean facilisis, felis eget dictum vulputate, lectus ante commodo est, at fringilla massa metus eu urna. Ut in dignissim lorem. Fusce sit amet magna rhoncus, commodo felis tempor, accumsan nisl. Fusce mollis, eros sit amet egestas feugiat, leo mi auctor justo, eu dignissim turpis elit ut tortor. Mauris nec feugiat urna. Integer dui neque, ultrices vel massa quis, dignissim fringilla sapien. Fusce vulputate tellus in lacus ultricies, sit amet suscipit magna rutrum. Proin at lectus sodales, pharetra neque et, laoreet sapien. Vestibulum diam turpis, gravida eu augue quis, fermentum mollis dui. Integer faucibus, felis ac convallis scelerisque, neque magna laoreet velit, nec dictum lectus elit sed nibh. Integer orci leo, facilisis vel imperdiet at, tristique ac mauris. Pellentesque quis ex sodales, porttitor turpis eu, pharetra dui.</p>
<p>Duis euismod diam urna, at ullamcorper dui tincidunt vitae. Curabitur vel erat sit amet arcu vehicula lacinia sed ac arcu. Cras neque nisl, posuere vitae dictum a, dapibus a diam. Cras non euismod ligula. In condimentum, urna vel blandit egestas, sapien diam condimentum turpis, at dapibus elit ante a orci. Mauris maximus dui sapien, luctus imperdiet quam efficitur quis. In sit amet leo nec nisi dictum accumsan id vel mi. Fusce auctor arcu sem, quis cursus urna semper a. Cras quis tempor ante. Integer cursus dapibus erat eu porta. Curabitur eleifend posuere enim nec vehicula. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam in dui nec metus vulputate rhoncus a at diam. In turpis libero, luctus quis metus in, posuere blandit metus.</p>
<p>Sed auctor dictum finibus. Sed tristique arcu vel diam pulvinar dapibus. Aliquam in arcu nec arcu vehicula euismod non eu nulla. Aliquam fermentum justo non lorem placerat rutrum vel sit amet metus. Suspendisse massa mi, tincidunt et placerat eget, consectetur sed erat. Fusce dictum metus tortor, a pulvinar justo posuere quis. Sed fringilla pharetra ex, eget faucibus lacus dignissim et. Curabitur posuere dui ac turpis scelerisque, eu scelerisque mi viverra. Vestibulum pulvinar nibh eu dui pharetra placerat. Praesent varius augue nisi, quis iaculis leo porttitor aliquet. Nulla imperdiet, nisl in dignissim vestibulum, dolor dui tempor leo, ultrices aliquam libero lacus a purus.</p>
<p>Integer ut erat lacinia ligula tincidunt malesuada. Proin sed varius tortor. Ut sodales dolor sit amet porttitor condimentum. Suspendisse sit amet orci euismod, tincidunt augue eget, mattis leo. Suspendisse sit amet arcu posuere tellus porttitor ornare vitae vitae est. Donec quis posuere odio. Nullam ut lacinia nulla, at laoreet risus. Sed dui tortor, facilisis vel tortor sit amet, ullamcorper dictum ante. Pellentesque eget diam augue. Duis dictum felis id ultricies finibus. Vivamus in consectetur dolor, sit amet mollis ex. Sed fermentum neque ac leo faucibus, et eleifend ante interdum. Sed pharetra libero eget mauris tincidunt, ut sagittis sapien facilisis. Vivamus vel malesuada quam. Ut consequat cursus risus sit amet aliquet.</p>
<p>Donec in eleifend lacus. Phasellus lacinia diam id ligula rhoncus, a laoreet ipsum mattis. Praesent enim lectus, interdum eu consequat sed, efficitur id diam. Praesent ultricies rhoncus nisl, ac gravida dui sodales non. Aenean molestie pulvinar mi quis consectetur. Curabitur quis hendrerit risus. Mauris justo nisl, pretium at lorem id, euismod volutpat nisl. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse eget magna non tellus pretium imperdiet eget a ligula. Fusce a est non urna rhoncus molestie. Sed at nunc ut nibh eleifend accumsan. Nunc bibendum eu augue nec interdum. Duis consequat, nibh a egestas imperdiet, mauris magna malesuada urna, vitae elementum leo orci eu nulla.</p>
<p>Donec sodales ipsum id velit rhoncus efficitur. Aliquam in diam sit amet felis fringilla consectetur nec nec nibh. Proin tincidunt dignissim neque sed volutpat. Curabitur in vulputate tortor. Duis at lacinia nisi, non laoreet lectus. Nullam neque lacus, scelerisque in augue sed, finibus pharetra tellus. Cras quis mi in elit accumsan volutpat. Nullam feugiat, est vel luctus iaculis, libero arcu ultricies lorem, non hendrerit ex nisl nec est. Sed ullamcorper, eros ut vulputate pretium, orci augue porta urna, ullamcorper interdum dui nunc et mi.</p>
<p>Nunc maximus sem tortor, ut iaculis justo fringilla a. Nulla facilisis sit amet urna ut suscipit. Curabitur sodales volutpat velit eget accumsan. Nulla in dolor vel nulla gravida porta. Suspendisse vehicula augue eget risus luctus dapibus. Etiam bibendum quam ante, scelerisque vulputate elit faucibus at. Vestibulum eu bibendum neque, at convallis dui. Aenean facilisis, orci non eleifend bibendum, sapien neque rhoncus est, sit amet blandit lorem quam vel sapien.</p>
<p>Aliquam eros elit, auctor non pharetra id, egestas ac nulla. Morbi maximus, orci nec viverra interdum, nulla lacus ultrices justo, sit amet sodales massa magna id dolor. Praesent tempus augue non erat vehicula, ut laoreet erat accumsan. Phasellus commodo, neque ac efficitur finibus, urna nibh maximus eros, eget scelerisque enim urna a dui. Nullam malesuada felis at ante vulputate, eget blandit elit ornare. Proin ac elit sollicitudin, malesuada quam vel, eleifend orci. Fusce mollis vel quam in elementum.</p>
<p>Nullam ut erat id metus elementum tincidunt at ac dolor. Morbi vel commodo neque, ac commodo eros. Nulla fermentum massa urna, a fermentum elit bibendum vitae. Duis pharetra mauris nec ultrices feugiat. Vestibulum justo nisl, tempor at neque vel, accumsan consequat lacus. Sed quis enim eu augue luctus consequat ac sit amet felis. Ut bibendum, augue et volutpat blandit, nisi odio egestas mauris, eu euismod tellus tellus vitae tortor. Morbi sit amet magna condimentum, blandit lacus a, condimentum ipsum. Nullam ut tristique justo. Integer laoreet laoreet facilisis. Nullam molestie nec sapien nec pulvinar. Aliquam venenatis hendrerit nunc eget hendrerit. Mauris finibus, risus id lacinia dignissim, leo nulla consequat diam, vitae porttitor dolor diam eget magna.</p>
<p>Morbi venenatis mauris velit. Cras sit amet urna tortor. Quisque quis tempor magna, ut sollicitudin augue. Phasellus consectetur nisi metus, et vestibulum urna dapibus semper. Praesent vulputate, turpis non consequat fringilla, lectus neque scelerisque sem, imperdiet rhoncus est metus finibus nibh. Curabitur fermentum sodales ultrices. Vestibulum tristique turpis sed libero finibus finibus. Donec ac tincidunt risus, non consectetur nisi. Sed at finibus odio, ut scelerisque nisi. Vivamus et scelerisque orci. Aliquam vitae diam dolor. Integer hendrerit aliquam arcu, a fringilla nisl rutrum ut. Curabitur euismod dignissim magna id bibendum. Suspendisse venenatis augue odio, at consequat sem vehicula ultricies. Maecenas sollicitudin aliquam urna vel varius. Donec placerat imperdiet tristique.</p>
<p>Aliquam consectetur tincidunt diam fermentum volutpat. Etiam quis elementum risus. Donec dictum faucibus urna. Cras a consequat ante. Nam finibus est a dolor aliquet ullamcorper. Ut ac sodales justo. Nunc finibus eleifend leo nec aliquam.</p>
<p>Duis enim erat, finibus nec faucibus et, vulputate sit amet orci. Integer pretium facilisis arcu, at molestie sem dictum eu. Sed tempus ut diam vitae ultricies. Suspendisse consequat tincidunt venenatis. Etiam consequat eu eros non convallis. Curabitur eleifend mattis justo, eu sagittis leo ultricies condimentum. Integer in tellus ac ipsum feugiat molestie non in mauris. Etiam laoreet sapien purus, nec molestie purus accumsan quis. Nulla sit amet mattis mauris, tristique tristique magna. Mauris faucibus pulvinar orci ut lacinia. Nam ac nisi nec dolor auctor accumsan eu eget justo. Nullam ut sem ultrices neque tempor dictum. Integer facilisis venenatis arcu sed sollicitudin. Nullam mattis fermentum enim, eget ultrices nunc. Aenean blandit, nunc in lacinia suscipit, lorem libero volutpat lorem, eget pellentesque dui nisi et dui.</p>
<p>Duis dictum, nunc ut imperdiet bibendum, est metus congue diam, at tempus augue nisi ac dolor. Nulla scelerisque nibh nibh, sit amet elementum nisl feugiat non. Proin maximus quam molestie feugiat facilisis. In quis vestibulum dui, vitae malesuada dui. Morbi commodo ornare justo, vel euismod mi pellentesque ac. Maecenas quis turpis at diam euismod condimentum. Sed molestie aliquam dictum. Vestibulum rutrum ullamcorper urna vitae ultrices. Nullam maximus nibh auctor, semper enim vel, suscipit ligula. Fusce et ligula ante. Phasellus tempor turpis in facilisis tincidunt.</p>
<p>Vestibulum orci leo, pulvinar non dolor nec, cursus tincidunt nulla. Sed tempor nunc neque, quis vehicula enim pulvinar sit amet. Morbi aliquet finibus justo ac luctus. Proin urna justo, egestas eu ullamcorper et, volutpat vel odio. Duis venenatis est ut dui mattis imperdiet. Pellentesque ut lectus velit. Maecenas mi est, bibendum nec tristique nec, cursus quis tortor. Aliquam erat volutpat. Donec blandit sapien sed urna tempor, non viverra ex sodales. Vivamus ac enim nec diam condimentum rhoncus. Phasellus ullamcorper augue ut vulputate egestas. Aenean eu urna ultrices, dignissim augue eu, lobortis diam. Sed auctor eget ante in tempor. Integer eget elementum nisl.</p>
<p>Donec dignissim faucibus risus. Suspendisse dictum dictum ex, eu rhoncus augue cursus at. Integer lectus est, pulvinar vitae tempus at, luctus eget risus. Sed vulputate enim diam, sed tempus lorem posuere non. Quisque eget libero velit. Morbi vitae mollis elit. Ut laoreet, nibh non molestie sollicitudin, felis massa convallis est, sit amet congue nisl metus in justo. Donec et tincidunt lacus. Morbi fringilla lorem efficitur ligula gravida convallis. Integer sagittis eu nunc vel efficitur. Maecenas sodales neque massa.</p>
<p>Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur non volutpat est. Etiam tristique nulla arcu, vel dictum risus euismod a. Pellentesque sit amet risus in purus ultricies pulvinar. Nam cursus erat ac gravida porttitor. Nam sit amet ex sed neque semper volutpat. Morbi in volutpat diam, sed scelerisque metus. Mauris non cursus erat, a tincidunt arcu. Vivamus porttitor ut lectus et consequat. Aenean diam enim, dignissim nec arcu non, condimentum venenatis metus. Nunc finibus justo vel risus varius elementum. Praesent scelerisque, risus in ultrices lacinia, nunc lectus volutpat odio, in eleifend diam est eget magna. Phasellus varius lacinia malesuada. Curabitur ligula nunc, mattis eget purus ac, euismod condimentum est.</p>
<p>Suspendisse volutpat erat et convallis suscipit. Nulla eget urna pellentesque, maximus mauris sit amet, fringilla urna. Sed vitae nulla sed ante malesuada consequat. Donec libero purus, laoreet et dolor vel, blandit accumsan velit. Etiam tincidunt libero tempus, blandit nisi at, tincidunt nisi. Maecenas justo justo, pretium a nunc rhoncus, pellentesque pharetra dui. Ut quis odio imperdiet, semper lorem id, placerat odio. Curabitur vitae volutpat nisl. Vivamus et ipsum cursus, aliquam sem vitae, feugiat ligula. Suspendisse malesuada semper tortor, eu ultrices magna molestie eget. Curabitur placerat, diam vel volutpat sagittis, lacus arcu posuere risus, at rutrum nibh augue ac lacus. Fusce non metus at quam gravida hendrerit. Nam id justo nisi. Maecenas convallis, dolor lacinia tristique cursus, elit enim fringilla turpis, ut tincidunt leo lacus ut massa. Ut hendrerit eget ante vel hendrerit.</p>
<p>Mauris hendrerit augue interdum, commodo felis a, pretium felis. Vivamus ultricies augue sed egestas consectetur. Pellentesque nec egestas sem. Fusce at volutpat arcu, et tincidunt libero. Sed condimentum malesuada interdum. Nullam id felis et nunc tempor sollicitudin vel non ipsum. Etiam porttitor convallis mattis.</p>
<p>Vestibulum id nunc sagittis, blandit odio ut, fringilla leo. Nam lacus eros, lobortis in ipsum cursus, sodales efficitur est. Cras ac tempor ligula, eu tincidunt ante. Donec eu sapien quis massa tempor placerat. Duis volutpat justo massa, nec condimentum lorem commodo consequat. Aenean interdum mi ut lacinia luctus. Cras vel diam est. Sed sapien diam, semper non odio sit amet, sodales suscipit lorem. In molestie, justo non feugiat maximus, justo nisi lacinia velit, quis blandit arcu lorem sed nisi. Etiam vitae tortor elementum, sagittis mi id, feugiat enim. Vestibulum sodales lorem urna, eget cursus tortor rhoncus sed. Suspendisse potenti. Fusce vitae eros eu ex gravida auctor gravida a nunc. Quisque viverra, lorem non iaculis efficitur, nisi est pretium mi, in accumsan magna eros ac felis. Quisque bibendum, magna sed vulputate ornare, purus massa sodales nisi, eget porttitor urna elit a libero. Nullam in luctus diam.</p>
<p>Nam sodales dapibus lectus ut laoreet. Donec feugiat magna et quam bibendum tincidunt. In vitae laoreet odio. Praesent nec elit mollis, imperdiet erat sed, porttitor libero. Phasellus sollicitudin orci et dui aliquam blandit. Integer sem arcu, feugiat quis luctus sit amet, ornare vel enim. Aenean faucibus placerat orci nec tristique.</p>
<p>Aenean maximus metus a quam euismod aliquet. Ut vitae tellus purus. Sed convallis nisi a magna malesuada rutrum. Curabitur finibus, diam in rutrum porttitor, dolor arcu ultricies tellus, quis rutrum metus eros eget sapien. Aenean ut eros sed eros viverra feugiat sed vel nisl. Donec facilisis, sapien ac tempus tristique, sapien enim posuere lorem, at cursus nisl tellus vel urna. Maecenas facilisis, dolor viverra aliquam mollis, purus mi tincidunt nibh, scelerisque finibus mauris sem id dui. Pellentesque placerat sapien posuere, venenatis purus at, bibendum elit. Quisque odio orci, sagittis vel tempus sed, tristique eu nisl. Vivamus ut ligula interdum, consequat dui ultricies, congue neque.</p>
<p>Ut purus leo, viverra interdum enim et, posuere congue libero. Sed bibendum rhoncus neque, in interdum dui congue sed. Aenean a diam sollicitudin, faucibus tortor a, auctor nisl. Integer mi mi, consectetur quis interdum eu, placerat ac enim. Quisque consequat faucibus arcu, sed hendrerit est. Maecenas interdum velit ut libero vehicula interdum. Vestibulum suscipit fermentum sodales. Suspendisse sem sapien, consectetur non convallis et, dapibus ut urna. Fusce efficitur eros nec iaculis sollicitudin. Praesent vitae blandit eros. Nullam porta finibus bibendum. Praesent eget molestie nisi. Aliquam rutrum ipsum et ligula tristique, ac mattis diam gravida. Proin ut interdum enim. Maecenas aliquam sapien est, quis laoreet nisl cursus in. Duis justo neque, efficitur id lacus vel, condimentum dapibus nibh.</p>
<p>Vivamus interdum dui in sem porta, quis luctus ante efficitur. Suspendisse quis tortor et eros aliquam ultrices eu ac felis. Phasellus at consectetur nisl. Ut nibh tellus, dapibus eget diam non, ullamcorper suscipit elit. Quisque accumsan egestas finibus. Cras laoreet libero vel elit pretium, non euismod eros sollicitudin. Pellentesque metus felis, laoreet quis tortor non, tincidunt aliquam ligula. Vivamus at sagittis dui. Praesent non fringilla erat. Duis eu pharetra massa. Fusce bibendum, velit dignissim molestie dapibus, ipsum turpis pulvinar arcu, ac porttitor sapien nisi quis lorem. Cras fringilla maximus facilisis.</p>
<p>Maecenas facilisis sodales venenatis. Quisque imperdiet, enim ac vulputate vulputate, justo nibh pretium odio, vel mollis quam ipsum in eros. Praesent nibh mauris, faucibus et posuere id, consequat a tortor. Vestibulum dapibus lacus id erat rutrum, vel lobortis nisi consectetur. Nulla aliquet, justo sed consequat sollicitudin, dui mi venenatis erat, nec pretium mauris dui eget sem. Nullam ac pharetra lacus. Integer vulputate, diam et tincidunt mattis, est turpis mattis est, vitae vehicula quam lectus nec mauris. Mauris pellentesque mattis faucibus.</p>
<p>Maecenas vel lectus condimentum, eleifend metus a, rhoncus dui. Etiam consectetur enim sed dui interdum sollicitudin. Duis massa lorem, tincidunt eu nibh a, semper fermentum felis. Integer eu sapien sit amet dui vulputate hendrerit ac sit amet erat. Phasellus suscipit massa vehicula nunc varius fermentum. Praesent bibendum iaculis elit nec tristique. Pellentesque facilisis egestas urna, et commodo dui pretium at. Etiam semper, massa volutpat sollicitudin venenatis, neque turpis dictum ex, eu condimentum sem quam non ex. Sed lacinia lectus vitae rhoncus vehicula. Vestibulum vel accumsan libero. Donec varius lectus mollis, dignissim orci et, rhoncus enim.</p>
<p>Suspendisse posuere lorem non enim consectetur, et convallis augue tempor. Vestibulum lobortis, tortor et consequat convallis, nisl neque convallis quam, vel varius est tortor eget felis. Cras a lobortis est, id condimentum nunc. Pellentesque auctor est rhoncus suscipit interdum. Nullam eu tristique felis. Aenean imperdiet maximus quam, tempus pulvinar sem condimentum fringilla. Nulla non scelerisque lacus. Quisque gravida eu ligula et sagittis. Fusce laoreet nisl id sagittis ultricies. Aliquam ut augue ut tortor sollicitudin semper id et sem. Nunc quis dui congue, dapibus enim non, egestas nunc.</p>
<p>Pellentesque tellus nibh, feugiat ut fringilla et, tincidunt in nisl. Quisque vestibulum eros eros, a ullamcorper velit posuere vitae. Fusce maximus risus at est tristique lobortis. In ex quam, porttitor ut tortor vitae, scelerisque aliquam neque. Nullam et ligula sit amet ex malesuada commodo quis tincidunt justo. Nulla tempor bibendum tellus, vitae mattis ipsum facilisis vel. Morbi scelerisque ligula sed dapibus lobortis. Vestibulum volutpat magna felis, ac tincidunt libero venenatis et. Sed pulvinar libero est. Vivamus sagittis risus quis magna hendrerit consectetur. Ut nec euismod sem, et cursus nulla. Etiam dapibus, purus ac aliquet venenatis, nulla libero pretium erat, in rutrum diam purus a lectus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut odio elit, ultrices vitae lectus at, iaculis tempus massa. Phasellus hendrerit posuere tincidunt.</p>
<p>Aenean nibh elit, dapibus vitae consectetur ac, dignissim at libero. Quisque blandit est ac risus tincidunt finibus. Donec sollicitudin fringilla facilisis. Nullam euismod, sem at egestas pharetra, lacus tellus ullamcorper lectus, ut commodo nulla sem a orci. Proin sed felis sem. Ut turpis mauris, feugiat sed dolor non, mollis lacinia sem. Mauris est dolor, hendrerit non pulvinar vitae, posuere id nulla. Aliquam rutrum, diam id interdum placerat, velit quam lobortis tortor, ut pretium lacus mauris tristique ex.</p>
<p>Curabitur vitae dolor vitae mauris pretium luctus. Maecenas malesuada mollis nisi. Cras non aliquam arcu. Sed facilisis pretium velit, a finibus dolor finibus at. Sed interdum elit at est scelerisque placerat. Donec accumsan sodales lorem ac condimentum. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. In ut facilisis urna. Aliquam ut nulla turpis. Donec pretium mauris urna, non ultricies lectus mattis non. Nulla facilisi. Nullam hendrerit a sapien ac iaculis. In efficitur consequat nulla sit amet semper. Sed non viverra dolor.</p>
<p>Donec venenatis vitae libero vitae mollis. Sed et semper lectus. Aenean id vehicula arcu, sed tempus leo. Phasellus non mi aliquet dui tincidunt eleifend. Pellentesque congue ultricies est. Morbi varius nec ligula eu hendrerit. Nulla fringilla vel turpis in cursus. Curabitur nec ex ac augue luctus vestibulum at nec leo. Duis quis consequat turpis, nec sodales odio. Etiam eu arcu blandit, euismod nibh in, pellentesque purus. Nullam elit turpis, tempus eget elit non, vestibulum interdum ligula.</p>
<p>Maecenas est justo, facilisis sagittis arcu a, venenatis dictum eros. Mauris ullamcorper ligula mauris, ac sollicitudin urna dignissim et. Integer fermentum lectus in pharetra mattis. Nunc porttitor in est eu sagittis. Mauris iaculis felis at tortor venenatis viverra. Donec iaculis elementum efficitur. Nunc eu urna ut ante facilisis ultricies. Sed volutpat orci at tristique semper. Nullam eget blandit nulla. Curabitur porttitor, felis ut rhoncus elementum, urna magna euismod ipsum, non fermentum mi nulla rhoncus sapien. In hac habitasse platea dictumst. Nulla euismod ligula ac nulla vestibulum, non pharetra mi placerat. Nam sed libero non erat blandit luctus a non urna. Quisque ut enim lacus. Donec a diam id dui vehicula viverra. Maecenas vehicula semper metus.</p>
<p>Curabitur sem turpis, ultricies non venenatis vel, bibendum ut nibh. Cras ac viverra massa, at sagittis metus. Aenean lobortis imperdiet quam at pharetra. Suspendisse ac commodo velit. Nunc eu tincidunt neque. Duis pretium ante id enim vulputate dignissim. In vestibulum fermentum dolor, id scelerisque neque pulvinar vel. Maecenas non euismod felis, ac rhoncus augue. Nulla imperdiet tempus justo non imperdiet. Duis ac aliquam tellus. Morbi gravida, nulla sit amet efficitur varius, ante elit mattis tellus, a egestas augue lacus non nibh. Pellentesque purus lectus, efficitur non orci ut, dapibus dignissim lacus. Cras ut tellus volutpat, finibus erat nec, suscipit velit.</p>
<p>Integer auctor mi in rhoncus facilisis. Donec eleifend mollis sem, eget condimentum neque eleifend id. Fusce at nibh tempor, laoreet lectus et, aliquam felis. Morbi fringilla placerat neque, a gravida mi bibendum fermentum. Nam id mi eu augue aliquet feugiat. Donec ut quam et tortor auctor aliquet. Ut pharetra pharetra mollis. Phasellus ultricies vitae justo at lobortis. Nulla et arcu consequat, vehicula turpis et, hendrerit eros. In efficitur faucibus est ac elementum. Phasellus imperdiet scelerisque ipsum nec sagittis. Integer aliquam commodo eros, eget ultricies ipsum consequat id. Aenean venenatis nisi purus, at facilisis magna fermentum vel. Quisque faucibus eros eu nulla lobortis, sed aliquam arcu consectetur.</p>
<p>Suspendisse vitae tristique ligula. Sed ullamcorper ut libero ut finibus. Mauris volutpat nisi eu nulla viverra tincidunt. Sed fringilla velit sit amet diam posuere, vitae porttitor odio pulvinar. Integer vehicula mauris neque, at commodo est aliquet venenatis. Sed blandit tortor quis orci aliquet tempus. Fusce dapibus ac eros quis interdum. Vivamus nec viverra est, vel viverra nibh.</p>
<p>Morbi varius mauris et sagittis gravida. Nunc ac dolor tellus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc laoreet accumsan ligula, et vulputate massa dictum maximus. Aliquam erat volutpat. Nunc malesuada justo eget velit maximus, at imperdiet nisi pretium. Maecenas a justo vitae sapien tincidunt placerat vel nec lorem. Donec quis mi nulla. Etiam sagittis ultrices nibh, eu egestas tellus aliquam quis. Vivamus vel iaculis felis. Aenean egestas, turpis eget fringilla luctus, tortor tortor sodales purus, at vehicula elit turpis non turpis. Morbi pellentesque ligula non quam vehicula rhoncus.</p>
<p>In hac habitasse platea dictumst. Cras felis lacus, porttitor aliquet elit vel, semper luctus risus. Nulla ex dolor, blandit id lacus at, dictum iaculis nulla. Nam eleifend accumsan ante. Praesent feugiat a quam non fermentum. Donec ut maximus arcu. Phasellus eu dolor in mi iaculis consectetur nec vel urna. Nam mi erat, auctor at porta non, hendrerit id tortor. Maecenas convallis ultrices mauris, pellentesque bibendum lectus dictum non. Ut nec justo faucibus, auctor leo non, placerat magna. Curabitur ultricies massa eget nibh venenatis aliquet. Aenean turpis tellus, maximus vel ultrices ut, scelerisque a turpis. Duis risus sem, dapibus consequat pellentesque sit amet, sagittis nec libero. Curabitur tempus posuere lectus, id vulputate augue consequat iaculis. Suspendisse vulputate, odio vel aliquet gravida, justo sem pellentesque neque, in tempor ligula mauris eu dui. Nulla consectetur, nibh vel pharetra dictum, dolor justo commodo nunc, vel sodales est odio id neque.</p>
<p>Nam eu orci tempor ex vestibulum luctus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Duis non odio efficitur leo aliquet condimentum. Vestibulum gravida eu urna id fermentum. Donec finibus lobortis erat ut elementum. Duis aliquam dolor in ipsum efficitur, non sollicitudin eros rhoncus. Nulla tempus suscipit tellus, non posuere odio porta at.</p>
<p>In hac habitasse platea dictumst. Cras vestibulum massa posuere, ultrices risus vitae, semper elit. Aliquam aliquam urna maximus, venenatis nibh nec, feugiat mauris. Nulla consequat est eu massa viverra iaculis. Integer ante eros, vehicula eget quam vel, tempor ultrices lacus. Duis ultricies sed velit tincidunt mollis. Nam mattis neque eu ultrices blandit. Curabitur vel nisl ut turpis aliquam condimentum.</p>
<p>Duis eget purus elit. Curabitur congue, quam et accumsan sollicitudin, libero metus condimentum orci, nec euismod lectus lorem euismod erat. Duis molestie orci ut nisi finibus aliquam. Quisque in turpis sit amet purus gravida pulvinar. Mauris mi ipsum, laoreet vitae est quis, dignissim lobortis leo. Proin tempor lobortis aliquam. Suspendisse nec finibus est. Mauris urna est, interdum eleifend facilisis nec, imperdiet quis felis. Sed porta, lectus quis sollicitudin aliquam, nisl dui sodales massa, ac aliquam mauris neque a quam. Vivamus egestas odio ac purus auctor, vitae finibus risus volutpat. Aliquam et augue aliquet, pretium diam eget, imperdiet ipsum. Nulla tempus enim quis ullamcorper efficitur. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean porttitor tortor at quam lobortis, id dignissim quam dapibus.</p>
<p>Quisque sit amet purus risus. Nulla ut elementum sem. Phasellus ac dictum dolor. Suspendisse porta sed est a consequat. Morbi turpis nulla, egestas a enim et, vulputate feugiat turpis. Morbi enim nibh, efficitur id leo vel, cursus tincidunt turpis. Ut volutpat, lectus sed blandit eleifend, erat ex luctus turpis, ac interdum nulla nibh sed est. Fusce ornare ex id magna efficitur, finibus fermentum velit facilisis. Praesent quis velit vehicula, lobortis quam non, ullamcorper urna. Donec at tempor ante. Phasellus egestas tincidunt iaculis. Donec vitae urna eget ipsum gravida maximus. Nulla congue dapibus sodales. Praesent quis erat lacus. Sed non risus non tortor ullamcorper ullamcorper.</p>
<p>Aenean id neque id lectus suscipit varius. Ut porta ipsum mattis ligula varius semper. Proin tincidunt dolor velit, a pharetra magna faucibus sit amet. Praesent ut auctor sapien, ac accumsan nisl. Etiam erat ipsum, luctus et velit a, facilisis eleifend tortor. Cras cursus pulvinar iaculis. Pellentesque nec neque nec leo interdum sodales in nec odio. Pellentesque condimentum, ante at dictum ullamcorper, tortor risus ultricies tortor, a hendrerit lorem odio ac diam. Nullam posuere luctus orci. Sed odio erat, aliquam non tincidunt vel, aliquam at nisi. Sed vel sem vulputate, vestibulum est non, volutpat ligula. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi vel maximus sem. Mauris eu odio lorem.</p>
<p>Nunc iaculis nulla neque, a semper arcu mattis eget. Donec commodo quam diam, sed mollis justo semper vitae. Ut tincidunt facilisis tellus, ut faucibus sapien facilisis ut. Pellentesque in turpis finibus velit aliquam blandit sed eu elit. Nam ut molestie nisi. Quisque in sem quis erat ultrices ultricies mattis eu tellus. Aenean eu turpis egestas, tempus arcu quis, tincidunt quam. Proin ullamcorper risus at porttitor tincidunt. Sed quis elementum orci, non varius risus. Maecenas pretium facilisis ullamcorper. Nunc arcu nisl, pharetra non urna vitae, tristique laoreet elit.</p>
<p>Aliquam ac tempor lectus. Curabitur vitae eleifend nunc. Nulla facilisi. In turpis sem, dictum sed mauris ut, egestas consectetur dui. Proin ut orci auctor ex condimentum aliquet sit amet imperdiet odio. Vestibulum ac auctor sapien, at convallis enim. Donec at aliquet ex. Suspendisse nunc nulla, placerat ut dapibus eget, tempor non lectus.</p>
<p>Aliquam ac quam rutrum, bibendum lectus vitae, malesuada sem. Ut dapibus vehicula massa vel facilisis. Proin pharetra eros nibh, sit amet ornare mauris lacinia id. Quisque eget ligula porttitor, porttitor ex eget, dignissim eros. Curabitur vestibulum, risus eget mattis laoreet, dui velit dignissim odio, id luctus neque lectus quis ligula. Nam et venenatis nunc. In porta sagittis libero vel laoreet. Sed id nisi nisi. Nullam eget congue turpis. Integer nec odio ut ligula malesuada iaculis ac vitae lorem. Ut fermentum viverra maximus. Integer eget venenatis erat, non porttitor elit.</p>
<p>Morbi quis lectus sapien. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Curabitur sed dolor eu erat accumsan elementum. Suspendisse finibus commodo est eu facilisis. Fusce varius dui ac pulvinar consequat. Praesent eleifend tempus cursus. Cras convallis efficitur diam quis tempus. Nulla luctus, libero et pellentesque luctus, ex turpis accumsan magna, sed consequat nulla nulla a purus.</p>
<p>Etiam vel mattis nulla. In lobortis eleifend facilisis. Morbi cursus, mi eget pretium eleifend, ante dui commodo erat, rhoncus iaculis metus enim at tortor. Fusce viverra diam sit amet maximus venenatis. Donec blandit felis non iaculis hendrerit. Proin et dui laoreet est blandit ultrices. Sed non ullamcorper risus. Nunc fringilla dolor ac nibh blandit gravida. Duis semper sagittis est auctor semper. Phasellus ut justo ante. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Curabitur vestibulum bibendum velit nec consectetur. Nullam quis nulla sagittis leo maximus imperdiet. Fusce eleifend vitae justo gravida faucibus. Vivamus luctus quis lorem vel rhoncus. Integer sit amet orci sit amet lectus vestibulum tincidunt non vitae quam.</p>
<p>Pellentesque lobortis elit ut ante tempus, ultricies fermentum neque sodales. Sed eget porta ipsum. Nullam nibh dolor, auctor eu imperdiet nec, pulvinar sed justo. In vel pulvinar ex. Quisque quis feugiat nulla. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Maecenas mattis lorem eget pulvinar aliquet. Nunc pretium sapien id risus mattis tristique.</p>
<p>Praesent sodales mollis rutrum. Pellentesque malesuada ornare cursus. In hac habitasse platea dictumst. Nullam elementum imperdiet feugiat. Sed at erat pellentesque, elementum nisi nec, dignissim tortor. Aliquam eleifend ligula nec orci commodo sagittis. Sed suscipit elit pulvinar ex hendrerit scelerisque. Nam non diam non tellus gravida tristique. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum aliquet ligula sed velit ultrices, quis posuere augue dignissim. Praesent nec mi sapien.</p>
<p>Cras sit amet feugiat sapien. Sed ac laoreet arcu, non venenatis mauris. Integer nec tempus justo, non vehicula ante. Cras sed mi ipsum. Nullam aliquam imperdiet ante, sed fringilla ex placerat a. Vivamus leo massa, venenatis non nulla a, gravida pretium quam. Curabitur eget massa rhoncus, viverra elit commodo, elementum arcu. Aenean sit amet purus at libero pretium auctor vel tempus lorem. Suspendisse at felis mauris. Duis eros nulla, volutpat at urna non, blandit imperdiet velit. Integer eros neque, viverra sed sagittis eu, sagittis at urna.</p>
<p>Aliquam nibh ligula, posuere ut malesuada in, hendrerit at dolor. Sed pharetra neque id ex ultrices, at rutrum mi facilisis. Sed ultricies varius lectus in feugiat. Sed venenatis sed leo in sollicitudin. Nam aliquet nisl ut dui egestas rhoncus. Mauris ac nisl a purus eleifend ornare ac sed turpis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras nec vulputate urna, non interdum leo. Nam viverra ac lacus at tempus. In hac habitasse platea dictumst. Vestibulum lectus nunc, imperdiet ac est venenatis, tincidunt pellentesque eros. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed leo velit, interdum ac mi condimentum, dictum imperdiet massa. Proin pharetra dui vel facilisis tincidunt. Proin ipsum ipsum, bibendum eu mattis at, volutpat id massa. Maecenas at fermentum elit, eu tincidunt ex.</p>
<p>Cras quam tellus, molestie lobortis nisl et, pellentesque ultricies odio. Nunc vel dictum risus, non posuere libero. Nulla venenatis nulla massa, nec euismod erat scelerisque at. Praesent sit amet semper ligula, eget tristique ante. Curabitur sed placerat nisi, non ultrices augue. Donec vehicula tempor diam, ac pharetra nibh ultricies nec. Vestibulum ligula turpis, volutpat a ultricies quis, dapibus et enim. Pellentesque scelerisque commodo ipsum, vel sollicitudin nibh laoreet non.</p>
<p>Vivamus tortor nulla, feugiat sed diam pharetra, semper maximus velit. Nullam nibh nisl, tincidunt tempus tellus sit amet, iaculis sollicitudin erat. Vestibulum ut sodales nunc. Aliquam nec sem et diam maximus congue. Mauris vitae convallis felis. Cras volutpat interdum lorem, a pellentesque ligula condimentum ac. Aliquam iaculis pellentesque leo a congue. Nulla pretium nisl id eros consectetur, quis ornare mi accumsan.</p>
<p>Vivamus vel quam tempus, vehicula ex sed, semper diam. Mauris in eleifend nibh. Fusce arcu augue, condimentum non nulla at, auctor accumsan mi. Ut ut justo laoreet, varius mauris sed, luctus mi. Mauris aliquet quis turpis id tristique. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. In dictum justo ut diam lacinia, sed commodo massa rutrum. Nulla consequat sem nunc, ut iaculis dui accumsan eu. Praesent eget est nulla. Phasellus posuere, massa id sagittis rhoncus, justo erat blandit enim, ac lacinia magna turpis vehicula quam.</p>
<p>Nunc fringilla est et sem efficitur maximus. Nam laoreet sit amet nunc sed venenatis. Nullam nisi odio, ullamcorper ut orci quis, bibendum venenatis nunc. Maecenas non scelerisque odio. Quisque quis vulputate velit, vel euismod nibh. In sem arcu, commodo sit amet massa ac, tempus fringilla eros. Curabitur dignissim orci posuere, rhoncus nunc ac, dictum nisl. Suspendisse quis lectus nec felis vehicula interdum. Donec elementum ac ante nec porta. Vivamus in ante vel odio sagittis viverra. Nam non ligula feugiat, eleifend nibh et, dignissim tortor. Ut id felis facilisis, accumsan arcu eget, lacinia elit. Quisque semper volutpat est, eget ultricies turpis hendrerit sed. Praesent eget accumsan ligula.</p>
<p>Phasellus non justo eleifend, iaculis magna vel, tincidunt enim. Phasellus rhoncus ipsum non nisi dictum, sed tincidunt ex iaculis. Aenean ut ornare ante. Maecenas consectetur condimentum justo sit amet mattis. Nullam finibus erat et interdum dignissim. Phasellus finibus euismod felis, at consectetur odio faucibus sit amet. Vivamus rutrum bibendum nisl at rutrum. Sed consectetur cursus suscipit. Ut faucibus tristique faucibus. Vestibulum vitae nulla eget sem venenatis pretium at quis ex.</p>
<p>Aenean eget viverra lorem, vel ornare leo. Aliquam condimentum tortor id ante ullamcorper rhoncus id sed eros. Phasellus odio dui, tincidunt ac dictum id, venenatis eu arcu. Nunc vehicula pellentesque magna nec iaculis. Aenean ullamcorper velit nec lorem laoreet lacinia. Cras maximus dolor nec nulla consequat, sed accumsan lectus egestas. Proin nulla risus, porttitor at eleifend eget, consequat non odio. Integer dictum neque sit amet congue auctor.</p>
<p>Sed ut tortor molestie, volutpat eros eget, blandit felis. Etiam at accumsan felis. Proin condimentum iaculis justo, et aliquet nulla tincidunt eget. Vestibulum sollicitudin tellus tristique urna dignissim auctor. Vivamus malesuada augue id lobortis posuere. Fusce semper vitae sapien id dictum. Pellentesque vitae ligula et purus pellentesque lacinia.</p>
<p>Quisque tempor, lectus non faucibus feugiat, arcu libero porttitor urna, a volutpat sem nibh at diam. Donec sit amet sollicitudin purus. Vestibulum in blandit dolor. Nunc ultrices quis elit eget eleifend. Nulla finibus quis sem vitae tempor. Aenean eu mi blandit velit rhoncus ullamcorper. Nullam non risus iaculis, venenatis erat facilisis, laoreet leo. Nulla in dui et dolor gravida condimentum id id mauris. Nulla eu suscipit mi, quis ultricies nisi. Praesent luctus, dolor sit amet ornare pellentesque, turpis est feugiat massa, id pharetra libero enim nec urna. Morbi odio mi, elementum quis molestie eget, suscipit vel leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Morbi feugiat pellentesque justo quis gravida.</p>
<p>Vestibulum auctor nibh vitae laoreet sagittis. In tristique efficitur magna congue pulvinar. Nullam sed urna eget odio mollis scelerisque. Cras et tortor a lectus feugiat semper a eu est. Ut condimentum libero a erat ultrices commodo. Maecenas in semper nulla, a malesuada tellus. Suspendisse viverra pulvinar arcu porta malesuada. Nullam auctor nunc velit, sed tempus est efficitur quis. Sed viverra mi dolor, in efficitur ipsum egestas viverra. Fusce congue libero tortor, id cursus diam dapibus in. Ut eleifend blandit neque sed sodales.</p>
<p>Mauris quis faucibus dolor. Duis tristique dolor vitae libero bibendum, nec sagittis lorem sagittis. In eleifend accumsan nisl et convallis. Nulla ut tincidunt nisl. Morbi fermentum, odio vitae lacinia semper, diam leo interdum mauris, sit amet suscipit tortor orci a nibh. Etiam pretium venenatis metus, vitae tristique quam commodo in. Praesent elementum mauris nec lectus venenatis condimentum. Nullam porttitor faucibus purus. Mauris laoreet sit amet neque nec luctus.</p>
<p>Maecenas viverra auctor arcu ac feugiat. Nunc a tincidunt ipsum, at scelerisque ipsum. Vestibulum nulla tellus, rutrum ut quam sit amet, pulvinar bibendum urna. Vivamus et mollis est. Maecenas semper leo vel nisi lobortis aliquam. Integer non ultrices ex, sed tincidunt est. Duis velit sem, finibus iaculis consectetur et, laoreet sagittis ligula. Suspendisse potenti. Nulla cursus cursus est quis vulputate. Pellentesque ante risus, fringilla et nibh sagittis, iaculis condimentum dolor.</p>
<p>Donec fermentum tellus tempor nibh vehicula, sit amet venenatis ipsum tempus. Donec sed luctus metus, facilisis maximus lectus. Mauris tristique rutrum gravida. Etiam erat diam, bibendum eu tempus eget, tristique ut enim. Cras sit amet bibendum sem, ac hendrerit odio. Ut vel diam malesuada libero volutpat malesuada. Proin sit amet ligula ut massa venenatis dapibus. Praesent ac risus et sapien sollicitudin semper feugiat quis tortor. Etiam eget lacus eu ligula suscipit pellentesque. Suspendisse fermentum metus at pellentesque hendrerit. Aenean eget eros non metus rutrum sollicitudin et at tortor. Cras sollicitudin dolor risus, et sollicitudin tortor dictum vel. Nam a hendrerit ex.</p>
<p>Curabitur at vestibulum diam, nec vehicula enim. Sed aliquet gravida suscipit. Duis non odio at odio elementum tempus in sit amet quam. Interdum et malesuada fames ac ante ipsum primis in faucibus. Suspendisse dignissim scelerisque risus, condimentum fringilla justo laoreet ac. Nullam scelerisque magna ac mi ornare tempus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean in ante nec elit condimentum interdum. Praesent rhoncus facilisis accumsan. Vivamus vestibulum enim a laoreet vestibulum. Curabitur nibh sapien, elementum efficitur tempor quis, egestas rutrum est. Suspendisse potenti. Mauris lectus sem, rhoncus nec malesuada in, sollicitudin sollicitudin ligula. Nulla at nibh nec arcu luctus scelerisque. Praesent consectetur magna sapien, nec ullamcorper mi malesuada in. Donec sapien dolor, lobortis et risus a, convallis blandit urna.</p>
<p>Proin eget faucibus massa, quis ullamcorper dui. Cras varius faucibus imperdiet. Vestibulum ultricies urna vitae sapien hendrerit semper. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nullam non sollicitudin enim, in consectetur sem. Vestibulum suscipit eleifend auctor. Aliquam sed purus in dolor sollicitudin fringilla at non dolor.</p>
<p>In ultrices tempus nulla nec venenatis. Phasellus ultrices id turpis a porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean vehicula lacus in pretium imperdiet. In sollicitudin, elit sit amet pulvinar tempor, augue tortor cursus tellus, vitae gravida metus magna at tortor. Aliquam erat volutpat. Etiam vitae sapien malesuada, facilisis erat et, placerat turpis. Suspendisse posuere mi vel magna iaculis, sit amet tristique leo euismod. Ut sem est, mollis eget massa sit amet, dapibus commodo tortor. Mauris pharetra feugiat turpis, non sodales mauris. Nam feugiat fermentum magna.</p>
<p>Vivamus aliquet interdum velit. Suspendisse tempor, sem non tincidunt bibendum, quam massa lobortis odio, eu aliquam quam nunc id odio. Pellentesque vitae mi ut nulla semper lacinia. Aenean non nunc molestie, euismod lacus eget, vehicula lorem. Aliquam quis libero laoreet, mattis enim sed, dictum justo. Cras placerat ultricies accumsan. Fusce eu semper enim, id dignissim leo. Sed porttitor pharetra lectus sit amet tristique. Donec convallis rhoncus nisl quis porta. Integer sodales turpis eleifend, aliquet elit non, consectetur nisi. Cras eu commodo mi. Ut porta diam neque, id tincidunt justo consequat ut. Suspendisse potenti. Proin in pretium tortor, non varius nulla. Donec non nulla turpis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.</p>
<p>Fusce non bibendum turpis. In elit arcu, malesuada ornare facilisis sit amet, laoreet quis sem. Nunc maximus elit vel consequat feugiat. Nulla tempus in sapien ut lacinia. Quisque elit dolor, vulputate vel convallis sit amet, accumsan id orci. Suspendisse ex nisi, faucibus eu vulputate non, consectetur et odio. Maecenas condimentum libero ac felis aliquet tempor cursus sit amet metus. Suspendisse mollis, felis eu finibus ultricies, metus libero facilisis odio, a tempus odio mauris vel nisl. Phasellus aliquam finibus enim non porttitor. Phasellus auctor justo in fringilla volutpat.</p>
<p>Mauris vehicula posuere sagittis. In auctor urna viverra massa fringilla, vel maximus elit rutrum. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla suscipit neque ligula, auctor tincidunt magna convallis vel. Donec erat est, dictum non justo nec, volutpat condimentum mi. Curabitur condimentum dapibus erat eget vestibulum. Nullam velit massa, mollis ac hendrerit sit amet, aliquet id lacus. Curabitur ligula odio, condimentum malesuada mattis et, bibendum non leo. Donec rhoncus diam id quam aliquet ultrices. Integer posuere rutrum eros, sit amet semper eros tincidunt ac. Mauris hendrerit sapien magna, ut pulvinar massa fermentum et. Nam a auctor erat, in congue tortor. Proin in orci fermentum quam posuere cursus ac vel leo. Curabitur non egestas velit, at porta lectus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
<p>Sed lacinia vitae dui luctus condimentum. Duis ut semper nisi. Sed consequat elementum lacus vitae tincidunt. Etiam ac tortor nec sapien aliquam ultricies. Curabitur viverra diam quis porta fermentum. Sed dignissim, est ut posuere accumsan, mauris elit malesuada lorem, eu molestie felis metus et nulla. Cras molestie erat mollis enim ullamcorper, non volutpat justo finibus. Suspendisse rhoncus eu turpis vitae aliquam. Sed mi nisl, ullamcorper eu diam eget, semper iaculis leo. Cras lobortis vestibulum ornare. Vivamus consequat magna ut luctus blandit. Phasellus placerat tincidunt eleifend. Etiam diam leo, rhoncus ac sem eu, efficitur porta magna. Mauris sit amet mi sit amet nunc consectetur congue quis eu arcu. Donec dignissim erat vitae ipsum dignissim, sit amet pretium lacus dictum. Mauris cursus a eros in convallis.</p>
<p>Vestibulum sit amet ligula erat. Praesent nec sapien ac leo facilisis suscipit. Aliquam erat volutpat. Integer mi est, pulvinar vel nibh at, ullamcorper tristique erat. Donec accumsan semper ex eu consequat. Phasellus vulputate posuere efficitur. Praesent fermentum rutrum magna at interdum. Morbi scelerisque quam sed mauris dapibus consequat. Nullam vehicula dictum rutrum. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Fusce a rutrum ligula. Ut quis nunc id metus ullamcorper porta eget tempor velit. Duis hendrerit tellus mi, nec malesuada nunc consequat et.</p>
<p>Nam erat ligula, pharetra ut euismod in, efficitur quis quam. Sed lorem ex, accumsan nec elementum non, porta in velit. Nunc lobortis mattis urna at malesuada. Nulla aliquam, sem ac commodo convallis, lacus nulla condimentum odio, at volutpat erat sapien at erat. Fusce suscipit eleifend leo elementum vestibulum. Duis vel sapien commodo, sollicitudin sem eu, vestibulum turpis. Sed a tellus eget justo ornare ornare sed ut ipsum.</p>
<p>Duis a blandit ligula, vel vestibulum dui. Cras sed mauris at nisi ornare posuere id vel ligula. Sed sem mi, tempus a volutpat sed, suscipit ut arcu. Nulla in pretium enim. Mauris sed massa semper, porttitor nisi porta, convallis quam. Vestibulum sollicitudin massa ac nisl scelerisque ultricies. Ut sit amet mi eget nulla pharetra convallis eget ut dui. Nunc ultricies ultrices enim, in faucibus lorem. Donec pharetra tellus id bibendum auctor. Etiam vitae quam interdum dolor venenatis feugiat. Integer turpis mauris, ultricies nec vehicula id, tempor consequat tellus.</p>
<p>In in consequat sapien. Nullam congue orci velit, eget vestibulum enim ullamcorper ac. Pellentesque maximus, diam id posuere fringilla, ipsum purus venenatis turpis, nec egestas erat neque ut felis. Sed porttitor feugiat sem, vel volutpat sem laoreet maximus. Aliquam quis mauris ut tortor aliquam condimentum. Cras a urna aliquam, hendrerit nisi tincidunt, condimentum nisi. Nulla facilisi. Proin suscipit augue at tempor finibus. Duis ultricies lacus ac metus vulputate, vel convallis nulla efficitur. Ut metus sapien, finibus a ante vitae, pulvinar porta ante. Quisque iaculis est in sem blandit, eu lacinia mauris pharetra. Integer sagittis nisi sed dui tempor, sit amet luctus justo faucibus. Phasellus eu eros vel erat porttitor aliquet in quis mauris. Quisque viverra nulla nibh. Aliquam eget mauris tempor, faucibus turpis non, ullamcorper nunc. Aliquam laoreet risus eros, ut consectetur sapien pulvinar at.</p>
<p>Morbi rhoncus rhoncus imperdiet. Aenean sed neque ullamcorper, dictum ex id, ultricies purus. Sed et augue nec velit varius consectetur. Fusce et malesuada velit. Sed luctus lacus sed turpis convallis blandit. Duis sed eleifend nibh. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Quisque ex neque, vulputate eget efficitur et, sagittis sed leo. In rutrum velit efficitur velit finibus varius. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In vel scelerisque lorem, sed ornare velit. Ut vel pharetra leo. Vivamus risus felis, imperdiet sed porta et, euismod sed quam. Quisque et massa est. Aenean dapibus suscipit ultricies.</p>
<p>Vivamus fermentum vehicula orci ac vulputate. Curabitur vitae leo tincidunt, vestibulum leo vitae, laoreet libero. Donec euismod tincidunt molestie. Donec vulputate velit ut augue bibendum sodales. Duis ut vestibulum lorem. Cras quis faucibus arcu. Proin egestas tempor lorem vitae vestibulum. Integer eget fringilla arcu. Pellentesque libero ipsum, sollicitudin mollis metus nec, hendrerit luctus arcu. Proin tempus purus in leo aliquet, a porta arcu hendrerit. Praesent ultricies luctus nisl. Vivamus condimentum nisl vel porta commodo. Donec posuere enim ut tincidunt gravida. Suspendisse potenti.</p>
<p>Proin in imperdiet neque. In rhoncus augue id dui gravida, a maximus ante tincidunt. Praesent scelerisque augue sed nisi pellentesque ornare. Maecenas eget tempus nisl. In pulvinar velit vulputate pulvinar viverra. Donec dignissim, libero in blandit vestibulum, libero augue accumsan ipsum, quis porta massa turpis eget purus. Vivamus tincidunt non magna non auctor. Suspendisse efficitur sapien ac neque dictum dapibus.</p>
<p>Sed sagittis libero vel iaculis sagittis. Suspendisse viverra vulputate ligula vel imperdiet. Phasellus tincidunt semper augue at viverra. Donec nisi mi, placerat quis diam ut, porta tempus arcu. Nullam placerat ligula et luctus eleifend. Etiam erat mauris, finibus placerat turpis at, eleifend pellentesque dolor. Quisque a consectetur eros, vel tincidunt erat.</p>
<p>Aliquam sit amet congue mauris, et interdum eros. Sed in nisl eu nisl fringilla vestibulum. Nullam rhoncus malesuada nisi nec dapibus. Nam tristique enim eros, a tincidunt justo semper egestas. Mauris tempus elementum purus id pellentesque. Quisque dictum eget justo ut feugiat. Morbi in nulla at leo vehicula venenatis at non dui. Phasellus volutpat accumsan magna, at vulputate elit imperdiet vel.</p>
<p>Cras tempus est at nunc tincidunt, sagittis sagittis sapien sollicitudin. Curabitur ipsum nisl, lacinia quis purus vitae, vestibulum dictum metus. Sed posuere neque elit. Sed at auctor dui. Phasellus eget faucibus nisl. Phasellus id erat ut ex semper fermentum. Maecenas rhoncus ligula lectus, quis ultricies diam ultricies nec. Vivamus id odio non nisl luctus ultricies non vel nibh. Ut quis dolor fringilla, finibus dolor id, interdum nisl. Vivamus vitae neque eu ligula viverra mattis non in augue. Donec scelerisque condimentum nulla a finibus. Nulla sollicitudin purus enim, a consectetur nisi tempor ut.</p>
<p>Morbi lacus purus, lobortis sed dapibus quis, finibus at elit. Nunc ultricies ante et convallis facilisis. Nulla sit amet ullamcorper eros, ac condimentum nisi. Quisque eget ullamcorper tortor, et placerat mi. Duis lacinia sapien sed fermentum tempus. Donec quis diam tincidunt, hendrerit sapien vitae, luctus nulla. Nam sit amet quam dolor. Donec euismod venenatis ipsum et vehicula. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam suscipit, odio ac interdum maximus, velit urna accumsan justo, eu rutrum tortor lacus tincidunt nisl.</p>
<p>Suspendisse aliquet molestie augue, quis scelerisque risus mattis ac. Praesent quis varius tortor. Sed feugiat erat et odio iaculis congue. Curabitur cursus, neque vel molestie tempor, diam enim mattis ipsum, egestas efficitur purus lacus ut neque. Aenean lobortis nulla est, sed dictum urna facilisis quis. Vivamus venenatis mollis accumsan. Integer vulputate tristique venenatis. Etiam lacinia augue turpis, at mattis mauris finibus eu. Phasellus convallis elit ante, in pharetra lectus dapibus in. Etiam scelerisque id dolor ac feugiat. Aliquam volutpat dolor et nisl feugiat pellentesque.</p>
<p>Phasellus nec turpis vehicula, tincidunt tortor in, vehicula ligula. Mauris pharetra tempor neque, quis semper nunc gravida a. Donec est massa, pellentesque eget semper a, congue vitae erat. Donec scelerisque enim justo, quis iaculis enim rhoncus in. Suspendisse at sem nisi. Nam rutrum, sapien nec ullamcorper imperdiet, magna lectus aliquam neque, tristique sollicitudin elit sapien vitae mauris. Aenean ac nulla eget sem rhoncus blandit. Quisque fringilla ante vel tellus scelerisque porttitor. Vestibulum blandit ligula ut vulputate dignissim. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce vel leo libero. Proin ut pretium neque, in eleifend felis. Quisque dignissim, ante ut ultrices maximus, augue arcu congue metus, non sagittis risus elit vitae eros.</p>
<p>Nullam consequat velit enim, nec commodo nibh varius vel. Aliquam diam sapien, egestas in dictum in, imperdiet vel erat. Maecenas ut purus a libero facilisis malesuada. Nunc lacinia non urna vitae cursus. Donec tristique, ligula nec pharetra sodales, erat velit pulvinar tellus, ut pulvinar massa metus quis magna. Vivamus aliquam sed nisl vel faucibus. Proin finibus ante in vulputate imperdiet. Phasellus eget ipsum a velit lobortis cursus non non augue. Integer tincidunt dignissim urna, et mattis sapien faucibus eget. Curabitur dapibus dapibus lorem vel scelerisque. Proin sed dictum sapien. Donec quis est vel tortor pulvinar tincidunt sit amet et enim. Vivamus urna erat, venenatis sed blandit scelerisque, ultricies non tellus. Vivamus vitae ligula euismod lacus accumsan viverra. In mollis consectetur dapibus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
<p>Aenean maximus dictum tortor, ac semper felis efficitur et. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec semper erat neque, sed cursus tellus semper non. Integer pellentesque massa leo. Praesent consequat malesuada nulla, sit amet faucibus velit molestie vel. Suspendisse vel libero viverra, sagittis orci vulputate, volutpat turpis. Sed nec ipsum tincidunt, mattis nulla ac, lacinia dui. Sed non elit quis ex rhoncus pharetra id in odio. Aliquam porttitor, turpis nec ultricies egestas, nulla libero iaculis massa, facilisis elementum magna velit ac erat. Nulla fringilla nulla et leo sodales vulputate. Integer consequat metus vel nunc laoreet, ac suscipit ex lobortis. Suspendisse lacus turpis, ultricies non tempor id, faucibus ac erat. Quisque ullamcorper venenatis metus, eu lacinia metus accumsan non. Aenean facilisis quis neque vitae aliquam. Nulla nec tortor facilisis, sodales turpis at, ultrices dolor.</p>
<p>Maecenas in cursus ex. Curabitur sed diam vitae dolor varius vestibulum eu id diam. Suspendisse sed egestas elit. Cras feugiat tortor vel tempus tincidunt. Pellentesque rutrum, nisi venenatis viverra pulvinar, lectus nisl tristique quam, scelerisque ultricies sapien nibh vitae elit. Mauris a interdum tellus, eget fermentum mi. Aenean eget elit tempus, mollis dui vitae, elementum justo.</p>
<p>Fusce a arcu velit. Aliquam at arcu ut turpis tristique ultricies eget non lectus. Aenean nisl tortor, consectetur vitae lectus sit amet, eleifend dignissim felis. Curabitur in arcu magna. Aenean in vulputate nulla. Suspendisse id interdum erat, nec tristique augue. Fusce augue ligula, fermentum eu felis non, vestibulum consectetur mi. Morbi faucibus augue leo, vel viverra velit iaculis vel. Curabitur ornare eros sed ex varius semper. Pellentesque vel orci eu nisi vulputate imperdiet. Donec et nulla eget orci vulputate hendrerit in et ex.</p>
`

View File

@ -6,7 +6,7 @@
:title="title"
>
<svg class="remix">
<use :xlink:href="require('../../../../../node_modules/remixicon/fonts/remixicon.symbol.svg') + `#ri-${icon}`" />
<use :xlink:href="require('remixicon/fonts/remixicon.symbol.svg') + `#ri-${icon}`" />
</svg>
</button>
</template>

View File

@ -21,17 +21,6 @@
</div>
</div>
</div>
<!-- <div class="collaboration-users">
<div
class="collaboration-users__item"
:style="`background-color: ${otherUser.color}`"
v-for="otherUser in users"
:key="otherUser.clientId"
>
{{ otherUser.name }}
</div>
</div> -->
</div>
</template>
@ -67,6 +56,7 @@ export default {
name: this.getRandomName(),
color: this.getRandomColor(),
},
provider: null,
indexdb: null,
editor: null,
users: [],
@ -76,8 +66,8 @@ export default {
mounted() {
const ydoc = new Y.Doc()
const provider = new WebsocketProvider('wss://websocket.tiptap.dev', 'tiptap-collaboration-example', ydoc)
provider.on('status', event => {
this.provider = new WebsocketProvider('wss://websocket.tiptap.dev', 'tiptap-collaboration-example', ydoc)
this.provider.on('status', event => {
this.status = event.status
})
@ -90,10 +80,10 @@ export default {
TaskList,
CustomTaskItem,
Collaboration.configure({
provider,
document: ydoc,
}),
CollaborationCursor.configure({
provider,
provider: this.provider,
user: this.currentUser,
onUpdate: users => {
this.users = users
@ -146,6 +136,7 @@ export default {
beforeDestroy() {
this.editor.destroy()
this.provider.destroy()
},
}
</script>
@ -253,30 +244,6 @@ export default {
}
}
// .collaboration-status {
// border-radius: 5px;
// margin-top: 1rem;
// color: #616161;
// &::before {
// content: ' ';
// display: inline-block;
// width: 0.5rem;
// height: 0.5rem;
// background: #ccc;
// border-radius: 50%;
// margin-right: 0.5rem;
// }
// &--connecting::before {
// background: #fd9170;
// }
// &--connected::before {
// background: #9DEF8F;
// }
// }
/* Give a remote user a caret */
.collaboration-cursor__caret {
position: relative;

View File

@ -30,6 +30,10 @@ import { v4 as uuid } from 'uuid'
import * as d3 from 'd3'
import simplify from 'simplify-js'
const getRandomElement = list => {
return list[Math.floor(Math.random() * list.length)]
}
export default {
name: 'Paper',
@ -47,8 +51,16 @@ export default {
data() {
return {
color: '#000000',
size: 2,
color: getRandomElement([
'#A975FF',
'#FB5151',
'#FD9170',
'#FFCB6B',
'#68CEF8',
'#80CBC4',
'#9DEF8F',
]),
size: Math.ceil(Math.random() * Math.floor(10)),
svg: null,
path: null,
points: [],
@ -148,7 +160,7 @@ export default {
<style lang="scss">
.draw {
svg {
background: #EEE;
background: #f1f3f5;
cursor: crosshair;
}

View File

@ -5,12 +5,9 @@
</template>
<script>
import Collaboration from '@tiptap/extension-collaboration'
import { Editor, EditorContent } from '@tiptap/vue-starter-kit'
import Document from '@tiptap/extension-document'
import Text from '@tiptap/extension-text'
import * as Y from 'yjs'
import { WebsocketProvider } from 'y-websocket'
import Paper from './Paper.js'
export default {
@ -21,21 +18,16 @@ export default {
data() {
return {
editor: null,
provider: null,
}
},
mounted() {
const ydoc = new Y.Doc()
const provider = new WebsocketProvider('wss://websocket.tiptap.dev', 'tiptap-draw-example', ydoc)
this.editor = new Editor({
extensions: [
Document.extend({
content: 'paper',
}),
Collaboration.configure({
provider,
}),
Text,
Paper,
],
@ -44,6 +36,7 @@ export default {
beforeDestroy() {
this.editor.destroy()
this.provider.destroy()
},
}
</script>

View File

@ -0,0 +1,7 @@
context('/examples/multiple-editors', () => {
before(() => {
cy.visit('/examples/multiple-editors')
})
// TODO: Write tests
})

View File

@ -0,0 +1,154 @@
<template>
<div class="form">
<div class="form__label">
Title
</div>
<div v-if="title" class="form__item form__item--title">
<editor-content :editor="title" />
</div>
<div class="form__label">
Tasks
</div>
<div v-if="tasks" class="form__item form__item--tasks">
<editor-content :editor="tasks" />
</div>
<div class="form__label">
Description
</div>
<div v-if="description" class="form__item form__item--description">
<editor-content :editor="description" />
</div>
</div>
</template>
<script>
import { Editor } from '@tiptap/core'
import { EditorContent } from '@tiptap/vue'
import Document from '@tiptap/extension-document'
import Paragraph from '@tiptap/extension-paragraph'
import Text from '@tiptap/extension-text'
import TaskList from '@tiptap/extension-task-list'
import TaskItem from '@tiptap/extension-task-item'
import Collaboration from '@tiptap/extension-collaboration'
import * as Y from 'yjs'
import { WebsocketProvider } from 'y-websocket'
const ParagraphDocument = Document.extend({
content: 'paragraph',
})
const TaskListDocument = Document.extend({
content: 'taskList',
})
const CustomTaskItem = TaskItem.extend({
content: 'text*',
})
export default {
components: {
EditorContent,
},
data() {
return {
title: null,
tasks: null,
description: null,
}
},
mounted() {
const ydoc = new Y.Doc()
this.provider = new WebsocketProvider('wss://websocket.tiptap.dev', 'tiptap-multiple-editors-example', ydoc)
this.title = new Editor({
extensions: [
ParagraphDocument,
Paragraph,
Text,
Collaboration.configure({
document: ydoc,
field: 'title',
}),
],
})
this.tasks = new Editor({
extensions: [
TaskListDocument,
Paragraph,
Text,
TaskList,
CustomTaskItem,
Collaboration.configure({
document: ydoc,
field: 'tasks',
}),
],
})
this.description = new Editor({
extensions: [
Document,
Paragraph,
Text,
Collaboration.configure({
document: ydoc,
field: 'description',
}),
],
})
},
beforeDestroy() {
this.title.destroy()
this.tasks.destroy()
this.description.destroy()
this.provider.destroy()
},
}
</script>
<style lang="scss">
.ProseMirror {
> * + * {
margin-top: 0.75em;
}
ul[data-type="taskList"] {
list-style: none;
padding: 0;
li {
display: flex;
align-items: center;
> input {
flex: 0 0 auto;
margin-right: 0.5rem;
}
}
}
}
.form__label {
color: #868e96;
text-transform: uppercase;
font-weight: bold;
font-size: 0.7rem;
letter-spacing: 1px;
}
.form__item {
margin: 0 0 1rem;
padding: 0.75rem 1rem;
border-radius: 5px;
border: 1px solid #e9ecef;
&--title {
font-size: 1.6rem;
}
}
</style>

View File

@ -19,12 +19,13 @@ export default {
data() {
return {
editor: null,
provider: null,
}
},
mounted() {
const ydoc = new Y.Doc()
const provider = new WebrtcProvider('tiptap-collaboration-extension', ydoc)
this.provider = new WebrtcProvider('tiptap-collaboration-extension', ydoc)
this.editor = new Editor({
extensions: [
@ -32,7 +33,7 @@ export default {
Paragraph,
Text,
Collaboration.configure({
provider,
document: ydoc,
}),
],
})
@ -40,6 +41,7 @@ export default {
beforeDestroy() {
this.editor.destroy()
this.provider.destroy()
},
}
</script>

View File

@ -20,12 +20,13 @@ export default {
data() {
return {
editor: null,
provider: null,
}
},
mounted() {
const ydoc = new Y.Doc()
const provider = new WebrtcProvider('tiptap-collaboration-cursor-extension', ydoc)
this.provider = new WebrtcProvider('tiptap-collaboration-cursor-extension', ydoc)
this.editor = new Editor({
extensions: [
@ -33,10 +34,10 @@ export default {
Paragraph,
Text,
Collaboration.configure({
provider,
document: ydoc,
}),
CollaborationCursor.configure({
provider,
provider: this.provider,
user: {
name: 'Cyndi Lauper',
color: '#f783ac',
@ -48,6 +49,7 @@ export default {
beforeDestroy() {
this.editor.destroy()
this.provider.destroy()
},
}
</script>

View File

@ -69,6 +69,38 @@ editor
Both calls would return `true` if its possible to apply the commands, and `false` in case its not.
In order to make that work with your custom commands, dont forget to return `true` or `false`.
For some of your own commands, you probably want to work with the raw [transaction](/api/overview). To make them work with `.can()` you should check if the transaction should be dispatched. Here is how we do that within `.insertText()`:
```js
export default (value: string): Command => ({ tr, dispatch }) => {
if (dispatch) {
tr.insertText(value)
}
return true
}
```
If youre just wrapping another tiptap command, you dont need to check that, well do it for you.
```js
bold: (): Command => ({ commands }) => {
return commands.toggleMark('bold')
},
```
If youre just wrapping a ProseMirror command, youll need to pass `dispatch` anyway. Then theres also no need to check it:
```js
export default (typeOrName: string | NodeType): Command => ({ state, dispatch }) => {
const type = getNodeType(typeOrName, state.schema)
return liftListItem(type)(state, dispatch)
}
```
### Try commands
If you want to run a list of commands, but want only the first successful command to be applied, you can do this with the `.first()` method. This method runs one command after the other and stops at the first which returns `true`.
@ -107,7 +139,14 @@ Have a look at all of the core commands listed below. They should give you a goo
| Command | Description |
| ----------------------- | --------------------------------------------------------- |
| .clearNodes() | Normalize nodes to a simple paragraph. |
| .createParagraphNear() | Create a paragraph nearby. |
| .exitCode() | Exit from a code block. |
| .extendMarkRange() | Extends the text selection to the current mark. |
| .joinBackward() | Join two nodes backward. |
| .joinForward() | Join two nodes forward. |
| .lift() | Removes an existing wrap. |
| .liftEmptyBlock() | Lift block if empty. |
| .newlineInCode() | Add a newline character in code. |
| .resetNodeAttributes() | Resets all node attributes to the default value. |
| .selectParentNode() | Select the parent node. |
| .setMark() | Add a mark with new attributes. |
@ -116,6 +155,7 @@ Have a look at all of the core commands listed below. They should give you a goo
| .toggleMark() | Toggle a mark on and off. |
| .toggleNode() | Toggle a node with another node. |
| .toggleWrap() | Wraps nodes in another node, or removes an existing wrap. |
| .undoInputRule() | Undo an input rule. |
| .unsetAllMarks() | Remove all marks in the current selection. |
| .unsetMark() | Remove a mark in the current selection. |
| .updateNodeAttributes() | Update attributes of a node. |
@ -130,13 +170,16 @@ Have a look at all of the core commands listed below. They should give you a goo
| .wrapInList() | Wrap a node in a list. |
### Selection
| Command | Description |
| ------------------ | --------------------------------------- |
| .blur() | Removes focus from the editor. |
| .deleteSelection() | Delete the selection, if there is one. |
| .focus() | Focus the editor at the given position. |
| .scrollIntoView() | Scroll the selection into view. |
| .selectAll() | Select the whole document. |
| Command | Description |
| --------------------- | --------------------------------------- |
| .blur() | Removes focus from the editor. |
| .deleteSelection() | Delete the selection, if there is one. |
| .focus() | Focus the editor at the given position. |
| .scrollIntoView() | Scroll the selection into view. |
| .selectAll() | Select the whole document. |
| .selectNodeBackward() | Select a node backward. |
| .selectNodeForward() | Select a node forward. |
| .selectParentNode() | Select the parent node. |
## Add your own commands
All extensions can add additional commands (and most do), check out the specific [documentation for the provided nodes](/api/nodes), [marks](/api/marks), and [extensions](/api/extensions) to learn more about those.

View File

@ -1,4 +1,7 @@
# CollaborationCursor
[![Version](https://img.shields.io/npm/v/@tiptap/extension-collaboration-cursor.svg?label=version)](https://www.npmjs.com/package/@tiptap/extension-collaboration-cursor)
[![Downloads](https://img.shields.io/npm/dm/@tiptap/extension-collaboration-cursor.svg)](https://npmcharts.com/compare/@tiptap/extension-collaboration-cursor?minimal=true)
This extension adds information about all connected users (like their name and a specified color), their current cursor position and their text selection (if theres one).
Open this page in multiple browser windows to test it.
@ -39,4 +42,4 @@ yarn add @tiptap/extension-collaboration-cursor
:::warning Public
The content of this editor is shared with other users.
:::
<demo name="Extensions/CollaborationCursor" highlight="11,38-44" />
<demo name="Extensions/CollaborationCursor" highlight="11,39-45" />

View File

@ -1,5 +1,4 @@
# Collaboration
[![Version](https://img.shields.io/npm/v/@tiptap/extension-collaboration.svg?label=version)](https://www.npmjs.com/package/@tiptap/extension-collaboration)
[![Downloads](https://img.shields.io/npm/dm/@tiptap/extension-collaboration.svg)](https://npmcharts.com/compare/@tiptap/extension-collaboration?minimal=true)
@ -21,9 +20,11 @@ yarn add @tiptap/extension-collaboration yjs y-websocket
```
## Settings
| Option | Type | Default | Description |
| -------- | -------- | ------- | ---------------------------------------------------------------------------------------------------- |
| provider | `Object` | `null` | A Y.js network connection, for example a [y-websocket](https://github.com/yjs/y-websocket) instance. |
| Option | Type | Default | Description |
| -------- | -------- | ----------- | --------------------------------------------------------------------------------------- |
| document | `Object` | `null` | An initialized Y.js document. |
| field | `String` | `'default'` | Name of a Y.js fragment, can be changed to sync multiple fields with one Y.js document. |
| fragment | `Object` | `null` | A raw Y.js fragment, can be used instead of `document` and `field`. |
## Commands
| Command | Parameters | Description |
@ -47,4 +48,4 @@ yarn add @tiptap/extension-collaboration yjs y-websocket
:::warning Public
The content of this editor is shared with other users.
:::
<demo name="Extensions/Collaboration" highlight="10,26-27,34-36" />
<demo name="Extensions/Collaboration" highlight="10,27-28,35-37,44" />

View File

@ -1,5 +1,9 @@
# Suggestion
:::pro Fund the development 💖
We need your support to maintain, update, support and develop tiptap 2. If youre waiting for this extension, [become a sponsor and fund the open-source](/sponsor).
:::
TODO
- mentions (as text or as/with user ID)

View File

@ -1,3 +1,8 @@
# TableCell
TODO
:::pro Fund the development 💖
We need your support to maintain, update, support and develop tiptap 2. If youre waiting for this extension, [become a sponsor and fund the open-source](/sponsor).
:::
TODO

View File

@ -1,3 +1,7 @@
# TableRow
TODO
:::pro Fund the development 💖
We need your support to maintain, update, support and develop tiptap 2. If youre waiting for this extension, [become a sponsor and fund the open-source](/sponsor).
:::
TODO

View File

@ -1,3 +1,7 @@
# Table
TODO
:::pro Fund the development 💖
We need your support to maintain, update, support and develop tiptap 2. If youre waiting for this extension, [become a sponsor and fund the open-source](/sponsor).
:::
TODO

View File

@ -80,9 +80,12 @@ The content attribute defines exactly what kind of content the node can have. Pr
```js
Node.create({
// must have one ore more blocks
// must have one or more blocks
content: 'block+',
// must have zero or more blocks
content: 'block*',
// allows all kinds of 'inline' content (text or hard breaks)
content: 'inline*',
@ -91,10 +94,12 @@ Node.create({
// can have one or more paragraphs, or lists (if lists are used)
content: '(paragraph|list?)+',
// must have exact one heading at the top, and one or more blocks below
content: 'heading block+'
})
```
#### Marks
You can define which marks are allowed inside of a node with the `marks` setting of the schema. Add a one or more names or groups of marks, allow all or disallow all marks like this:

View File

@ -1,3 +1,5 @@
# Write a book
This demo has 150 paragraphs and more than 13,000 words, check the performance yourself. The most heavy processing is to check the active state of the buttons for the selection. If youd like to optimize for that use case, try to limit those checks in your toolbar. But honestly, we think its great already, isnt it?
<demo name="Examples/Book" highlight="" />

View File

@ -1,4 +1,5 @@
# Drawing
<demo name="Examples/Drawing" inline />
Did you ever wanted to draw in a text editor? Me neither. Anyway, here is an example how that could work with tiptap. If you want to build something like that, [learn more about node views](/guide/node-views).
<demo name="Examples/Drawing" />

View File

@ -0,0 +1,9 @@
# Multiple editors
The following examples has three different instances of tiptap. The first is configured to have a single paragraph of text, the second to have a task list and the third to have text. All of them are stored in a single Y.js document, which is synced with other users.
:::warning Shared Document
Be nice! The content of this editor is shared with other users from the Internet.
:::
<demo name="Examples/MultipleEditors" />

View File

@ -45,7 +45,7 @@ const editor = new Editor({
// …
// Register the document with tiptap
Collaboration.configure({
provider
document: ydoc,
}),
],
})
@ -90,7 +90,7 @@ const editor = new Editor({
// …
// Register the document with tiptap
Collaboration.configure({
provider
document: ydoc,
}),
],
})
@ -128,7 +128,19 @@ node ./index.js
This should output something like “Listening on ws://127.0.0.1:1234”. If you go back to your tiptap editor and hit reload, it should connect to the WebSocket server and changes should sync with all other clients. Amazing, isnt it?
### Add cursors
### Multiple network providers
You can even combine multiple providers. Thats not needed, but could keep clients connected, even if one connection - for example the websocket server - goes down for a while. Here is an example:
```js
new WebrtcProvider('example-document', ydoc)
new WebsocketProvider('ws://127.0.0.1:1234', 'example-document', ydoc)
```
Yes, thats all.
Keep in mind that WebRTC needs a signaling server to connect clients. This signaling server doesnt receive the synced data, but helps to let clients find each other. You can [run your own signaling server](https://github.com/yjs/y-webrtc#signaling), if you like.
### Show other cursors
If you want to enable users to see the cursor and text selections of each other, add the [`CollaborationCursor`](/api/extensions/collaboration-cursor) extension.
```js
@ -145,11 +157,11 @@ const editor = new Editor({
extensions: [
// …
Collaboration.configure({
provider
document: ydoc,
}),
// Register the collaboration cursor extension
CollaborationCursor.configure({
provider: this.provider,
provider: provider,
name: 'Cyndi Lauper',
color: '#f783ac',
}),
@ -179,14 +191,15 @@ import * as Y from 'yjs'
import { IndexeddbPersistence } from 'y-indexeddb'
const ydoc = new Y.Doc()
// Store the Y document in the browser
const indexdb = new IndexeddbPersistence('example-document', ydoc)
new IndexeddbPersistence('example-document', ydoc)
const editor = new Editor({
extensions: [
// …
Collaboration.configure({
provider
document: ydoc,
}),
],
})
@ -209,13 +222,38 @@ Dont want to wrap your head around the backend part? No worries, we offer a m
::: -->
### The document name
The document name is `'example-document'` in all examples here, but it could be any string. In a real-world app youd probably add the name of your entity, the ID of the entity and in some cases even the field (if you have multiple fields that you want to make collaborative). Here is how that could look like for a CMS:
The document name is `'example-document'` in all examples here, but it could be any string. In a real-world app youd probably add the name of your entity and the ID of the entity. Here is how that could look like:
```js
const documentName = 'page.140.content'
const documentName = 'page.140'
```
In the backend, you can split the string to know the user is typing on a page with the ID 140 in the `content` field and manage authorization and such accordingly. New documents are created on the fly, no need to tell the backend about them, besides passing a string to the provider.
In the backend, you can split the string to know the user is typing on a page with the ID 140 to manage authorization and such accordingly. New documents are created on the fly, no need to tell the backend about them, besides passing a string to the provider.
And if youd like to sync multiple fields with one Y.js document, just pass different fragment names to the collaboration extension:
```js
// a tiptap instance for the field
Collaboration.configure({
document: ydoc,
field: 'title',
})
// and another instance for the summary, both in the same Y.js document
Collaboration.configure({
document: ydoc,
field: 'summary',
})
```
If your setup is somehow more complex, for example with nested fragments, you can pass a raw Y.js fragment too. `document` and `field` will be ignored then.
```js
// a raw Y.js fragment
Collaboration.configure({
fragment: ydoc.getXmlFragment('custom'),
})
```
### Authentication
With the `onConnect` hook you can write a custom Promise to check if a client is authenticated. That can be a request to an API, to a microservice, a database query, or whatever is needed, as long as its executing `resolve()` at some point. You can also pass contextual data to the `resolve()` method which will be accessible in other hooks.

View File

@ -0,0 +1,109 @@
# Alpine.js
## toc
TODO
https://codesandbox.io/s/alpine-tiptap-2ro5e?file=/index.html:0-1419
index.html
```html
<!DOCTYPE html>
<html>
<head>
<title>Parcel Sandbox</title>
<meta charset="UTF-8" />
<link
href="https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css"
rel="stylesheet"
/>
<script
src="https://cdn.jsdelivr.net/gh/alpinejs/alpine@v2.8.0/dist/alpine.min.js"
defer
></script>
</head>
<body>
<div
x-data="setupEditor('<p>My content goes here</p>')"
x-init="() => init($refs.editor)"
x-on:click.away="inFocus = false;"
>
<template x-if="editor">
<nav class="space-x-1">
<button
class="bg-gray-200 rounded px-2 py-1"
x-bind:class="{ 'bg-gray-600 text-white': editor.isActive('bold') }"
@click="editor.chain().focus().toggleBold().run()"
>
Bold
</button>
<button
class="bg-gray-200 rounded px-2 py-1"
x-bind:class="{ 'bg-gray-600 text-white': editor.isActive('italic') }"
@click="editor.chain().focus().toggleItalic().run()"
>
Italic
</button>
</nav>
</template>
<div x-ref="editor"></div>
<button
class="bg-indigo-500 text-white rounded px-3 py-1"
x-on:click="console.log(content)"
>
Submit
</button>
(view console for editor output)
</div>
<script src="src/index.js"></script>
</body>
</html>
```
index.js
```js
import { Editor as TipTap } from "@tiptap/core";
import { defaultExtensions } from "@tiptap/starter-kit";
window.setupEditor = function (content) {
return {
content: content,
inFocus: false,
// updatedAt is to force Alpine to
// rerender on selection change
updatedAt: Date.now(),
editor: null,
init(el) {
let editor = new TipTap({
element: el,
extensions: defaultExtensions(),
content: this.content,
editorProps: {
attributes: {
class: "prose-sm py-4 focus:outline-none"
}
}
});
editor.on("update", () => {
this.content = this.editor.getHTML();
});
editor.on("focus", () => {
this.inFocus = true;
});
editor.on("selection", () => {
this.updatedAt = Date.now();
});
this.editor = editor;
}
};
};
```

View File

@ -0,0 +1,35 @@
# Livewire
## toc
TODO
editor.blade.php
```html
<!--
In your livewire component you could add an
autosave method to handle saving the content
from the editor every 10 seconds if you wanted
-->
<x-editor
wire:model="foo"
wire:poll.10000ms="autosave"
></x-editor>
```
my-livewire-component.blade.php
```html
<div
x-data="setupEditor(
@entangle($attributes->wire('model')).defer
)"
x-init="() => init($refs.editor)"
x-on:click.away="inFocus = false;"
wire:ignore
{{ $attributes->whereDoesntStartWith('wire:model') }}
>
<div x-ref="editor"></div>
</div>
```

View File

@ -3,10 +3,9 @@
## toc
## Introduction
Node views are the best thing since sliced bread, at least if youre a fan of customization (and bread). Node views enable you to add literally anything to a node. If you can write it in JavaScript, you can use it in your editor.
TODO
```js
<!-- ```js
import { Node } from '@tiptap/core'
import { VueRenderer } from '@tiptap/vue'
import Component from './Component.vue'
@ -24,7 +23,7 @@ export default Node.create({
})
},
})
```
``` -->
## Different types of node views
@ -38,6 +37,10 @@ export default Node.create({
</div>
```
#### Example: Task item
https://github.com/ueberdosis/tiptap-next/blob/main/packages/extension-task-item/src/task-item.ts#L74
### Without content
```html
@ -48,8 +51,10 @@ export default Node.create({
</div>
```
#### Example: Table of contents
<demo name="Guide/NodeViews/TableOfContents" />
#### Example: Drawing in the editor
<demo name="Examples/Drawing" />
### Advanced node views with content
@ -69,6 +74,7 @@ export default Node.create({
</div>
```
#### Example: Drag handles
<demo name="Guide/NodeViews/DragHandle" />
## Render Vue components
@ -130,3 +136,13 @@ export default {
}
</script>
```
### Component with Content
```html
<template>
<node-view-wrapper class="dom">
<node-view-content class="content-dom" />
</node-view-wrapper>
</template>
```

View File

@ -35,8 +35,6 @@ Were [waiting for Gridsome](https://github.com/gridsome/gridsome/issues/1289)
### Explicitly register the Document, Text and Paragraph extensions
tiptap 1 tried to hide a few required extensions from you with the default setting `useBuiltInExtensions: true`. That setting has been removed and youre required to import all extensions. Be sure to explicitly import at least the [Document](/api/nodes/document), [Paragraph](/api/nodes/paragraph) and [Text](/api/nodes/text) extensions.
TODO: removed dropCursor, enableDropCursor, enableGapCursor
```js
import Document from '@tiptap/extension-document'
import Paragraph from '@tiptap/extension-paragraph'
@ -52,11 +50,34 @@ new Editor({
})
```
### New document type
~~**We renamed the default `Document` type from `doc` to `document`.** To keep it like that, use your own implementation of the `Document` node or migrate the stored JSON to use the new name.~~
And we removed some settings: `dropCursor`, `enableDropCursor`, and `enableGapCursor`. Those are separate extensions now: [`Dropcursor`](/api/extensions/dropcursor) and [`Gapcursor`](/api/extensions/gapcursor). You probably want to load them, but if you dont just ignore me.
### New names for most extensions
**We renamed the default `Document` type from `doc` to `document`.** To keep it like that, use your own implementation of the `Document` node or migrate the stored JSON to use the new name.
Also, we switched to lowerCamelCase, so theres a lot that changed. If you stored your content as JSON you need to loop through it and rename a lot of types. Sorry for that one.
| Old type | New type |
| --------------------- | ---------------------- |
| ~~`blockquote`~~ | `blockquote` |
| ~~`bold`~~ | `bold` |
| ~~`bullet_list`~~ | `bulletList` |
| ~~`code`~~ | `code` |
| ~~`code_block`~~ | `codeBlock` |
| ~~`hard_break`~~ | `hardBreak` |
| ~~`heading`~~ | `heading` |
| ~~`horizontal_rule`~~ | `horizontalRule` |
| ~~`italic`~~ | `italic` |
| ~~`link`~~ | `link` |
| ~~`ordered_list`~~ | `orderedList` |
| ~~`paragraph`~~ | `paragraph` |
| ~~`strike`~~ | `strike` |
| ~~`todo_list`~~ | `taskList` (new name!) |
| ~~`underline`~~ | `underline` |
| … | … |
### Removed methods
TODO: state()
We removed the `.state()` method. No worries though, its still available through `editor.state`.
### New extension API
In case youve built some custom extensions for your project, youre required to rewrite them to fit the new API. No worries, you can keep a lot of your work though. The `schema`, `commands`, `keys`, `inputRules` and `pasteRules` all work like they did before. Its just different how you register them.
@ -100,6 +121,30 @@ Read more about [all the nifty details building custom extensions](/guide/build-
| --------------- | ----------- |
| ~~`autoFocus`~~ | `autofocus` |
### Renamed commands
All new extensions come with specific commands to set, unset and toggle styles. So instead of `.bold()`, its now `.toggleBold()`. Also, we switched to lowerCamelCase, below are a few examples. Oh, and we renamed `todo_list`, to `taskList`, sorry for that one.
| Old command | New command |
| ------------------------ | ------------------------------- |
| `.redo()` | `.redo()` (nothing changed) |
| `.undo()` | `.undo()` (nothing changed) |
| ~~`.todo_list()`~~ | `.toggleTaskList()` (new name!) |
| ~~`.blockquote()`~~ | `.toggleBlockquote()` |
| ~~`.bold()`~~ | `.toggleBold()` |
| ~~`.bullet_list()`~~ | `.toggleBulletList()` |
| ~~`.code()`~~ | `.toggleCode()` |
| ~~`.code_block()`~~ | `.toggleCodeBlock()` |
| ~~`.hard_break()`~~ | `.toggleHardBreak()` |
| ~~`.heading()`~~ | `.toggleHeading()` |
| ~~`.horizontal_rule()`~~ | `.toggleHorizontalRule()` |
| ~~`.italic()`~~ | `.toggleItalic()` |
| ~~`.link()`~~ | `.toggleLink()` |
| ~~`.ordered_list()`~~ | `.toggleOrderedList()` |
| ~~`.paragraph()`~~ | `.toggleParagraph()` |
| ~~`.strike()`~~ | `.toggleStrike()` |
| ~~`.underline()`~~ | `.toggleUnderline()` |
| … | … |
### Commands can be chained now
Most commands can be combined to one call now. Thats shorter than separate function calls in most cases. Here is an example to make the selected text bold:
@ -118,6 +163,9 @@ With tiptap 2.x you have to explicitly call the `focus()` and you probably want
editor.chain().focus().toggleBold().run()
```
### Event callbacks have fewer parameters
The new event callbacks have fewer parameters. The same things should be available through `this.` now. [Read more about events here.](/api/events)
### Collaborative editing
The reference implementation for collaborative editing uses Y.js now. Thats a whole different thing. You still can use the tiptap 1 extension, but its up to you to adapt it to the new extension API. If youve done this, dont forget to share it with us so we can link to it from here!

View File

@ -0,0 +1,12 @@
# Monthly reports
| Month | Tasks | Sponsors | Funding | Worked |
| --------- | ---------------------------------------------------------------------- | -------- | ------- | ------------- |
| 01/2021 | Maintenance tiptap v1, … | … | … | … |
| 12/2020 | Invited all sponsors, gathered feedback | 60 | $1,035 | 60 h |
| 11/2020 | Wrote documentation, improved collaborative editing, advanced examples | 31 | $468 | 188 h |
| 10/2020 | Rewrote extensions for tiptap 2 | 25 | $423 | 102 h |
| 09/2020 | Developed the new API, wrote documentation | | | 125 h |
| 08/2020 | Set up tiptap 2 | | | 56 h |
| **Total** | | | | **531 h** |

View File

@ -1,6 +0,0 @@
# August 2020
* Setting up tiptap 2
* 56 hours, $3,920 development costs (at $70/hour)
* Sponsored @calebporzio with $99
* **Total -$4,019**

View File

@ -1,5 +0,0 @@
# September 2020
* Developing the API of tiptap 2, writing the documentation
* 125 hours, $8,750 development costs (at $70/hour)
* Sponsored @calebporzio with $99
* **Total -$8,849**

View File

@ -1,6 +0,0 @@
# October 2020
* Writing extensions for tiptap 2
* 25 sponsors, $423/month
* 102 hours, $7,140 development costs (at $70/hour)
* Sponsored @calebporzio with $99
* **Total -$6,816**

View File

@ -1,5 +0,0 @@
# November 2020
* Wrote the documentation, improved the collaborative editing experience, built advanced examples
* 31 sponsors, $468/month
* 188 hours, $13,160 development costs (at $70/hour)
* Sponsored @calebporzio with $99

View File

@ -32,7 +32,8 @@
link: /examples/minimalist
- title: Drawing
link: /examples/drawing
draft: true
- title: Multiple editors
link: /examples/multiple-editors
- title: Guide
items:
@ -45,6 +46,14 @@
- title: Nuxt.js
link: /guide/getting-started/nuxtjs
skip: true
- title: Alpine.js
link: /guide/getting-started/alpinejs
draft: true
skip: true
- title: Livewire
link: /guide/getting-started/livewire
draft: true
skip: true
- title: Configure the editor
link: /guide/configuration
- title: Create a toolbar
@ -101,15 +110,12 @@
- title: Table
link: /api/nodes/table
draft: true
pro: true
- title: TableRow
link: /api/nodes/table-row
draft: true
pro: true
- title: TableCell
link: /api/nodes/table-cell
draft: true
pro: true
- title: TaskList
link: /api/nodes/task-list
- title: TaskItem
@ -157,7 +163,6 @@
- title: Suggestion
link: /api/extensions/suggestion
draft: true
pro: true
- title: TextAlign
link: /api/extensions/text-align
- title: Typography
@ -173,20 +178,10 @@
- title: Sponsoring
items:
- title: Monthly reports
link: /updates
redirect: /updates/2020-11
items:
- title: November 2020
link: /updates/2020-11
- title: October 2020
link: /updates/2020-10
- title: September 2020
link: /updates/2020-09
- title: August 2020
link: /updates/2020-08
- title: Become a sponsor
link: /sponsor
- title: Monthly reports
link: /reports
- title: Links
items:

View File

@ -35,24 +35,24 @@
"@rollup/plugin-babel": "^5.2.1",
"@rollup/plugin-commonjs": "^17.0.0",
"@rollup/plugin-node-resolve": "^11.0.1",
"@typescript-eslint/eslint-plugin": "^4.10.0",
"@typescript-eslint/parser": "^4.10.0",
"cypress": "^6.1.0",
"@typescript-eslint/eslint-plugin": "^4.12.0",
"@typescript-eslint/parser": "^4.12.0",
"cypress": "^6.2.1",
"eslint": "^7.15.0",
"eslint-config-airbnb-base": "^14.2.0",
"eslint-plugin-cypress": "^2.11.2",
"eslint-plugin-html": "^6.1.0",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-vue": "^7.3.0",
"eslint-plugin-vue": "^7.4.1",
"lerna": "^3.22.1",
"minimist": "^1.2.5",
"rollup": "^2.35.1",
"rollup": "^2.36.0",
"rollup-plugin-auto-external": "^2.0.0",
"rollup-plugin-sourcemaps": "^0.6.3",
"rollup-plugin-terser": "^7.0.2",
"rollup-plugin-typescript2": "^0.29.0",
"rollup-plugin-vue": "5",
"typedoc": "^0.19.2",
"typedoc": "^0.20.13",
"typescript": "^4.1.3",
"vue": "^2.6.12"
}

View File

@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [2.0.0-alpha.10](https://github.com/ueberdosis/tiptap-next/compare/@tiptap/core@2.0.0-alpha.9...@tiptap/core@2.0.0-alpha.10) (2021-01-06)
**Note:** Version bump only for package @tiptap/core
# [2.0.0-alpha.9](https://github.com/ueberdosis/tiptap-next/compare/@tiptap/core@2.0.0-alpha.8...@tiptap/core@2.0.0-alpha.9) (2020-12-18)
**Note:** Version bump only for package @tiptap/core

View File

@ -1,7 +1,7 @@
{
"name": "@tiptap/core",
"description": "headless rich text editor",
"version": "2.0.0-alpha.9",
"version": "2.0.0-alpha.10",
"homepage": "https://tiptap.dev",
"keywords": [
"tiptap",

View File

@ -213,7 +213,9 @@ export class Editor extends EventEmitter {
*/
private createExtensionManager() {
const coreExtensions = Object.entries(extensions).map(([, extension]) => extension)
const allExtensions = [...this.options.extensions, ...coreExtensions]
const allExtensions = [...this.options.extensions, ...coreExtensions].filter(extension => {
return ['extension', 'node', 'mark'].includes(extension?.type)
})
this.extensionManager = new ExtensionManager(allExtensions, this.proxy)
}

View File

@ -0,0 +1,9 @@
import { createParagraphNear as originalCreateParagraphNear } from 'prosemirror-commands'
import { Command } from '../types'
/**
* Create a paragraph nearby.
*/
export const createParagraphNear = (): Command => ({ state, dispatch }) => {
return originalCreateParagraphNear(state, dispatch)
}

View File

@ -0,0 +1,9 @@
import { exitCode as originalExitCode } from 'prosemirror-commands'
import { Command } from '../types'
/**
* Exit from a code block.
*/
export const exitCode = (): Command => ({ state, dispatch }) => {
return originalExitCode(state, dispatch)
}

View File

@ -0,0 +1,9 @@
import { joinBackward as originalJoinBackward } from 'prosemirror-commands'
import { Command } from '../types'
/**
* Join two nodes backward.
*/
export const joinBackward = (): Command => ({ state, dispatch }) => {
return originalJoinBackward(state, dispatch)
}

View File

@ -0,0 +1,9 @@
import { joinForward as originalJoinForward } from 'prosemirror-commands'
import { Command } from '../types'
/**
* Join two nodes forward.
*/
export const joinForward = (): Command => ({ state, dispatch }) => {
return originalJoinForward(state, dispatch)
}

View File

@ -0,0 +1,9 @@
import { liftEmptyBlock as originalLiftEmptyBlock } from 'prosemirror-commands'
import { Command } from '../types'
/**
* Lift block if empty.
*/
export const liftEmptyBlock = (): Command => ({ state, dispatch }) => {
return originalLiftEmptyBlock(state, dispatch)
}

View File

@ -0,0 +1,9 @@
import { newlineInCode as originalNewlineInCode } from 'prosemirror-commands'
import { Command } from '../types'
/**
* Add a newline character in code.
*/
export const newlineInCode = (): Command => ({ state, dispatch }) => {
return originalNewlineInCode(state, dispatch)
}

View File

@ -0,0 +1,9 @@
import { selectNodeBackward as originalSelectNodeBackward } from 'prosemirror-commands'
import { Command } from '../types'
/**
* Select a node backward.
*/
export const selectNodeBackward = (): Command => ({ state, dispatch }) => {
return originalSelectNodeBackward(state, dispatch)
}

View File

@ -0,0 +1,9 @@
import { selectNodeForward as originalSelectNodeForward } from 'prosemirror-commands'
import { Command } from '../types'
/**
* Select a node forward.
*/
export const selectNodeForward = (): Command => ({ state, dispatch }) => {
return originalSelectNodeForward(state, dispatch)
}

View File

@ -0,0 +1,9 @@
import { undoInputRule as originalUndoInputRule } from 'prosemirror-inputrules'
import { Command } from '../types'
/**
* Undo an input rule.
*/
export const undoInputRule = (): Command => ({ state, dispatch }) => {
return originalUndoInputRule(state, dispatch)
}

View File

@ -1,19 +1,27 @@
import { Extension } from '../Extension'
import * as blur from '../commands/blur'
import * as clearContent from '../commands/clearContent'
import * as command from '../commands/command'
import * as clearNodes from '../commands/clearNodes'
import * as command from '../commands/command'
import * as createParagraphNear from '../commands/createParagraphNear'
import * as deleteSelection from '../commands/deleteSelection'
import * as exitCode from '../commands/exitCode'
import * as extendMarkRange from '../commands/extendMarkRange'
import * as first from '../commands/first'
import * as focus from '../commands/focus'
import * as insertHTML from '../commands/insertHTML'
import * as insertText from '../commands/insertText'
import * as joinBackward from '../commands/joinBackward'
import * as joinForward from '../commands/joinForward'
import * as lift from '../commands/lift'
import * as liftEmptyBlock from '../commands/liftEmptyBlock'
import * as liftListItem from '../commands/liftListItem'
import * as newlineInCode from '../commands/newlineInCode'
import * as resetNodeAttributes from '../commands/resetNodeAttributes'
import * as scrollIntoView from '../commands/scrollIntoView'
import * as selectAll from '../commands/selectAll'
import * as selectNodeBackward from '../commands/selectNodeBackward'
import * as selectNodeForward from '../commands/selectNodeForward'
import * as selectParentNode from '../commands/selectParentNode'
import * as setContent from '../commands/setContent'
import * as setMark from '../commands/setMark'
@ -25,6 +33,7 @@ import * as toggleList from '../commands/toggleList'
import * as toggleMark from '../commands/toggleMark'
import * as toggleNode from '../commands/toggleNode'
import * as toggleWrap from '../commands/toggleWrap'
import * as undoInputRule from '../commands/undoInputRule'
import * as unsetAllMarks from '../commands/unsetAllMarks'
import * as unsetMark from '../commands/unsetMark'
import * as updateNodeAttributes from '../commands/updateNodeAttributes'
@ -40,17 +49,25 @@ export const Commands = Extension.create({
...clearContent,
...clearNodes,
...command,
...createParagraphNear,
...deleteSelection,
...exitCode,
...extendMarkRange,
...first,
...focus,
...insertHTML,
...insertText,
...joinBackward,
...joinForward,
...lift,
...liftEmptyBlock,
...liftListItem,
...newlineInCode,
...resetNodeAttributes,
...scrollIntoView,
...selectAll,
...selectNodeBackward,
...selectNodeForward,
...selectParentNode,
...setContent,
...setMark,
@ -62,8 +79,9 @@ export const Commands = Extension.create({
...toggleMark,
...toggleNode,
...toggleWrap,
...unsetMark,
...undoInputRule,
...unsetAllMarks,
...unsetMark,
...updateNodeAttributes,
...wrapIn,
...wrapInList,

View File

@ -1,48 +1,36 @@
import {
newlineInCode,
createParagraphNear,
liftEmptyBlock,
exitCode,
deleteSelection,
joinForward,
joinBackward,
selectNodeForward,
selectNodeBackward,
} from 'prosemirror-commands'
import { undoInputRule } from 'prosemirror-inputrules'
import { Extension } from '../Extension'
export const Keymap = Extension.create({
name: 'keymap',
addKeyboardShortcuts() {
const handleBackspace = () => this.editor.commands.first(({ state, dispatch }) => [
() => undoInputRule(state, dispatch),
() => deleteSelection(state, dispatch),
() => joinBackward(state, dispatch),
() => selectNodeBackward(state, dispatch),
const handleBackspace = () => this.editor.commands.first(({ commands }) => [
() => commands.undoInputRule(),
() => commands.deleteSelection(),
() => commands.joinBackward(),
() => commands.selectNodeBackward(),
])
const handleDelete = () => this.editor.commands.first(({ state, dispatch }) => [
() => deleteSelection(state, dispatch),
() => joinForward(state, dispatch),
() => selectNodeForward(state, dispatch),
const handleDelete = () => this.editor.commands.first(({ commands }) => [
() => commands.deleteSelection(),
() => commands.joinForward(),
() => commands.selectNodeForward(),
])
return {
Enter: () => this.editor.commands.first(({ commands, state, dispatch }) => [
() => newlineInCode(state, dispatch),
() => createParagraphNear(state, dispatch),
() => liftEmptyBlock(state, dispatch),
Enter: () => this.editor.commands.first(({ commands }) => [
() => commands.newlineInCode(),
() => commands.createParagraphNear(),
() => commands.liftEmptyBlock(),
() => commands.splitBlock(),
]),
'Mod-Enter': exitCode,
'Mod-Enter': () => this.editor.commands.exitCode(),
Backspace: () => handleBackspace(),
'Mod-Backspace': () => handleBackspace(),
Delete: () => handleDelete(),
'Mod-Delete': () => handleDelete(),
// we dont need a custom `selectAll` for now
// 'Mod-a': () => this.editor.selectAll(),
// 'Mod-a': () => this.editor.commands.selectAll(),
}
},
})

View File

@ -97,7 +97,7 @@ export type NodeViewRendererProps = {
extension: Node,
}
export type NodeViewRenderer = (props: NodeViewRendererProps) => NodeView
export type NodeViewRenderer = (props: NodeViewRendererProps) => (NodeView | {})
export type UnfilteredCommands = {
[Item in keyof AllExtensions]: AllExtensions[Item] extends Extension<any, infer ExtensionCommands>

View File

@ -7,14 +7,27 @@ import {
} from 'y-prosemirror'
export interface CollaborationOptions {
provider: any,
/**
* An initialized Y.js document.
*/
document: any,
/**
* Name of a Y.js fragment, can be changed to sync multiple fields with one Y.js document.
*/
field: string,
/**
* A raw Y.js fragment, can be used instead of `document` and `field`.
*/
fragment: any,
}
export const Collaboration = Extension.create({
name: 'collaboration',
defaultOptions: <CollaborationOptions>{
provider: null,
document: null,
field: 'default',
fragment: null,
},
addCommands() {
@ -47,17 +60,15 @@ export const Collaboration = Extension.create({
},
addProseMirrorPlugins() {
const fragment = this.options.fragment
? this.options.fragment
: this.options.document.getXmlFragment(this.options.field)
return [
ySyncPlugin(
this.options.provider.doc.getXmlFragment('prosemirror'),
),
ySyncPlugin(fragment),
yUndoPlugin(),
]
},
onDestroy() {
this.options.provider?.destroy()
},
})
declare module '@tiptap/core' {

View File

@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [2.0.0-alpha.6](https://github.com/ueberdosis/tiptap-next/compare/@tiptap/extension-text-align@2.0.0-alpha.5...@tiptap/extension-text-align@2.0.0-alpha.6) (2021-01-06)
**Note:** Version bump only for package @tiptap/extension-text-align
# [2.0.0-alpha.5](https://github.com/ueberdosis/tiptap-next/compare/@tiptap/extension-text-align@2.0.0-alpha.4...@tiptap/extension-text-align@2.0.0-alpha.5) (2020-12-18)
**Note:** Version bump only for package @tiptap/extension-text-align

View File

@ -1,7 +1,7 @@
{
"name": "@tiptap/extension-text-align",
"description": "text align extension for tiptap",
"version": "2.0.0-alpha.5",
"version": "2.0.0-alpha.6",
"homepage": "https://tiptap.dev",
"keywords": [
"tiptap",

View File

@ -59,10 +59,14 @@ export const TextAlign = Extension.create({
return {
// TODO: re-use only 'textAlign' attribute
// TODO: use custom splitBlock only for `this.options.types`
// TODO: use complete default enter handler (chainCommand) with custom splitBlock
Enter: () => this.editor.commands.splitBlock({
withAttributes: true,
}),
Enter: () => this.editor.commands.first(({ commands }) => [
() => commands.newlineInCode(),
() => commands.createParagraphNear(),
() => commands.liftEmptyBlock(),
() => commands.splitBlock({
withAttributes: true,
}),
]),
'Mod-Shift-l': () => this.editor.commands.setTextAlign('left'),
'Mod-Shift-e': () => this.editor.commands.setTextAlign('center'),
'Mod-Shift-r': () => this.editor.commands.setTextAlign('right'),

View File

@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [2.0.0-alpha.6](https://github.com/ueberdosis/tiptap-next/compare/@tiptap/html@2.0.0-alpha.5...@tiptap/html@2.0.0-alpha.6) (2021-01-06)
**Note:** Version bump only for package @tiptap/html
# [2.0.0-alpha.5](https://github.com/ueberdosis/tiptap-next/compare/@tiptap/html@2.0.0-alpha.4...@tiptap/html@2.0.0-alpha.5) (2020-12-18)
**Note:** Version bump only for package @tiptap/html

View File

@ -1,7 +1,7 @@
{
"name": "@tiptap/html",
"description": "utility package to render tiptap JSON as HTML",
"version": "2.0.0-alpha.5",
"version": "2.0.0-alpha.6",
"homepage": "https://tiptap.dev",
"keywords": [
"tiptap",
@ -22,8 +22,8 @@
"dist"
],
"dependencies": {
"@tiptap/core": "^2.0.0-alpha.9",
"hostic-dom": "^0.8.5",
"@tiptap/core": "^2.0.0-alpha.10",
"hostic-dom": "^0.8.6",
"prosemirror-model": "^1.12.0"
}
}

View File

@ -39,7 +39,6 @@
"@tiptap/extension-ordered-list": "^2.0.0-alpha.5",
"@tiptap/extension-paragraph": "^2.0.0-alpha.5",
"@tiptap/extension-strike": "^2.0.0-alpha.5",
"@tiptap/extension-text": "^2.0.0-alpha.5",
"@tiptap/extension-underline": "^2.0.0-alpha.5"
"@tiptap/extension-text": "^2.0.0-alpha.5"
}
}

View File

@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [2.0.0-alpha.9](https://github.com/ueberdosis/tiptap-next/compare/@tiptap/vue-starter-kit@2.0.0-alpha.8...@tiptap/vue-starter-kit@2.0.0-alpha.9) (2021-01-06)
**Note:** Version bump only for package @tiptap/vue-starter-kit
# [2.0.0-alpha.8](https://github.com/ueberdosis/tiptap-next/compare/@tiptap/vue-starter-kit@2.0.0-alpha.7...@tiptap/vue-starter-kit@2.0.0-alpha.8) (2020-12-18)
**Note:** Version bump only for package @tiptap/vue-starter-kit

View File

@ -1,7 +1,7 @@
{
"name": "@tiptap/vue-starter-kit",
"description": "Vue starter kit for tiptap",
"version": "2.0.0-alpha.8",
"version": "2.0.0-alpha.9",
"homepage": "https://tiptap.dev",
"keywords": [
"tiptap",
@ -23,6 +23,6 @@
],
"dependencies": {
"@tiptap/starter-kit": "^2.0.0-alpha.7",
"@tiptap/vue": "^2.0.0-alpha.5"
"@tiptap/vue": "^2.0.0-alpha.6"
}
}

View File

@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [2.0.0-alpha.6](https://github.com/ueberdosis/tiptap-next/compare/@tiptap/vue@2.0.0-alpha.5...@tiptap/vue@2.0.0-alpha.6) (2021-01-06)
**Note:** Version bump only for package @tiptap/vue
# [2.0.0-alpha.5](https://github.com/ueberdosis/tiptap-next/compare/@tiptap/vue@2.0.0-alpha.4...@tiptap/vue@2.0.0-alpha.5) (2020-12-18)
**Note:** Version bump only for package @tiptap/vue

View File

@ -1,7 +1,7 @@
{
"name": "@tiptap/vue",
"description": "Vue components for tiptap",
"version": "2.0.0-alpha.5",
"version": "2.0.0-alpha.6",
"homepage": "https://tiptap.dev",
"keywords": [
"tiptap",

View File

@ -1,4 +1,9 @@
import { Editor, Node, NodeViewRendererProps } from '@tiptap/core'
import {
Editor,
Node,
NodeViewRenderer,
NodeViewRendererProps,
} from '@tiptap/core'
import { Decoration, NodeView } from 'prosemirror-view'
import { NodeSelection } from 'prosemirror-state'
import { Node as ProseMirrorNode } from 'prosemirror-model'
@ -115,7 +120,7 @@ class VueNodeView implements NodeView {
style: {
whiteSpace: 'pre-wrap',
},
attrs: {
domProps: {
id,
contenteditable: isEditable,
},
@ -309,7 +314,7 @@ class VueNodeView implements NodeView {
}
export default function VueRenderer(component: Vue | VueConstructor, options?: Partial<VueRendererOptions>) {
export default function VueRenderer(component: Vue | VueConstructor, options?: Partial<VueRendererOptions>): NodeViewRenderer {
return (props: NodeViewRendererProps) => {
// try to get the parent component
// this is important for vue devtools to show the component hierarchy correctly
@ -319,7 +324,7 @@ export default function VueRenderer(component: Vue | VueConstructor, options?: P
: undefined
if (!parent) {
return undefined
return {}
}
return new VueNodeView(component, props, options) as NodeView

336
yarn.lock
View File

@ -2464,9 +2464,9 @@
"@types/prosemirror-model" "*"
"@types/prosemirror-view@*", "@types/prosemirror-view@^1.16.1":
version "1.16.1"
resolved "https://registry.yarnpkg.com/@types/prosemirror-view/-/prosemirror-view-1.16.1.tgz#09d66e2518366fd8d6c316c35c621bc374a0414c"
integrity sha512-vsL7QB9Qmg9HcBTWsOkmBEGMF0CfA/SZgtqlUArQglnDWV40ZJYonkjBzyP+YhurMC/s4JT4T2vzfnv7rFF/cg==
version "1.17.0"
resolved "https://registry.yarnpkg.com/@types/prosemirror-view/-/prosemirror-view-1.17.0.tgz#7e283038730a67c35521c8dbc932765a70291edd"
integrity sha512-1OALGaiRmq3c+Y35QVrqqlEykWEszYYx08jAPBhYe6M+YbC6Y2LnmCDXjEOTI1oToJwoADHFPGHl4W59L3fgGg==
dependencies:
"@types/prosemirror-model" "*"
"@types/prosemirror-state" "*"
@ -2523,61 +2523,61 @@
"@types/unist" "*"
"@types/vfile-message" "*"
"@typescript-eslint/eslint-plugin@^4.10.0":
version "4.10.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.10.0.tgz#19ed3baf4bc4232c5a7fcd32eaca75c3a5baf9f3"
integrity sha512-h6/V46o6aXpKRlarP1AiJEXuCJ7cMQdlpfMDrcllIgX3dFkLwEBTXAoNP98ZoOmqd1xvymMVRAI4e7yVvlzWEg==
"@typescript-eslint/eslint-plugin@^4.12.0":
version "4.12.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.12.0.tgz#00d1b23b40b58031e6d7c04a5bc6c1a30a2e834a"
integrity sha512-wHKj6q8s70sO5i39H2g1gtpCXCvjVszzj6FFygneNFyIAxRvNSVz9GML7XpqrB9t7hNutXw+MHnLN/Ih6uyB8Q==
dependencies:
"@typescript-eslint/experimental-utils" "4.10.0"
"@typescript-eslint/scope-manager" "4.10.0"
"@typescript-eslint/experimental-utils" "4.12.0"
"@typescript-eslint/scope-manager" "4.12.0"
debug "^4.1.1"
functional-red-black-tree "^1.0.1"
regexpp "^3.0.0"
semver "^7.3.2"
tsutils "^3.17.1"
"@typescript-eslint/experimental-utils@4.10.0":
version "4.10.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.10.0.tgz#dbf5d0f89802d5feaf7d11e5b32df29bbc2f3a0e"
integrity sha512-opX+7ai1sdWBOIoBgpVJrH5e89ra1KoLrJTz0UtWAa4IekkKmqDosk5r6xqRaNJfCXEfteW4HXQAwMdx+jjEmw==
"@typescript-eslint/experimental-utils@4.12.0":
version "4.12.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.12.0.tgz#372838e76db76c9a56959217b768a19f7129546b"
integrity sha512-MpXZXUAvHt99c9ScXijx7i061o5HEjXltO+sbYfZAAHxv3XankQkPaNi5myy0Yh0Tyea3Hdq1pi7Vsh0GJb0fA==
dependencies:
"@types/json-schema" "^7.0.3"
"@typescript-eslint/scope-manager" "4.10.0"
"@typescript-eslint/types" "4.10.0"
"@typescript-eslint/typescript-estree" "4.10.0"
"@typescript-eslint/scope-manager" "4.12.0"
"@typescript-eslint/types" "4.12.0"
"@typescript-eslint/typescript-estree" "4.12.0"
eslint-scope "^5.0.0"
eslint-utils "^2.0.0"
"@typescript-eslint/parser@^4.10.0":
version "4.10.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.10.0.tgz#1a622b0847b765b2d8f0ede6f0cdd85f03d76031"
integrity sha512-amBvUUGBMadzCW6c/qaZmfr3t9PyevcSWw7hY2FuevdZVp5QPw/K76VSQ5Sw3BxlgYCHZcK6DjIhSZK0PQNsQg==
"@typescript-eslint/parser@^4.12.0":
version "4.12.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.12.0.tgz#e1cf30436e4f916c31fcc962158917bd9e9d460a"
integrity sha512-9XxVADAo9vlfjfoxnjboBTxYOiNY93/QuvcPgsiKvHxW6tOZx1W4TvkIQ2jB3k5M0pbFP5FlXihLK49TjZXhuQ==
dependencies:
"@typescript-eslint/scope-manager" "4.10.0"
"@typescript-eslint/types" "4.10.0"
"@typescript-eslint/typescript-estree" "4.10.0"
"@typescript-eslint/scope-manager" "4.12.0"
"@typescript-eslint/types" "4.12.0"
"@typescript-eslint/typescript-estree" "4.12.0"
debug "^4.1.1"
"@typescript-eslint/scope-manager@4.10.0":
version "4.10.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.10.0.tgz#dbd7e1fc63d7363e3aaff742a6f2b8afdbac9d27"
integrity sha512-WAPVw35P+fcnOa8DEic0tQUhoJJsgt+g6DEcz257G7vHFMwmag58EfowdVbiNcdfcV27EFR0tUBVXkDoIvfisQ==
"@typescript-eslint/scope-manager@4.12.0":
version "4.12.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.12.0.tgz#beeb8beca895a07b10c593185a5612f1085ef279"
integrity sha512-QVf9oCSVLte/8jvOsxmgBdOaoe2J0wtEmBr13Yz0rkBNkl5D8bfnf6G4Vhox9qqMIoG7QQoVwd2eG9DM/ge4Qg==
dependencies:
"@typescript-eslint/types" "4.10.0"
"@typescript-eslint/visitor-keys" "4.10.0"
"@typescript-eslint/types" "4.12.0"
"@typescript-eslint/visitor-keys" "4.12.0"
"@typescript-eslint/types@4.10.0":
version "4.10.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.10.0.tgz#12f983750ebad867f0c806e705c1953cd6415789"
integrity sha512-+dt5w1+Lqyd7wIPMa4XhJxUuE8+YF+vxQ6zxHyhLGHJjHiunPf0wSV8LtQwkpmAsRi1lEOoOIR30FG5S2HS33g==
"@typescript-eslint/types@4.12.0":
version "4.12.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.12.0.tgz#fb891fe7ccc9ea8b2bbd2780e36da45d0dc055e5"
integrity sha512-N2RhGeheVLGtyy+CxRmxdsniB7sMSCfsnbh8K/+RUIXYYq3Ub5+sukRCjVE80QerrUBvuEvs4fDhz5AW/pcL6g==
"@typescript-eslint/typescript-estree@4.10.0":
version "4.10.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.10.0.tgz#1e62e45fd57866afd42daf5e9fb6bd4e8dbcfa75"
integrity sha512-mGK0YRp9TOk6ZqZ98F++bW6X5kMTzCRROJkGXH62d2azhghmq+1LNLylkGe6uGUOQzD452NOAEth5VAF6PDo5g==
"@typescript-eslint/typescript-estree@4.12.0":
version "4.12.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.12.0.tgz#3963418c850f564bdab3882ae23795d115d6d32e"
integrity sha512-gZkFcmmp/CnzqD2RKMich2/FjBTsYopjiwJCroxqHZIY11IIoN0l5lKqcgoAPKHt33H2mAkSfvzj8i44Jm7F4w==
dependencies:
"@typescript-eslint/types" "4.10.0"
"@typescript-eslint/visitor-keys" "4.10.0"
"@typescript-eslint/types" "4.12.0"
"@typescript-eslint/visitor-keys" "4.12.0"
debug "^4.1.1"
globby "^11.0.1"
is-glob "^4.0.1"
@ -2585,12 +2585,12 @@
semver "^7.3.2"
tsutils "^3.17.1"
"@typescript-eslint/visitor-keys@4.10.0":
version "4.10.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.10.0.tgz#9478822329a9bc8ebcc80623d7f79a01da5ee451"
integrity sha512-hPyz5qmDMuZWFtHZkjcCpkAKHX8vdu1G3YsCLEd25ryZgnJfj6FQuJ5/O7R+dB1ueszilJmAFMtlU4CA6se3Jg==
"@typescript-eslint/visitor-keys@4.12.0":
version "4.12.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.12.0.tgz#a470a79be6958075fa91c725371a83baf428a67a"
integrity sha512-hVpsLARbDh4B9TKYz5cLbcdMIOAoBYgFPCSP9FFS/liSF+b33gVNq8JHY3QGhHNVz85hObvL7BEYLlgx553WCw==
dependencies:
"@typescript-eslint/types" "4.10.0"
"@typescript-eslint/types" "4.12.0"
eslint-visitor-keys "^2.0.0"
"@vue/babel-helper-vue-jsx-merge-props@^1.2.1":
@ -3153,7 +3153,7 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1:
dependencies:
color-convert "^1.9.0"
ansi-styles@^4.1.0:
ansi-styles@^4.0.0, ansi-styles@^4.1.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
@ -3350,10 +3350,10 @@ ast-types@0.13.3:
resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.3.tgz#50da3f28d17bdbc7969a3a2d83a0e4a72ae755a7"
integrity sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA==
astral-regex@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
astral-regex@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
async-each@^1.0.1:
version "1.0.3"
@ -4145,7 +4145,7 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
strip-ansi "^3.0.0"
supports-color "^2.0.0"
chalk@^2.0.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2:
chalk@^2.0.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@ -4455,7 +4455,7 @@ colorette@^1.2.1:
resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b"
integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==
colors@^1.1.2:
colors@^1.1.2, colors@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
@ -4968,11 +4968,16 @@ css-what@2.1:
resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2"
integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==
css-what@^3.2.1, css-what@^3.4.2:
css-what@^3.2.1:
version "3.4.2"
resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4"
integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==
css-what@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/css-what/-/css-what-4.0.0.tgz#35e73761cab2eeb3d3661126b23d7aa0e8432233"
integrity sha512-teijzG7kwYfNVsUh2H/YN62xW3KK9YhXEgSlbxMlcyjPNvdKJqFx5lrwlJgoFP1ZHlB89iGDlo/JyshKeRhv5A==
css@^2.0.0:
version "2.2.4"
resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929"
@ -5099,10 +5104,10 @@ cyclist@^1.0.1:
resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=
cypress@^6.1.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/cypress/-/cypress-6.1.0.tgz#af2596cb110aa98eaf75fef3d8ab379ca0ff2413"
integrity sha512-uQnSxRcZ6hkf9R5cr8KpRBTzN88QZwLIImbf5DWa5RIxH6o5Gpff58EcjiYhAR8/8p9SGv7O6SRygq4H+k0Qpw==
cypress@^6.2.1:
version "6.2.1"
resolved "https://registry.yarnpkg.com/cypress/-/cypress-6.2.1.tgz#27d5fbcf008c698c390fdb0c03441804176d06c4"
integrity sha512-OYkSgzA4J4Q7eMjZvNf5qWpBLR4RXrkqjL3UZ1UzGGLAskO0nFTi/RomNTG6TKvL3Zp4tw4zFY1gp5MtmkCZrA==
dependencies:
"@cypress/listr-verbose-renderer" "^0.4.1"
"@cypress/request" "^2.88.5"
@ -6211,10 +6216,10 @@ eslint-plugin-import@^2.22.1:
resolve "^1.17.0"
tsconfig-paths "^3.9.0"
eslint-plugin-vue@^7.3.0:
version "7.3.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-7.3.0.tgz#0faf0fcf0e1b1052bf800d4dee42d64f50679cb0"
integrity sha512-4rc9xrZgwT4aLz3XE6lrHu+FZtDLWennYvtzVvvS81kW9c65U4DUzQQWAFjDCgCFvN6HYWxi7ueEtxZVSB+f0g==
eslint-plugin-vue@^7.4.1:
version "7.4.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-7.4.1.tgz#2526ef0c010c218824a89423dbe6ddbe76f04fd6"
integrity sha512-W/xPNHYIkGJphLUM2UIYYGKbRw3BcDoMIPY9lu1TTa2YLiZoxurddfnmOP+UOVywxb5vi438ejzwvKdZqydtIw==
dependencies:
eslint-utils "^2.1.0"
natural-compare "^1.4.0"
@ -6255,9 +6260,9 @@ eslint-visitor-keys@^2.0.0:
integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==
eslint@^7.15.0:
version "7.15.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.15.0.tgz#eb155fb8ed0865fcf5d903f76be2e5b6cd7e0bc7"
integrity sha512-Vr64xFDT8w30wFll643e7cGrIkPEU50yIiI36OdSIDoSGguIeaLzBo0vpGvzo9RECUqq7htURfwEtKqwytkqzA==
version "7.17.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.17.0.tgz#4ccda5bf12572ad3bf760e6f195886f50569adb0"
integrity sha512-zJk08MiBgwuGoxes5sSQhOtibZ75pz0J35XTRlZOk9xMffhpA9BTbQZxoXZzOl5zMbleShbGwtw+1kGferfFwQ==
dependencies:
"@babel/code-frame" "^7.0.0"
"@eslint/eslintrc" "^0.2.2"
@ -6293,7 +6298,7 @@ eslint@^7.15.0:
semver "^7.2.1"
strip-ansi "^6.0.0"
strip-json-comments "^3.1.0"
table "^5.2.3"
table "^6.0.4"
text-table "^0.2.0"
v8-compile-cache "^2.0.3"
@ -6306,16 +6311,7 @@ espree@^6.2.1:
acorn-jsx "^5.2.0"
eslint-visitor-keys "^1.1.0"
espree@^7.3.0:
version "7.3.0"
resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.0.tgz#dc30437cf67947cf576121ebd780f15eeac72348"
integrity sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==
dependencies:
acorn "^7.4.0"
acorn-jsx "^5.2.0"
eslint-visitor-keys "^1.3.0"
espree@^7.3.1:
espree@^7.3.0, espree@^7.3.1:
version "7.3.1"
resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6"
integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==
@ -7297,9 +7293,9 @@ globby@10.0.0:
slash "^3.0.0"
globby@^11.0.0, globby@^11.0.1:
version "11.0.1"
resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357"
integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==
version "11.0.2"
resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.2.tgz#1af538b766a3b540ebfb58a32b2e2d5897321d83"
integrity sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==
dependencies:
array-union "^2.1.0"
dir-glob "^3.0.1"
@ -7795,11 +7791,6 @@ hex-color-regex@^1.1.0:
resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==
highlight.js@^10.2.0:
version "10.4.0"
resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.4.0.tgz#ef3ce475e5dfa7a48484260b49ea242ddab823a0"
integrity sha512-EfrUGcQ63oLJbj0J0RI9ebX6TAITbsDBLbsjr881L/X5fMO9+oadKzEF21C7R3ULKG6Gv3uoab2HiqVJa/4+oA==
hirestime@^3.2.1:
version "3.2.2"
resolved "https://registry.yarnpkg.com/hirestime/-/hirestime-3.2.2.tgz#1b5ff4c796b6b70586fa6efa4850952c6e1be484"
@ -7826,12 +7817,12 @@ hosted-git-info@^3.0.6:
dependencies:
lru-cache "^6.0.0"
hostic-dom@^0.8.5:
version "0.8.5"
resolved "https://registry.yarnpkg.com/hostic-dom/-/hostic-dom-0.8.5.tgz#500de796842454a745ce160d9cb0483c82643e28"
integrity sha512-0H5DTaE2/u3pSM5bPf7CaS9SunFASc0zlmw1R6hk0i6ozalRl0ePnAhm4YUYRG6pDbg0BYqCbjgwuFWOc3SskA==
hostic-dom@^0.8.6:
version "0.8.6"
resolved "https://registry.yarnpkg.com/hostic-dom/-/hostic-dom-0.8.6.tgz#5a5e2a1270b12ff4d479acdb679ba16de3028b58"
integrity sha512-gostOugTHuFKhnO4YQpH21SBc8A4jQ1mB5sqUCYC4gXm2LLwQ85V9EFa4DPh6Z9M6sCUJ7TAs1/hqr8iraX7Rw==
dependencies:
css-what "^3.4.2"
css-what "^4.0.0"
he "^1.2.0"
hsl-regex@^1.0.0:
@ -8924,7 +8915,7 @@ json5@^1.0.1:
dependencies:
minimist "^1.2.0"
json5@^2.1.2:
json5@^2.1.0, json5@^2.1.2:
version "2.1.3"
resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43"
integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==
@ -9172,10 +9163,10 @@ levn@^0.4.1:
prelude-ls "^1.2.1"
type-check "~0.4.0"
lib0@^0.2.12, lib0@^0.2.28, lib0@^0.2.31, lib0@^0.2.33, lib0@^0.2.34:
version "0.2.34"
resolved "https://registry.yarnpkg.com/lib0/-/lib0-0.2.34.tgz#c4479f5f2083894687fcfa9d0b9d9935e35ea008"
integrity sha512-cqsVIMPgFlDtgQcpkt7HOY6W3sbYPIe3qxMnbRSwHTgiQancgm+TRDPx28mC6GUZ6lG6Nr0bIWf4Nog6dWUNUg==
lib0@^0.2.28, lib0@^0.2.31, lib0@^0.2.33, lib0@^0.2.34, lib0@^0.2.35:
version "0.2.35"
resolved "https://registry.yarnpkg.com/lib0/-/lib0-0.2.35.tgz#1d62adb3feefce70c84f3eb664c5e50286de41ca"
integrity sha512-drVD3EscB3TIxiFzceuZg7oF5Z6I8a0KX+7FowNcAXOEsTej/hlHB+ElJ8Pa/Ge73Gy3fklSJtPxpNd2PajdWg==
dependencies:
isomorphic.js "^0.1.3"
@ -9614,10 +9605,10 @@ markdown-escapes@^1.0.0:
resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535"
integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==
marked@^1.1.1:
version "1.2.5"
resolved "https://registry.yarnpkg.com/marked/-/marked-1.2.5.tgz#a44b31f2a0b8b5bfd610f00d55d1952d1ac1dfdb"
integrity sha512-2AlqgYnVPOc9WDyWu7S5DJaEZsfk6dNh/neatQ3IHUW4QLutM/VPSH9lG7bif+XjFWc9K9XR3QvR+fXuECmfdA==
marked@^1.2.5:
version "1.2.7"
resolved "https://registry.yarnpkg.com/marked/-/marked-1.2.7.tgz#6e14b595581d2319cdcf033a24caaf41455a01fb"
integrity sha512-No11hFYcXr/zkBvL6qFmAp1z6BKY3zqLMHny/JN/ey+al7qwCM2+CMBL9BOgqMxZU36fz4cCWfn2poWIf7QRXA==
md5-file@^4.0.0:
version "4.0.0"
@ -10621,6 +10612,13 @@ onetime@^5.1.0:
dependencies:
mimic-fn "^2.1.0"
onigasm@^2.2.5:
version "2.2.5"
resolved "https://registry.yarnpkg.com/onigasm/-/onigasm-2.2.5.tgz#cc4d2a79a0fa0b64caec1f4c7ea367585a676892"
integrity sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==
dependencies:
lru-cache "^5.1.1"
optimize-css-assets-webpack-plugin@^5.0.1:
version "5.0.4"
resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz#85883c6528aaa02e30bbad9908c92926bb52dc90"
@ -11767,9 +11765,9 @@ prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.1.2, prosemirror-keymap@^1.1.3:
w3c-keyname "^2.2.0"
prosemirror-model@^1.0.0, prosemirror-model@^1.1.0, prosemirror-model@^1.12.0, prosemirror-model@^1.8.1:
version "1.13.0"
resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.13.0.tgz#ce5574669489fb4acfd875f7bbfa11f3a88319a2"
integrity sha512-j5F0Wt5Me8a1qKI6xNRNET6l07tWTpXwxfcs7xTl5PWAxJGgAC+vHIuwenGZMWSE6kU2k4qr55pw5aFXlUfgVA==
version "1.13.1"
resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.13.1.tgz#fa3dc888cf6928bd3968620588ffe6458d201f9f"
integrity sha512-PNH+b5bilAJi1B5yJ8QzoNY3ZV+nlD0jKG3XCBk7PmE/YUTJomBkFBS005vfU+3M9yeVR8/6spAEDsfVFUhNeQ==
dependencies:
orderedmap "^1.1.0"
@ -12792,10 +12790,10 @@ rollup-pluginutils@^2.8.2:
dependencies:
estree-walker "^0.6.1"
rollup@^2.35.1:
version "2.35.1"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.35.1.tgz#e6bc8d10893556a638066f89e8c97f422d03968c"
integrity sha512-q5KxEyWpprAIcainhVy6HfRttD9kutQpHbeqDTWnqAFNJotiojetK6uqmcydNMymBEtC4I8bCYR+J3mTMqeaUA==
rollup@^2.36.0:
version "2.36.0"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.36.0.tgz#af2cdea36f70fa3de586840c2604882dfb4d0aac"
integrity sha512-L38QyQK77bkJy9nPyeydnHFK6xMofqumh4scTV2d4RG4EFq6pGdxnn67dVHFUDJ9J0PSEQx8zn1FiVS5TydsKg==
optionalDependencies:
fsevents "~2.1.2"
@ -12991,7 +12989,7 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.2.0, semver@^6.3.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
semver@^7.2.1, semver@^7.3.2:
semver@^7.2.1, semver@^7.3.2, semver@^7.3.4:
version "7.3.4"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97"
integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==
@ -13134,6 +13132,31 @@ shelljs@^0.8.4:
interpret "^1.0.0"
rechoir "^0.6.2"
shiki-languages@^0.2.7:
version "0.2.7"
resolved "https://registry.yarnpkg.com/shiki-languages/-/shiki-languages-0.2.7.tgz#7230b675b96d37a36ac1bf995525375ce69f3924"
integrity sha512-REmakh7pn2jCn9GDMRSK36oDgqhh+rSvJPo77sdWTOmk44C5b0XlYPwJZcFOMJWUZJE0c7FCbKclw4FLwUKLRw==
dependencies:
vscode-textmate "^5.2.0"
shiki-themes@^0.2.7:
version "0.2.7"
resolved "https://registry.yarnpkg.com/shiki-themes/-/shiki-themes-0.2.7.tgz#6e04451d832152e0fc969876a7bd926b3963c1f2"
integrity sha512-ZMmboDYw5+SEpugM8KGUq3tkZ0vXg+k60XX6NngDK7gc1Sv6YLUlanpvG3evm57uKJvfXsky/S5MzSOTtYKLjA==
dependencies:
json5 "^2.1.0"
vscode-textmate "^5.2.0"
shiki@^0.2.7:
version "0.2.7"
resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.2.7.tgz#d2547548ed8742673730e1e4bbe792a77c445540"
integrity sha512-bwVc7cdtYYHEO9O+XJ8aNOskKRfaQd5Y4ovLRfbQkmiLSUaR+bdlssbZUUhbQ0JAFMYcTcJ5tjG5KtnufttDHQ==
dependencies:
onigasm "^2.2.5"
shiki-languages "^0.2.7"
shiki-themes "^0.2.7"
vscode-textmate "^5.2.0"
signal-exit@^3.0.0, signal-exit@^3.0.2:
version "3.0.3"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
@ -13219,14 +13242,14 @@ slice-ansi@0.0.4:
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=
slice-ansi@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==
slice-ansi@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
dependencies:
ansi-styles "^3.2.0"
astral-regex "^1.0.0"
is-fullwidth-code-point "^2.0.0"
ansi-styles "^4.0.0"
astral-regex "^2.0.0"
is-fullwidth-code-point "^3.0.0"
slide@^1.1.6:
version "1.1.6"
@ -13876,15 +13899,15 @@ symbol-observable@^1.1.0:
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==
table@^5.2.3:
version "5.4.6"
resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e"
integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==
table@^6.0.4:
version "6.0.4"
resolved "https://registry.yarnpkg.com/table/-/table-6.0.4.tgz#c523dd182177e926c723eb20e1b341238188aa0d"
integrity sha512-sBT4xRLdALd+NFBvwOz8bw4b15htyythha+q+DVZqy2RS08PPC8O2sZFgJYEY7bJvbCFKccs+WIZ/cd+xxTWCw==
dependencies:
ajv "^6.10.2"
lodash "^4.17.14"
slice-ansi "^2.1.0"
string-width "^3.0.0"
ajv "^6.12.4"
lodash "^4.17.20"
slice-ansi "^4.0.0"
string-width "^4.2.0"
tapable@2.0.0-beta.5:
version "2.0.0-beta.5"
@ -14252,16 +14275,16 @@ trough@^1.0.0:
dependencies:
glob "^7.1.2"
ts-loader@^8.0.11:
version "8.0.12"
resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-8.0.12.tgz#1de9f1de65176318c1e6d187bfc496182f8dc2a0"
integrity sha512-UIivVfGVJDdwwjgSrbtcL9Nf10c1BWnL1mxAQUVcnhNIn/P9W3nP5v60Z0aBMtc7ZrE11lMmU6+5jSgAXmGaYw==
ts-loader@^8.0.14:
version "8.0.14"
resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-8.0.14.tgz#e46ac1f8dcb88808d0b1335d2eae65b74bd78fe8"
integrity sha512-Jt/hHlUnApOZjnSjTmZ+AbD5BGlQFx3f1D0nYuNKwz0JJnuDGHJas6az+FlWKwwRTu+26GXpv249A8UAnYUpqA==
dependencies:
chalk "^2.3.0"
chalk "^4.1.0"
enhanced-resolve "^4.0.0"
loader-utils "^1.0.2"
loader-utils "^2.0.0"
micromatch "^4.0.0"
semver "^6.0.0"
semver "^7.3.4"
tsconfig-paths@^3.9.0:
version "3.9.0"
@ -14359,27 +14382,27 @@ typedarray@^0.0.6:
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
typedoc-default-themes@^0.11.4:
version "0.11.4"
resolved "https://registry.yarnpkg.com/typedoc-default-themes/-/typedoc-default-themes-0.11.4.tgz#1bc55b7c8d1132844616ff6f570e1e2cd0eb7343"
integrity sha512-Y4Lf+qIb9NTydrexlazAM46SSLrmrQRqWiD52593g53SsmUFioAsMWt8m834J6qsp+7wHRjxCXSZeiiW5cMUdw==
typedoc-default-themes@0.12.1:
version "0.12.1"
resolved "https://registry.yarnpkg.com/typedoc-default-themes/-/typedoc-default-themes-0.12.1.tgz#6c4a759f9dc365b4021579587b3773deb6fb6eeb"
integrity sha512-6PEvV+/kWAJeUwEtrKgIsZQSbybW5DGCr6s2mMjHsDplpgN8iBHI52UbA+2C+c2TMCxBNMK9TMS6pdeIdwsLSw==
typedoc@^0.19.2:
version "0.19.2"
resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.19.2.tgz#842a63a581f4920f76b0346bb80eb2a49afc2c28"
integrity sha512-oDEg1BLEzi1qvgdQXc658EYgJ5qJLVSeZ0hQ57Eq4JXy6Vj2VX4RVo18qYxRWz75ifAaYuYNBUCnbhjd37TfOg==
typedoc@^0.20.13:
version "0.20.14"
resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.20.14.tgz#894ff71841a4abbe8f46cf52f3cc96c9d68328dc"
integrity sha512-9bsZp5/qkl+gDSv9DRvHbfbY8Sr0tD8fKx7hNIvcluxeAFzBCEo9o0qDCdLUZw+/axbfd9TaqHvSuCVRu+YH6Q==
dependencies:
colors "^1.4.0"
fs-extra "^9.0.1"
handlebars "^4.7.6"
highlight.js "^10.2.0"
lodash "^4.17.20"
lunr "^2.3.9"
marked "^1.1.1"
marked "^1.2.5"
minimatch "^3.0.0"
progress "^2.0.3"
semver "^7.3.2"
shelljs "^0.8.4"
typedoc-default-themes "^0.11.4"
shiki "^0.2.7"
typedoc-default-themes "0.12.1"
typescript@^4.1.3:
version "4.1.3"
@ -14901,6 +14924,11 @@ void-elements@^2.0.1:
resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec"
integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=
vscode-textmate@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-5.2.0.tgz#01f01760a391e8222fe4f33fbccbd1ad71aed74e"
integrity sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==
vue-eslint-parser@^7.3.0:
version "7.3.0"
resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.3.0.tgz#894085839d99d81296fa081d19643733f23d7559"
@ -15368,12 +15396,12 @@ xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1:
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
y-indexeddb@^9.0.5:
version "9.0.5"
resolved "https://registry.yarnpkg.com/y-indexeddb/-/y-indexeddb-9.0.5.tgz#a162526add738a456b7185a6a5626534609ee132"
integrity sha512-40VxkqPoK2VxE1vMosS5MfwlHQOvaeLEN89dIkjh7URjZny6bDQOl4yKldaDv9ZosZgYEPyWuWTF3Z92RZ1y+A==
y-indexeddb@^9.0.6:
version "9.0.6"
resolved "https://registry.yarnpkg.com/y-indexeddb/-/y-indexeddb-9.0.6.tgz#49aecac11bc229571fb134e0ec0717c0330b731f"
integrity sha512-8mdCYdzZDWS2lGiB9Reaz67ZqvnV6EXH/F7L+TmBC+3mWjIBrPw4UcI79nOhEOh+y9lHXzNpSda4YJ06M13F1A==
dependencies:
lib0 "^0.2.12"
lib0 "^0.2.35"
y-leveldb@^0.1.0:
version "0.1.0"
@ -15390,7 +15418,7 @@ y-prosemirror@^1.0.5:
dependencies:
lib0 "^0.2.34"
y-protocols@^1.0.0, y-protocols@^1.0.1:
y-protocols@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/y-protocols/-/y-protocols-1.0.1.tgz#7855c900039a02b369590b8ae78bc6e1cbc13c9f"
integrity sha512-QP3fCM7c2gGfUi2nqf8gspyO4VW23zv3kNqPNdD3wNxMbuNQenMyoDVZYEo12jzR4RQ3aaDfPK62Sf31SVOmfg==
@ -15398,9 +15426,9 @@ y-protocols@^1.0.0, y-protocols@^1.0.1:
lib0 "^0.2.28"
y-webrtc@^10.1.7:
version "10.1.7"
resolved "https://registry.yarnpkg.com/y-webrtc/-/y-webrtc-10.1.7.tgz#dd8b46ee790797dc72f7fb37a4efe6a8cd04a41a"
integrity sha512-GzgH6O2s73A1ndGcapIyVeRkjGL0suUAe4dhN+ZIjKIrQK0CjKG7a7cxK5raiKSW1I41XiRN/eOtsjbD/bu5fg==
version "10.1.8"
resolved "https://registry.yarnpkg.com/y-webrtc/-/y-webrtc-10.1.8.tgz#b35d8cb2a96462f134ea9b16a1179c970ad20b48"
integrity sha512-eeKU8QWtT5ahPLv+NCrf6ax8MXXmKYEtFO/eh0Svl8D3VDZ/3H8w9NLWVoL1GEwv5HNH0gu0p78n8v76Ttziuw==
dependencies:
lib0 "^0.2.34"
simple-peer "^9.9.3"
@ -15409,14 +15437,14 @@ y-webrtc@^10.1.7:
ws "^7.2.0"
y-websocket@^1.3.8:
version "1.3.8"
resolved "https://registry.yarnpkg.com/y-websocket/-/y-websocket-1.3.8.tgz#1ee881ff20b3d0e3a50ac4e472253757ebdb9ffe"
integrity sha512-ut2srey5upZQPYfBiT0mHhSxa50Fd0mOmfKR+F8Gxx/zwZ3y3tSNUOfblLcJtqY583gjH0s/zMOU+FKjhTCuog==
version "1.3.9"
resolved "https://registry.yarnpkg.com/y-websocket/-/y-websocket-1.3.9.tgz#9a66ac337d248d6c428348c00079c533f777954c"
integrity sha512-iOi1shywIkf7jw10iq6zE/2d7nyKXmD91szdhGTgorcmApVzTte5K9yWVO+XVAcZcdQBT8ho1Nzw43ZFdfhS/A==
dependencies:
lib0 "^0.2.31"
lodash.debounce "^4.0.8"
y-leveldb "^0.1.0"
y-protocols "^1.0.0"
y-protocols "^1.0.1"
optionalDependencies:
ws "^6.2.1"
@ -15520,8 +15548,8 @@ yauzl@^2.10.0, yauzl@^2.4.2:
fd-slicer "~1.1.0"
yjs@^13.4.7:
version "13.4.7"
resolved "https://registry.yarnpkg.com/yjs/-/yjs-13.4.7.tgz#6271f68d19ceae955e241fa2a136b312ec2347df"
integrity sha512-Vz8TbNudgTNSrM/5UxmAdUevNfFWSE44R134S5jW4odSF8KmlO8GhAOg05+Vy5if72B3ERq8qAh3Ws/eCEvVdw==
version "13.4.9"
resolved "https://registry.yarnpkg.com/yjs/-/yjs-13.4.9.tgz#8416d47eed7b1baa5a999840f01a790794af45fb"
integrity sha512-TJ6C7PPyiVP9HnSx40hm47FfacXcvMNy/70msnhXaebIFDDsVX6AOFTzLktCB6vY/SoCfpkIKO/hzhulfDTsMA==
dependencies:
lib0 "^0.2.33"