diff --git a/README.md b/README.md index 2f4a3c7da4d..119f430368f 100644 --- a/README.md +++ b/README.md @@ -1,159 +1,5 @@ - -[![Donate using PayPal](https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/badges/Donate-PayPal-green.svg)](https://www.paypal.com/donate/?business=E8JMYD2LQ8MMA&no_recurring=0&item_name=I+rely+on+donations+to+maintain+and+improve+the+Joplin+open+source+project.+Thank+you+for+your+help+-+it+makes+a+difference%21¤cy_code=EUR) [![Sponsor on GitHub](https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/badges/GitHub-Badge.svg)](https://github.com/sponsors/laurent22/) [![Become a patron](https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/badges/Patreon-Badge.svg)](https://www.patreon.com/joplin) [![Donate using IBAN](https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/badges/Donate-IBAN.svg)](https://joplinapp.org/donate/#donations) - - - - -**Joplin** is a free, open source note taking and to-do application, which can handle a large number of notes organised into notebooks. The notes are searchable, can be copied, tagged and modified either from the applications directly or from your own text editor. The notes are in [Markdown format](https://github.com/laurent22/joplin/blob/dev/readme/apps/markdown.md). - -Notes exported from Evernote [can be imported](https://github.com/laurent22/joplin/blob/dev/readme/apps/import_export.md) into Joplin, including the formatted content (which is converted to Markdown), resources (images, attachments, etc.) and complete metadata (geolocation, updated time, created time, etc.). Plain Markdown files can also be imported. - -Joplin is "offline first", which means you always have all your data on your phone or computer. This ensures that your notes are always accessible, whether you have an internet connection or not. - -The notes can be securely [synchronised](https://github.com/laurent22/joplin/blob/dev/readme/apps/sync/index.md) using [end-to-end encryption](https://github.com/laurent22/joplin/blob/dev/readme/apps/sync/e2ee.md) with various cloud services including Nextcloud, Dropbox, OneDrive and [Joplin Cloud](https://joplinapp.org/plans/). - -Full text search is available on all platforms to quickly find the information you need. The app can be customised using plugins and themes, and you can also easily create your own. - -The application is available for Windows, Linux, macOS, Android and iOS. A [Web Clipper](https://github.com/laurent22/joplin/blob/dev/readme/apps/clipper.md), to save web pages and screenshots from your browser, is also available for [Firefox](https://addons.mozilla.org/firefox/addon/joplin-web-clipper/) and [Chrome](https://chrome.google.com/webstore/detail/joplin-web-clipper/alofnhikmmkdbbbgpnglcpdollgjjfek?hl=en-GB). - -
- -# Help and documentation - -For more information about the applications, see the [full Joplin documentation](https://joplinapp.org) - -# Donations - -Donations to Joplin support the development of the project. Developing quality applications mostly takes time, but there are also some expenses, such as digital certificates to sign the applications, app store fees, hosting, etc. Most of all, your donation will make it possible to keep up the current development standard. - -Please see the [donation page](https://github.com/laurent22/joplin/blob/dev/readme/donate.md) for information on how to support the development of Joplin. - -# Sponsors - - - EduBirdie web design agency RealGambling.ca write an essay online with EssayPro - - -* * * - - -| | | | | -| :---: | :---: | :---: | :---: | -|
[Akhil-CM](https://github.com/Akhil-CM) |
[andypiper](https://github.com/andypiper) |
[avanderberg](https://github.com/avanderberg) |
[chr15m](https://github.com/chr15m) | -|
[felixstorm](https://github.com/felixstorm) |
[Galliver7](https://github.com/Galliver7) |
[Hegghammer](https://github.com/Hegghammer) |
[KentBrockman](https://github.com/KentBrockman) | -|
[marcdw1289](https://github.com/marcdw1289) |
[maxtruxa](https://github.com/maxtruxa) |
[sif](https://github.com/sif) |
[taskcruncher](https://github.com/taskcruncher) | -| | | | | - - -# Community - -Name | Description ---- | --- -[Support Forum](https://discourse.joplinapp.org/) | This is the main place for general discussion about Joplin, user support, software development questions, and to discuss new features. Also where the latest beta versions are released and discussed. -[Bluesky feed](https://bsky.app/profile/joplinapp.bsky.social) | Follow us on Bluesky -[Twitter feed](https://twitter.com/joplinapp) | Follow us on Twitter -[Mastodon feed](https://mastodon.social/@joplinapp) | Follow us on Mastodon -[Patreon page](https://www.patreon.com/joplin) |The latest news are often posted there -[Discord server](https://discord.gg/VSj7AFHvpq) | Our chat server -[LinkedIn](https://www.linkedin.com/company/joplin) | Our LinkedIn page -[Lemmy Community](https://sopuli.xyz/c/joplinapp) | Also a good place to get help - -# Contributing - -Please see the guide for information on how to contribute to the development of Joplin: https://github.com/laurent22/joplin/blob/dev/readme/dev/index.md - -# Contributors - -Thank you to everyone who've contributed to Joplin's source code! - - -| | | | | | -| :---: | :---: | :---: | :---: | :---: | -|
[laurent22](https://github.com/laurent22) |
[personalizedrefrigerator](https://github.com/personalizedrefrigerator) |
[tessus](https://github.com/tessus) |
[CalebJohn](https://github.com/CalebJohn) |
[pedr](https://github.com/pedr) | -|
[roman-r-m](https://github.com/roman-r-m) |
[miciasto](https://github.com/miciasto) |
[ken1kob](https://github.com/ken1kob) |
[genneko](https://github.com/genneko) |
[wh201906](https://github.com/wh201906) | -|
[Ardakilic](https://github.com/Ardakilic) |
[Daeraxa](https://github.com/Daeraxa) |
[NickWick13](https://github.com/NickWick13) |
[tanrax](https://github.com/tanrax) |
[j-krl](https://github.com/j-krl) | -|
[JackGruber](https://github.com/JackGruber) |
[naviji](https://github.com/naviji) |
[PackElend](https://github.com/PackElend) |
[julien-me](https://github.com/julien-me) |
[AliceHincu](https://github.com/AliceHincu) | -|
[potatogim](https://github.com/potatogim) |
[Mr-Kanister](https://github.com/Mr-Kanister) |
[milotype](https://github.com/milotype) |
[asrient](https://github.com/asrient) |
[rtmkrlv](https://github.com/rtmkrlv) | -|
[fmrtn](https://github.com/fmrtn) |
[hubertfilho](https://github.com/hubertfilho) |
[devonzuegel](https://github.com/devonzuegel) |
[ScriptInfra](https://github.com/ScriptInfra) |
[matsest](https://github.com/matsest) | -|
[palerdot](https://github.com/palerdot) |
[abonte](https://github.com/abonte) |
[rnbastos](https://github.com/rnbastos) |
[Abijeet](https://github.com/Abijeet) |
[jd1378](https://github.com/jd1378) | -|
[ishantgupta777](https://github.com/ishantgupta777) |
[coderrsid](https://github.com/coderrsid) |
[rabeehrz](https://github.com/rabeehrz) |
[mablin7](https://github.com/mablin7) |
[jackytsu](https://github.com/jackytsu) | -|
[mak2002](https://github.com/mak2002) |
[ERYpTION](https://github.com/ERYpTION) |
[XarisA](https://github.com/XarisA) |
[CptMeetKat](https://github.com/CptMeetKat) |
[foxmask](https://github.com/foxmask) | -|
[innocuo](https://github.com/innocuo) |
[Rahulm2310](https://github.com/Rahulm2310) |
[Ahmad45123](https://github.com/Ahmad45123) |
[jonath92](https://github.com/jonath92) |
[qx100](https://github.com/qx100) | -|
[xavivars](https://github.com/xavivars) |
[readingsnail](https://github.com/readingsnail) |
[krotesk](https://github.com/krotesk) |
[zblesk](https://github.com/zblesk) |
[findrakecil](https://github.com/findrakecil) | -|
[vsimkus](https://github.com/vsimkus) |
[Vaso3](https://github.com/Vaso3) |
[petrz12](https://github.com/petrz12) |
[mrkaato0](https://github.com/mrkaato0) |
[marcosvega91](https://github.com/marcosvega91) | -|
[Tolu-Mals](https://github.com/Tolu-Mals) |
[shinglyu](https://github.com/shinglyu) |
[Runo-saduwa](https://github.com/Runo-saduwa) |
[nishantwrp](https://github.com/nishantwrp) |
[marph91](https://github.com/marph91) | -|
[Mannivu](https://github.com/Mannivu) |
[Elaborendum](https://github.com/Elaborendum) |
[alexdevero](https://github.com/alexdevero) |
[RedDocMD](https://github.com/RedDocMD) |
[wljince007](https://github.com/wljince007) | -|
[RenatoXSR](https://github.com/RenatoXSR) |
[leematos](https://github.com/leematos) |
[amandamcg](https://github.com/amandamcg) |
[ylc395](https://github.com/ylc395) |
[yaozeye](https://github.com/yaozeye) | -|
[zuphilip](https://github.com/zuphilip) |
[kna](https://github.com/kna) |
[Retr0ve](https://github.com/Retr0ve) |
[maxpatiiuk](https://github.com/maxpatiiuk) |
[Rishabh-malhotraa](https://github.com/Rishabh-malhotraa) | -|
[metbril](https://github.com/metbril) |
[SFulpius](https://github.com/SFulpius) |
[TaoK](https://github.com/TaoK) |
[WhiredPlanck](https://github.com/WhiredPlanck) |
[ProgramFan](https://github.com/ProgramFan) | -|
[moltenform](https://github.com/moltenform) |
[cagnusmarlsen](https://github.com/cagnusmarlsen) |
[cedecode](https://github.com/cedecode) |
[piotrb](https://github.com/piotrb) |
[nathanleiby](https://github.com/nathanleiby) | -|
[marcushill](https://github.com/marcushill) |
[adarsh-sgh](https://github.com/adarsh-sgh) |
[RaphaelKimmig](https://github.com/RaphaelKimmig) |
[tfinnberg](https://github.com/tfinnberg) |
[mrkaato](https://github.com/mrkaato) | -|
[jcgurango](https://github.com/jcgurango) |
[bradmcl](https://github.com/bradmcl) |
[archont00](https://github.com/archont00) |
[anihm136](https://github.com/anihm136) |
[amitsin6h](https://github.com/amitsin6h) | -|
[Atalanttore](https://github.com/Atalanttore) |
[t1011](https://github.com/t1011) |
[hieuthi](https://github.com/hieuthi) |
[martonpaulo](https://github.com/martonpaulo) |
[mmahmoudian](https://github.com/mmahmoudian) | -|
[mimeyn](https://github.com/mimeyn) |
[bobchao](https://github.com/bobchao) |
[rc2dev](https://github.com/rc2dev) |
[Rishabhraghwendra18](https://github.com/Rishabhraghwendra18) |
[sinkuu](https://github.com/sinkuu) | -|
[Sidd-R](https://github.com/Sidd-R) |
[stweil](https://github.com/stweil) |
[Subhra264](https://github.com/Subhra264) |
[conyx](https://github.com/conyx) |
[fstanis](https://github.com/fstanis) | -|
[axq](https://github.com/axq) |
[alexchee](https://github.com/alexchee) |
[kowalskidev](https://github.com/kowalskidev) |
[jyuvaraj03](https://github.com/jyuvaraj03) |
[Shoatally](https://github.com/Shoatally) | -|
[Wartijn](https://github.com/Wartijn) |
[HahaBill](https://github.com/HahaBill) |
[tmclo](https://github.com/tmclo) |
[TobiasDev](https://github.com/TobiasDev) |
[SubodhDahal](https://github.com/SubodhDahal) | -|
[StarFang208](https://github.com/StarFang208) |
[LEVIII007](https://github.com/LEVIII007) |
[sealch](https://github.com/sealch) |
[sebastienjust](https://github.com/sebastienjust) |
[criticic](https://github.com/criticic) | -|
[rt-oliveira](https://github.com/rt-oliveira) |
[thearchivalone](https://github.com/thearchivalone) |
[ikunya](https://github.com/ikunya) |
[ShuiHuo](https://github.com/ShuiHuo) |
[paventyang](https://github.com/paventyang) | -|
[tiberiusteng](https://github.com/tiberiusteng) |
[sensor-freak](https://github.com/sensor-freak) |
[kornava](https://github.com/kornava) |
[s1nceri7y](https://github.com/s1nceri7y) |
[ruuti](https://github.com/ruuti) | -|
[pf-siedler](https://github.com/pf-siedler) |
[mrjo118](https://github.com/mrjo118) |
[majsterkovic](https://github.com/majsterkovic) |
[lscolombo](https://github.com/lscolombo) |
[stingray-11](https://github.com/stingray-11) | -|
[kik0220](https://github.com/kik0220) |
[jduar](https://github.com/jduar) |
[ihan1004](https://github.com/ihan1004) |
[eresytter](https://github.com/eresytter) |
[barbowza](https://github.com/barbowza) | -|
[balmag](https://github.com/balmag) |
[daniellandau](https://github.com/daniellandau) |
[djunho](https://github.com/djunho) |
[idcristi](https://github.com/idcristi) |
[chrmoritz](https://github.com/chrmoritz) | -|
[chrisb86](https://github.com/chrisb86) |
[cas--](https://github.com/cas--) |
[brttbndr](https://github.com/brttbndr) |
[mrwulf](https://github.com/mrwulf) |
[betty-alagwu](https://github.com/betty-alagwu) | -|
[BartBucknill](https://github.com/BartBucknill) |
[entrymaster](https://github.com/entrymaster) |
[infinity052](https://github.com/infinity052) |
[antontkv](https://github.com/antontkv) |
[andypiper](https://github.com/andypiper) | -|
[k33pn3xtlvl](https://github.com/k33pn3xtlvl) |
[serenitatis](https://github.com/serenitatis) |
[akirataguchi115](https://github.com/akirataguchi115) |
[ab-elhaddad](https://github.com/ab-elhaddad) |
[xUser5000](https://github.com/xUser5000) | -|
[PiotrNarel](https://github.com/PiotrNarel) |
[Philipp91](https://github.com/Philipp91) |
[RadCod3](https://github.com/RadCod3) |
[popovoleksandr](https://github.com/popovoleksandr) |
[mjjzf](https://github.com/mjjzf) | -|
[Mohamad-Shiro](https://github.com/Mohamad-Shiro) |
[maicki](https://github.com/maicki) |
[itzTheMeow](https://github.com/itzTheMeow) |
[solariz](https://github.com/solariz) |
[ethan42411](https://github.com/ethan42411) | -|
[JOJ0](https://github.com/JOJ0) |
[jalajcodes](https://github.com/jalajcodes) |
[jblunck](https://github.com/jblunck) |
[jdrobertso](https://github.com/jdrobertso) |
[Jesssullivan](https://github.com/Jesssullivan) | -|
[jmontane](https://github.com/jmontane) |
[johanhammar](https://github.com/johanhammar) |
[krishna8421](https://github.com/krishna8421) |
[Linkosred](https://github.com/Linkosred) |
[kirtanprht](https://github.com/kirtanprht) | -|
[xuhcc](https://github.com/xuhcc) |
[kkoyung](https://github.com/kkoyung) |
[khuongduy354](https://github.com/khuongduy354) |
[Kevin-vdberg](https://github.com/Kevin-vdberg) |
[kevinshu1995](https://github.com/kevinshu1995) | -|
[y-usuzumi](https://github.com/y-usuzumi) |
[kaustubhsh](https://github.com/kaustubhsh) |
[KaneGreen](https://github.com/KaneGreen) |
[Juvecu](https://github.com/Juvecu) |
[dodog](https://github.com/dodog) | -|
[joybinchen](https://github.com/joybinchen) |
[joserebelo](https://github.com/joserebelo) |
[joesfer](https://github.com/joesfer) |
[joschaschmiedt](https://github.com/joschaschmiedt) |
[K0UR05H](https://github.com/K0UR05H) | -|
[kklas](https://github.com/kklas) |
[xmlangel](https://github.com/xmlangel) |
[Letty](https://github.com/Letty) |
[troilus](https://github.com/troilus) |
[LightTreasure](https://github.com/LightTreasure) | -|
[Longhao-Chen](https://github.com/Longhao-Chen) |
[diogocaveiro](https://github.com/diogocaveiro) |
[lboullo0](https://github.com/lboullo0) |
[mrlpm](https://github.com/mrlpm) |
[MHolkamp](https://github.com/MHolkamp) | -|
[mshibanami](https://github.com/mshibanami) |
[marc-bouvier](https://github.com/marc-bouvier) |
[mvonmaltitz](https://github.com/mvonmaltitz) |
[nicholas-10](https://github.com/nicholas-10) |
[Vistaus](https://github.com/Vistaus) | -|
[beonma](https://github.com/beonma) |
[gtlsgamr](https://github.com/gtlsgamr) |
[horaceyoung](https://github.com/horaceyoung) |
[ianjs](https://github.com/ianjs) |
[iahmedbacha](https://github.com/iahmedbacha) | -|
[eltociear](https://github.com/eltociear) |
[caseycs](https://github.com/caseycs) |
[IrvinDominin](https://github.com/IrvinDominin) |
[ishammahajan](https://github.com/ishammahajan) |
[ffadilaputra](https://github.com/ffadilaputra) | -|
[Oriwantgreencard](https://github.com/Oriwantgreencard) |
[j0hn-mc-clane](https://github.com/j0hn-mc-clane) |
[JRaiden16](https://github.com/JRaiden16) |
[jacobherrington](https://github.com/jacobherrington) |
[jamesadjinwa](https://github.com/jamesadjinwa) | -|
[jrwrigh](https://github.com/jrwrigh) |
[analogist](https://github.com/analogist) |
[JanhaviAlekar](https://github.com/JanhaviAlekar) |
[jaredcrowe](https://github.com/jaredcrowe) |
[jasonwilliams](https://github.com/jasonwilliams) | -|
[J-U-B](https://github.com/J-U-B) |
[imsardine](https://github.com/imsardine) |
[volatilevar](https://github.com/volatilevar) |
[innkuika](https://github.com/innkuika) |
[Jia35](https://github.com/Jia35) | -|
[JoelRSimpson](https://github.com/JoelRSimpson) |
[joeltaylor](https://github.com/joeltaylor) |
[thejohnfreeman](https://github.com/thejohnfreeman) |
[exic](https://github.com/exic) |
[JonathanPlasse](https://github.com/JonathanPlasse) | -|
[nickhobbs94](https://github.com/nickhobbs94) |
[Frichetten](https://github.com/Frichetten) |
[nicolas-suzuki](https://github.com/nicolas-suzuki) |
[Nicryc](https://github.com/Nicryc) |
[nightknighto](https://github.com/nightknighto) | -|
[nik-gautam](https://github.com/nik-gautam) |
[nitingururajk](https://github.com/nitingururajk) |
[noah-nash](https://github.com/noah-nash) |
[vulpivia](https://github.com/vulpivia) |
[OmGole](https://github.com/OmGole) | -|
[Ouvill](https://github.com/Ouvill) |
[shorty2380](https://github.com/shorty2380) |
[dist3r](https://github.com/dist3r) |
[BCSharp](https://github.com/BCSharp) |
[rakleed](https://github.com/rakleed) | -|
[idle-code](https://github.com/idle-code) |
[Oaklight](https://github.com/Oaklight) |
[Perkolator](https://github.com/Perkolator) |
[petzi53](https://github.com/petzi53) |
[phavekes](https://github.com/phavekes) | -|
[phitsc](https://github.com/phitsc) |
[KowalskiPiotr98](https://github.com/KowalskiPiotr98) |
[Polaris66](https://github.com/Polaris66) |
[Diadlo](https://github.com/Diadlo) |
[pranavmodx](https://github.com/pranavmodx) | -|
[DarkFalc0n](https://github.com/DarkFalc0n) |
[psy-q](https://github.com/psy-q) |
[R3dError](https://github.com/R3dError) |
[rajprakash00](https://github.com/rajprakash00) |
[rahil1304](https://github.com/rahil1304) | -|
[marcorombach](https://github.com/marcorombach) |
[mlkood](https://github.com/mlkood) |
[plextoriano](https://github.com/plextoriano) |
[Marmo](https://github.com/Marmo) |
[mcejp](https://github.com/mcejp) | -|
[freaktechnik](https://github.com/freaktechnik) |
[martinkorelic](https://github.com/martinkorelic) |
[Petemir](https://github.com/Petemir) |
[matsair](https://github.com/matsair) |
[MattDemers](https://github.com/MattDemers) | -|
[mgroth0](https://github.com/mgroth0) |
[silentmatt](https://github.com/silentmatt) |
[moorage](https://github.com/moorage) |
[maxs-test](https://github.com/maxs-test) |
[MichBoi](https://github.com/MichBoi) | -|
[msorens](https://github.com/msorens) |
[MikkCZ](https://github.com/MikkCZ) |
[MichipX](https://github.com/MichipX) |
[Elleo](https://github.com/Elleo) |
[phucbm](https://github.com/phucbm) | -|
[maholmlund](https://github.com/maholmlund) |
[MovingEarth](https://github.com/MovingEarth) |
[MrTraduttore](https://github.com/MrTraduttore) |
[ZhReimu](https://github.com/ZhReimu) |
[sanjarcode](https://github.com/sanjarcode) | -|
[Mustafa-ALD](https://github.com/Mustafa-ALD) |
[LeMyst](https://github.com/LeMyst) |
[matmolni](https://github.com/matmolni) |
[NJannasch](https://github.com/NJannasch) |
[njmulsqb](https://github.com/njmulsqb) | -|
[zomglings](https://github.com/zomglings) |
[hexclover](https://github.com/hexclover) |
[adrynov](https://github.com/adrynov) |
[andrewperry](https://github.com/andrewperry) |
[tekdel](https://github.com/tekdel) | -|
[fobo66](https://github.com/fobo66) |
[andzs](https://github.com/andzs) |
[pandeymangg](https://github.com/pandeymangg) |
[Shaxine](https://github.com/Shaxine) |
[antonio-ramadas](https://github.com/antonio-ramadas) | -|
[aprvsh](https://github.com/aprvsh) |
[archisman-panigrahi](https://github.com/archisman-panigrahi) |
[aynp](https://github.com/aynp) |
[assimd](https://github.com/assimd) |
[Atrate](https://github.com/Atrate) | -|
[austindoupnik](https://github.com/austindoupnik) |
[azurelunatic](https://github.com/azurelunatic) |
[BeeverTeeth](https://github.com/BeeverTeeth) |
[be-we](https://github.com/be-we) |
[ei8fdb](https://github.com/ei8fdb) | -|
[bimlas](https://github.com/bimlas) |
[bishoy-magdy](https://github.com/bishoy-magdy) |
[brad](https://github.com/brad) |
[brenobaptista](https://github.com/brenobaptista) |
[cuihaoleo](https://github.com/cuihaoleo) | -|
[CandleCandle](https://github.com/CandleCandle) |
[carlbordum](https://github.com/carlbordum) |
[carlosngo](https://github.com/carlosngo) |
[carlosedp](https://github.com/carlosedp) |
[chaifeng](https://github.com/chaifeng) | -|
[charles-e](https://github.com/charles-e) |
[cyy53589](https://github.com/cyy53589) |
[2jaeyeol](https://github.com/2jaeyeol) |
[thackeraaron](https://github.com/thackeraaron) |
[AIbnuHIbban](https://github.com/AIbnuHIbban) | -|
[asalthobaity](https://github.com/asalthobaity) |
[awesome-pro](https://github.com/awesome-pro) |
[abhi-bhatra](https://github.com/abhi-bhatra) |
[iamabhi222](https://github.com/iamabhi222) |
[waditos](https://github.com/waditos) | -|
[AdrienPoupa](https://github.com/AdrienPoupa) |
[sandstone991](https://github.com/sandstone991) |
[aksh-konda](https://github.com/aksh-konda) |
[alanfortlink](https://github.com/alanfortlink) |
[alecmaly](https://github.com/alecmaly) | -|
[alessandroberna](https://github.com/alessandroberna) |
[adw2019](https://github.com/adw2019) |
[afischer211](https://github.com/afischer211) |
[bablecopherye](https://github.com/bablecopherye) |
[a13xk](https://github.com/a13xk) | -|
[apankratov](https://github.com/apankratov) |
[teterkin](https://github.com/teterkin) |
[avanderberg](https://github.com/avanderberg) |
[lex111](https://github.com/lex111) |
[Alkindi42](https://github.com/Alkindi42) | -|
[Jumanjii](https://github.com/Jumanjii) |
[AlphaJack](https://github.com/AlphaJack) |
[captain-aman-11](https://github.com/captain-aman-11) |
[aminvakil](https://github.com/aminvakil) |
[richtwin567](https://github.com/richtwin567) | -|
[andrejilderda](https://github.com/andrejilderda) |
[deining](https://github.com/deining) |
[Chillu1](https://github.com/Chillu1) |
[eduebernal](https://github.com/eduebernal) |
[eduardokimmel](https://github.com/eduardokimmel) | -|
[ei-ke](https://github.com/ei-ke) |
[einverne](https://github.com/einverne) |
[etho201](https://github.com/etho201) |
[eodeluga](https://github.com/eodeluga) |
[Fabien-jrt](https://github.com/Fabien-jrt) | -|
[fabiogvdneto](https://github.com/fabiogvdneto) |
[fathyar](https://github.com/fathyar) |
[Fejby](https://github.com/Fejby) |
[fernandonagase](https://github.com/fernandonagase) |
[ferk6a](https://github.com/ferk6a) | -|
[fpindado](https://github.com/fpindado) |
[FleischKarussel](https://github.com/FleischKarussel) |
[easyteacher](https://github.com/easyteacher) |
[glemco](https://github.com/glemco) |
[halkeye](https://github.com/halkeye) | -|
[gmaubach](https://github.com/gmaubach) |
[gmag11](https://github.com/gmag11) |
[Jackymancs4](https://github.com/Jackymancs4) |
[gitstart](https://github.com/gitstart) |
[Glandos](https://github.com/Glandos) | -|
[ggteixeira](https://github.com/ggteixeira) |
[gusbemacbe](https://github.com/gusbemacbe) |
[HOLLYwyh](https://github.com/HOLLYwyh) |
[Fvbor](https://github.com/Fvbor) |
[hamishmb](https://github.com/hamishmb) | -|
[bennetthanna](https://github.com/bennetthanna) |
[graueneko](https://github.com/graueneko) |
[harshitkathuria](https://github.com/harshitkathuria) |
[ckant](https://github.com/ckant) |
[Techwolf12](https://github.com/Techwolf12) | -|
[christopher-o-toole](https://github.com/christopher-o-toole) |
[cloudtrends](https://github.com/cloudtrends) |
[cicerotcv](https://github.com/cicerotcv) |
[CoolCu](https://github.com/CoolCu) |
[CyrusYip](https://github.com/CyrusYip) | -|
[damienmascre](https://github.com/damienmascre) |
[da2x](https://github.com/da2x) |
[danielb2](https://github.com/danielb2) |
[danimnunes](https://github.com/danimnunes) |
[danil-tolkachev](https://github.com/danil-tolkachev) | -|
[darshani28](https://github.com/darshani28) |
[dhgoldberg](https://github.com/dhgoldberg) |
[DavidBeale](https://github.com/DavidBeale) |
[NeverMendel](https://github.com/NeverMendel) |
[deeepsig](https://github.com/deeepsig) | -|
[DG0lden](https://github.com/DG0lden) |
[deunlee](https://github.com/deunlee) |
[diego-betto](https://github.com/diego-betto) |
[erdody](https://github.com/erdody) |
[diragb](https://github.com/diragb) | -|
[domgoodwin](https://github.com/domgoodwin) |
[b4mboo](https://github.com/b4mboo) |
[donbowman](https://github.com/donbowman) |
[DeeJayLSP](https://github.com/DeeJayLSP) |
[sirnacnud](https://github.com/sirnacnud) | -|
[dflock](https://github.com/dflock) |
[drobilica](https://github.com/drobilica) |
[educbraga](https://github.com/educbraga) | | | - +This is basically a [Joplin](https://github.com/laurent22/joplin) app but optimized for tablets (and especially for Boox Tab). +Key differences are: +- Side menu is always visible (except for note edit screen) +- New theme with nice typography +- Focus mode diff --git a/packages/app-mobile/components/NoteBodyViewer/hooks/useSource.ts b/packages/app-mobile/components/NoteBodyViewer/hooks/useSource.ts index f595137ed2d..fba89c3c5aa 100644 --- a/packages/app-mobile/components/NoteBodyViewer/hooks/useSource.ts +++ b/packages/app-mobile/components/NoteBodyViewer/hooks/useSource.ts @@ -39,9 +39,9 @@ const useSource = (tempDirPath: string, themeId: number) => { `; }, [tempDirPath]); - const [paddingLeft, paddingRight] = useMemo(() => { + const [paddingLeft, paddingRight, extraRawCss] = useMemo(() => { const theme = themeStyle(themeId); - return [theme.marginLeft, theme.marginRight]; + return [theme.marginLeft, theme.marginRight, theme.extraRawCss]; }, [themeId]); const html = useMemo(() => { @@ -75,6 +75,7 @@ const useSource = (tempDirPath: string, themeId: number) => { diff --git a/packages/app-mobile/components/SideMenu.tsx b/packages/app-mobile/components/SideMenu.tsx index 2acb95e1fdf..09f39fd3468 100644 --- a/packages/app-mobile/components/SideMenu.tsx +++ b/packages/app-mobile/components/SideMenu.tsx @@ -1,12 +1,12 @@ import * as React from 'react'; import { connect } from 'react-redux'; import { AccessibilityInfo, Animated, Dimensions, Easing, I18nManager, LayoutChangeEvent, PanResponder, Pressable, StyleSheet, useWindowDimensions, View } from 'react-native'; -import { State } from '@joplin/lib/reducer'; import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import AccessibleView from './accessibility/AccessibleView'; import { _ } from '@joplin/lib/locale'; import useReduceMotionEnabled from '../utils/hooks/useReduceMotionEnabled'; import { themeStyle } from './global-style'; +import { AppState } from '../utils/types'; export enum SideMenuPosition { Left = 'left', @@ -14,6 +14,7 @@ export enum SideMenuPosition { } export type OnChangeCallback = (isOpen: boolean)=> void; +const isTablet = true;// DeviceInfo.isTablet(); interface Props { themeId: number; @@ -29,6 +30,7 @@ interface Props { onChange: OnChangeCallback; disableGestures: boolean; + editMode: boolean; } interface UseStylesProps { @@ -36,9 +38,10 @@ interface UseStylesProps { isLeftMenu: boolean; menuWidth: number; menuOpenFraction: Animated.AnimatedInterpolation; + isMenuOpen: boolean; } -const useStyles = ({ themeId, isLeftMenu, menuWidth, menuOpenFraction }: UseStylesProps) => { +const useStyles = ({ themeId, isLeftMenu, menuWidth, menuOpenFraction, isMenuOpen }: UseStylesProps) => { const { height: windowHeight, width: windowWidth } = useWindowDimensions(); return useMemo(() => { const theme = themeStyle(themeId); @@ -53,16 +56,9 @@ const useStyles = ({ themeId, isLeftMenu, menuWidth, menuOpenFraction }: UseStyl contentOuterWrapper: { flexGrow: 1, flexShrink: 1, - width: windowWidth, + width: windowWidth - (isMenuOpen ? menuWidth : 0), height: windowHeight, - transform: [{ - translateX: menuOpenFraction.interpolate({ - inputRange: [0, 1], - outputRange: [0, isLeftMenu ? menuWidth : -menuWidth], - }), - // The RN Animation docs suggests setting "perspective" while setting other transform styles: - // https://reactnative.dev/docs/animations#bear-in-mind - }, { perspective: 1000 }], + transform: isMenuOpen ? 'translateX(' + menuWidth + 'px)' : 'none', }, contentWrapper: { display: 'flex', @@ -107,7 +103,7 @@ const useStyles = ({ themeId, isLeftMenu, menuWidth, menuOpenFraction }: UseStyl width: windowWidth, }, }); - }, [themeId, isLeftMenu, windowWidth, windowHeight, menuWidth, menuOpenFraction]); + }, [themeId, isLeftMenu, windowWidth, windowHeight, menuWidth, menuOpenFraction, isMenuOpen]); }; interface UseAnimationsProps { @@ -265,11 +261,11 @@ const SideMenuComponent: React.FC = props => { setIsAnimating(true); }, [setIsAnimating]); - const styles = useStyles({ themeId: props.themeId, menuOpenFraction, menuWidth, isLeftMenu }); - + const styles = useStyles({ themeId: props.themeId, menuOpenFraction, menuWidth, isLeftMenu, isMenuOpen: open }); + const menuComponent = ( = props => { const contentComponent = ( @@ -314,16 +310,18 @@ const SideMenuComponent: React.FC = props => { {menuComponent} {contentComponent} - {closeButtonOverlay} + {!isTablet && closeButtonOverlay} ); }; -const SideMenu = connect((state: State) => { +const SideMenu = connect((state: AppState) => { return { + route: state.route, themeId: state.settings.theme, isOpen: state.showSideMenu, + editMode: state.editMode, }; })(SideMenuComponent); diff --git a/packages/app-mobile/components/screens/Note/Note.tsx b/packages/app-mobile/components/screens/Note/Note.tsx index 6a7536256c1..33c0251c16f 100644 --- a/packages/app-mobile/components/screens/Note/Note.tsx +++ b/packages/app-mobile/components/screens/Note/Note.tsx @@ -33,7 +33,7 @@ import { BaseScreenComponent } from '../../base-screen'; import { themeStyle, editorFont } from '../../global-style'; import shared, { BaseNoteScreenComponent, Props as BaseProps } from '@joplin/lib/components/shared/note-screen-shared'; import SelectDateTimeDialog from '../../SelectDateTimeDialog'; -import ShareExtension from '../../../utils/ShareExtension.js'; +import ShareExtension from '../../../utils/ShareExtension'; import CameraView from '../../CameraView/CameraView'; import { FolderEntity, NoteEntity, ResourceEntity } from '@joplin/lib/services/database/types'; import Logger from '@joplin/utils/Logger'; @@ -338,6 +338,12 @@ class NoteScreenComponent extends BaseScreenComponent imp getMode: () => this.state.mode, setMode: (mode: 'view'|'edit') => { this.setState({ mode }); + if (mode === 'view') { + this.props.dispatch({ + type: 'SET_EDIT_MODE', + payload: false, + }); + } }, }, commands, @@ -486,6 +492,7 @@ class NoteScreenComponent extends BaseScreenComponent imp fontSize: theme.fontSize, paddingTop: 10, // Added for iOS (Not needed for Android??) paddingBottom: 10, // Added for iOS (Not needed for Android??) + ...theme.titleTextInput, }; this.styles_[cacheKey] = StyleSheet.create(styles); @@ -1543,6 +1550,10 @@ class NoteScreenComponent extends BaseScreenComponent imp icon: 'create', onPress: () => { this.setState({ mode: 'edit' }); + this.props.dispatch({ + type: 'SET_EDIT_MODE', + payload: true, + }) this.doFocusUpdate_ = true; }, diff --git a/packages/app-mobile/package.json b/packages/app-mobile/package.json index 11a581d830a..47271abe5c2 100644 --- a/packages/app-mobile/package.json +++ b/packages/app-mobile/package.json @@ -40,7 +40,7 @@ "crypto-browserify": "3.12.0", "deprecated-react-native-prop-types": "5.0.0", "events": "3.3.0", - "expo": "51.0.26", + "expo": "52.0.*", "expo-camera": "15.0.16", "lodash": "4.17.21", "md5": "2.3.0", @@ -48,7 +48,7 @@ "prop-types": "15.8.1", "punycode": "2.3.1", "react": "18.3.1", - "react-native": "0.74.1", + "react-native": "0.75.*", "react-native-device-info": "10.14.0", "react-native-document-picker": "9.3.0", "react-native-dropdownalert": "5.1.0", @@ -125,6 +125,7 @@ "react-test-renderer": "18.3.1", "sharp": "0.33.4", "sqlite3": "5.1.6", + "tesseract": "^0.0.3", "timers-browserify": "2.0.12", "ts-jest": "29.1.5", "ts-loader": "9.5.1", diff --git a/packages/app-mobile/root.tsx b/packages/app-mobile/root.tsx index 68b54a3590f..90541713c88 100644 --- a/packages/app-mobile/root.tsx +++ b/packages/app-mobile/root.tsx @@ -42,7 +42,7 @@ import NavService from '@joplin/lib/services/NavService'; import { createStore, applyMiddleware, Dispatch } from 'redux'; import reduxSharedMiddleware from '@joplin/lib/components/shared/reduxSharedMiddleware'; import shimInit from './utils/shim-init-react'; -const { AppNav } = require('./components/app-nav.js'); +const { AppNav } = require('./components/app-nav'); import Note from '@joplin/lib/models/Note'; import Folder from '@joplin/lib/models/Folder'; import BaseSyncTarget from '@joplin/lib/BaseSyncTarget'; @@ -58,13 +58,13 @@ import Database from '@joplin/lib/database'; import NotesScreen from './components/screens/Notes'; import TagsScreen from './components/screens/tags'; import ConfigScreen from './components/screens/ConfigScreen/ConfigScreen'; -const { FolderScreen } = require('./components/screens/folder.js'); +const { FolderScreen } = require('./components/screens/folder'); import LogScreen from './components/screens/LogScreen'; import StatusScreen from './components/screens/status'; import SearchScreen from './components/screens/SearchScreen'; -const { OneDriveLoginScreen } = require('./components/screens/onedrive-login.js'); +const { OneDriveLoginScreen } = require('./components/screens/onedrive-login'); import EncryptionConfigScreen from './components/screens/encryption-config'; -import DropboxLoginScreen from './components/screens/dropbox-login.js'; +import DropboxLoginScreen from './components/screens/dropbox-login'; import { MenuProvider } from 'react-native-popup-menu'; import SideMenu, { SideMenuPosition } from './components/SideMenu'; import SideMenuContent from './components/side-menu-content'; @@ -78,10 +78,10 @@ import WelcomeUtils from '@joplin/lib/WelcomeUtils'; import { themeStyle } from './components/global-style'; import SyncTargetRegistry from '@joplin/lib/SyncTargetRegistry'; import SyncTargetFilesystem from '@joplin/lib/SyncTargetFilesystem'; -const SyncTargetNextcloud = require('@joplin/lib/SyncTargetNextcloud.js'); -const SyncTargetWebDAV = require('@joplin/lib/SyncTargetWebDAV.js'); -const SyncTargetDropbox = require('@joplin/lib/SyncTargetDropbox.js'); -const SyncTargetAmazonS3 = require('@joplin/lib/SyncTargetAmazonS3.js'); +const SyncTargetNextcloud = require('@joplin/lib/SyncTargetNextcloud'); +const SyncTargetWebDAV = require('@joplin/lib/SyncTargetWebDAV'); +const SyncTargetDropbox = require('@joplin/lib/SyncTargetDropbox'); +const SyncTargetAmazonS3 = require('@joplin/lib/SyncTargetAmazonS3'); import BiometricPopup from './components/biometrics/BiometricPopup'; import initLib from '@joplin/lib/initLib'; import { isCallbackUrl, parseCallbackUrl, CallbackUrlCommand } from '@joplin/lib/callbackUrlUtils'; @@ -141,6 +141,7 @@ import { AppState } from './utils/types'; import { getDisplayParentId } from '@joplin/lib/services/trash'; const logger = Logger.create('root'); +const isTablet = true;// DeviceInfo.isTablet(); // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied let storeDispatch: any = function(_action: any) {}; @@ -284,10 +285,18 @@ function historyCanGoBackTo(route: any) { const appReducer = (state = appDefaultState, action: any) => { let newState = state; let historyGoingBack = false; - + try { switch (action.type) { + case 'SET_EDIT_MODE': + newState = { + ...state, + editMode: action.payload, + showSideMenu: !action.payload, + }; + break; + case 'NAV_BACK': case 'NAV_GO': @@ -318,7 +327,7 @@ const appReducer = (state = appDefaultState, action: any) => { navHistory.splice(0, navHistory.length); } - newState = { ...state }; + newState = { ...state, editMode: false }; newState.selectedNoteHash = ''; @@ -384,9 +393,10 @@ const appReducer = (state = appDefaultState, action: any) => { break; case 'SIDE_MENU_CLOSE': - - newState = { ...state }; - newState.showSideMenu = false; + if (!isTablet) { + newState = { ...state }; + newState.showSideMenu = false; + } break; case 'SET_PLUGIN_PANELS_DIALOG_VISIBLE': @@ -1256,7 +1266,7 @@ class AppComponent extends React.Component { let menuPosition = SideMenuPosition.Left; let disableSideMenuGestures = this.props.disableSideMenuGestures; - if (this.props.routeName === 'Note') { + if (this.props.routeName === 'Note' && !isTablet) { sideMenuContent = ; menuPosition = SideMenuPosition.Right; } else if (this.props.routeName === 'Config') { @@ -1311,7 +1321,7 @@ class AppComponent extends React.Component { toleranceY={20} openMenuOffset={this.state.sideMenuWidth} menuPosition={menuPosition} - onChange={(isOpen: boolean) => this.sideMenu_change(isOpen)} + onChange={(isOpen: boolean) => !isTablet && this.sideMenu_change(isOpen)} disableGestures={disableSideMenuGestures} > diff --git a/packages/app-mobile/tsconfig.json b/packages/app-mobile/tsconfig.json index 306938e4f78..5b95fa01a0e 100644 --- a/packages/app-mobile/tsconfig.json +++ b/packages/app-mobile/tsconfig.json @@ -12,6 +12,8 @@ ], "compilerOptions": { "types": ["jest", "node"], - "moduleSuffixes": [".ios", ".android", ".native", ""] + "moduleSuffixes": [".ios", ".android", ".native", ""], + "allowSyntheticDefaultImports": true, + "noImplicitAny": false } } diff --git a/packages/app-mobile/utils/appDefaultState.ts b/packages/app-mobile/utils/appDefaultState.ts index 880cb9525c7..04214a50fe8 100644 --- a/packages/app-mobile/utils/appDefaultState.ts +++ b/packages/app-mobile/utils/appDefaultState.ts @@ -7,6 +7,8 @@ export const DEFAULT_ROUTE = { smartFilterId: 'c3176726992c11e9ac940492261af972', }; +const isTablet = true;//DeviceInfo.isTablet(); + const appDefaultState: AppState = { smartFilterId: undefined, keyboardVisible: false, @@ -18,6 +20,8 @@ const appDefaultState: AppState = { showPanelsDialog: false, newNoteAttachFileAction: null, ...defaultState, + editMode: false, + showSideMenu: isTablet, // On mobile, it's possible to select notes that aren't in the selected folder/tag/etc. allowSelectionInOtherFolders: true, diff --git a/packages/app-mobile/utils/types.ts b/packages/app-mobile/utils/types.ts index 969f8b7e2df..1d34493cd13 100644 --- a/packages/app-mobile/utils/types.ts +++ b/packages/app-mobile/utils/types.ts @@ -13,4 +13,5 @@ export interface AppState extends State { disableSideMenuGestures: boolean; newNoteAttachFileAction: AttachFileAction | null; + editMode?: boolean; } diff --git a/packages/lib/models/Setting.ts b/packages/lib/models/Setting.ts index 5c3352cf939..875ceda992a 100644 --- a/packages/lib/models/Setting.ts +++ b/packages/lib/models/Setting.ts @@ -164,6 +164,7 @@ class Setting extends BaseModel { public static THEME_DRACULA = 5; public static THEME_NORD = 6; public static THEME_ARITIM_DARK = 7; + public static THEME_TOPLIN = 8; public static FONT_DEFAULT = 0; public static FONT_MENLO = 1; diff --git a/packages/lib/theme.ts b/packages/lib/theme.ts index c34b29885dd..e37e5af96ad 100644 --- a/packages/lib/theme.ts +++ b/packages/lib/theme.ts @@ -6,6 +6,7 @@ import theme_solarizedDark from './themes/solarizedDark'; import theme_nord from './themes/nord'; import theme_aritimDark from './themes/aritimDark'; import theme_oledDark from './themes/oledDark'; +import theme_toplin from './themes/toplin'; import Setting from './models/Setting'; import { Theme, ThemeAppearance } from './themes/type'; @@ -20,6 +21,7 @@ const themes: Record = { [Setting.THEME_NORD]: theme_nord, [Setting.THEME_ARITIM_DARK]: theme_aritimDark, [Setting.THEME_OLED_DARK]: theme_oledDark, + [Setting.THEME_TOPLIN]: theme_toplin, }; export function themeById(themeId: number) { diff --git a/packages/lib/themes/solarizedLight.ts b/packages/lib/themes/solarizedLight.ts index 468509796ae..3ad1bd18534 100644 --- a/packages/lib/themes/solarizedLight.ts +++ b/packages/lib/themes/solarizedLight.ts @@ -32,6 +32,7 @@ const theme: Theme = { codeMirrorTheme: 'solarized light', codeThemeCss: 'atom-one-light.css', + useNormalization: true, }; export default theme; diff --git a/packages/lib/themes/toplin.js b/packages/lib/themes/toplin.js new file mode 100644 index 00000000000..0f2a5fcf5e1 --- /dev/null +++ b/packages/lib/themes/toplin.js @@ -0,0 +1,193 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const type_1 = require("./type"); +// This is the default theme in Joplin +const theme = { + appearance: type_1.ThemeAppearance.Light, + // Color scheme "1" is the basic one, like used to display the note + // content. It's basically dark gray text on white background + backgroundColor: '#ffffff', + backgroundColorTransparent: 'rgba(255,255,255,0.9)', + oddBackgroundColor: '#eeeeee', + color: '#000', // For regular text + colorError: 'red', + colorCorrect: 'green', // Opposite of colorError + colorWarn: 'rgb(228,86,0)', + colorWarnUrl: '#155BDA', + colorFaded: '#627184', // For less important text + dividerColor: '#dddddd', + selectedColor: '#e5e5e5', + urlColor: '#155BDA', + // Color scheme "2" is used for the sidebar. It's white text over + // dark blue background. + backgroundColor2: '#fff', + color2: '#ffffff', + selectedColor2: '#131313', + colorError2: '#ff6c6c', + colorWarn2: '#ffcb81', + colorWarn3: '#ff7626', + // Color scheme "3" is used for the config screens for example/ + // It's dark text over gray background. + backgroundColor3: '#fff', + backgroundColorHover3: '#fff', + color3: '#627284', + // Color scheme "4" is used for secondary-style buttons. It makes a white + // button with blue text. + backgroundColor4: '#ffffff', + color4: '#2D6BDC', + raisedBackgroundColor: '#e5e5e5', + raisedColor: '#222222', + searchMarkerBackgroundColor: '#F7D26E', + searchMarkerColor: 'black', + warningBackgroundColor: '#FFD08D', + destructiveColor: '#D00707', + tableBackgroundColor: 'rgb(247, 247, 247)', + codeBackgroundColor: 'rgb(243, 243, 243)', + codeBorderColor: 'rgb(220, 220, 220)', + codeColor: 'rgb(0,0,0)', + blockQuoteOpacity: 0.7, + codeMirrorTheme: 'default', + codeThemeCss: 'atom-one-light.css', + headerBackgroundColor: '#F0F0F0', + textSelectionColor: '#0096FF', + colorBright2: '#000', + useNormalization: false, + titleTextInput: { + maxWidth: '700px', + paddingTop: '0.25em', + paddingBottom: '0.25em', + marginLeft: 'auto', + marginRight: 'auto', + fontFamily: 'Spectral', + fontSize: '3rem', + fontWeight: 800, + borderBottomWidth: '0 important', + lineHeight: '1.25rem', + }, + extraRawCss: `@import url('https://fonts.googleapis.com/css?family=Spectral|Spectral+SC'); + @import url('https://fonts.googleapis.com/css2?family=Martel:wght@200;300;400;600;700;800;900&display=swap'); + @import url('https://fonts.googleapis.com/css2?family=PT+Serif:ital,wght@0,400;0,700;1,400;1,700&display=swap'); + + + #rendered-md { + max-width: 700px; + margin: 0 auto; + padding: 0 1.5rem; + font-size: 1rem; + font-family: PT Serif, Martel, serif; + line-height: 1.75em + } + + #rendered-md .header-1, + #rendered-md .header-2, + #rendered-md .header-3, + #rendered-md .header-4, + #rendered-md .header-5, + #rendered-md .header-6 { + margin: 1em 0; + font-family: Spectral, serif; + line-height: 1.25em; + border-bottom: none; + } + + #rendered-md h1 { + font-weight: 800; + font-size: 3em + } + + #rendered-md h2 { + font-weight: 400; + font-size: 1.8em + } + + #rendered-md h3 { + font-weight: 600; + font-size: 1.3em + } + + #rendered-md h4 { + font-weight: 600; + font-size: 1.2em + } + + #rendered-md h5 { + font-weight: 600; + font-size: 1.1em + } + + #rendered-md h6 { + font-weight: 600; + font-size: 1em + } + + #rendered-md h3, + #rendered-md h4, + #rendered-md h5, + #rendered-md h6 { + text-transform: uppercase + } + + #rendered-md li p, + #rendered-md p, + #rendered-md pre { + margin-bottom: 0 + } + + #rendered-md code, + #rendered-md pre { + border-radius: 0.5rem; + color: #fafafa; + background-color: #212121 + } + + @media print { + + #rendered-md code, + #rendered-md pre { + color: #fafafa !important; + background-color: #212121 !important + } + } + + #rendered-md code { + padding: 0.25rem 0.5rem + } + + #rendered-md pre { + padding: 1rem + } + + #rendered-md pre code { + padding: 0 + } + + #rendered-md blockquote { + margin: 2.5em 0; + padding-left: 2rem; + padding-right: 2rem; + border-left: 5px solid #bdbdbd; + font-size: 1.25em; + line-height: 1.75em + } + + #rendered-md hr { + margin: 4rem auto; + max-width: 10rem + } + + #rendered-md a { + color: #a5171e; + cursor: pointer + } + + #rendered-md img { + max-width: 100% + } + + #rendered-md b, + #rendered-md strong { + font-weight: 800 + }`, +}; +exports.default = theme; +//# sourceMappingURL=toplin.js.map \ No newline at end of file diff --git a/packages/lib/themes/toplin.ts b/packages/lib/themes/toplin.ts new file mode 100644 index 00000000000..cb60e7e9ab4 --- /dev/null +++ b/packages/lib/themes/toplin.ts @@ -0,0 +1,203 @@ +import { Theme, ThemeAppearance } from './type'; + +// This is the default theme in Joplin +const theme: Theme = { + appearance: ThemeAppearance.Light, + + // Color scheme "1" is the basic one, like used to display the note + // content. It's basically dark gray text on white background + backgroundColor: '#ffffff', + backgroundColorTransparent: 'rgba(255,255,255,0.9)', + oddBackgroundColor: '#eeeeee', + color: '#000', // For regular text + colorError: 'red', + colorCorrect: 'green', // Opposite of colorError + colorWarn: 'rgb(228,86,0)', + colorWarnUrl: '#155BDA', + colorFaded: '#627184', // For less important text + dividerColor: '#dddddd', + selectedColor: '#e5e5e5', + urlColor: '#155BDA', + + // Color scheme "2" is used for the sidebar. It's white text over + // dark blue background. + backgroundColor2: '#fff', + color2: '#ffffff', + selectedColor2: '#131313', + colorError2: '#ff6c6c', + colorWarn2: '#ffcb81', + colorWarn3: '#ff7626', + + // Color scheme "3" is used for the config screens for example/ + // It's dark text over gray background. + backgroundColor3: '#fff', + backgroundColorHover3: '#fff', + color3: '#627284', + + // Color scheme "4" is used for secondary-style buttons. It makes a white + // button with blue text. + backgroundColor4: '#ffffff', + color4: '#2D6BDC', + + raisedBackgroundColor: '#e5e5e5', + raisedColor: '#222222', + searchMarkerBackgroundColor: '#F7D26E', + searchMarkerColor: 'black', + + warningBackgroundColor: '#FFD08D', + destructiveColor: '#D00707', + + tableBackgroundColor: 'rgb(247, 247, 247)', + codeBackgroundColor: 'rgb(243, 243, 243)', + codeBorderColor: 'rgb(220, 220, 220)', + codeColor: 'rgb(0,0,0)', + + blockQuoteOpacity: 0.7, + + codeMirrorTheme: 'default', + codeThemeCss: 'atom-one-light.css', + + headerBackgroundColor: '#F0F0F0', + textSelectionColor: '#0096FF', + colorBright2: '#000', + + useNormalization: false, + titleTextInput: { + maxWidth: '700px', + paddingTop: '0.25em', + paddingBottom: '0.25em', + marginLeft: 'auto', + marginRight: 'auto', + fontFamily: 'Spectral', + fontSize: '3rem', + fontWeight: 800, + borderBottomWidth: '0 important', + lineHeight: '1.25rem', + }, + extraRawCss: `@import url('https://fonts.googleapis.com/css?family=Spectral|Spectral+SC'); + @import url('https://fonts.googleapis.com/css2?family=Martel:wght@200;300;400;600;700;800;900&display=swap'); + @import url('https://fonts.googleapis.com/css2?family=PT+Serif:ital,wght@0,400;0,700;1,400;1,700&display=swap'); + + + #rendered-md { + max-width: 700px; + margin: 0 auto; + padding: 0 1.5rem; + font-size: 1rem; + font-family: PT Serif, Martel, serif; + line-height: 1.75em + } + + #rendered-md .header-1, + #rendered-md .header-2, + #rendered-md .header-3, + #rendered-md .header-4, + #rendered-md .header-5, + #rendered-md .header-6 { + margin: 1em 0; + font-family: Spectral, serif; + line-height: 1.25em; + border-bottom: none; + } + + #rendered-md h1 { + font-weight: 800; + font-size: 3em + } + + #rendered-md h2 { + font-weight: 400; + font-size: 1.8em + } + + #rendered-md h3 { + font-weight: 600; + font-size: 1.3em + } + + #rendered-md h4 { + font-weight: 600; + font-size: 1.2em + } + + #rendered-md h5 { + font-weight: 600; + font-size: 1.1em + } + + #rendered-md h6 { + font-weight: 600; + font-size: 1em + } + + #rendered-md h3, + #rendered-md h4, + #rendered-md h5, + #rendered-md h6 { + text-transform: uppercase + } + + #rendered-md li p, + #rendered-md p, + #rendered-md pre { + margin-bottom: 0 + } + + #rendered-md code, + #rendered-md pre { + border-radius: 0.5rem; + color: #fafafa; + background-color: #212121 + } + + @media print { + + #rendered-md code, + #rendered-md pre { + color: #fafafa !important; + background-color: #212121 !important + } + } + + #rendered-md code { + padding: 0.25rem 0.5rem + } + + #rendered-md pre { + padding: 1rem + } + + #rendered-md pre code { + padding: 0 + } + + #rendered-md blockquote { + margin: 2.5em 0; + padding-left: 2rem; + padding-right: 2rem; + border-left: 5px solid #bdbdbd; + font-size: 1.25em; + line-height: 1.75em + } + + #rendered-md hr { + margin: 4rem auto; + max-width: 10rem + } + + #rendered-md a { + color: #a5171e; + cursor: pointer + } + + #rendered-md img { + max-width: 100% + } + + #rendered-md b, + #rendered-md strong { + font-weight: 800 + }`, +}; + +export default theme; diff --git a/packages/lib/themes/type.ts b/packages/lib/themes/type.ts index 49a62913173..6281790fd06 100644 --- a/packages/lib/themes/type.ts +++ b/packages/lib/themes/type.ts @@ -67,4 +67,8 @@ export interface Theme { headerBackgroundColor: string; textSelectionColor: string; colorBright2: string; + + useNormalization: boolean; + extraRawCss?: any; + titleTextInput?: any; } diff --git a/packages/renderer/noteStyle.ts b/packages/renderer/noteStyle.ts index b104c46d7db..043283e1d40 100644 --- a/packages/renderer/noteStyle.ts +++ b/packages/renderer/noteStyle.ts @@ -482,6 +482,10 @@ export default function(theme: any, options: Options = null) { } } `; + const styles = []; + if (theme.useNormalization) { + styles.push(css); + } - return [css]; + return styles; }