diff options
355 files changed, 7373 insertions, 4696 deletions
diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 190b5038c..000000000 --- a/.babelrc +++ /dev/null @@ -1,66 +0,0 @@ -{ - "presets": [ - "react", - [ - "env", - { - "exclude": ["transform-async-to-generator", "transform-regenerator"], - "loose": true, - "modules": false, - "targets": { - "browsers": ["last 2 versions", "IE >= 11", "iOS >= 9"] - } - } - ] - ], - "plugins": [ - "syntax-dynamic-import", - ["transform-object-rest-spread", { "useBuiltIns": true }], - "transform-decorators-legacy", - "transform-class-properties", - [ - "react-intl", - { - "messagesDir": "./build/messages" - } - ], - "preval" - ], - "env": { - "development": { - "plugins": [ - "transform-react-jsx-source", - "transform-react-jsx-self" - ] - }, - "production": { - "plugins": [ - "lodash", - [ - "transform-react-remove-prop-types", - { - "mode": "remove", - "removeImport": true, - "additionalLibraries": [ - "react-immutable-proptypes" - ] - } - ], - "transform-react-inline-elements", - [ - "transform-runtime", - { - "helpers": true, - "polyfill": false, - "regenerator": false - } - ] - ] - }, - "test": { - "plugins": [ - "transform-es2015-modules-commonjs" - ] - } - } -} diff --git a/.env.vagrant b/.env.vagrant index 04b889d00..f3b54f6e3 100644 --- a/.env.vagrant +++ b/.env.vagrant @@ -1,2 +1,2 @@ VAGRANT=true -LOCAL_DOMAIN=mastodon.dev \ No newline at end of file +LOCAL_DOMAIN=mastodon.local diff --git a/.rubocop.yml b/.rubocop.yml index 4ba5903bd..59e8a757a 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -77,6 +77,11 @@ Rails/SkipsModelValidations: Rails/HttpStatus: Enabled: false +Rails/Exit: + Exclude: + - 'lib/mastodon/*' + - 'lib/cli' + Style/ClassAndModuleChildren: Enabled: false diff --git a/AUTHORS.md b/AUTHORS.md index c4bbb6014..abcc24384 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -3,76 +3,85 @@ and provided thanks to the work of the following contributors: * [Gargron](https://github.com/Gargron) * [ykzts](https://github.com/ykzts) -* [mjankowski](https://github.com/mjankowski) * [akihikodaki](https://github.com/akihikodaki) +* [mjankowski](https://github.com/mjankowski) * [unarist](https://github.com/unarist) -* [yiskah](https://github.com/yiskah) +* [ThibG](https://github.com/ThibG) * [m4sk1n](https://github.com/m4sk1n) +* [yiskah](https://github.com/yiskah) * [nolanlawson](https://github.com/nolanlawson) * [sorin-davidoi](https://github.com/sorin-davidoi) * [abcang](https://github.com/abcang) -* [ThibG](https://github.com/ThibG) * [lynlynlynx](https://github.com/lynlynlynx) * [alpaca-tc](https://github.com/alpaca-tc) * [nclm](https://github.com/nclm) * [ineffyble](https://github.com/ineffyble) +* [renatolond](https://github.com/renatolond) * [jeroenpraat](https://github.com/jeroenpraat) * [blackle](https://github.com/blackle) * [Quent-in](https://github.com/Quent-in) * [JantsoP](https://github.com/JantsoP) * [nullkal](https://github.com/nullkal) * [yookoala](https://github.com/yookoala) +* [mayaeh](https://github.com/mayaeh) * [ysksn](https://github.com/ysksn) +* [shuheiktgw](https://github.com/shuheiktgw) * [ashfurrow](https://github.com/ashfurrow) -* [eramdam](https://github.com/eramdam) -* [mayaeh](https://github.com/mayaeh) * [zunda](https://github.com/zunda) -* [ticky](https://github.com/ticky) +* [eramdam](https://github.com/eramdam) +* [Kjwon15](https://github.com/Kjwon15) * [masarakki](https://github.com/masarakki) +* [ticky](https://github.com/ticky) +* [Quenty31](https://github.com/Quenty31) +* [danhunsaker](https://github.com/danhunsaker) +* [ThisIsMissEm](https://github.com/ThisIsMissEm) +* [hcmiya](https://github.com/hcmiya) +* [stephenburgess8](https://github.com/stephenburgess8) * [Wonderfall](https://github.com/Wonderfall) +* [takayamaki](https://github.com/takayamaki) * [matteoaquila](https://github.com/matteoaquila) * [rkarabut](https://github.com/rkarabut) -* [stephenburgess8](https://github.com/stephenburgess8) -* [Kjwon15](https://github.com/Kjwon15) * [Artoria2e5](https://github.com/Artoria2e5) * [yukimochi](https://github.com/yukimochi) * [marrus-sh](https://github.com/marrus-sh) * [krainboltgreene](https://github.com/krainboltgreene) -* [renatolond](https://github.com/renatolond) -* [BoFFire](https://github.com/BoFFire) -* [clworld](https://github.com/clworld) -* [danhunsaker](https://github.com/danhunsaker) * [patf](https://github.com/patf) -* [Quenty31](https://github.com/Quenty31) -* [MitarashiDango](https://github.com/MitarashiDango) * [Aldarone](https://github.com/Aldarone) +* [BoFFire](https://github.com/BoFFire) +* [clworld](https://github.com/clworld) +* [dracos](https://github.com/dracos) +* [SerCom_KC](mailto:sercom-kc@users.noreply.github.com) +* [Sylvhem](https://github.com/Sylvhem) +* [nightpool](https://github.com/nightpool) +* [MasterGroosha](https://github.com/MasterGroosha) * [JeanGauthier](https://github.com/JeanGauthier) * [kschaper](https://github.com/kschaper) -* [takayamaki](https://github.com/takayamaki) +* [mabkenar](https://github.com/mabkenar) +* [MitarashiDango](mailto:mitarashidango@users.noreply.github.com) +* [beatrix-bitrot](https://github.com/beatrix-bitrot) * [adbelle](https://github.com/adbelle) * [evanminto](https://github.com/evanminto) -* [mabkenar](https://github.com/mabkenar) * [MightyPork](https://github.com/MightyPork) -* [beatrix-bitrot](https://github.com/beatrix-bitrot) * [yhirano55](https://github.com/yhirano55) * [camponez](https://github.com/camponez) +* [MaciekBaron](https://github.com/MaciekBaron) +* [SerCom-KC](https://github.com/SerCom-KC) * [aschmitz](https://github.com/aschmitz) * [fpiesche](https://github.com/fpiesche) * [gandaro](https://github.com/gandaro) * [johnsudaar](https://github.com/johnsudaar) * [trebmuh](https://github.com/trebmuh) -* [Sylvhem](https://github.com/Sylvhem) +* [Rakib Hasan](mailto:rmhasan@gmail.com) * [lindwurm](https://github.com/lindwurm) +* [victorhck](mailto:victorhck@geeko.site) * [voidsatisfaction](https://github.com/voidsatisfaction) -* [neetshin](https://github.com/neetshin) * [valentin2105](https://github.com/valentin2105) +* [devkral](https://github.com/devkral) * [hikari-no-yume](https://github.com/hikari-no-yume) -* [Angristan](https://github.com/Angristan) +* [angristan](https://github.com/angristan) * [seefood](https://github.com/seefood) * [jackjennings](https://github.com/jackjennings) -* [hcmiya](https://github.com/hcmiya) -* [nightpool](https://github.com/nightpool) -* [salvadorpla](https://github.com/salvadorpla) +* [spla](mailto:spla@mastodont.cat) * [expenses](https://github.com/expenses) * [walf443](https://github.com/walf443) * [JoelQ](https://github.com/JoelQ) @@ -85,65 +94,75 @@ and provided thanks to the work of the following contributors: * [victorhck](https://github.com/victorhck) * [puckipedia](https://github.com/puckipedia) * [contraexemplo](https://github.com/contraexemplo) +* [hugogameiro](https://github.com/hugogameiro) * [kazu9su](https://github.com/kazu9su) * [Komic](https://github.com/Komic) * [diomed](https://github.com/diomed) +* [ariasuni](https://github.com/ariasuni) +* [Neetshin](mailto:neetshin@neetsh.in) * [rainyday](https://github.com/rainyday) +* [ProgVal](https://github.com/ProgVal) +* [yuntan](https://github.com/yuntan) +* [goofy-bz](mailto:goofy@babelzilla.org) * [kadiix](https://github.com/kadiix) * [kodacs](https://github.com/kodacs) -* [ProgVal](https://github.com/ProgVal) +* [fvh-P](https://github.com/fvh-P) +* [rtucker](https://github.com/rtucker) +* [KScl](https://github.com/KScl) * [sterdev](https://github.com/sterdev) * [TheKinrar](https://github.com/TheKinrar) * [AA4ch1](https://github.com/AA4ch1) * [alexgleason](https://github.com/alexgleason) * [cpytel](https://github.com/cpytel) * [northerner](https://github.com/northerner) +* [fhemberger](https://github.com/fhemberger) * [hnrysmth](https://github.com/hnrysmth) -* [hugogameiro](https://github.com/hugogameiro) +* [d6rkaiz](https://github.com/d6rkaiz) +* [JMendyk](https://github.com/JMendyk) * [JohnD28](https://github.com/JohnD28) * [znz](https://github.com/znz) * [Naouak](https://github.com/Naouak) -* [rtucker](https://github.com/rtucker) * [reneklacan](https://github.com/reneklacan) -* [KScl](https://github.com/KScl) -* [SerCom-KC](https://github.com/SerCom-KC) +* [ekiru](https://github.com/ekiru) * [tcitworld](https://github.com/tcitworld) * [geta6](https://github.com/geta6) -* [goofy-bz](https://github.com/goofy-bz) * [happycoloredbanana](https://github.com/happycoloredbanana) * [leopku](https://github.com/leopku) * [SansPseudoFix](https://github.com/SansPseudoFix) * [tomfhowe](https://github.com/tomfhowe) * [noraworld](https://github.com/noraworld) -* [fvh-P](https://github.com/fvh-P) * [178inaba](https://github.com/178inaba) -* [devkral](https://github.com/devkral) * [alyssais](https://github.com/alyssais) * [kodnaplakal](https://github.com/kodnaplakal) * [stalker314314](https://github.com/stalker314314) * [huertanix](https://github.com/huertanix) * [genesixx](https://github.com/genesixx) -* [fhemberger](https://github.com/fhemberger) * [halkeye](https://github.com/halkeye) +* [hinaloe](https://github.com/hinaloe) * [treby](https://github.com/treby) -* [d6rkaiz](https://github.com/d6rkaiz) * [jpdevries](https://github.com/jpdevries) -* [rndm-stranger](https://github.com/rndm-stranger) +* [00x9d](https://github.com/00x9d) +* [Kurtis Rainbolt-Greene](mailto:me@kurtisrainboltgreene.name) * [saper](https://github.com/saper) * [nevillepark](https://github.com/nevillepark) * [ornithocoder](https://github.com/ornithocoder) * [pierreozoux](https://github.com/pierreozoux) -* [ramlmn](https://github.com/ramlmn) +* [Ram Lmn](mailto:ramlmn@users.noreply.github.com) * [harukasan](https://github.com/harukasan) * [stamak](https://github.com/stamak) +* [theboss](https://github.com/theboss) +* [Technowix](mailto:technowix@users.noreply.github.com) * [Eychics](https://github.com/Eychics) -* [thor-the-norseman](https://github.com/thor-the-norseman) +* [Thor Harald Johansen](mailto:thj@thj.no) * [0x70b1a5](https://github.com/0x70b1a5) * [gled-rs](https://github.com/gled-rs) * [R0ckweb](https://github.com/R0ckweb) +* [caasi](https://github.com/caasi) * [esetomo](https://github.com/esetomo) * [foxiehkins](https://github.com/foxiehkins) -* [sdukhovni](https://github.com/sdukhovni) +* [hoodie](mailto:hoodiekitten@outlook.com) +* [luzi82](https://github.com/luzi82) +* [duxovni](https://github.com/duxovni) * [unsmell](https://github.com/unsmell) * [chriswmartin](https://github.com/chriswmartin) * [vahnj](https://github.com/vahnj) @@ -152,6 +171,7 @@ and provided thanks to the work of the following contributors: * [redtachyons](https://github.com/redtachyons) * [thurloat](https://github.com/thurloat) * [aaribaud](https://github.com/aaribaud) +* [Andrew](mailto:andrewlchronister@gmail.com) * [estuans](https://github.com/estuans) * [dissolve](https://github.com/dissolve) * [PurpleBooth](https://github.com/PurpleBooth) @@ -165,7 +185,6 @@ and provided thanks to the work of the following contributors: * [farlistener](https://github.com/farlistener) * [DavidLibeau](https://github.com/DavidLibeau) * [SirCmpwn](https://github.com/SirCmpwn) -* [MasterGroosha](https://github.com/MasterGroosha) * [Fjoerfoks](https://github.com/Fjoerfoks) * [fmauNeko](https://github.com/fmauNeko) * [gloaec](https://github.com/gloaec) @@ -175,26 +194,37 @@ and provided thanks to the work of the following contributors: * [h-izumi](https://github.com/h-izumi) * [ErikXXon](https://github.com/ErikXXon) * [ian-kelling](https://github.com/ian-kelling) +* [immae](https://github.com/immae) +* [Reverite](https://github.com/Reverite) * [foozmeat](https://github.com/foozmeat) * [jasonrhodes](https://github.com/jasonrhodes) -* [asm](https://github.com/asm) +* [Jason Snell](mailto:jason@newrelic.com) * [jviide](https://github.com/jviide) * [crakaC](https://github.com/crakaC) * [tkbky](https://github.com/tkbky) +* [Kaylee](mailto:kaylee@codethat.sucks) * [Kazhnuz](https://github.com/Kazhnuz) +* [connyduck](https://github.com/connyduck) +* [Lindsey Bieda](mailto:lindseyb@users.noreply.github.com) +* [Lorenz Diener](mailto:halcyon@icosahedron.website) * [alimony](https://github.com/alimony) * [mig5](https://github.com/mig5) * [ndarville](https://github.com/ndarville) * [Abzol](https://github.com/Abzol) +* [pwoolcoc](https://github.com/pwoolcoc) * [xPaw](https://github.com/xPaw) +* [petzah](https://github.com/petzah) +* [ignisf](https://github.com/ignisf) * [raymestalez](https://github.com/raymestalez) +* [u1-liquid](https://github.com/u1-liquid) * [sim6](https://github.com/sim6) -* [ekiru](https://github.com/ekiru) -* [Technowix](https://github.com/Technowix) +* [stemid](https://github.com/stemid) * [ThomasLeister](https://github.com/ThomasLeister) * [mcat-ee](https://github.com/mcat-ee) * [tototoshi](https://github.com/tototoshi) +* [TrashMacNugget](https://github.com/TrashMacNugget) * [VirtuBox](https://github.com/VirtuBox) +* [Vladyslav](mailto:vaden@tuta.io) * [kaniini](https://github.com/kaniini) * [vayan](https://github.com/vayan) * [yannicka](https://github.com/yannicka) @@ -202,12 +232,16 @@ and provided thanks to the work of the following contributors: * [zacanger](https://github.com/zacanger) * [amazedkoumei](https://github.com/amazedkoumei) * [anon5r](https://github.com/anon5r) +* [bsky](mailto:me@imbsky.net) +* [chr-1x](https://github.com/chr-1x) * [codl](https://github.com/codl) +* [cpsdqs](https://github.com/cpsdqs) * [barzamin](https://github.com/barzamin) * [fhalna](https://github.com/fhalna) * [haoyayoi](https://github.com/haoyayoi) * [ik11235](https://github.com/ik11235) * [kawax](https://github.com/kawax) +* [kedamaDQ](https://github.com/kedamaDQ) * [007lva](https://github.com/007lva) * [matsurai25](https://github.com/matsurai25) * [mecab](https://github.com/mecab) @@ -215,32 +249,41 @@ and provided thanks to the work of the following contributors: * [oliverkeeble](https://github.com/oliverkeeble) * [pinfort](https://github.com/pinfort) * [rbaumert](https://github.com/rbaumert) +* [trwnh](https://github.com/trwnh) * [usagi-f](https://github.com/usagi-f) * [vidarlee](https://github.com/vidarlee) * [vjackson725](https://github.com/vjackson725) * [wxcafe](https://github.com/wxcafe) * [rinsuki](https://github.com/rinsuki) +* [新都心(Neet Shin)](mailto:nucx@dio-vox.com) * [cygnan](https://github.com/cygnan) * [Awea](https://github.com/Awea) * [halcy](https://github.com/halcy) -* [bounshi](https://github.com/bounshi) +* [naaaaaaaaaaaf](https://github.com/naaaaaaaaaaaf) +* [NecroTechno](https://github.com/NecroTechno) * [8398a7](https://github.com/8398a7) * [857b](https://github.com/857b) +* [insom](https://github.com/insom) +* [Aditoo17](https://github.com/Aditoo17) * [unascribed](https://github.com/unascribed) * [Aguay-val](https://github.com/Aguay-val) * [knu](https://github.com/knu) +* [h3poteto](https://github.com/h3poteto) +* [unleashed](https://github.com/unleashed) * [alxrcs](https://github.com/alxrcs) * [console-cowboy](https://github.com/console-cowboy) * [pointlessone](https://github.com/pointlessone) * [a2](https://github.com/a2) * [0xa](https://github.com/0xa) +* [palindromordnilap](https://github.com/palindromordnilap) * [virtualpain](https://github.com/virtualpain) * [sapphirus](https://github.com/sapphirus) * [amandavisconti](https://github.com/amandavisconti) * [ameliavoncat](https://github.com/ameliavoncat) * [ilpianista](https://github.com/ilpianista) -* [andydrop](https://github.com/andydrop) +* [Andreas Drop](mailto:andy@remline.de) * [schas002](https://github.com/schas002) +* [abackstrom](https://github.com/abackstrom) * [jumbosushi](https://github.com/jumbosushi) * [ayumin](https://github.com/ayumin) * [BaptisteGelez](https://github.com/BaptisteGelez) @@ -251,6 +294,7 @@ and provided thanks to the work of the following contributors: * [brycied00d](https://github.com/brycied00d) * [carlosjs23](https://github.com/carlosjs23) * [cgxxx](https://github.com/cgxxx) +* [kibitan](https://github.com/kibitan) * [chrisheninger](https://github.com/chrisheninger) * [chris-martin](https://github.com/chris-martin) * [DoubleMalt](https://github.com/DoubleMalt) @@ -259,21 +303,30 @@ and provided thanks to the work of the following contributors: * [chriswk](https://github.com/chriswk) * [csu](https://github.com/csu) * [kklleemm](https://github.com/kklleemm) +* [dachinat](https://github.com/dachinat) * [monsterpit-daggertooth](https://github.com/monsterpit-daggertooth) * [watilde](https://github.com/watilde) * [daprice](https://github.com/daprice) * [dar5hak](https://github.com/dar5hak) * [kant](https://github.com/kant) +* [maxolasersquad](https://github.com/maxolasersquad) * [singingwolfboy](https://github.com/singingwolfboy) * [davidcelis](https://github.com/davidcelis) +* [davefp](https://github.com/davefp) * [yipdw](https://github.com/yipdw) * [debanshuk](https://github.com/debanshuk) +* [Derek Lewis](mailto:derekcecillewis@gmail.com) * [dblandin](https://github.com/dblandin) -* [aranaur](https://github.com/aranaur) +* [Drew Gates](mailto:aranaur@users.noreply.github.com) +* [dtschust](https://github.com/dtschust) +* [Dryusdan](https://github.com/Dryusdan) +* [eai04191](https://github.com/eai04191) * [d3vgru](https://github.com/d3vgru) * [Elizafox](https://github.com/Elizafox) * [ericblade](https://github.com/ericblade) * [mikoim](https://github.com/mikoim) +* [espenronnevik](https://github.com/espenronnevik) +* [Finariel](https://github.com/Finariel) * [siuying](https://github.com/siuying) * [hattori6789](https://github.com/hattori6789) * [algernon](https://github.com/algernon) @@ -283,21 +336,23 @@ and provided thanks to the work of the following contributors: * [Fiaxhs](https://github.com/Fiaxhs) * [reedcourty](https://github.com/reedcourty) * [anneau](https://github.com/anneau) +* [Harmon758](https://github.com/Harmon758) * [HellPie](https://github.com/HellPie) * [Habu-Kagumba](https://github.com/Habu-Kagumba) -* [hinaloe](https://github.com/hinaloe) * [suzukaze](https://github.com/suzukaze) * [Hiromi-Kai](https://github.com/Hiromi-Kai) +* [hishamhm](https://github.com/hishamhm) * [musashino205](https://github.com/musashino205) * [iwaim](https://github.com/iwaim) * [valrus](https://github.com/valrus) * [IMcD23](https://github.com/IMcD23) * [yi0713](https://github.com/yi0713) -* [immae](https://github.com/immae) * [iblech](https://github.com/iblech) +* [usbsnowcrash](https://github.com/usbsnowcrash) * [jack-michaud](https://github.com/jack-michaud) * [Floppy](https://github.com/Floppy) * [loomchild](https://github.com/loomchild) +* [jenkr55](https://github.com/jenkr55) * [docjkl](https://github.com/docjkl) * [TrollDecker](https://github.com/TrollDecker) * [jmontane](https://github.com/jmontane) @@ -311,24 +366,29 @@ and provided thanks to the work of the following contributors: * [j0k3r](https://github.com/j0k3r) * [KEINOS](https://github.com/KEINOS) * [futoase](https://github.com/futoase) -* [abjectio](https://github.com/abjectio) +* [Pneumaticat](https://github.com/Pneumaticat) +* [Kit Redgrave](mailto:qwertyitis@gmail.com) +* [Knut Erik](mailto:abjectio@users.noreply.github.com) * [mkody](https://github.com/mkody) -* [connyduck](https://github.com/connyduck) * [k0ta0uchi](https://github.com/k0ta0uchi) * [KrzysiekJ](https://github.com/KrzysiekJ) * [leowzukw](https://github.com/leowzukw) * [lmorchard](https://github.com/lmorchard) +* [Tak](https://github.com/Tak) * [cacheflow](https://github.com/cacheflow) * [ldidry](https://github.com/ldidry) * [jemus42](https://github.com/jemus42) * [lfuelling](https://github.com/lfuelling) * [Grabacr07](https://github.com/Grabacr07) * [mistermantas](https://github.com/mistermantas) +* [mareklach](https://github.com/mareklach) * [wirehack7](https://github.com/wirehack7) +* [martymcguire](https://github.com/martymcguire) * [marvinkopf](https://github.com/marvinkopf) * [otsune](https://github.com/otsune) -* [m-blc](https://github.com/m-blc) +* [Mathias B](mailto:10813340+mathias-b@users.noreply.github.com) * [matt-auckland](https://github.com/matt-auckland) +* [matthiasbeyer](https://github.com/matthiasbeyer) * [mattjmattj](https://github.com/mattjmattj) * [mtparet](https://github.com/mtparet) * [maximeborges](https://github.com/maximeborges) @@ -336,7 +396,7 @@ and provided thanks to the work of the following contributors: * [michaeljdeeb](https://github.com/michaeljdeeb) * [Themimitoof](https://github.com/Themimitoof) * [cyweo](https://github.com/cyweo) -* [M1dgard](https://github.com/M1dgard) +* [Midgard](mailto:m1dgard@users.noreply.github.com) * [mike-burns](https://github.com/mike-burns) * [verymilan](https://github.com/verymilan) * [milmazz](https://github.com/milmazz) @@ -344,29 +404,38 @@ and provided thanks to the work of the following contributors: * [mitchhentges](https://github.com/mitchhentges) * [moritzheiber](https://github.com/moritzheiber) * [mouse-reeve](https://github.com/mouse-reeve) +* [Mozinet-fr](https://github.com/Mozinet-fr) * [lae](https://github.com/lae) * [Nanamachi](https://github.com/Nanamachi) +* [orinthe](https://github.com/orinthe) +* [Dar13](https://github.com/Dar13) * [ngerakines](https://github.com/ngerakines) * [vonneudeck](https://github.com/vonneudeck) * [Ninetailed](https://github.com/Ninetailed) * [k24](https://github.com/k24) -* [noiob](https://github.com/noiob) +* [Noiob](mailto:noiob@users.noreply.github.com) * [kwaio](https://github.com/kwaio) * [norayr](https://github.com/norayr) * [joyeusenoelle](https://github.com/joyeusenoelle) * [OlivierNicole](https://github.com/OlivierNicole) +* [noppa](https://github.com/noppa) * [Otakan951](https://github.com/Otakan951) * [fahy](https://github.com/fahy) +* [PatrickRWells](https://github.com/PatrickRWells) * [Pangoraw](https://github.com/Pangoraw) -* [pwoolcoc](https://github.com/pwoolcoc) * [peterkeen](https://github.com/peterkeen) -* [petzah](https://github.com/petzah) -* [ignisf](https://github.com/ignisf) +* [pgate](https://github.com/pgate) +* [qguv](https://github.com/qguv) +* [remram44](https://github.com/remram44) +* [retokromer](https://github.com/retokromer) * [rfwatson](https://github.com/rfwatson) * [rfreebern](https://github.com/rfreebern) +* [Ryan Wade](mailto:ryan.wade@protonmail.com) * [sylph01](https://github.com/sylph01) +* [S-H-GAMELINKS](https://github.com/S-H-GAMELINKS) * [staticsafe](https://github.com/staticsafe) * [snwh](https://github.com/snwh) +* [sts10](https://github.com/sts10) * [skoji](https://github.com/skoji) * [ScienJus](https://github.com/ScienJus) * [larkinscott](https://github.com/larkinscott) @@ -378,73 +447,97 @@ and provided thanks to the work of the following contributors: * [ernix](https://github.com/ernix) * [rosylilly](https://github.com/rosylilly) * [shouko](https://github.com/shouko) +* [Sina Mashek](mailto:sina@mashek.xyz) * [sossii](https://github.com/sossii) +* [SpankyWorks](https://github.com/SpankyWorks) * [StefOfficiel](https://github.com/StefOfficiel) * [svetlik](https://github.com/svetlik) * [dereckson](https://github.com/dereckson) -* [theboss](https://github.com/theboss) +* [phaedryx](https://github.com/phaedryx) * [takp](https://github.com/takp) * [tkusano](https://github.com/tkusano) +* [TakesxiSximada](https://github.com/TakesxiSximada) * [TheInventrix](https://github.com/TheInventrix) * [shug0](https://github.com/shug0) * [Fortyseven](https://github.com/Fortyseven) * [tobypinder](https://github.com/tobypinder) * [tomosm](https://github.com/tomosm) * [TomoyaShibata](https://github.com/TomoyaShibata) -* [TrashMacNugget](https://github.com/TrashMacNugget) * [treyssatvincent](https://github.com/treyssatvincent) -* [optikfluffel](https://github.com/optikfluffel) -* [vmincev](https://github.com/vmincev) -* [waldyrious](https://github.com/waldyrious) -* [tahnok](https://github.com/tahnok) -* [YDrogen](https://github.com/YDrogen) -* [YOSHIOKAEiichiro](https://github.com/YOSHIOKAEiichiro) -* [S-YOU](https://github.com/S-YOU) -* [YaQ00](https://github.com/YaQ00) -* [yanakend](https://github.com/yanakend) -* [orzFly](https://github.com/orzFly) -* [chansuke](https://github.com/chansuke) -* [yuntan](https://github.com/yuntan) -* [LogicalDash](https://github.com/LogicalDash) -* [ZiiX](https://github.com/ZiiX) -* [benklop](https://github.com/benklop) -* [caasi](https://github.com/caasi) -* [caesarologia](https://github.com/caesarologia) -* [chrolis](https://github.com/chrolis) -* [cormojs](https://github.com/cormojs) -* [cpsdqs](https://github.com/cpsdqs) -* [d0p1s4m4](https://github.com/d0p1s4m4) -* [evilny0](https://github.com/evilny0) -* [febrezo](https://github.com/febrezo) -* [fsubal](https://github.com/fsubal) -* [dikky1218](https://github.com/dikky1218) -* [gentarok](https://github.com/gentarok) -* [hakoai](https://github.com/hakoai) -* [chaosbunker](https://github.com/chaosbunker) -* [isati](https://github.com/isati) -* [jkap](https://github.com/jkap) -* [jirayudech](https://github.com/jirayudech) -* [jukper](https://github.com/jukper) -* [karlyeurl](https://github.com/karlyeurl) -* [kedamaDQ](https://github.com/kedamaDQ) -* [kuro5hin](https://github.com/kuro5hin) -* [maxypy](https://github.com/maxypy) -* [marcus-herrmann](https://github.com/marcus-herrmann) -* [mshrtkch](https://github.com/mshrtkch) -* [muan](https://github.com/muan) -* [rch850](https://github.com/rch850) -* [roikale](https://github.com/roikale) -* [rysiekpl](https://github.com/rysiekpl) -* [saturday06](https://github.com/saturday06) -* [scriptjunkie](https://github.com/scriptjunkie) -* [seekr](https://github.com/seekr) -* [syui](https://github.com/syui) -* [tackeyy](https://github.com/tackeyy) -* [tmyt](https://github.com/tmyt) -* [utam0k](https://github.com/utam0k) -* [vpzomtrrfrt](https://github.com/vpzomtrrfrt) -* [walfie](https://github.com/walfie) -* [y-temp4](https://github.com/y-temp4) -* [ymmtmdk](https://github.com/ymmtmdk) +* [Udo Kramer](mailto:optik@fluffel.io) +* [Una](mailto:una@unascribed.com) +* [Ushitora Anqou](mailto:ushitora_anqou@yahoo.co.jp) +* [Valentin Lorentz](mailto:progval+git@progval.net) +* [Vladimir Mincev](mailto:vladimir@canicinteractive.com) +* [Waldir Pimenta](mailto:waldyrious@gmail.com) +* [Wesley Ellis](mailto:tahnok@gmail.com) +* [Wiktor](mailto:wiktor@metacode.biz) +* [Wonderfall](mailto:wonderfall@schrodinger.io) +* [YDrogen](mailto:ydrogen45@gmail.com) +* [YMHuang](mailto:ymhuang@fmbase.tw) +* [YOSHIOKA Eiichiro](mailto:yoshioka.eiichiro@gmail.com) +* [YOU](mailto:stackexchange.you@gmail.com) +* [YaQ](mailto:i_k_o_m_a_7@yahoo.co.jp) +* [Yanaken](mailto:yanakend@gmail.com) +* [Yann Klis](mailto:yann.klis@gmail.com) +* [Yeechan Lu](mailto:wz.bluesnow@gmail.com) +* [Yusuke Abe](mailto:moonset20@gmail.com) +* [Zachary Spector](mailto:logicaldash@gmail.com) +* [ZiiX](mailto:ziix@users.noreply.github.com) +* [asria-jp](mailto:is@alicematic.com) +* [ava](mailto:vladooku@users.noreply.github.com) +* [benklop](mailto:benklop@gmail.com) +* [bsky](mailto:git@imbsky.net) +* [caesarologia](mailto:lopesgemelli.1@gmail.com) +* [chrolis](mailto:chrolis@users.noreply.github.com) +* [cormo](mailto:cormorant2+github@gmail.com) +* [d0p1](mailto:dopi-sama@hush.com) +* [evilny0](mailto:evilny0@moomoocamp.net) +* [febrezo](mailto:felixbrezo@gmail.com) +* [fsubal](mailto:fsubal@users.noreply.github.com) +* [fusshi-](mailto:dikky1218@users.noreply.github.com) +* [gentaro](mailto:gentaroooo@gmail.com) +* [hakoai](mailto:hk--76@qa2.so-net.ne.jp) +* [haosbvnker](mailto:github@chaosbunker.com) +* [isati](mailto:phil@juchnowi.cz) +* [jenn kaplan](mailto:me@jkap.io) +* [jirayudech](mailto:jirayudech@gmail.com) +* [jukper](mailto:jukkaperanto@gmail.com) +* [jumoru](mailto:jumoru@mailbox.org) +* [karlyeurl](mailto:karl.yeurl@gmail.com) +* [kedama](mailto:32974885+kedamadq@users.noreply.github.com) +* [kuro5hin](mailto:rusty@kuro5hin.org) +* [maxypy](mailto:maxime@mpigou.fr) +* [mhe](mailto:mail@marcus-herrmann.com) +* [mimikun](mailto:dzdzble_effort_311@outlook.jp) +* [mshrtkch](mailto:mshrtkch@users.noreply.github.com) +* [muan](mailto:muan@github.com) +* [neetshin](mailto:neetshin@neetsh.in) +* [rch850](mailto:rich850@gmail.com) +* [roikale](mailto:roikale@users.noreply.github.com) +* [rysiekpl](mailto:rysiek@hackerspace.pl) +* [saturday06](mailto:dyob@lunaport.net) +* [scriptjunkie](mailto:scriptjunkie@scriptjunkie.us) +* [seekr](mailto:mario.drs@gmail.com) +* [sundevour](mailto:31990469+sundevour@users.noreply.github.com) +* [syui](mailto:syui@users.noreply.github.com) +* [tackeyy](mailto:mailto.takita.yusuke@gmail.com) +* [tateisu](mailto:tateisu@gmail.com) +* [tmyt](mailto:shigure@refy.net) +* [utam0k](mailto:k0ma@utam0k.jp) +* [vpzomtrrfrt](mailto:vpzomtrrfrt@gmail.com) +* [walfie](mailto:walfington@gmail.com) +* [y-temp4](mailto:y.temp4@gmail.com) +* [ymmtmdk](mailto:ymmtmdk@gmail.com) +* [yoshipc](mailto:yoooo@yoshipc.net) +* [Özcan Zafer AYAN](mailto:ozcanzaferayan@gmail.com) +* [ばん](mailto:detteiu0321@gmail.com) +* [みたらしだんご](mailto:mitarashidango@users.noreply.github.com) +* [りんすき](mailto:6533808+rinsuki@users.noreply.github.com) +* [ヨイツの賢狼ホロ | 3rd style](mailto:horo@yoitsu.moe) +* [猫吸血鬼ディフリス / 猫ロキP](mailto:deflis@gmail.com) +* [艮 鮟鱇](mailto:ushitora_anqou@yahoo.co.jp) +* [西小倉宏信](mailto:nishiko@mindia.jp) +* [雨宮美羽](mailto:k737566@gmail.com) This document is provided for informational purposes only. Since it is only updated once per release, the version you are looking at may be currently out of date. To see the full list of contributors, consider looking at the [git history](https://github.com/tootsuite/mastodon/graphs/contributors) instead. diff --git a/Aptfile b/Aptfile index 60d24f8b3..0a01fa24b 100644 --- a/Aptfile +++ b/Aptfile @@ -10,3 +10,20 @@ libxdamage1 libxfixes3 protobuf-compiler zlib1g-dev +libcairo2 +libcroco3 +libdatrie1 +libgdk-pixbuf2.0-0 +libgraphite2-3 +libharfbuzz0b +libpango-1.0-0 +libpangocairo-1.0-0 +libpangoft2-1.0-0 +libpixman-1-0 +librsvg2-2 +libthai-data +libthai0 +libvpx5 +libxcb-render0 +libxcb-shm0 +libxrender1 diff --git a/Gemfile b/Gemfile index 356081dbf..27d65f272 100644 --- a/Gemfile +++ b/Gemfile @@ -34,7 +34,7 @@ gem 'devise', '~> 4.4' gem 'devise-two-factor', '~> 3.0' group :pam_authentication, optional: true do - gem 'devise_pam_authenticatable2', '~> 9.1' + gem 'devise_pam_authenticatable2', '~> 9.2' end gem 'net-ldap', '~> 0.10' @@ -88,7 +88,7 @@ gem 'tty-command', '~> 0.8', require: false gem 'tty-prompt', '~> 0.16', require: false gem 'twitter-text', '~> 1.14' gem 'tzinfo-data', '~> 1.2018' -gem 'webpacker', '~> 3.4' +gem 'webpacker', '~> 3.5' gem 'webpush' gem 'json-ld', '~> 2.2' diff --git a/Gemfile.lock b/Gemfile.lock index 8eda89d12..e4e1c69df 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -174,7 +174,7 @@ GEM devise (~> 4.0) railties (< 5.3) rotp (~> 2.0) - devise_pam_authenticatable2 (9.1.1) + devise_pam_authenticatable2 (9.2.0) devise (>= 4.0.0) rpam2 (~> 4.0) diff-lcs (1.3) @@ -629,7 +629,7 @@ GEM addressable (>= 2.3.6) crack (>= 0.3.2) hashdiff - webpacker (3.4.3) + webpacker (3.5.5) activesupport (>= 4.2) rack-proxy (>= 0.6.1) railties (>= 4.2) @@ -671,7 +671,7 @@ DEPENDENCIES derailed_benchmarks devise (~> 4.4) devise-two-factor (~> 3.0) - devise_pam_authenticatable2 (~> 9.1) + devise_pam_authenticatable2 (~> 9.2) doorkeeper (~> 5.0) dotenv-rails (~> 2.2, < 2.3) fabrication (~> 2.20) @@ -761,7 +761,7 @@ DEPENDENCIES twitter-text (~> 1.14) tzinfo-data (~> 1.2018) webmock (~> 3.3) - webpacker (~> 3.4) + webpacker (~> 3.5) webpush RUBY VERSION diff --git a/README.md b/README.md index e65ebcc37..4e10cbcd7 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ![Mastodon](https://i.imgur.com/NhZc40l.png) ======== -[![Build Status](https://img.shields.io/circleci/project/github/tootsuite/mastodon.svg)][circleci] +[![Build Status](https://img.shields.io/circleci/project/github/glitch-soc/mastodon.svg)][circleci] [circleci]: https://circleci.com/gh/glitch-soc/mastodon Mastodon is a **free, open-source social network server** based on **open web protocols** like ActivityPub and OStatus. The social focus of the project is a viable decentralized alternative to commercial social media silos that returns the control of the content distribution channels to the people. The technical focus of the project is a good user interface, a clean REST API for 3rd party apps and robust anti-abuse tools. diff --git a/Vagrantfile b/Vagrantfile index ee45d1d16..a30ba2b34 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -85,6 +85,9 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.provider :virtualbox do |vb| vb.name = "mastodon" vb.customize ["modifyvm", :id, "--memory", "4096"] + # Increase the number of CPUs. Uncomment and adjust to + # increase performance + # vb.customize ["modifyvm", :id, "--cpus", "3"] # Disable VirtualBox DNS proxy to skip long-delay IPv6 resolutions. # https://github.com/mitchellh/vagrant/issues/1172 @@ -97,19 +100,22 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| end - config.vm.hostname = "mastodon.dev" - # This uses the vagrant-hostsupdater plugin, and lets you - # access the development site at http://mastodon.dev. + # access the development site at http://mastodon.local. + # If you change it, also change it in .env.vagrant before provisioning + # the vagrant server to update the development build. + # # To install: # $ vagrant plugin install vagrant-hostsupdater + config.vm.hostname = "mastodon.local" + if defined?(VagrantPlugins::HostsUpdater) config.vm.network :private_network, ip: "192.168.42.42", nictype: "virtio" config.hostsupdater.remove_on_suspend = false end if config.vm.networks.any? { |type, options| type == :private_network } - config.vm.synced_folder ".", "/vagrant", type: "nfs", mount_options: ['rw', 'vers=3', 'tcp'] + config.vm.synced_folder ".", "/vagrant", type: "nfs", mount_options: ['rw', 'vers=3', 'tcp', 'actimeo=1'] else config.vm.synced_folder ".", "/vagrant" end diff --git a/app/controllers/api/base_controller.rb b/app/controllers/api/base_controller.rb index 0b3735087..90f42251e 100644 --- a/app/controllers/api/base_controller.rb +++ b/app/controllers/api/base_controller.rb @@ -53,10 +53,6 @@ class Api::BaseController < ApplicationController [params[:limit].to_i.abs, default_limit * 2].min end - def truthy_param?(key) - ActiveModel::Type::Boolean.new.cast(params[key]) - end - def current_resource_owner @current_user ||= User.find(doorkeeper_token.resource_owner_id) if doorkeeper_token end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 8ffc31bb4..dca6c5a5a 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -128,6 +128,10 @@ class ApplicationController < ActionController::Base protected + def truthy_param?(key) + ActiveModel::Type::Boolean.new.cast(params[key]) + end + def forbidden respond_with_error(403) end diff --git a/app/controllers/auth/sessions_controller.rb b/app/controllers/auth/sessions_controller.rb index 7cd46662f..d4a659409 100644 --- a/app/controllers/auth/sessions_controller.rb +++ b/app/controllers/auth/sessions_controller.rb @@ -11,6 +11,7 @@ class Auth::SessionsController < Devise::SessionsController prepend_before_action :set_pack before_action :set_instance_presenter, only: [:new] before_action :set_body_classes + after_action :clear_site_data, only: [:destroy] def new Devise.omniauth_configs.each do |provider, config| @@ -28,8 +29,10 @@ class Auth::SessionsController < Devise::SessionsController end def destroy + tmp_stored_location = stored_location_for(:user) super flash.delete(:notice) + store_location_for(:user, tmp_stored_location) if continue_after? end protected @@ -126,4 +129,16 @@ class Auth::SessionsController < Devise::SessionsController end paths end + + def clear_site_data + return if continue_after? + + # Should be '"*"' but that doesn't work in Chrome (neither does '"executionContexts"') + # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Clear-Site-Data + response.headers['Clear-Site-Data'] = '"cache", "cookies"' + end + + def continue_after? + truthy_param?(:continue) + end end diff --git a/app/controllers/oauth/authorizations_controller.rb b/app/controllers/oauth/authorizations_controller.rb index eb977510b..f6f5d1ecc 100644 --- a/app/controllers/oauth/authorizations_controller.rb +++ b/app/controllers/oauth/authorizations_controller.rb @@ -18,4 +18,18 @@ class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController def set_pack use_pack 'auth' end + + def render_success + if skip_authorization? || (matching_token? && !truthy_param?('force_login')) + redirect_or_render authorize_response + elsif Doorkeeper.configuration.api_only + render json: pre_auth + else + render :new + end + end + + def truthy_param?(key) + ActiveModel::Type::Boolean.new.cast(params[key]) + end end diff --git a/app/helpers/admin/account_moderation_notes_helper.rb b/app/helpers/admin/account_moderation_notes_helper.rb index 25586fbba..4d8f0352e 100644 --- a/app/helpers/admin/account_moderation_notes_helper.rb +++ b/app/helpers/admin/account_moderation_notes_helper.rb @@ -4,7 +4,7 @@ module Admin::AccountModerationNotesHelper def admin_account_link_to(account) return if account.nil? - link_to admin_account_path(account.id), class: name_tag_classes(account) do + link_to admin_account_path(account.id), class: name_tag_classes(account), title: account.acct do safe_join([ image_tag(account.avatar.url, width: 15, height: 15, alt: display_name(account), class: 'avatar'), content_tag(:span, account.acct, class: 'username'), @@ -15,7 +15,7 @@ module Admin::AccountModerationNotesHelper def admin_account_inline_link_to(account) return if account.nil? - link_to admin_account_path(account.id), class: name_tag_classes(account, true) do + link_to admin_account_path(account.id), class: name_tag_classes(account, true), title: account.acct do content_tag(:span, account.acct, class: 'username') end end diff --git a/app/helpers/home_helper.rb b/app/helpers/home_helper.rb index f5b501235..ba7c443c2 100644 --- a/app/helpers/home_helper.rb +++ b/app/helpers/home_helper.rb @@ -7,13 +7,13 @@ module HomeHelper } end - def account_link_to(account, button = '') + def account_link_to(account, button = '', size: 36, path: nil) content_tag(:div, class: 'account') do content_tag(:div, class: 'account__wrapper') do section = if account.nil? content_tag(:div, class: 'account__display-name') do content_tag(:div, class: 'account__avatar-wrapper') do - content_tag(:div, '', class: 'account__avatar', style: "background-image: url(#{full_asset_url('avatars/original/missing.png', skip_pipeline: true)})") + content_tag(:div, '', class: 'account__avatar', style: "width: #{size}px; height: #{size}px; background-size: #{size}px #{size}px; background-image: url(#{full_asset_url('avatars/original/missing.png', skip_pipeline: true)})") end + content_tag(:span, class: 'display-name') do content_tag(:strong, t('about.contact_missing')) + @@ -21,9 +21,9 @@ module HomeHelper end end else - link_to(TagManager.instance.url_for(account), class: 'account__display-name') do + link_to(path || TagManager.instance.url_for(account), class: 'account__display-name') do content_tag(:div, class: 'account__avatar-wrapper') do - content_tag(:div, '', class: 'account__avatar', style: "background-image: url(#{account.avatar.url})") + content_tag(:div, '', class: 'account__avatar', style: "width: #{size}px; height: #{size}px; background-size: #{size}px #{size}px; background-image: url(#{account.avatar.url})") end + content_tag(:span, class: 'display-name') do content_tag(:bdi) do @@ -48,4 +48,12 @@ module HomeHelper '1+' end end + + def custom_field_classes(field) + if field.verified? + 'verified' + else + 'emojify' + end + end end diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb index fc03fcf82..ed873ceed 100644 --- a/app/helpers/settings_helper.rb +++ b/app/helpers/settings_helper.rb @@ -8,6 +8,7 @@ module SettingsHelper bg: 'Български', ca: 'Català', co: 'Corsu', + cs: 'Čeština', cy: 'Cymraeg', da: 'Dansk', de: 'Deutsch', diff --git a/app/javascript/core/settings.js b/app/javascript/core/settings.js index e48fcb9b1..377c899dc 100644 --- a/app/javascript/core/settings.js +++ b/app/javascript/core/settings.js @@ -50,3 +50,27 @@ delegate(document, '#account_locked', 'change', ({ target }) => { lock.style.display = 'none'; } }); + +delegate(document, '.input-copy input', 'click', ({ target }) => { + target.select(); +}); + +delegate(document, '.input-copy button', 'click', ({ target }) => { + const input = target.parentNode.querySelector('input'); + + input.focus(); + input.select(); + + try { + if (document.execCommand('copy')) { + input.blur(); + target.parentNode.classList.add('copied'); + + setTimeout(() => { + target.parentNode.classList.remove('copied'); + }, 700); + } + } catch (err) { + console.error(err); + } +}); diff --git a/app/javascript/flavours/glitch/actions/dropdown_menu.js b/app/javascript/flavours/glitch/actions/dropdown_menu.js index 217ba4e74..14f2939c7 100644 --- a/app/javascript/flavours/glitch/actions/dropdown_menu.js +++ b/app/javascript/flavours/glitch/actions/dropdown_menu.js @@ -1,8 +1,8 @@ export const DROPDOWN_MENU_OPEN = 'DROPDOWN_MENU_OPEN'; export const DROPDOWN_MENU_CLOSE = 'DROPDOWN_MENU_CLOSE'; -export function openDropdownMenu(id, placement) { - return { type: DROPDOWN_MENU_OPEN, id, placement }; +export function openDropdownMenu(id, placement, keyboard) { + return { type: DROPDOWN_MENU_OPEN, id, placement, keyboard }; } export function closeDropdownMenu(id) { diff --git a/app/javascript/flavours/glitch/actions/notifications.js b/app/javascript/flavours/glitch/actions/notifications.js index e88eda78f..fb84cd01e 100644 --- a/app/javascript/flavours/glitch/actions/notifications.js +++ b/app/javascript/flavours/glitch/actions/notifications.js @@ -25,6 +25,11 @@ export const NOTIFICATIONS_EXPAND_FAIL = 'NOTIFICATIONS_EXPAND_FAIL'; export const NOTIFICATIONS_CLEAR = 'NOTIFICATIONS_CLEAR'; export const NOTIFICATIONS_SCROLL_TOP = 'NOTIFICATIONS_SCROLL_TOP'; +export const NOTIFICATIONS_MOUNT = 'NOTIFICATIONS_MOUNT'; +export const NOTIFICATIONS_UNMOUNT = 'NOTIFICATIONS_UNMOUNT'; + +export const NOTIFICATIONS_SET_VISIBILITY = 'NOTIFICATIONS_SET_VISIBILITY'; + defineMessages({ mention: { id: 'notification.mention', defaultMessage: '{name} mentioned you' }, }); @@ -216,3 +221,22 @@ export function deleteMarkedNotificationsSuccess() { type: NOTIFICATIONS_DELETE_MARKED_SUCCESS, }; }; + +export function mountNotifications() { + return { + type: NOTIFICATIONS_MOUNT, + }; +}; + +export function unmountNotifications() { + return { + type: NOTIFICATIONS_UNMOUNT, + }; +}; + +export function notificationsSetVisibility(visibility) { + return { + type: NOTIFICATIONS_SET_VISIBILITY, + visibility: visibility, + }; +}; diff --git a/app/javascript/flavours/glitch/components/column.js b/app/javascript/flavours/glitch/components/column.js index 57c4c7a40..dc87818a5 100644 --- a/app/javascript/flavours/glitch/components/column.js +++ b/app/javascript/flavours/glitch/components/column.js @@ -9,6 +9,7 @@ export default class Column extends React.PureComponent { children: PropTypes.node, extraClasses: PropTypes.string, name: PropTypes.string, + label: PropTypes.string, }; scrollTop () { @@ -42,10 +43,10 @@ export default class Column extends React.PureComponent { } render () { - const { children, extraClasses, name } = this.props; + const { children, extraClasses, name, label } = this.props; return ( - <div role='region' data-column={name} className={`column ${extraClasses || ''}`} ref={this.setRef}> + <div role='region' aria-label={label} data-column={name} className={`column ${extraClasses || ''}`} ref={this.setRef}> {children} </div> ); diff --git a/app/javascript/flavours/glitch/components/dropdown_menu.js b/app/javascript/flavours/glitch/components/dropdown_menu.js index 1c2b0bf25..05611c135 100644 --- a/app/javascript/flavours/glitch/components/dropdown_menu.js +++ b/app/javascript/flavours/glitch/components/dropdown_menu.js @@ -23,6 +23,7 @@ class DropdownMenu extends React.PureComponent { placement: PropTypes.string, arrowOffsetLeft: PropTypes.string, arrowOffsetTop: PropTypes.string, + openedViaKeyboard: PropTypes.bool, }; static defaultProps = { @@ -42,13 +43,15 @@ class DropdownMenu extends React.PureComponent { componentDidMount () { document.addEventListener('click', this.handleDocumentClick, false); + document.addEventListener('keydown', this.handleKeyDown, false); document.addEventListener('touchend', this.handleDocumentClick, listenerOptions); - if (this.focusedItem) this.focusedItem.focus(); + if (this.focusedItem && this.props.openedViaKeyboard) this.focusedItem.focus(); this.setState({ mounted: true }); } componentWillUnmount () { document.removeEventListener('click', this.handleDocumentClick, false); + document.removeEventListener('keydown', this.handleKeyDown, false); document.removeEventListener('touchend', this.handleDocumentClick, listenerOptions); } @@ -62,13 +65,10 @@ class DropdownMenu extends React.PureComponent { handleKeyDown = e => { const items = Array.from(this.node.getElementsByTagName('a')); - const index = items.indexOf(e.currentTarget); + const index = items.indexOf(document.activeElement); let element; switch(e.key) { - case 'Enter': - this.handleClick(e); - break; case 'ArrowDown': element = items[index+1]; if (element) { @@ -96,6 +96,12 @@ class DropdownMenu extends React.PureComponent { } } + handleItemKeyDown = e => { + if (e.key === 'Enter') { + this.handleClick(e); + } + } + handleClick = e => { const i = Number(e.currentTarget.getAttribute('data-index')); const { action, to } = this.props.items[i]; @@ -120,7 +126,7 @@ class DropdownMenu extends React.PureComponent { return ( <li className='dropdown-menu__item' key={`${text}-${i}`}> - <a href={href} target='_blank' rel='noopener' role='button' tabIndex='0' ref={i === 0 ? this.setFocusRef : null} onClick={this.handleClick} onKeyDown={this.handleKeyDown} data-index={i}> + <a href={href} target='_blank' rel='noopener' role='button' tabIndex='0' ref={i === 0 ? this.setFocusRef : null} onClick={this.handleClick} onKeyDown={this.handleItemKeyDown} data-index={i}> {text} </a> </li> @@ -170,6 +176,7 @@ export default class Dropdown extends React.PureComponent { onClose: PropTypes.func.isRequired, dropdownPlacement: PropTypes.string, openDropdownId: PropTypes.number, + openedViaKeyboard: PropTypes.bool, }; static defaultProps = { @@ -180,14 +187,14 @@ export default class Dropdown extends React.PureComponent { id: id++, }; - handleClick = ({ target }) => { + handleClick = ({ target, type }) => { if (this.state.id === this.props.openDropdownId) { this.handleClose(); } else { const { top } = target.getBoundingClientRect(); const placement = top * 2 < innerHeight ? 'bottom' : 'top'; - this.props.onOpen(this.state.id, this.handleItemClick, placement); + this.props.onOpen(this.state.id, this.handleItemClick, placement, type !== 'click'); } } @@ -197,6 +204,11 @@ export default class Dropdown extends React.PureComponent { handleKeyDown = e => { switch(e.key) { + case ' ': + case 'Enter': + this.handleClick(e); + e.preventDefault(); + break; case 'Escape': this.handleClose(); break; @@ -232,7 +244,7 @@ export default class Dropdown extends React.PureComponent { } render () { - const { icon, items, size, ariaLabel, disabled, dropdownPlacement, openDropdownId } = this.props; + const { icon, items, size, ariaLabel, disabled, dropdownPlacement, openDropdownId, openedViaKeyboard } = this.props; const open = this.state.id === openDropdownId; return ( @@ -248,7 +260,7 @@ export default class Dropdown extends React.PureComponent { /> <Overlay show={open} placement={dropdownPlacement} target={this.findTarget}> - <DropdownMenu items={items} onClose={this.handleClose} /> + <DropdownMenu items={items} onClose={this.handleClose} openedViaKeyboard={openedViaKeyboard} /> </Overlay> </div> ); diff --git a/app/javascript/flavours/glitch/components/intersection_observer_article.js b/app/javascript/flavours/glitch/components/intersection_observer_article.js index f7f6b0a53..6eeca5598 100644 --- a/app/javascript/flavours/glitch/components/intersection_observer_article.js +++ b/app/javascript/flavours/glitch/components/intersection_observer_article.js @@ -107,7 +107,7 @@ export default class IntersectionObserverArticle extends ImmutablePureComponent return ( <article ref={this.handleRef} - aria-posinset={index} + aria-posinset={index + 1} aria-setsize={listLength} style={{ height: `${this.height || cachedHeight}px`, opacity: 0, overflow: 'hidden' }} data-id={id} @@ -119,7 +119,7 @@ export default class IntersectionObserverArticle extends ImmutablePureComponent } return ( - <article ref={this.handleRef} aria-posinset={index} aria-setsize={listLength} data-id={id} tabIndex='0'> + <article ref={this.handleRef} aria-posinset={index + 1} aria-setsize={listLength} data-id={id} tabIndex='0'> {children && React.cloneElement(children, { hidden: false })} </article> ); diff --git a/app/javascript/flavours/glitch/components/media_gallery.js b/app/javascript/flavours/glitch/components/media_gallery.js index 1de12c5e0..605a2862b 100644 --- a/app/javascript/flavours/glitch/components/media_gallery.js +++ b/app/javascript/flavours/glitch/components/media_gallery.js @@ -78,6 +78,11 @@ class Item extends React.PureComponent { e.stopPropagation(); } + handleMouseDown = (e) => { + e.preventDefault(); + e.stopPropagation(); + } + render () { const { attachment, index, size, standalone, letterbox, displayWidth } = this.props; @@ -181,6 +186,7 @@ class Item extends React.PureComponent { onClick={this.handleClick} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave} + onMouseDown={this.handleMouseDown} autoPlay={autoPlay} loop muted diff --git a/app/javascript/flavours/glitch/components/status.js b/app/javascript/flavours/glitch/components/status.js index f3709f653..665aa457a 100644 --- a/app/javascript/flavours/glitch/components/status.js +++ b/app/javascript/flavours/glitch/components/status.js @@ -7,7 +7,7 @@ import StatusIcons from './status_icons'; import StatusContent from './status_content'; import StatusActionBar from './status_action_bar'; import AttachmentList from './attachment_list'; -import { FormattedMessage } from 'react-intl'; +import { injectIntl, FormattedMessage } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { MediaGallery, Video } from 'flavours/glitch/util/async-components'; import { HotKeys } from 'react-hotkeys'; @@ -19,6 +19,24 @@ import { autoUnfoldCW } from 'flavours/glitch/util/content_warning'; // to use the progress bar to show download progress import Bundle from '../features/ui/components/bundle'; +export const textForScreenReader = (intl, status, rebloggedByText = false, expanded = false) => { + const displayName = status.getIn(['account', 'display_name']); + + const values = [ + displayName.length === 0 ? status.getIn(['account', 'acct']).split('@')[0] : displayName, + status.get('spoiler_text') && !expanded ? status.get('spoiler_text') : status.get('search_index').slice(status.get('spoiler_text').length), + intl.formatDate(status.get('created_at'), { hour: '2-digit', minute: '2-digit', month: 'short', day: 'numeric' }), + status.getIn(['account', 'acct']), + ]; + + if (rebloggedByText) { + values.push(rebloggedByText); + } + + return values.join(', '); +}; + +@injectIntl export default class Status extends ImmutablePureComponent { static contextTypes = { @@ -52,6 +70,7 @@ export default class Status extends ImmutablePureComponent { getScrollPosition: PropTypes.func, updateScrollBottom: PropTypes.func, expanded: PropTypes.bool, + intl: PropTypes.object.isRequired, }; state = { @@ -337,6 +356,7 @@ export default class Status extends ImmutablePureComponent { } = this; const { router } = this.context; const { + intl, status, account, settings, @@ -474,6 +494,12 @@ export default class Status extends ImmutablePureComponent { selectorAttribs[`data-${notifKind}-by`] = `@${account.get('acct')}`; } + let rebloggedByText; + + if (prepend === 'reblog') { + rebloggedByText = intl.formatMessage({ id: 'status.reblogged_by', defaultMessage: '{name} boosted' }, { name: account.get('acct') }); + } + const handlers = { reply: this.handleHotkeyReply, favourite: this.handleHotkeyFavourite, @@ -502,6 +528,7 @@ export default class Status extends ImmutablePureComponent { ref={handleRef} tabIndex='0' data-featured={featured ? 'true' : null} + aria-label={textForScreenReader(intl, status, rebloggedByText, !status.get('hidden'))} > <header className='status__info'> <span> @@ -539,7 +566,7 @@ export default class Status extends ImmutablePureComponent { parseClick={parseClick} disabled={!router} /> - {!isCollapsed || !muted ? ( + {!isCollapsed || !(muted || !settings.getIn(['collapsed', 'show_action_bar'])) ? ( <StatusActionBar {...other} status={status} diff --git a/app/javascript/flavours/glitch/containers/dropdown_menu_container.js b/app/javascript/flavours/glitch/containers/dropdown_menu_container.js index dccd93dab..b2419a0fd 100644 --- a/app/javascript/flavours/glitch/containers/dropdown_menu_container.js +++ b/app/javascript/flavours/glitch/containers/dropdown_menu_container.js @@ -8,20 +8,21 @@ const mapStateToProps = state => ({ isModalOpen: state.get('modal').modalType === 'ACTIONS', dropdownPlacement: state.getIn(['dropdown_menu', 'placement']), openDropdownId: state.getIn(['dropdown_menu', 'openId']), + openedViaKeyboard: state.getIn(['dropdown_menu', 'keyboard']), }); const mapDispatchToProps = (dispatch, { status, items }) => ({ - onOpen(id, onItemClick, dropdownPlacement) { + onOpen(id, onItemClick, dropdownPlacement, keyboard) { dispatch(isUserTouching() ? openModal('ACTIONS', { status, actions: items.map( (item, i) => item ? { ...item, name: `${item.text}-${i}`, - onClick: (e) => { return onItemClick(i, e) }, + onClick: item.action ? ((e) => { return onItemClick(i, e) }) : null, } : null ), - }) : openDropdownMenu(id, dropdownPlacement)); + }) : openDropdownMenu(id, dropdownPlacement, keyboard)); }, onClose(id) { dispatch(closeModal()); diff --git a/app/javascript/flavours/glitch/features/account/components/action_bar.js b/app/javascript/flavours/glitch/features/account/components/action_bar.js index 26717ee49..3d6eeb06a 100644 --- a/app/javascript/flavours/glitch/features/account/components/action_bar.js +++ b/app/javascript/flavours/glitch/features/account/components/action_bar.js @@ -2,7 +2,7 @@ import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container'; -import { Link } from 'react-router-dom'; +import { NavLink } from 'react-router-dom'; import { defineMessages, injectIntl, FormattedMessage, FormattedNumber } from 'react-intl'; import { me, isStaff } from 'flavours/glitch/util/initial_state'; @@ -52,6 +52,13 @@ export default class ActionBar extends React.PureComponent { }); } + isStatusesPageActive = (match, location) => { + if (!match) { + return false; + } + return !location.pathname.match(/\/(followers|following)\/?$/); + } + render () { const { account, intl } = this.props; @@ -136,20 +143,20 @@ export default class ActionBar extends React.PureComponent { </div> <div className='account__action-bar-links'> - <Link className='account__action-bar__tab' to={`/accounts/${account.get('id')}`}> + <NavLink isActive={this.isStatusesPageActive} activeClassName='active' className='account__action-bar__tab' to={`/accounts/${account.get('id')}`}> <FormattedMessage id='account.posts' defaultMessage='Posts' /> <strong><FormattedNumber value={account.get('statuses_count')} /></strong> - </Link> + </NavLink> - <Link className='account__action-bar__tab' to={`/accounts/${account.get('id')}/following`}> + <NavLink exact activeClassName='active' className='account__action-bar__tab' to={`/accounts/${account.get('id')}/following`}> <FormattedMessage id='account.follows' defaultMessage='Follows' /> <strong><FormattedNumber value={account.get('following_count')} /></strong> - </Link> + </NavLink> - <Link className='account__action-bar__tab' to={`/accounts/${account.get('id')}/followers`}> + <NavLink exact activeClassName='active' className='account__action-bar__tab' to={`/accounts/${account.get('id')}/followers`}> <FormattedMessage id='account.followers' defaultMessage='Followers' /> <strong><FormattedNumber value={account.get('followers_count')} /></strong> - </Link> + </NavLink> </div> </div> </div> diff --git a/app/javascript/flavours/glitch/features/account/components/header.js b/app/javascript/flavours/glitch/features/account/components/header.js index eda0d637e..f0d36947d 100644 --- a/app/javascript/flavours/glitch/features/account/components/header.js +++ b/app/javascript/flavours/glitch/features/account/components/header.js @@ -15,8 +15,19 @@ const messages = defineMessages({ follow: { id: 'account.follow', defaultMessage: 'Follow' }, requested: { id: 'account.requested', defaultMessage: 'Awaiting approval. Click to cancel follow request' }, unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' }, + edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' }, + link_verified_on: { id: 'account.link_verified_on', defaultMessage: 'Ownership of this link was checked on {date}' }, }); +const dateFormatOptions = { + month: 'short', + day: 'numeric', + year: 'numeric', + hour12: false, + hour: '2-digit', + minute: '2-digit', +}; + @injectIntl export default class Header extends ImmutablePureComponent { @@ -27,6 +38,10 @@ export default class Header extends ImmutablePureComponent { intl: PropTypes.object.isRequired, }; + openEditProfile = () => { + window.open('/settings/profile', '_blank'); + } + render () { const { account, intl } = this.props; @@ -77,6 +92,12 @@ export default class Header extends ImmutablePureComponent { </div> ); } + } else { + actionBtn = ( + <div className='account--action-button'> + <IconButton size={26} icon='pencil' title={intl.formatMessage(messages.edit_profile)} onClick={this.openEditProfile} /> + </div> + ); } if (account.get('moved') && !account.getIn(['relationship', 'following'])) { @@ -111,7 +132,9 @@ export default class Header extends ImmutablePureComponent { {fields.map((pair, i) => ( <dl key={i}> <dt dangerouslySetInnerHTML={{ __html: pair.get('name_emojified') }} title={pair.get('name')} /> - <dd dangerouslySetInnerHTML={{ __html: pair.get('value_emojified') }} title={pair.get('value_plain')} /> + <dd className={pair.get('verified_at') && 'verified'} title={pair.get('value_plain')}> + {pair.get('verified_at') && <span title={intl.formatMessage(messages.link_verified_on, { date: intl.formatDate(pair.get('verified_at'), dateFormatOptions) })}><i className='fa fa-check verified__mark' /></span>} <span dangerouslySetInnerHTML={{ __html: pair.get('value_emojified') }} /> + </dd> </dl> ))} </div> diff --git a/app/javascript/flavours/glitch/features/community_timeline/index.js b/app/javascript/flavours/glitch/features/community_timeline/index.js index b5843ca16..ddcca2dc0 100644 --- a/app/javascript/flavours/glitch/features/community_timeline/index.js +++ b/app/javascript/flavours/glitch/features/community_timeline/index.js @@ -76,7 +76,7 @@ export default class CommunityTimeline extends React.PureComponent { const pinned = !!columnId; return ( - <Column ref={this.setRef} name='local'> + <Column ref={this.setRef} name='local' label={intl.formatMessage(messages.title)}> <ColumnHeader icon='users' active={hasUnread} diff --git a/app/javascript/flavours/glitch/features/composer/index.js b/app/javascript/flavours/glitch/features/composer/index.js index 77f9ee0c1..257797047 100644 --- a/app/javascript/flavours/glitch/features/composer/index.js +++ b/app/javascript/flavours/glitch/features/composer/index.js @@ -102,6 +102,7 @@ function mapStateToProps (state) { anyMedia: state.getIn(['compose', 'media_attachments']).size > 0, spoilersAlwaysOn: spoilersAlwaysOn, mediaDescriptionConfirmation: state.getIn(['local_settings', 'confirm_missing_media_description']), + preselectOnReply: state.getIn(['local_settings', 'preselect_on_reply']), }; }; @@ -146,7 +147,7 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ onMount() { dispatch(mountCompose()); }, - onOpenActionModal(props) { + onOpenActionsModal(props) { dispatch(openModal('ACTIONS', props)); }, onOpenDoodleModal() { @@ -242,7 +243,7 @@ const handlers = { } // Submit disabled: - if (isSubmitting || isUploading || (!!text.length && !text.trim().length && !anyMedia)) { + if (isSubmitting || isUploading || (!text.trim().length && !anyMedia)) { return; } @@ -328,13 +329,14 @@ class Composer extends React.Component { isSubmitting, preselectDate, text, + preselectOnReply, } = this.props; let selectionEnd, selectionStart; // Caret/selection handling. if (focusDate !== prevProps.focusDate) { switch (true) { - case preselectDate !== prevProps.preselectDate: + case preselectDate !== prevProps.preselectDate && preselectOnReply: selectionStart = text.search(/\s/) + 1; selectionEnd = text.length; break; @@ -347,6 +349,7 @@ class Composer extends React.Component { if (textarea) { textarea.setSelectionRange(selectionStart, selectionEnd); textarea.focus(); + textarea.scrollIntoView(); } // Refocuses the textarea after submitting. @@ -415,7 +418,7 @@ class Composer extends React.Component { spoilersAlwaysOn, } = this.props; - let disabledButton = isSubmitting || isUploading || (!!text.length && !text.trim().length && !anyMedia); + let disabledButton = isSubmitting || isUploading || (!text.trim().length && !anyMedia); return ( <div className='composer'> @@ -533,6 +536,7 @@ Composer.propTypes = { anyMedia: PropTypes.bool, spoilersAlwaysOn: PropTypes.bool, mediaDescriptionConfirmation: PropTypes.bool, + preselectOnReply: PropTypes.bool, // Dispatch props. onCancelReply: PropTypes.func, diff --git a/app/javascript/flavours/glitch/features/direct_timeline/index.js b/app/javascript/flavours/glitch/features/direct_timeline/index.js index 418db7c79..dc7e0534d 100644 --- a/app/javascript/flavours/glitch/features/direct_timeline/index.js +++ b/app/javascript/flavours/glitch/features/direct_timeline/index.js @@ -76,7 +76,7 @@ export default class DirectTimeline extends React.PureComponent { const pinned = !!columnId; return ( - <Column ref={this.setRef}> + <Column ref={this.setRef} label={intl.formatMessage(messages.title)}> <ColumnHeader icon='envelope' active={hasUnread} diff --git a/app/javascript/flavours/glitch/features/drawer/header/index.js b/app/javascript/flavours/glitch/features/drawer/header/index.js index deec42435..7fefd32c9 100644 --- a/app/javascript/flavours/glitch/features/drawer/header/index.js +++ b/app/javascript/flavours/glitch/features/drawer/header/index.js @@ -46,6 +46,8 @@ const messages = defineMessages({ // The component. export default function DrawerHeader ({ columns, + unreadNotifications, + showNotificationsBadge, intl, onSettingsClick, }) { @@ -77,7 +79,12 @@ export default function DrawerHeader ({ aria-label={intl.formatMessage(messages.notifications)} title={intl.formatMessage(messages.notifications)} to='/notifications' - ><Icon icon='bell' /></Link> + > + <span className='icon-badge-wrapper'> + <Icon icon='bell' /> + { showNotificationsBadge && unreadNotifications > 0 && <div className='icon-badge' />} + </span> + </Link> ))} {renderForColumn('COMMUNITY', ( <Link @@ -112,6 +119,8 @@ export default function DrawerHeader ({ // Props. DrawerHeader.propTypes = { columns: ImmutablePropTypes.list, + unreadNotifications: PropTypes.number, + showNotificationsBadge: PropTypes.bool, intl: PropTypes.object, onSettingsClick: PropTypes.func, }; diff --git a/app/javascript/flavours/glitch/features/drawer/index.js b/app/javascript/flavours/glitch/features/drawer/index.js index 4649e404f..038a2513e 100644 --- a/app/javascript/flavours/glitch/features/drawer/index.js +++ b/app/javascript/flavours/glitch/features/drawer/index.js @@ -2,6 +2,7 @@ import PropTypes from 'prop-types'; import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; +import { defineMessages } from 'react-intl'; import classNames from 'classnames'; // Actions. @@ -25,6 +26,11 @@ import DrawerSearch from './search'; import { me } from 'flavours/glitch/util/initial_state'; import { wrap } from 'flavours/glitch/util/redux_helpers'; +// Messages. +const messages = defineMessages({ + compose: { id: 'navigation_bar.compose', defaultMessage: 'Compose new toot' }, +}); + // State mapping. const mapStateToProps = state => ({ account: state.getIn(['accounts', me]), @@ -34,6 +40,8 @@ const mapStateToProps = state => ({ searchHidden: state.getIn(['search', 'hidden']), searchValue: state.getIn(['search', 'value']), submitted: state.getIn(['search', 'submitted']), + unreadNotifications: state.getIn(['notifications', 'unread']), + showNotificationsBadge: state.getIn(['local_settings', 'notifications', 'tab_badge']), }); // Dispatch mapping. @@ -87,15 +95,19 @@ class Drawer extends React.Component { searchValue, submitted, isSearchPage, + unreadNotifications, + showNotificationsBadge, } = this.props; const computedClass = classNames('drawer', `mbstobon-${elefriend}`); // The result. return ( - <div className={computedClass}> + <div className={computedClass} role='region' aria-label={intl.formatMessage(messages.compose)}> {multiColumn ? ( <DrawerHeader columns={columns} + unreadNotifications={unreadNotifications} + showNotificationsBadge={showNotificationsBadge} intl={intl} onSettingsClick={onOpenSettings} /> @@ -139,6 +151,8 @@ Drawer.propTypes = { searchHidden: PropTypes.bool, searchValue: PropTypes.string, submitted: PropTypes.bool, + unreadNotifications: PropTypes.number, + showNotificationsBadge: PropTypes.bool, // Dispatch props. onChange: PropTypes.func, diff --git a/app/javascript/flavours/glitch/features/emoji_picker/index.js b/app/javascript/flavours/glitch/features/emoji_picker/index.js index d22a50848..a78117971 100644 --- a/app/javascript/flavours/glitch/features/emoji_picker/index.js +++ b/app/javascript/flavours/glitch/features/emoji_picker/index.js @@ -340,6 +340,7 @@ class EmojiPickerMenu extends React.PureComponent { skin={skinTone} showPreview={false} backgroundImageFn={backgroundImageFn} + autoFocus emojiTooltip /> diff --git a/app/javascript/flavours/glitch/features/favourited_statuses/index.js b/app/javascript/flavours/glitch/features/favourited_statuses/index.js index d8fa1b84e..32bf4e71a 100644 --- a/app/javascript/flavours/glitch/features/favourited_statuses/index.js +++ b/app/javascript/flavours/glitch/features/favourited_statuses/index.js @@ -71,7 +71,7 @@ export default class Favourites extends ImmutablePureComponent { const pinned = !!columnId; return ( - <Column ref={this.setRef} name='favourites'> + <Column ref={this.setRef} name='favourites' label={intl.formatMessage(messages.heading)}> <ColumnHeader icon='star' title={intl.formatMessage(messages.heading)} diff --git a/app/javascript/flavours/glitch/features/getting_started/index.js b/app/javascript/flavours/glitch/features/getting_started/index.js index fb2e92278..09dcbe716 100644 --- a/app/javascript/flavours/glitch/features/getting_started/index.js +++ b/app/javascript/flavours/glitch/features/getting_started/index.js @@ -33,6 +33,7 @@ const messages = defineMessages({ lists: { id: 'navigation_bar.lists', defaultMessage: 'Lists' }, lists_subheading: { id: 'column_subheading.lists', defaultMessage: 'Lists' }, misc: { id: 'navigation_bar.misc', defaultMessage: 'Misc' }, + menu: { id: 'getting_started.heading', defaultMessage: 'Getting started' }, }); const makeMapStateToProps = () => { @@ -148,7 +149,7 @@ export default class GettingStarted extends ImmutablePureComponent { ]); return ( - <Column name='getting-started' icon='asterisk' heading={intl.formatMessage(messages.heading)} hideHeadingOnMobile> + <Column name='getting-started' icon='asterisk' heading={intl.formatMessage(messages.heading)} label={intl.formatMessage(messages.menu)} hideHeadingOnMobile> <div className='scrollable optionally-scrollable'> <div className='getting-started__wrapper'> <ColumnSubheading text={intl.formatMessage(messages.navigation_subheading)} /> diff --git a/app/javascript/flavours/glitch/features/hashtag_timeline/index.js b/app/javascript/flavours/glitch/features/hashtag_timeline/index.js index 8f77ed42b..311fabb63 100644 --- a/app/javascript/flavours/glitch/features/hashtag_timeline/index.js +++ b/app/javascript/flavours/glitch/features/hashtag_timeline/index.js @@ -88,7 +88,7 @@ export default class HashtagTimeline extends React.PureComponent { const pinned = !!columnId; return ( - <Column ref={this.setRef} name='hashtag'> + <Column ref={this.setRef} name='hashtag' label={`#${id}`}> <ColumnHeader icon='hashtag' active={hasUnread} diff --git a/app/javascript/flavours/glitch/features/home_timeline/index.js b/app/javascript/flavours/glitch/features/home_timeline/index.js index 3650ffc6d..7d124ba01 100644 --- a/app/javascript/flavours/glitch/features/home_timeline/index.js +++ b/app/javascript/flavours/glitch/features/home_timeline/index.js @@ -97,7 +97,7 @@ export default class HomeTimeline extends React.PureComponent { const pinned = !!columnId; return ( - <Column ref={this.setRef} name='home'> + <Column ref={this.setRef} name='home' label={intl.formatMessage(messages.title)}> <ColumnHeader icon='home' active={hasUnread} diff --git a/app/javascript/flavours/glitch/features/list_timeline/index.js b/app/javascript/flavours/glitch/features/list_timeline/index.js index 07edf45aa..2e77ba235 100644 --- a/app/javascript/flavours/glitch/features/list_timeline/index.js +++ b/app/javascript/flavours/glitch/features/list_timeline/index.js @@ -136,7 +136,7 @@ export default class ListTimeline extends React.PureComponent { } return ( - <Column ref={this.setRef}> + <Column ref={this.setRef} label={title}> <ColumnHeader icon='list-ul' active={hasUnread} diff --git a/app/javascript/flavours/glitch/features/local_settings/navigation/index.js b/app/javascript/flavours/glitch/features/local_settings/navigation/index.js index 0c1040290..a992b1ffc 100644 --- a/app/javascript/flavours/glitch/features/local_settings/navigation/index.js +++ b/app/javascript/flavours/glitch/features/local_settings/navigation/index.js @@ -10,6 +10,7 @@ import LocalSettingsNavigationItem from './item'; const messages = defineMessages({ general: { id: 'settings.general', defaultMessage: 'General' }, + compose: { id: 'settings.compose_box_opts', defaultMessage: 'Compose box options' }, content_warnings: { id: 'settings.content_warnings', defaultMessage: 'Content Warnings' }, collapsed: { id: 'settings.collapsed_statuses', defaultMessage: 'Collapsed toots' }, media: { id: 'settings.media', defaultMessage: 'Media' }, @@ -43,31 +44,37 @@ export default class LocalSettingsNavigation extends React.PureComponent { active={index === 1} index={1} onNavigate={onNavigate} - title={intl.formatMessage(messages.content_warnings)} + title={intl.formatMessage(messages.compose)} /> <LocalSettingsNavigationItem active={index === 2} index={2} onNavigate={onNavigate} - title={intl.formatMessage(messages.collapsed)} + title={intl.formatMessage(messages.content_warnings)} /> <LocalSettingsNavigationItem active={index === 3} index={3} onNavigate={onNavigate} - title={intl.formatMessage(messages.media)} + title={intl.formatMessage(messages.collapsed)} /> <LocalSettingsNavigationItem active={index === 4} - href='/settings/preferences' index={4} + onNavigate={onNavigate} + title={intl.formatMessage(messages.media)} + /> + <LocalSettingsNavigationItem + active={index === 5} + href='/settings/preferences' + index={5} icon='cog' title={intl.formatMessage(messages.preferences)} /> <LocalSettingsNavigationItem - active={index === 5} + active={index === 6} className='close' - index={5} + index={6} onNavigate={onClose} title={intl.formatMessage(messages.close)} /> diff --git a/app/javascript/flavours/glitch/features/local_settings/page/index.js b/app/javascript/flavours/glitch/features/local_settings/page/index.js index 0db49ba5d..ece80c4da 100644 --- a/app/javascript/flavours/glitch/features/local_settings/page/index.js +++ b/app/javascript/flavours/glitch/features/local_settings/page/index.js @@ -43,6 +43,25 @@ export default class LocalSettingsPage extends React.PureComponent { <FormattedMessage id='settings.show_reply_counter' defaultMessage='Display an estimate of the reply count' /> </LocalSettingsPageItem> <section> + <h2><FormattedMessage id='settings.notifications_opts' defaultMessage='Notifications options' /></h2> + <LocalSettingsPageItem + settings={settings} + item={['notifications', 'tab_badge']} + id='mastodon-settings--notifications-tab_badge' + onChange={onChange} + > + <FormattedMessage id='settings.notifications.tab_badge' defaultMessage="Display a badge for unread notifications if the notifications column isn't open" /> + </LocalSettingsPageItem> + <LocalSettingsPageItem + settings={settings} + item={['notifications', 'favicon_badge']} + id='mastodon-settings--notifications-favicon_badge' + onChange={onChange} + > + <FormattedMessage id='settings.notifications.favicon_badge' defaultMessage='Display unread notifications count in the favicon' /> + </LocalSettingsPageItem> + </section> + <section> <h2><FormattedMessage id='settings.layout_opts' defaultMessage='Layout options' /></h2> <LocalSettingsPageItem settings={settings} @@ -74,53 +93,63 @@ export default class LocalSettingsPage extends React.PureComponent { <FormattedMessage id='settings.navbar_under' defaultMessage='Navbar at the bottom (Mobile only)' /> </LocalSettingsPageItem> </section> - <section> - <h2><FormattedMessage id='settings.compose_box_opts' defaultMessage='Compose box options' /></h2> - <LocalSettingsPageItem - settings={settings} - item={['always_show_spoilers_field']} - id='mastodon-settings--always_show_spoilers_field' - onChange={onChange} - > - <FormattedMessage id='settings.always_show_spoilers_field' defaultMessage='Always enable the Content Warning field' /> - </LocalSettingsPageItem> - <LocalSettingsPageItem - settings={settings} - item={['confirm_missing_media_description']} - id='mastodon-settings--confirm_missing_media_description' - onChange={onChange} - > - <FormattedMessage id='settings.confirm_missing_media_description' defaultMessage='Show confirmation dialog before sending toots lacking media descriptions' /> - </LocalSettingsPageItem> - <LocalSettingsPageItem - settings={settings} - item={['side_arm']} - id='mastodon-settings--side_arm' - options={[ - { value: 'none', message: intl.formatMessage(messages.side_arm_none) }, - { value: 'direct', message: intl.formatMessage({ id: 'privacy.direct.short' }) }, - { value: 'private', message: intl.formatMessage({ id: 'privacy.private.short' }) }, - { value: 'unlisted', message: intl.formatMessage({ id: 'privacy.unlisted.short' }) }, - { value: 'public', message: intl.formatMessage({ id: 'privacy.public.short' }) }, - ]} - onChange={onChange} - > - <FormattedMessage id='settings.side_arm' defaultMessage='Secondary toot button:' /> - </LocalSettingsPageItem> - <LocalSettingsPageItem - settings={settings} - item={['side_arm_reply_mode']} - id='mastodon-settings--side_arm_reply_mode' - options={[ - { value: 'keep', message: intl.formatMessage(messages.side_arm_keep) }, - { value: 'copy', message: intl.formatMessage(messages.side_arm_copy) }, - { value: 'restrict', message: intl.formatMessage(messages.side_arm_restrict) }, - ]} - onChange={onChange} - > - <FormattedMessage id='settings.side_arm_reply_mode' defaultMessage='When replying to a toot:' /> - </LocalSettingsPageItem> - </section> + </div> + ), + ({ intl, onChange, settings }) => ( + <div className='glitch local-settings__page compose_box_opts'> + <h1><FormattedMessage id='settings.compose_box_opts' defaultMessage='Compose box options' /></h1> + <LocalSettingsPageItem + settings={settings} + item={['always_show_spoilers_field']} + id='mastodon-settings--always_show_spoilers_field' + onChange={onChange} + > + <FormattedMessage id='settings.always_show_spoilers_field' defaultMessage='Always enable the Content Warning field' /> + </LocalSettingsPageItem> + <LocalSettingsPageItem + settings={settings} + item={['preselect_on_reply']} + id='mastodon-settings--preselect_on_reply' + onChange={onChange} + > + <FormattedMessage id='settings.preselect_on_reply' defaultMessage='Pre-select usernames past the first when replying to a toot with multiple participants' /> + </LocalSettingsPageItem> + <LocalSettingsPageItem + settings={settings} + item={['confirm_missing_media_description']} + id='mastodon-settings--confirm_missing_media_description' + onChange={onChange} + > + <FormattedMessage id='settings.confirm_missing_media_description' defaultMessage='Show confirmation dialog before sending toots lacking media descriptions' /> + </LocalSettingsPageItem> + <LocalSettingsPageItem + settings={settings} + item={['side_arm']} + id='mastodon-settings--side_arm' + options={[ + { value: 'none', message: intl.formatMessage(messages.side_arm_none) }, + { value: 'direct', message: intl.formatMessage({ id: 'privacy.direct.short' }) }, + { value: 'private', message: intl.formatMessage({ id: 'privacy.private.short' }) }, + { value: 'unlisted', message: intl.formatMessage({ id: 'privacy.unlisted.short' }) }, + { value: 'public', message: intl.formatMessage({ id: 'privacy.public.short' }) }, + ]} + onChange={onChange} + > + <FormattedMessage id='settings.side_arm' defaultMessage='Secondary toot button:' /> + </LocalSettingsPageItem> + <LocalSettingsPageItem + settings={settings} + item={['side_arm_reply_mode']} + id='mastodon-settings--side_arm_reply_mode' + options={[ + { value: 'keep', message: intl.formatMessage(messages.side_arm_keep) }, + { value: 'copy', message: intl.formatMessage(messages.side_arm_copy) }, + { value: 'restrict', message: intl.formatMessage(messages.side_arm_restrict) }, + ]} + onChange={onChange} + > + <FormattedMessage id='settings.side_arm_reply_mode' defaultMessage='When replying to a toot:' /> + </LocalSettingsPageItem> </div> ), ({ intl, onChange, settings }) => ( @@ -240,6 +269,18 @@ export default class LocalSettingsPage extends React.PureComponent { <FormattedMessage id='settings.image_backgrounds_media' defaultMessage='Preview collapsed toot media' /> </LocalSettingsPageItem> </section> + <section> + <h2></h2> + <LocalSettingsPageItem + settings={settings} + item={['collapsed', 'show_action_bar']} + id='mastodon-settings--collapsed-show-action-bar' + onChange={onChange} + dependsOn={[['collapsed', 'enabled']]} + > + <FormattedMessage id='settings.show_action_bar' defaultMessage='Show action buttons in collapsed toots' /> + </LocalSettingsPageItem> + </section> </div> ), ({ onChange, settings }) => ( diff --git a/app/javascript/flavours/glitch/features/notifications/index.js b/app/javascript/flavours/glitch/features/notifications/index.js index 266d6807d..13ed26865 100644 --- a/app/javascript/flavours/glitch/features/notifications/index.js +++ b/app/javascript/flavours/glitch/features/notifications/index.js @@ -8,6 +8,8 @@ import { enterNotificationClearingMode, expandNotifications, scrollTopNotifications, + mountNotifications, + unmountNotifications, } from 'flavours/glitch/actions/notifications'; import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns'; import NotificationContainer from './containers/notification_container'; @@ -42,6 +44,12 @@ const mapDispatchToProps = dispatch => ({ onEnterCleaningMode(yes) { dispatch(enterNotificationClearingMode(yes)); }, + onMount() { + dispatch(mountNotifications()); + }, + onUnmount() { + dispatch(unmountNotifications()); + }, dispatch, }); @@ -62,6 +70,8 @@ export default class Notifications extends React.PureComponent { localSettings: ImmutablePropTypes.map, notifCleaningActive: PropTypes.bool, onEnterCleaningMode: PropTypes.func, + onMount: PropTypes.func, + onUnmount: PropTypes.func, }; static defaultProps = { @@ -126,6 +136,20 @@ export default class Notifications extends React.PureComponent { } } + componentDidMount () { + const { onMount } = this.props; + if (onMount) { + onMount(); + } + } + + componentWillUnmount () { + const { onUnmount } = this.props; + if (onUnmount) { + onUnmount(); + } + } + render () { const { intl, notifications, shouldUpdateScroll, isLoading, isUnread, columnId, multiColumn, hasMore } = this.props; const pinned = !!columnId; @@ -179,6 +203,7 @@ export default class Notifications extends React.PureComponent { ref={this.setColumnRef} name='notifications' extraClasses={this.props.notifCleaningActive ? 'notif-cleaning' : null} + label={intl.formatMessage(messages.title)} > <ColumnHeader icon='bell' diff --git a/app/javascript/flavours/glitch/features/public_timeline/index.js b/app/javascript/flavours/glitch/features/public_timeline/index.js index a6c0b1688..53f2836f1 100644 --- a/app/javascript/flavours/glitch/features/public_timeline/index.js +++ b/app/javascript/flavours/glitch/features/public_timeline/index.js @@ -76,7 +76,7 @@ export default class PublicTimeline extends React.PureComponent { const pinned = !!columnId; return ( - <Column ref={this.setRef} name='federated'> + <Column ref={this.setRef} name='federated' label={intl.formatMessage(messages.title)}> <ColumnHeader icon='globe' active={hasUnread} diff --git a/app/javascript/flavours/glitch/features/standalone/community_timeline/index.js b/app/javascript/flavours/glitch/features/standalone/community_timeline/index.js index c488f9541..2b67e836a 100644 --- a/app/javascript/flavours/glitch/features/standalone/community_timeline/index.js +++ b/app/javascript/flavours/glitch/features/standalone/community_timeline/index.js @@ -51,7 +51,7 @@ export default class CommunityTimeline extends React.PureComponent { const { intl } = this.props; return ( - <Column ref={this.setRef}> + <Column ref={this.setRef} label={intl.formatMessage(messages.title)}> <ColumnHeader icon='users' title={intl.formatMessage(messages.title)} diff --git a/app/javascript/flavours/glitch/features/standalone/public_timeline/index.js b/app/javascript/flavours/glitch/features/standalone/public_timeline/index.js index 0b4238485..907da3992 100644 --- a/app/javascript/flavours/glitch/features/standalone/public_timeline/index.js +++ b/app/javascript/flavours/glitch/features/standalone/public_timeline/index.js @@ -51,7 +51,7 @@ export default class PublicTimeline extends React.PureComponent { const { intl } = this.props; return ( - <Column ref={this.setRef}> + <Column ref={this.setRef} label={intl.formatMessage(messages.title)}> <ColumnHeader icon='globe' title={intl.formatMessage(messages.title)} diff --git a/app/javascript/flavours/glitch/features/status/components/card.js b/app/javascript/flavours/glitch/features/status/components/card.js index 680bf63ab..b52f3c4fa 100644 --- a/app/javascript/flavours/glitch/features/status/components/card.js +++ b/app/javascript/flavours/glitch/features/status/components/card.js @@ -20,6 +20,39 @@ const getHostname = url => { return parser.hostname; }; +const trim = (text, len) => { + const cut = text.indexOf(' ', len); + + if (cut === -1) { + return text; + } + + return text.substring(0, cut) + (text.length > len ? '…' : ''); +}; + +const domParser = new DOMParser(); + +const addAutoPlay = html => { + const document = domParser.parseFromString(html, 'text/html').documentElement; + const iframe = document.querySelector('iframe'); + + if (iframe) { + if (iframe.src.indexOf('?') !== -1) { + iframe.src += '&'; + } else { + iframe.src += '?'; + } + + iframe.src += 'autoplay=1&auto_play=1'; + + // DOM parser creates html/body elements around original HTML fragment, + // so we need to get innerHTML out of the body and not the entire document + return document.querySelector('body').innerHTML; + } + + return html; +}; + export default class Card extends React.PureComponent { static propTypes = { @@ -33,9 +66,16 @@ export default class Card extends React.PureComponent { }; state = { - width: 0, + width: 280, + embedded: false, }; + componentWillReceiveProps (nextProps) { + if (this.props.card !== nextProps.card) { + this.setState({ embedded: false }); + } + } + handlePhotoClick = () => { const { card, onOpenMedia } = this.props; @@ -43,7 +83,7 @@ export default class Card extends React.PureComponent { Immutable.fromJS([ { type: 'image', - url: card.get('url'), + url: card.get('embed_url'), description: card.get('title'), meta: { original: { @@ -57,56 +97,14 @@ export default class Card extends React.PureComponent { ); }; - renderLink () { - const { card, maxDescription } = this.props; - - let image = ''; - let provider = card.get('provider_name'); - - if (card.get('image')) { - image = ( - <div className='status-card__image'> - <img src={card.get('image')} alt={card.get('title')} className='status-card__image-image' width={card.get('width')} height={card.get('height')} /> - </div> - ); - } - - if (provider.length < 1) { - provider = decodeIDNA(getHostname(card.get('url'))); - } - - const className = classnames('status-card', { - 'horizontal': card.get('width') > card.get('height'), - }); - - return ( - <a href={card.get('url')} className={className} target='_blank' rel='noopener'> - {image} - - <div className='status-card__content'> - <strong className='status-card__title' title={card.get('title')}>{card.get('title')}</strong> - <p className='status-card__description'>{(card.get('description') || '').substring(0, maxDescription)}</p> - <span className='status-card__host'>{provider}</span> - </div> - </a> - ); - } - - renderPhoto () { + handleEmbedClick = () => { const { card } = this.props; - return ( - <img - className='status-card-photo' - onClick={this.handlePhotoClick} - role='button' - tabIndex='0' - src={card.get('url')} - alt={card.get('title')} - width={card.get('width')} - height={card.get('height')} - /> - ); + if (card.get('type') === 'photo') { + this.handlePhotoClick(); + } else { + this.setState({ embedded: true }); + } } setRef = c => { @@ -117,7 +115,7 @@ export default class Card extends React.PureComponent { renderVideo () { const { card } = this.props; - const content = { __html: card.get('html') }; + const content = { __html: addAutoPlay(card.get('html')) }; const { width } = this.state; const ratio = card.get('width') / card.get('height'); const height = card.get('width') > card.get('height') ? (width / ratio) : (width * ratio); @@ -125,7 +123,7 @@ export default class Card extends React.PureComponent { return ( <div ref={this.setRef} - className='status-card-video' + className='status-card__image status-card-video' dangerouslySetInnerHTML={content} style={{ height }} /> @@ -133,23 +131,76 @@ export default class Card extends React.PureComponent { } render () { - const { card } = this.props; + const { card, maxDescription } = this.props; + const { width, embedded } = this.state; if (card === null) { return null; } - switch(card.get('type')) { - case 'link': - return this.renderLink(); - case 'photo': - return this.renderPhoto(); - case 'video': - return this.renderVideo(); - case 'rich': - default: - return null; + const provider = card.get('provider_name').length === 0 ? decodeIDNA(getHostname(card.get('url'))) : card.get('provider_name'); + const horizontal = card.get('width') > card.get('height') && (card.get('width') + 100 >= width) || card.get('type') !== 'link'; + const className = classnames('status-card', { horizontal }); + const interactive = card.get('type') !== 'link'; + const title = interactive ? <a className='status-card__title' href={card.get('url')} title={card.get('title')} rel='noopener' target='_blank'><strong>{card.get('title')}</strong></a> : <strong className='status-card__title' title={card.get('title')}>{card.get('title')}</strong>; + const ratio = card.get('width') / card.get('height'); + const height = card.get('width') > card.get('height') ? (width / ratio) : (width * ratio); + + const description = ( + <div className='status-card__content'> + {title} + {!horizontal && <p className='status-card__description'>{trim(card.get('description') || '', maxDescription)}</p>} + <span className='status-card__host'>{provider}</span> + </div> + ); + + let embed = ''; + let thumbnail = <div style={{ backgroundImage: `url(${card.get('image')})`, width: horizontal ? width : null, height: horizontal ? height : null }} className='status-card__image-image' />; + + if (interactive) { + if (embedded) { + embed = this.renderVideo(); + } else { + let iconVariant = 'play'; + + if (card.get('type') === 'photo') { + iconVariant = 'search-plus'; + } + + embed = ( + <div className='status-card__image'> + {thumbnail} + + <div className='status-card__actions'> + <div> + <button onClick={this.handleEmbedClick}><i className={`fa fa-${iconVariant}`} /></button> + <a href={card.get('url')} target='_blank' rel='noopener'><i className='fa fa-external-link' /></a> + </div> + </div> + </div> + ); + } + + return ( + <div className={className} ref={this.setRef}> + {embed} + {description} + </div> + ); + } else if (card.get('image')) { + embed = ( + <div className='status-card__image'> + {thumbnail} + </div> + ); } + + return ( + <a href={card.get('url')} className={className} target='_blank' rel='noopener' ref={this.setRef}> + {embed} + {description} + </a> + ); } } diff --git a/app/javascript/flavours/glitch/features/status/index.js b/app/javascript/flavours/glitch/features/status/index.js index 3d309976a..5759a575c 100644 --- a/app/javascript/flavours/glitch/features/status/index.js +++ b/app/javascript/flavours/glitch/features/status/index.js @@ -39,6 +39,7 @@ import { HotKeys } from 'react-hotkeys'; import { boostModal, favouriteModal, deleteModal } from 'flavours/glitch/util/initial_state'; import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from 'flavours/glitch/util/fullscreen'; import { autoUnfoldCW } from 'flavours/glitch/util/content_warning'; +import { textForScreenReader } from 'flavours/glitch/components/status'; const messages = defineMessages({ deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' }, @@ -48,6 +49,7 @@ const messages = defineMessages({ blockConfirm: { id: 'confirmations.block.confirm', defaultMessage: 'Block' }, revealAll: { id: 'status.show_more_all', defaultMessage: 'Show more for all' }, hideAll: { id: 'status.show_less_all', defaultMessage: 'Show less for all' }, + detailedStatus: { id: 'status.detailed_status', defaultMessage: 'Detailed conversation view' }, }); const makeMapStateToProps = () => { @@ -103,7 +105,7 @@ export default class Status extends ImmutablePureComponent { if (nextProps.params.statusId !== this.props.params.statusId && nextProps.params.statusId) { this._scrolledIntoView = false; this.props.dispatch(fetchStatus(nextProps.params.statusId)); - this.setState({ isExpanded: autoUnfoldCW(nextProps.settings, nextProps.status) }); + this.setState({ isExpanded: autoUnfoldCW(nextProps.settings, nextProps.status), threadExpanded: undefined }); } } @@ -387,7 +389,7 @@ export default class Status extends ImmutablePureComponent { }; return ( - <Column> + <Column label={intl.formatMessage(messages.detailedStatus)}> <ColumnHeader showBackButton extraButton={( @@ -400,7 +402,7 @@ export default class Status extends ImmutablePureComponent { {ancestors} <HotKeys handlers={handlers}> - <div className='focusable' tabIndex='0'> + <div className='focusable' tabIndex='0' aria-label={textForScreenReader(intl, status, false, !status.get('hidden'))}> <DetailedStatus status={status} settings={settings} diff --git a/app/javascript/flavours/glitch/features/ui/components/columns_area.js b/app/javascript/flavours/glitch/features/ui/components/columns_area.js index f87c078ec..71cb7e8c9 100644 --- a/app/javascript/flavours/glitch/features/ui/components/columns_area.js +++ b/app/javascript/flavours/glitch/features/ui/components/columns_area.js @@ -30,6 +30,8 @@ const componentMap = { 'LIST': ListTimeline, }; +const shouldHideFAB = path => path.match(/^\/statuses\//); + const messages = defineMessages({ publish: { id: 'compose_form.publish', defaultMessage: 'Toot' }, }); @@ -158,7 +160,7 @@ export default class ColumnsArea extends ImmutablePureComponent { this.pendingIndex = null; if (singleColumn) { - const floatingActionButton = this.context.router.history.location.pathname === '/statuses/new' ? null : <Link key='floating-action-button' to='/statuses/new' className='floating-action-button' aria-label={intl.formatMessage(messages.publish)}><i className='fa fa-pencil' /></Link>; + const floatingActionButton = shouldHideFAB(this.context.router.history.location.pathname) ? null : <Link key='floating-action-button' to='/statuses/new' className='floating-action-button' aria-label={intl.formatMessage(messages.publish)}><i className='fa fa-pencil' /></Link>; return columnIndex !== -1 ? [ <ReactSwipeableViews key='content' index={columnIndex} onChangeIndex={this.handleSwipe} onTransitionEnd={this.handleAnimationEnd} animateTransitions={shouldAnimate} springConfig={{ duration: '400ms', delay: '0s', easeFunction: 'ease' }} style={{ height: '100%' }}> diff --git a/app/javascript/flavours/glitch/features/ui/components/media_modal.js b/app/javascript/flavours/glitch/features/ui/components/media_modal.js index d4fd45d4d..1f3ac18ea 100644 --- a/app/javascript/flavours/glitch/features/ui/components/media_modal.js +++ b/app/javascript/flavours/glitch/features/ui/components/media_modal.js @@ -129,7 +129,7 @@ export default class MediaModal extends ImmutablePureComponent { startTime={time || 0} onCloseVideo={onClose} detailed - description={image.get('description')} + alt={image.get('description')} key={image.get('url')} /> ); diff --git a/app/javascript/flavours/glitch/features/ui/components/report_modal.js b/app/javascript/flavours/glitch/features/ui/components/report_modal.js index 81643b6c2..a139394ac 100644 --- a/app/javascript/flavours/glitch/features/ui/components/report_modal.js +++ b/app/javascript/flavours/glitch/features/ui/components/report_modal.js @@ -106,6 +106,7 @@ export default class ReportModal extends ImmutablePureComponent { onChange={this.handleCommentChange} onKeyDown={this.handleKeyDown} disabled={isSubmitting} + autoFocus /> {domain && ( diff --git a/app/javascript/flavours/glitch/features/ui/components/tabs_bar.js b/app/javascript/flavours/glitch/features/ui/components/tabs_bar.js index b2fee21e1..b44a21a42 100644 --- a/app/javascript/flavours/glitch/features/ui/components/tabs_bar.js +++ b/app/javascript/flavours/glitch/features/ui/components/tabs_bar.js @@ -4,10 +4,34 @@ import { NavLink, withRouter } from 'react-router-dom'; import { FormattedMessage, injectIntl } from 'react-intl'; import { debounce } from 'lodash'; import { isUserTouching } from 'flavours/glitch/util/is_mobile'; +import { connect } from 'react-redux'; + +const mapStateToProps = state => ({ + unreadNotifications: state.getIn(['notifications', 'unread']), + showBadge: state.getIn(['local_settings', 'notifications', 'tab_badge']), +}); + +@connect(mapStateToProps) +class NotificationsIcon extends React.PureComponent { + static propTypes = { + unreadNotifications: PropTypes.number, + showBadge: PropTypes.bool, + }; + + render() { + const { unreadNotifications, showBadge } = this.props; + return ( + <span className='icon-badge-wrapper'> + <i className='fa fa-fw fa-bell' /> + { showBadge && unreadNotifications > 0 && <div className='icon-badge' />} + </span> + ); + } +} export const links = [ <NavLink className='tabs-bar__link primary' to='/timelines/home' data-preview-title-id='column.home' data-preview-icon='home' ><i className='fa fa-fw fa-home' /><FormattedMessage id='tabs_bar.home' defaultMessage='Home' /></NavLink>, - <NavLink className='tabs-bar__link primary' to='/notifications' data-preview-title-id='column.notifications' data-preview-icon='bell' ><i className='fa fa-fw fa-bell' /><FormattedMessage id='tabs_bar.notifications' defaultMessage='Notifications' /></NavLink>, + <NavLink className='tabs-bar__link primary' to='/notifications' data-preview-title-id='column.notifications' data-preview-icon='bell' ><NotificationsIcon /><FormattedMessage id='tabs_bar.notifications' defaultMessage='Notifications' /></NavLink>, <NavLink className='tabs-bar__link secondary' to='/timelines/public/local' data-preview-title-id='column.community' data-preview-icon='users' ><i className='fa fa-fw fa-users' /><FormattedMessage id='tabs_bar.local_timeline' defaultMessage='Local' /></NavLink>, <NavLink className='tabs-bar__link secondary' exact to='/timelines/public' data-preview-title-id='column.public' data-preview-icon='globe' ><i className='fa fa-fw fa-globe' /><FormattedMessage id='tabs_bar.federated_timeline' defaultMessage='Federated' /></NavLink>, diff --git a/app/javascript/flavours/glitch/features/ui/components/video_modal.js b/app/javascript/flavours/glitch/features/ui/components/video_modal.js index e0cb7fc09..69e0ee46e 100644 --- a/app/javascript/flavours/glitch/features/ui/components/video_modal.js +++ b/app/javascript/flavours/glitch/features/ui/components/video_modal.js @@ -24,7 +24,7 @@ export default class VideoModal extends ImmutablePureComponent { startTime={time} onCloseVideo={onClose} detailed - description={media.get('description')} + alt={media.get('description')} /> </div> </div> diff --git a/app/javascript/flavours/glitch/features/ui/components/zoomable_image.js b/app/javascript/flavours/glitch/features/ui/components/zoomable_image.js index 0a0a4d41a..3f6562bc9 100644 --- a/app/javascript/flavours/glitch/features/ui/components/zoomable_image.js +++ b/app/javascript/flavours/glitch/features/ui/components/zoomable_image.js @@ -137,6 +137,7 @@ export default class ZoomableImage extends React.PureComponent { role='presentation' ref={this.setImageRef} alt={alt} + title={alt} src={src} style={{ transform: `scale(${scale})`, diff --git a/app/javascript/flavours/glitch/features/ui/index.js b/app/javascript/flavours/glitch/features/ui/index.js index 1cff94321..ecbac1f8f 100644 --- a/app/javascript/flavours/glitch/features/ui/index.js +++ b/app/javascript/flavours/glitch/features/ui/index.js @@ -10,13 +10,14 @@ import { isMobile } from 'flavours/glitch/util/is_mobile'; import { debounce } from 'lodash'; import { uploadCompose, resetCompose } from 'flavours/glitch/actions/compose'; import { expandHomeTimeline } from 'flavours/glitch/actions/timelines'; -import { expandNotifications } from 'flavours/glitch/actions/notifications'; +import { expandNotifications, notificationsSetVisibility } from 'flavours/glitch/actions/notifications'; import { fetchFilters } from 'flavours/glitch/actions/filters'; import { clearHeight } from 'flavours/glitch/actions/height_cache'; import { WrappedSwitch, WrappedRoute } from 'flavours/glitch/util/react_router_helpers'; import UploadArea from './components/upload_area'; import ColumnsAreaContainer from './containers/columns_area_container'; import classNames from 'classnames'; +import Favico from 'favico.js'; import { Drawer, Status, @@ -59,11 +60,14 @@ const messages = defineMessages({ }); const mapStateToProps = state => ({ - hasComposingText: state.getIn(['compose', 'text']) !== '', + hasComposingText: state.getIn(['compose', 'text']).trim().length !== 0, + hasMediaAttachments: state.getIn(['compose', 'media_attachments']).size > 0, layout: state.getIn(['local_settings', 'layout']), isWide: state.getIn(['local_settings', 'stretch']), navbarUnder: state.getIn(['local_settings', 'navbar_under']), dropdownMenuIsOpen: state.getIn(['dropdown_menu', 'openId']) !== null, + unreadNotifications: state.getIn(['notifications', 'unread']), + showFaviconBadge: state.getIn(['local_settings', 'notifications', 'favicon_badge']), }); const keyMap = { @@ -110,11 +114,14 @@ export default class UI extends React.Component { navbarUnder: PropTypes.bool, isComposing: PropTypes.bool, hasComposingText: PropTypes.bool, + hasMediaAttachments: PropTypes.bool, match: PropTypes.object.isRequired, location: PropTypes.object.isRequired, history: PropTypes.object.isRequired, intl: PropTypes.object.isRequired, dropdownMenuIsOpen: PropTypes.bool, + unreadNotifications: PropTypes.number, + showFaviconBadge: PropTypes.bool, }; state = { @@ -123,9 +130,9 @@ export default class UI extends React.Component { }; handleBeforeUnload = (e) => { - const { intl, hasComposingText } = this.props; + const { intl, hasComposingText, hasMediaAttachments } = this.props; - if (hasComposingText) { + if (hasComposingText || hasMediaAttachments) { // Setting returnValue to any string causes confirmation dialog. // Many browsers no longer display this text to users, // but we set user-friendly message for other browsers, e.g. Edge. @@ -206,7 +213,27 @@ export default class UI extends React.Component { } } + handleVisibilityChange = () => { + const visibility = !document[this.visibilityHiddenProp]; + this.props.dispatch(notificationsSetVisibility(visibility)); + } + componentWillMount () { + if (typeof document.hidden !== 'undefined') { // Opera 12.10 and Firefox 18 and later support + this.visibilityHiddenProp = 'hidden'; + this.visibilityChange = 'visibilitychange'; + } else if (typeof document.msHidden !== 'undefined') { + this.visibilityHiddenProp = 'msHidden'; + this.visibilityChange = 'msvisibilitychange'; + } else if (typeof document.webkitHidden !== 'undefined') { + this.visibilityHiddenProp = 'webkitHidden'; + this.visibilityChange = 'webkitvisibilitychange'; + } + if (this.visibilityChange !== undefined) { + document.addEventListener(this.visibilityChange, this.handleVisibilityChange, false); + this.handleVisibilityChange(); + } + window.addEventListener('beforeunload', this.handleBeforeUnload, false); window.addEventListener('resize', this.handleResize, { passive: true }); document.addEventListener('dragenter', this.handleDragEnter, false); @@ -219,6 +246,8 @@ export default class UI extends React.Component { navigator.serviceWorker.addEventListener('message', this.handleServiceWorkerPostMessage); } + this.favicon = new Favico({ animation:"none" }); + this.props.dispatch(expandHomeTimeline()); this.props.dispatch(expandNotifications()); setTimeout(() => this.props.dispatch(fetchFilters()), 500); @@ -247,9 +276,19 @@ export default class UI extends React.Component { if (![this.props.location.pathname, '/'].includes(prevProps.location.pathname)) { this.columnsAreaNode.handleChildrenContentChange(); } + if (this.props.unreadNotifications != prevProps.unreadNotifications || + this.props.showFaviconBadge != prevProps.showFaviconBadge) { + if (this.favicon) { + this.favicon.badge(this.props.showFaviconBadge ? this.props.unreadNotifications : 0); + } + } } componentWillUnmount () { + if (this.visibilityChange !== undefined) { + document.removeEventListener(this.visibilityChange, this.handleVisibilityChange); + } + window.removeEventListener('beforeunload', this.handleBeforeUnload); window.removeEventListener('resize', this.handleResize); document.removeEventListener('dragenter', this.handleDragEnter); diff --git a/app/javascript/flavours/glitch/features/video/index.js b/app/javascript/flavours/glitch/features/video/index.js index 44aba797c..5cbe01f26 100644 --- a/app/javascript/flavours/glitch/features/video/index.js +++ b/app/javascript/flavours/glitch/features/video/index.js @@ -135,7 +135,10 @@ export default class Video extends React.PureComponent { this.seek = c; } - handleClickRoot = e => e.stopPropagation(); + handleMouseDownRoot = e => { + e.preventDefault(); + e.stopPropagation(); + } handlePlay = () => { this.setState({ paused: false }); @@ -261,11 +264,12 @@ export default class Video extends React.PureComponent { } handleOpenVideo = () => { - const { src, preview, width, height } = this.props; + const { src, preview, width, height, alt } = this.props; const media = fromJS({ type: 'video', url: src, preview_url: preview, + description: alt, width, height, }); @@ -318,7 +322,7 @@ export default class Video extends React.PureComponent { ref={this.setPlayerRef} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave} - onClick={this.handleClickRoot} + onMouseDown={this.handleMouseDownRoot} tabIndex={0} > <video diff --git a/app/javascript/flavours/glitch/locales/en.js b/app/javascript/flavours/glitch/locales/en.js index fb3763ced..90e924d4a 100644 --- a/app/javascript/flavours/glitch/locales/en.js +++ b/app/javascript/flavours/glitch/locales/en.js @@ -18,6 +18,7 @@ const messages = { 'settings.auto_collapse_notifications': 'Notifications', 'settings.auto_collapse_reblogs': 'Boosts', 'settings.auto_collapse_replies': 'Replies', + 'settings.show_action_bar': 'Show action buttons in collapsed toots', 'settings.close': 'Close', 'settings.collapsed_statuses': 'Collapsed toots', 'settings.enable_collapsed': 'Enable collapsed toots', diff --git a/app/javascript/flavours/glitch/locales/ja.js b/app/javascript/flavours/glitch/locales/ja.js index f558d7ab7..c323956c6 100644 --- a/app/javascript/flavours/glitch/locales/ja.js +++ b/app/javascript/flavours/glitch/locales/ja.js @@ -4,13 +4,14 @@ const messages = { 'getting_started.open_source_notice': 'Glitchsocは{Mastodon}によるフリーなオープンソースソフトウェアです。誰でもGitHub({github})から開発に參加したり、問題を報告したりできます。', 'layout.auto': '自動', 'layout.current_is': 'あなたの現在のレイアウト:', - 'layout.desktop': 'Desktop', - 'layout.mobile': 'Mobile', + 'layout.desktop': 'デスクトップ', + 'layout.single': 'モバイル', 'navigation_bar.app_settings': 'アプリ設定', 'getting_started.onboarding': '解説を表示', 'onboarding.page_one.federation': '{domain}はMastodonのインスタンスです。Mastodonとは、独立したサーバが連携して作るソーシャルネットワークです。これらのサーバーをインスタンスと呼びます。', 'onboarding.page_one.welcome': '{domain}へようこそ!', 'onboarding.page_six.github': '{domain}はGlitchsocを使用しています。Glitchsocは{Mastodon}のフレンドリーな{fork}で、どんなMastodonアプリやインスタンスとも互換性があります。Glitchsocは完全に無料で、オープンソースです。{github}でバグ報告や機能要望あるいは貢獻をすることが可能です。', + 'settings.always_show_spoilers_field': '常にコンテンツワーニング設定を表示する(指定がない場合は通常投稿)', 'settings.auto_collapse': '自動折りたたみ', 'settings.auto_collapse_all': 'すべて', 'settings.auto_collapse_lengthy': '長いトゥート', @@ -20,7 +21,12 @@ const messages = { 'settings.auto_collapse_replies': '返信', 'settings.close': '閉じる', 'settings.collapsed_statuses': 'トゥート', + 'settings.confirm_missing_media_description': '画像に対する補助記載がないときに投稿前の警告を表示する', + 'settings.content_warnings': 'コンテンツワーニング', + 'settings.content_warnings_filter': '説明に指定した文字が含まれているものを自動で展開しないようにする', + 'settings.content_warnings.regexp': '正規表現', 'settings.enable_collapsed': 'トゥート折りたたみを有効にする', + 'settings.enable_content_warnings_auto_unfold': 'コンテンツワーニング指定されている投稿を常に表示する', 'settings.general': '一般', 'settings.image_backgrounds': '画像背景', 'settings.image_backgrounds_media': '折りたまれたメディア付きトゥートをプレビュー', @@ -28,15 +34,28 @@ const messages = { 'settings.media': 'メディア', 'settings.media_letterbox': 'メディアをレターボックス式で表示', 'settings.media_fullwidth': '全幅メディアプレビュー', + 'settings.navbar_under': 'ナビを画面下部に移動させる(モバイル レイアウトのみ)', + 'settings.notifications.favicon_badge': '通知アイコンに未読件数を表示する', + 'settings.notifications_opts': '通知の設定', + 'settings.notifications.tab_badge': '未読の通知があるとき、通知アイコンにマークを表示する', 'settings.preferences': 'ユーザー設定', - 'settings.wide_view': 'ワイドビュー(Desktopレイアウトのみ)', - 'settings.navbar_under': 'ナビを画面下部に移動させる(Mobileレイアウトのみ)', + 'settings.wide_view': 'ワイドビュー(デスクトップ レイアウトのみ)', 'settings.compose_box_opts': 'コンポーズボックス設定', + 'settings.show_reply_counter': '投稿に対するリプライの数を表示する', 'settings.side_arm': 'セカンダリートゥートボタン', + 'settings.side_arm.none': '表示しない', + 'settings.side_arm_reply_mode': '返信時の投稿範囲', + 'settings.side_arm_reply_mode.copy': '返信先の投稿範囲を利用する', + 'settings.side_arm_reply_mode.keep': 'セカンダリートゥートボタンの設定を維持する', + 'settings.side_arm_reply_mode.restrict': '返信先の投稿範囲に制限する', 'settings.layout': 'レイアウト', + 'settings.layout_opts': 'レイアウトの設定', 'status.collapse': '折りたたむ', 'status.uncollapse': '折りたたみを解除', + 'confirmations.missing_media_description.message': '少なくとも1つの画像に視聴覚障害者のための画像説明が付与されていません。すべての画像に対して説明を付与することを望みます。', + 'confirmations.missing_media_description.confirm': 'このまま投稿', + 'favourite_modal.combo': '次からは {combo} を押せば、これをスキップできます。', 'home.column_settings.show_direct': 'DMを表示', @@ -68,4 +87,4 @@ const messages = { 'column.bookmarks': 'ブックマーク' }; -export default Object.assign({}, inherited, messages); +export default Object.assign({}, inherited, messages); \ No newline at end of file diff --git a/app/javascript/flavours/glitch/middleware/sounds.js b/app/javascript/flavours/glitch/middleware/sounds.js index 3d1e3eaba..9f1bc02b9 100644 --- a/app/javascript/flavours/glitch/middleware/sounds.js +++ b/app/javascript/flavours/glitch/middleware/sounds.js @@ -15,7 +15,7 @@ const play = audio => { if (typeof audio.fastSeek === 'function') { audio.fastSeek(0); } else { - audio.seek(0); + audio.currentTime = 0; } } diff --git a/app/javascript/flavours/glitch/reducers/compose.js b/app/javascript/flavours/glitch/reducers/compose.js index 594d70ee2..0ddff707e 100644 --- a/app/javascript/flavours/glitch/reducers/compose.js +++ b/app/javascript/flavours/glitch/reducers/compose.js @@ -314,8 +314,12 @@ export default function compose(state = initialState, action) { map.set('idempotencyKey', uuid()); if (action.status.get('spoiler_text').length > 0) { + let spoiler_text = action.status.get('spoiler_text'); + if (!spoiler_text.match(/^re[: ]/i)) { + spoiler_text = 're: '.concat(spoiler_text); + } map.set('spoiler', true); - map.set('spoiler_text', action.status.get('spoiler_text')); + map.set('spoiler_text', spoiler_text); } else { map.set('spoiler', false); map.set('spoiler_text', ''); diff --git a/app/javascript/flavours/glitch/reducers/dropdown_menu.js b/app/javascript/flavours/glitch/reducers/dropdown_menu.js index 5449884cc..36fd4f132 100644 --- a/app/javascript/flavours/glitch/reducers/dropdown_menu.js +++ b/app/javascript/flavours/glitch/reducers/dropdown_menu.js @@ -4,12 +4,12 @@ import { DROPDOWN_MENU_CLOSE, } from '../actions/dropdown_menu'; -const initialState = Immutable.Map({ openId: null, placement: null }); +const initialState = Immutable.Map({ openId: null, placement: null, keyboard: false }); export default function dropdownMenu(state = initialState, action) { switch (action.type) { case DROPDOWN_MENU_OPEN: - return state.merge({ openId: action.id, placement: action.placement }); + return state.merge({ openId: action.id, placement: action.placement, keyboard: action.keyboard }); case DROPDOWN_MENU_CLOSE: return state.get('openId') === action.id ? state.set('openId', null) : state; default: diff --git a/app/javascript/flavours/glitch/reducers/local_settings.js b/app/javascript/flavours/glitch/reducers/local_settings.js index 063ae3943..19233a963 100644 --- a/app/javascript/flavours/glitch/reducers/local_settings.js +++ b/app/javascript/flavours/glitch/reducers/local_settings.js @@ -14,6 +14,7 @@ const initialState = ImmutableMap({ show_reply_count : false, always_show_spoilers_field: false, confirm_missing_media_description: false, + preselect_on_reply: true, content_warnings : ImmutableMap({ auto_unfold : false, filter : null, @@ -32,11 +33,16 @@ const initialState = ImmutableMap({ user_backgrounds : false, preview_images : false, }), + show_action_bar : true, }), media : ImmutableMap({ letterbox : true, fullwidth : true, }), + notifications : ImmutableMap({ + favicon_badge : false, + tab_badge : true, + }), }); const hydrate = (state, localSettings) => state.mergeDeep(localSettings); diff --git a/app/javascript/flavours/glitch/reducers/notifications.js b/app/javascript/flavours/glitch/reducers/notifications.js index dc820b476..0b816e85e 100644 --- a/app/javascript/flavours/glitch/reducers/notifications.js +++ b/app/javascript/flavours/glitch/reducers/notifications.js @@ -1,4 +1,7 @@ import { + NOTIFICATIONS_MOUNT, + NOTIFICATIONS_UNMOUNT, + NOTIFICATIONS_SET_VISIBILITY, NOTIFICATIONS_UPDATE, NOTIFICATIONS_EXPAND_SUCCESS, NOTIFICATIONS_EXPAND_REQUEST, @@ -24,9 +27,12 @@ const initialState = ImmutableMap({ items: ImmutableList(), hasMore: true, top: true, + mounted: 0, unread: 0, + lastReadId: '0', isLoading: false, cleaningMode: false, + isTabVisible: true, // notification removal mark of new notifs loaded whilst cleaningMode is true. markNewForDelete: false, }); @@ -40,9 +46,11 @@ const notificationToMap = (state, notification) => ImmutableMap({ }); const normalizeNotification = (state, notification) => { - const top = state.get('top'); + const top = !shouldCountUnreadNotifications(state); - if (!top) { + if (top) { + state = state.set('lastReadId', notification.id); + } else { state = state.update('unread', unread => unread + 1); } @@ -56,6 +64,8 @@ const normalizeNotification = (state, notification) => { }; const expandNormalizedNotifications = (state, notifications, next) => { + const top = !(shouldCountUnreadNotifications(state)); + const lastReadId = state.get('lastReadId'); let items = ImmutableList(); notifications.forEach((n, i) => { @@ -77,6 +87,14 @@ const expandNormalizedNotifications = (state, notifications, next) => { }); } + if (top) { + if (!items.isEmpty()) { + mutable.update('lastReadId', id => compareId(id, items.first().get('id')) > 0 ? id : items.first().get('id')); + } + } else { + mutable.update('unread', unread => unread + items.filter(item => compareId(item.get('id'), lastReadId) > 0).size); + } + if (!next) { mutable.set('hasMore', true); } @@ -89,15 +107,29 @@ const filterNotifications = (state, relationship) => { return state.update('items', list => list.filterNot(item => item !== null && item.get('account') === relationship.id)); }; +const clearUnread = (state) => { + state = state.set('unread', 0); + const lastNotification = state.get('items').find(item => item !== null); + return state.set('lastReadId', lastNotification ? lastNotification.get('id') : '0'); +} + const updateTop = (state, top) => { - if (top) { - state = state.set('unread', 0); + state = state.set('top', top); + + if (!shouldCountUnreadNotifications(state)) { + state = clearUnread(state); } return state.set('top', top); }; const deleteByStatus = (state, statusId) => { + const top = !(shouldCountUnreadNotifications(state)); + if (!top) { + const lastReadId = state.get('lastReadId'); + const deletedUnread = state.get('items').filter(item => item !== null && item.get('status') === statusId && compareId(item.get('id'), lastReadId) > 0); + state = state.update('unread', unread => unread - deletedUnread.size); + } return state.update('items', list => list.filterNot(item => item !== null && item.get('status') === statusId)); }; @@ -129,10 +161,36 @@ const deleteMarkedNotifs = (state) => { return state.update('items', list => list.filterNot(item => item.get('markedForDelete'))); }; +const updateMounted = (state) => { + state = state.update('mounted', count => count + 1); + if (!shouldCountUnreadNotifications(state)) { + state = clearUnread(state); + } + return state; +}; + +const updateVisibility = (state, visibility) => { + state = state.set('isTabVisible', visibility); + if (!shouldCountUnreadNotifications(state)) { + state = clearUnread(state); + } + return state; +}; + +const shouldCountUnreadNotifications = (state) => { + return !(state.get('isTabVisible') && state.get('top') && state.get('mounted') > 0); +}; + export default function notifications(state = initialState, action) { let st; switch(action.type) { + case NOTIFICATIONS_MOUNT: + return updateMounted(state); + case NOTIFICATIONS_UNMOUNT: + return state.update('mounted', count => count - 1); + case NOTIFICATIONS_SET_VISIBILITY: + return updateVisibility(state, action.visibility); case NOTIFICATIONS_EXPAND_REQUEST: case NOTIFICATIONS_DELETE_MARKED_REQUEST: return state.set('isLoading', true); diff --git a/app/javascript/flavours/glitch/styles/accounts.scss b/app/javascript/flavours/glitch/styles/accounts.scss index ac1989832..9568581ec 100644 --- a/app/javascript/flavours/glitch/styles/accounts.scss +++ b/app/javascript/flavours/glitch/styles/accounts.scss @@ -267,6 +267,20 @@ } } + .verified { + border: 1px solid rgba($valid-value-color, 0.5); + background: rgba($valid-value-color, 0.25); + + a { + color: $valid-value-color; + font-weight: 500; + } + + &__mark { + color: $valid-value-color; + } + } + dl:last-child { border-bottom: 0; } diff --git a/app/javascript/flavours/glitch/styles/admin.scss b/app/javascript/flavours/glitch/styles/admin.scss index 7fe5e4a19..b8cc33039 100644 --- a/app/javascript/flavours/glitch/styles/admin.scss +++ b/app/javascript/flavours/glitch/styles/admin.scss @@ -1,3 +1,5 @@ +$no-columns-breakpoint: 600px; + .admin-wrapper { display: flex; justify-content: center; @@ -24,12 +26,22 @@ height: 100px; } + @media screen and (max-width: $no-columns-breakpoint) { + & > a:first-child { + display: none; + } + } + ul { list-style: none; border-radius: 4px 0 0 4px; overflow: hidden; margin-bottom: 20px; + @media screen and (max-width: $no-columns-breakpoint) { + margin-bottom: 0; + } + a { display: block; padding: 15px; @@ -62,20 +74,24 @@ a { border: 0; padding: 15px 35px; + } + } - &.selected { - color: $primary-text-color; - background-color: $ui-highlight-color; - border-bottom: 0; - border-radius: 0; + .simple-navigation-active-leaf a { + color: $primary-text-color; + background-color: $ui-highlight-color; + border-bottom: 0; + border-radius: 0; - &:hover { - background-color: lighten($ui-highlight-color, 5%); - } - } + &:hover { + background-color: lighten($ui-highlight-color, 5%); } } } + + & > ul > .simple-navigation-active-leaf a { + border-radius: 4px 0 0 4px; + } } .content-wrapper { @@ -89,11 +105,19 @@ padding-top: 60px; padding-left: 25px; + @media screen and (max-width: $no-columns-breakpoint) { + max-width: none; + padding: 15px; + padding-top: 30px; + } + h2 { color: $secondary-text-color; font-size: 24px; line-height: 28px; font-weight: 400; + padding-bottom: 40px; + border-bottom: 1px solid lighten($ui-base-color, 8%); margin-bottom: 40px; } @@ -108,7 +132,7 @@ h4 { text-transform: uppercase; font-size: 13px; - font-weight: 500; + font-weight: 700; color: $darker-text-color; padding-bottom: 8px; margin-bottom: 8px; @@ -122,6 +146,11 @@ font-weight: 400; } + .fields-group h6 { + color: $primary-text-color; + font-weight: 500; + } + & > p { font-size: 14px; line-height: 18px; @@ -167,30 +196,7 @@ } } - .simple_form { - max-width: 400px; - - &.edit_user, - &.new_form_admin_settings, - &.new_form_two_factor_confirmation, - &.new_form_delete_confirmation, - &.new_import, - &.new_domain_block, - &.edit_domain_block { - max-width: none; - } - - .form_two_factor_confirmation_code, - .form_delete_confirmation_password { - max-width: 400px; - } - - .actions { - max-width: 400px; - } - } - - @media screen and (max-width: 600px) { + @media screen and (max-width: $no-columns-breakpoint) { display: block; overflow-y: auto; -webkit-overflow-scrolling: touch; @@ -204,16 +210,8 @@ .sidebar { width: 100%; - padding: 10px 0; + padding: 0; height: auto; - - .logo { - margin: 20px auto; - } - } - - .content { - padding-top: 20px; } } } @@ -578,3 +576,102 @@ a.name-tag, color: $dark-text-color; } } + +.report-card { + background: $ui-base-color; + border-radius: 4px; + margin-bottom: 20px; + + &__profile { + display: flex; + justify-content: space-between; + align-items: center; + padding: 15px; + + .account { + padding: 0; + border: 0; + + &__avatar-wrapper { + margin-left: 0; + } + } + + &__stats { + flex: 0 0 auto; + font-weight: 500; + color: $darker-text-color; + text-transform: uppercase; + text-align: right; + + a { + color: inherit; + text-decoration: none; + + &:focus, + &:hover, + &:active { + color: lighten($darker-text-color, 8%); + } + } + + .red { + color: $error-value-color; + } + } + } + + &__summary { + &__item { + display: flex; + justify-content: flex-start; + border-top: 1px solid darken($ui-base-color, 4%); + + &:hover { + background: lighten($ui-base-color, 2%); + } + + &__reported-by, + &__assigned { + padding: 15px; + flex: 0 0 auto; + box-sizing: border-box; + width: 150px; + color: $darker-text-color; + + &, + .username { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + } + + &__content { + flex: 1 1 auto; + max-width: calc(100% - 300px); + + &__icon { + color: $dark-text-color; + margin-right: 4px; + font-weight: 500; + } + } + + &__content a { + display: block; + box-sizing: border-box; + width: 100%; + padding: 15px; + text-decoration: none; + color: $darker-text-color; + } + } + } +} + +.one-line { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} diff --git a/app/javascript/flavours/glitch/styles/basics.scss b/app/javascript/flavours/glitch/styles/basics.scss index 11c91bbc9..9c2499ac4 100644 --- a/app/javascript/flavours/glitch/styles/basics.scss +++ b/app/javascript/flavours/glitch/styles/basics.scss @@ -1,3 +1,10 @@ +@function hex-color($color) { + @if type-of($color) == 'color' { + $color: str-slice(ie-hex-str($color), 4); + } + @return '%23' + unquote($color) +} + body { font-family: 'mastodon-font-sans-serif', sans-serif; background: darken($ui-base-color, 8%); diff --git a/app/javascript/flavours/glitch/styles/components/accounts.scss b/app/javascript/flavours/glitch/styles/components/accounts.scss index b2b6248ff..3eddd7fb4 100644 --- a/app/javascript/flavours/glitch/styles/components/accounts.scss +++ b/app/javascript/flavours/glitch/styles/components/accounts.scss @@ -239,6 +239,11 @@ flex: 0 1 100%; border-left: 1px solid lighten($ui-base-color, 8%); padding: 10px 0; + border-bottom: 4px solid transparent; + + &.active { + border-bottom: 4px solid $ui-highlight-color; + } & > span { display: block; diff --git a/app/javascript/flavours/glitch/styles/components/boost.scss b/app/javascript/flavours/glitch/styles/components/boost.scss index d92444042..f1ad041e9 100644 --- a/app/javascript/flavours/glitch/styles/components/boost.scss +++ b/app/javascript/flavours/glitch/styles/components/boost.scss @@ -1,10 +1,3 @@ -@function hex-color($color) { - @if type-of($color) == 'color' { - $color: str-slice(ie-hex-str($color), 4); - } - @return '%23' + unquote($color) -} - button.icon-button i.fa-retweet { background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='22' height='209'><path d='M4.97 3.16c-.1.03-.17.1-.22.18L.8 8.24c-.2.3.03.78.4.8H3.6v2.68c0 4.26-.55 3.62 3.66 3.62h7.66l-2.3-2.84c-.03-.02-.03-.04-.05-.06H7.27c-.44 0-.72-.3-.72-.72v-2.7h2.5c.37.03.63-.48.4-.77L5.5 3.35c-.12-.17-.34-.25-.53-.2zm12.16.43c-.55-.02-1.32.02-2.4.02H7.1l2.32 2.85.03.06h5.25c.42 0 .72.28.72.72v2.7h-2.5c-.36.02-.56.54-.3.8l3.92 4.9c.18.25.6.25.78 0l3.94-4.9c.26-.28 0-.83-.37-.8H18.4v-2.7c0-3.15.4-3.62-1.25-3.66z' fill='#{hex-color($action-button-color)}' stroke-width='0'/><path d='M7.78 19.66c-.24.02-.44.25-.44.5v2.46h-.06c-1.08 0-1.86-.03-2.4-.03-1.64 0-1.25.43-1.25 3.65v4.47c0 4.26-.56 3.62 3.65 3.62H8.5l-1.3-1.06c-.1-.08-.18-.2-.2-.3-.02-.17.06-.35.2-.45l1.33-1.1H7.28c-.44 0-.72-.3-.72-.7v-4.48c0-.44.28-.72.72-.72h.06v2.5c0 .38.54.63.82.38l4.9-3.93c.25-.18.25-.6 0-.78l-4.9-3.92c-.1-.1-.24-.14-.38-.12zm9.34 2.93c-.54-.02-1.3.02-2.4.02h-1.25l1.3 1.07c.1.07.18.2.2.33.02.16-.06.3-.2.4l-1.33 1.1h1.28c.42 0 .72.28.72.72v4.47c0 .42-.3.72-.72.72h-.1v-2.47c0-.3-.3-.53-.6-.47-.07 0-.14.05-.2.1l-4.9 3.93c-.26.18-.26.6 0 .78l4.9 3.92c.27.25.82 0 .8-.38v-2.5h.1c4.27 0 3.65.67 3.65-3.62v-4.47c0-3.15.4-3.62-1.25-3.66zM10.34 38.66c-.24.02-.44.25-.43.5v2.47H7.3c-1.08 0-1.86-.04-2.4-.04-1.64 0-1.25.43-1.25 3.65v4.47c0 3.66-.23 3.7 2.34 3.66l-1.34-1.1c-.1-.08-.18-.2-.2-.3 0-.17.07-.35.2-.45l1.96-1.6c-.03-.06-.04-.13-.04-.2v-4.48c0-.44.28-.72.72-.72H9.9v2.5c0 .36.5.6.8.38l4.93-3.93c.24-.18.24-.6 0-.78l-4.94-3.92c-.1-.08-.23-.13-.36-.12zm5.63 2.93l1.34 1.1c.1.07.18.2.2.33.02.16-.03.3-.16.4l-1.96 1.6c.02.07.06.13.06.22v4.47c0 .42-.3.72-.72.72h-2.66v-2.47c0-.3-.3-.53-.6-.47-.06.02-.12.05-.18.1l-4.94 3.93c-.24.18-.24.6 0 .78l4.94 3.92c.28.22.78-.02.78-.38v-2.5h2.66c4.27 0 3.65.67 3.65-3.62v-4.47c0-3.66.34-3.7-2.4-3.66zM13.06 57.66c-.23.03-.4.26-.4.5v2.47H7.28c-1.08 0-1.86-.04-2.4-.04-1.64 0-1.25.43-1.25 3.65v4.87l2.93-2.37v-2.5c0-.44.28-.72.72-.72h5.38v2.5c0 .36.5.6.78.38l4.94-3.93c.24-.18.24-.6 0-.78l-4.94-3.92c-.1-.1-.24-.14-.38-.12zm5.3 6.15l-2.92 2.4v2.52c0 .42-.3.72-.72.72h-5.4v-2.47c0-.3-.32-.53-.6-.47-.07.02-.13.05-.2.1L3.6 70.52c-.25.18-.25.6 0 .78l4.93 3.92c.28.22.78-.02.78-.38v-2.5h5.42c4.27 0 3.65.67 3.65-3.62v-4.47-.44zM19.25 78.8c-.1.03-.2.1-.28.17l-.9.9c-.44-.3-1.36-.25-3.35-.25H7.28c-1.08 0-1.86-.03-2.4-.03-1.64 0-1.25.43-1.25 3.65v.7l2.93.3v-1c0-.44.28-.72.72-.72h7.44c.2 0 .37.08.5.2l-1.8 1.8c-.25.26-.08.76.27.8l6.27.7c.28.03.56-.25.53-.53l-.7-6.25c0-.27-.3-.48-.55-.44zm-17.2 6.1c-.2.07-.36.3-.33.54l.7 6.25c.02.36.58.55.83.27l.8-.8c.02 0 .04-.02.04 0 .46.24 1.37.17 3.18.17h7.44c4.27 0 3.65.67 3.65-3.62v-.75l-2.93-.3v1.05c0 .42-.3.72-.72.72H7.28c-.15 0-.3-.03-.4-.1L8.8 86.4c.3-.24.1-.8-.27-.84l-6.28-.65h-.2zM4.88 98.6c-1.33 0-1.34.48-1.3 2.3l1.14-1.37c.08-.1.22-.17.34-.2.16 0 .34.08.44.2l1.66 2.03c.04 0 .07-.03.12-.03h7.44c.34 0 .57.2.65.5h-2.43c-.34.05-.53.52-.3.78l3.92 4.95c.18.24.6.24.78 0l3.94-4.94c.22-.27-.02-.76-.37-.77H18.4c.02-3.9.6-3.4-3.66-3.4H7.28c-1.08 0-1.86-.04-2.4-.04zm.15 2.46c-.1.03-.2.1-.28.2l-3.94 4.9c-.2.28.03.77.4.78H3.6c-.02 3.94-.45 3.4 3.66 3.4h7.44c3.65 0 3.74.3 3.7-2.25l-1.1 1.34c-.1.1-.2.17-.32.2-.16 0-.34-.08-.44-.2l-1.65-2.03c-.06.02-.1.04-.18.04H7.28c-.35 0-.57-.2-.66-.5h2.44c.37 0 .63-.5.4-.78l-3.96-4.9c-.1-.15-.3-.23-.47-.2zM4.88 117.6c-1.16 0-1.3.3-1.3 1.56l1.14-1.38c.08-.1.22-.14.34-.16.16 0 .34.04.44.16l2.22 2.75h7c.42 0 .72.28.72.72v.53h-2.6c-.3.1-.43.54-.2.78l3.92 4.9c.18.25.6.25.78 0l3.94-4.9c.22-.28-.02-.77-.37-.78H18.4v-.53c0-4.2.72-3.63-3.66-3.63H7.28c-1.08 0-1.86-.03-2.4-.03zm.1 1.74c-.1.03-.17.1-.23.16L.8 124.44c-.2.28.03.77.4.78H3.6v.5c0 4.26-.55 3.62 3.66 3.62h7.44c1.03 0 1.74.02 2.28 0-.16.02-.34-.03-.44-.15l-2.22-2.76H7.28c-.44 0-.72-.3-.72-.72v-.5h2.5c.37.02.63-.5.4-.78L5.5 119.5c-.12-.15-.34-.22-.53-.16zm12.02 10c1.2-.02 1.4-.25 1.4-1.53l-1.1 1.36c-.07.1-.17.17-.3.18zM5.94 136.6l2.37 2.93h6.42c.42 0 .72.28.72.72v1.25h-2.6c-.3.1-.43.54-.2.78l3.92 4.9c.18.25.6.25.78 0l3.94-4.9c.22-.28-.02-.77-.37-.78H18.4v-1.25c0-4.2.72-3.63-3.66-3.63H7.28c-.6 0-.92-.02-1.34-.03zm-1.72.06c-.4.08-.54.3-.6.75l.6-.74zm.84.93c-.12 0-.24.08-.3.18l-3.95 4.9c-.24.3 0 .83.4.82H3.6v1.22c0 4.26-.55 3.62 3.66 3.62h7.44c.63 0 .97.02 1.4.03l-2.37-2.93H7.28c-.44 0-.72-.3-.72-.72v-1.22h2.5c.4.04.67-.53.4-.8l-3.96-4.92c-.1-.13-.27-.2-.44-.2zm13.28 10.03l-.56.7c.36-.07.5-.3.56-.7zM17.13 155.6c-.55-.02-1.32.03-2.4.03h-8.2l2.38 2.9h5.82c.42 0 .72.28.72.72v1.97H12.9c-.32.06-.48.52-.28.78l3.94 4.94c.2.23.6.22.78-.03l3.94-4.9c.22-.28-.02-.77-.37-.78H18.4v-1.97c0-3.15.4-3.62-1.25-3.66zm-12.1.28c-.1.02-.2.1-.28.18l-3.94 4.9c-.2.3.03.78.4.8H3.6v1.96c0 4.26-.55 3.62 3.66 3.62h8.24l-2.36-2.9H7.28c-.44 0-.72-.3-.72-.72v-1.97h2.5c.37.02.63-.5.4-.78l-3.96-4.9c-.1-.15-.3-.22-.47-.2zM5.13 174.5c-.15 0-.3.07-.38.2L.8 179.6c-.24.27 0 .82.4.8H3.6v2.32c0 4.26-.55 3.62 3.66 3.62h7.94l-2.35-2.9h-5.6c-.43 0-.7-.3-.7-.72v-2.3h2.5c.38.03.66-.54.4-.83l-3.97-4.9c-.1-.13-.23-.2-.38-.2zm12 .1c-.55-.02-1.32.03-2.4.03H6.83l2.35 2.9h5.52c.42 0 .72.28.72.72v2.34h-2.6c-.3.1-.43.53-.2.78l3.92 4.9c.18.24.6.24.78 0l3.94-4.9c.22-.3-.02-.78-.37-.8H18.4v-2.33c0-3.15.4-3.62-1.25-3.66zM4.97 193.16c-.1.03-.17.1-.22.18l-3.94 4.9c-.2.3.03.78.4.8H3.6v2.68c0 4.26-.55 3.62 3.66 3.62h7.66l-2.3-2.84c-.03-.02-.03-.04-.05-.06H7.27c-.44 0-.72-.3-.72-.72v-2.7h2.5c.37.03.63-.48.4-.77l-3.96-4.9c-.12-.17-.34-.25-.53-.2zm12.16.43c-.55-.02-1.32.03-2.4.03H7.1l2.32 2.84.03.06h5.25c.42 0 .72.28.72.72v2.7h-2.5c-.36.02-.56.54-.3.8l3.92 4.9c.18.25.6.25.78 0l3.94-4.9c.26-.28 0-.83-.37-.8H18.4v-2.7c0-3.15.4-3.62-1.25-3.66z' fill='#{hex-color($highlight-text-color)}' stroke-width='0'/></svg>"); diff --git a/app/javascript/flavours/glitch/styles/components/index.scss b/app/javascript/flavours/glitch/styles/components/index.scss index 834839632..cbf968ec4 100644 --- a/app/javascript/flavours/glitch/styles/components/index.scss +++ b/app/javascript/flavours/glitch/styles/components/index.scss @@ -415,14 +415,14 @@ &.top { bottom: -5px; - margin-left: -13px; + margin-left: -7px; border-width: 5px 7px 0; border-top-color: $ui-secondary-color; } &.bottom { top: -5px; - margin-left: -13px; + margin-left: -7px; border-width: 0 7px 5px; border-bottom-color: $ui-secondary-color; } @@ -571,7 +571,7 @@ } } - span { + span:last-child { margin-left: 5px; display: none; } @@ -827,6 +827,10 @@ color: $highlight-text-color; } +.reduce-motion button.icon-button.disabled i.fa-retweet { + color: darken($action-button-color, 13%); +} + .load-more { display: block; color: $dark-text-color; @@ -1121,6 +1125,22 @@ left: 0; } +.icon-badge-wrapper { + position: relative; +} + +.icon-badge { + position: absolute; + display: block; + right: -.25em; + top: -.25em; + background-color: $ui-highlight-color; + border-radius: 50%; + font-size: 75%; + width: 1em; + height: 1em; +} + ::-webkit-scrollbar-thumb { border-radius: 0; } diff --git a/app/javascript/flavours/glitch/styles/components/metadata.scss b/app/javascript/flavours/glitch/styles/components/metadata.scss index 2efe6cd66..da045574a 100644 --- a/app/javascript/flavours/glitch/styles/components/metadata.scss +++ b/app/javascript/flavours/glitch/styles/components/metadata.scss @@ -4,17 +4,12 @@ overflow: hidden; margin: 20px -10px -20px; border-bottom: 0; - - a { - text-decoration: none; - - &:hover{ - text-decoration: underline; - } - } + border-top: 0; dl { - border-top: 1px solid lighten($ui-base-color, 8%); + background: $ui-base-color; + border-top: 1px solid lighten($ui-base-color, 4%); + border-bottom: 0; display: flex; } @@ -35,10 +30,6 @@ width: 120px; flex: 0 0 auto; font-weight: 500; - - a { - color: $primary-text-color; - } } dd { @@ -46,8 +37,9 @@ color: $primary-text-color; background: $ui-base-color; - a { - color: $highlight-text-color; + &.verified { + border: 1px solid rgba($valid-value-color, 0.5); + background: rgba($valid-value-color, 0.25); } } } diff --git a/app/javascript/flavours/glitch/styles/components/status.scss b/app/javascript/flavours/glitch/styles/components/status.scss index b841d73c4..aa49aba55 100644 --- a/app/javascript/flavours/glitch/styles/components/status.scss +++ b/app/javascript/flavours/glitch/styles/components/status.scss @@ -623,7 +623,6 @@ .status-card { display: flex; - cursor: pointer; font-size: 14px; border: 1px solid lighten($ui-base-color, 8%); border-radius: 4px; @@ -632,20 +631,62 @@ text-decoration: none; overflow: hidden; - &:hover { - background: lighten($ui-base-color, 8%); + &__actions { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; + display: flex; + justify-content: center; + align-items: center; + + & > div { + background: rgba($base-shadow-color, 0.6); + border-radius: 4px; + padding: 12px 9px; + flex: 0 0 auto; + display: flex; + justify-content: center; + align-items: center; + } + + button, + a { + display: inline; + color: $primary-text-color; + background: transparent; + border: 0; + padding: 0 5px; + text-decoration: none; + opacity: 0.6; + font-size: 18px; + line-height: 18px; + + &:hover, + &:active, + &:focus { + opacity: 1; + } + } + + a { + font-size: 19px; + position: relative; + bottom: -1px; + } + + a .fa, a:hover .fa { + color: inherit; + } } } -.status-card-video, -.status-card-rich, -.status-card-photo { - margin-top: 14px; - overflow: hidden; +a.status-card { + cursor: pointer; - iframe { - width: 100%; - height: auto; + &:hover { + background: lighten($ui-base-color, 8%); } } @@ -673,6 +714,7 @@ overflow: hidden; text-overflow: ellipsis; white-space: nowrap; + text-decoration: none; } .status-card__content { @@ -694,6 +736,7 @@ .status-card__image { flex: 0 0 100px; background: lighten($ui-base-color, 8%); + position: relative; } .status-card.horizontal { @@ -719,6 +762,8 @@ width: 100%; height: 100%; object-fit: cover; + background-size: cover; + background-position: center center; } .status__video-player { diff --git a/app/javascript/flavours/glitch/styles/containers.scss b/app/javascript/flavours/glitch/styles/containers.scss index 17901f233..d1b9934d7 100644 --- a/app/javascript/flavours/glitch/styles/containers.scss +++ b/app/javascript/flavours/glitch/styles/containers.scss @@ -724,6 +724,14 @@ a { color: lighten($ui-highlight-color, 8%); } + + dl:first-child .verified { + border-radius: 0 4px 0 0; + } + + .verified a { + color: $valid-value-color; + } } .account__header__content { diff --git a/app/javascript/flavours/glitch/styles/forms.scss b/app/javascript/flavours/glitch/styles/forms.scss index f97890187..cbd3de94c 100644 --- a/app/javascript/flavours/glitch/styles/forms.scss +++ b/app/javascript/flavours/glitch/styles/forms.scss @@ -1,3 +1,5 @@ +$no-columns-breakpoint: 600px; + code { font-family: 'mastodon-font-monospace', monospace; font-weight: 400; @@ -13,6 +15,60 @@ code { .input { margin-bottom: 15px; overflow: hidden; + + &.hidden { + margin: 0; + } + + &.radio_buttons { + .radio { + margin-bottom: 15px; + + &:last-child { + margin-bottom: 0; + } + } + + .radio > label { + position: relative; + padding-left: 28px; + + input { + position: absolute; + top: -2px; + left: 0; + } + } + } + + &.boolean { + position: relative; + margin-bottom: 0; + + .label_input > label { + font-family: inherit; + font-size: 14px; + padding-top: 5px; + color: $primary-text-color; + display: block; + width: auto; + } + + .label_input, + .hint { + padding-left: 28px; + } + + .label_input__wrapper { + position: static; + } + + label.checkbox { + position: absolute; + top: 2px; + left: 0; + } + } } .row { @@ -27,9 +83,22 @@ code { } } + .hint { + color: $darker-text-color; + + a { + color: $highlight-text-color; + } + + code { + border-radius: 3px; + padding: 0.2em 0.4em; + background: darken($ui-base-color, 12%); + } + } + span.hint { display: block; - color: $darker-text-color; font-size: 12px; margin-top: 4px; } @@ -44,11 +113,6 @@ code { line-height: 18px; margin-top: 15px; margin-bottom: 0; - color: $darker-text-color; - - a { - color: $highlight-text-color; - } } } @@ -66,81 +130,60 @@ code { } } - .label_input { - display: flex; + .input.with_floating_label { + .label_input { + display: flex; - label { - flex: 0 0 auto; + & > label { + font-family: inherit; + font-size: 14px; + color: $primary-text-color; + font-weight: 500; + min-width: 150px; + flex: 0 0 auto; + } + + input, + select { + flex: 1 1 auto; + } } - input { - flex: 1 1 auto; + &.select .hint { + margin-top: 6px; + margin-left: 150px; } } .input.with_label { - padding: 15px 0; - margin-bottom: 0; - - .label_input { - flex-wrap: wrap; - align-items: flex-start; - } - - &.select .label_input { - align-items: initial; - } - .label_input > label { font-family: inherit; - font-size: 16px; + font-size: 14px; color: $primary-text-color; display: block; - padding-top: 5px; - margin-bottom: 5px; - flex: 1; - min-width: 150px; + margin-bottom: 8px; word-wrap: break-word; + font-weight: 500; + } - &.select { - flex: 0; - } - - & ~ * { - margin-left: 10px; - } + .hint { + margin-top: 6px; } ul { flex: 390px; } - - &.boolean { - padding: initial; - margin-bottom: initial; - - .label_input > label { - font-family: inherit; - font-size: 14px; - color: $primary-text-color; - display: block; - width: auto; - } - - label.checkbox { - position: relative; - padding-left: 25px; - flex: 1 1 auto; - } - } } .input.with_block_label { + max-width: none; + & > label { font-family: inherit; font-size: 16px; color: $primary-text-color; display: block; + font-weight: 500; padding-top: 5px; } @@ -148,55 +191,75 @@ code { margin-bottom: 15px; } - li { - float: left; - width: 50%; + ul { + columns: 2; } } + .required abbr { + text-decoration: none; + color: lighten($error-value-color, 12%); + } + .fields-group { margin-bottom: 25px; - } - .input.radio_buttons .radio label { - margin-bottom: 5px; - font-family: inherit; - font-size: 14px; - color: $primary-text-color; - display: block; - width: auto; + .input:last-child { + margin-bottom: 0; + } } - .input.boolean { - margin-bottom: 5px; + .fields-row { + display: flex; + margin: 0 -10px; + padding-top: 5px; + margin-bottom: 25px; - label { - font-family: inherit; - font-size: 14px; - color: $primary-text-color; - display: block; - width: auto; + .input { + max-width: none; } - label.checkbox { - position: relative; - padding-left: 25px; + &__column { + box-sizing: border-box; + padding: 0 10px; flex: 1 1 auto; + min-height: 1px; + + &-6 { + max-width: 50%; + } } - input[type=checkbox] { - position: absolute; - left: 0; - top: 5px; - margin: 0; + .fields-group:last-child, + .fields-row__column.fields-group { + margin-bottom: 0; } - .hint { - padding-left: 25px; - margin-left: 0; + @media screen and (max-width: $no-columns-breakpoint) { + display: block; + margin-bottom: 0; + + &__column { + max-width: none; + } + + .fields-group:last-child, + .fields-row__column.fields-group, + .fields-row__column { + margin-bottom: 25px; + } } } + .input.radio_buttons .radio label { + margin-bottom: 5px; + font-family: inherit; + font-size: 14px; + color: $primary-text-color; + display: block; + width: auto; + } + .check_boxes { .checkbox { label { @@ -225,12 +288,7 @@ code { input[type=email], input[type=password], textarea { - background: transparent; box-sizing: border-box; - border: 0; - border-bottom: 2px solid $ui-primary-color; - border-radius: 2px 2px 0 0; - padding: 7px 4px; font-size: 16px; color: $primary-text-color; display: block; @@ -238,23 +296,31 @@ code { outline: 0; font-family: inherit; resize: vertical; + background: darken($ui-base-color, 10%); + border: 1px solid darken($ui-base-color, 14%); + border-radius: 4px; + padding: 10px; &:invalid { box-shadow: none; } &:focus:invalid { - border-bottom-color: lighten($error-red, 12%); + border-color: lighten($error-red, 12%); } &:required:valid { - border-bottom-color: $valid-value-color; + border-color: $valid-value-color; + } + + &:hover { + border-color: darken($ui-base-color, 20%); } &:active, &:focus { - border-bottom-color: $highlight-text-color; - background: rgba($base-overlay-background, 0.1); + border-color: $highlight-text-color; + background: darken($ui-base-color, 8%); } } @@ -338,28 +404,52 @@ code { } select { + appearance: none; + box-sizing: border-box; font-size: 16px; - max-height: 29px; + color: $primary-text-color; + display: block; + width: 100%; + outline: 0; + font-family: inherit; + resize: vertical; + background: darken($ui-base-color, 10%) url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 12%))}'/></svg>") no-repeat right 8px center / auto 16px; + border: 1px solid darken($ui-base-color, 14%); + border-radius: 4px; + padding: 10px; + height: 41px; } - .input-with-append { - position: relative; - - .input input { - padding-right: 127px; + .label_input { + &__wrapper { + position: relative; } - .append { + &__append { position: absolute; - right: 0; - top: 0; - padding: 7px 4px; + right: 1px; + top: 1px; + padding: 10px; padding-bottom: 9px; font-size: 16px; color: $dark-text-color; font-family: inherit; pointer-events: none; cursor: default; + max-width: 140px; + white-space: nowrap; + overflow: hidden; + + &::after { + content: ''; + display: block; + position: absolute; + top: 0; + right: 0; + bottom: 1px; + width: 5px; + background-image: linear-gradient(to right, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%)); + } } } } @@ -434,6 +524,30 @@ code { } } +.quick-nav { + list-style: none; + margin-bottom: 25px; + font-size: 14px; + + li { + display: inline-block; + margin-right: 10px; + } + + a { + color: $highlight-text-color; + text-transform: uppercase; + text-decoration: none; + font-weight: 700; + + &:hover, + &:focus, + &:active { + color: lighten($highlight-text-color, 8%); + } + } +} + .oauth-prompt, .follow-prompt { margin-bottom: 30px; @@ -592,3 +706,64 @@ code { display: block; } } + +.scope-danger { + color: $warning-red; +} + +.form_admin_settings_site_short_description, +.form_admin_settings_site_description, +.form_admin_settings_site_extended_description, +.form_admin_settings_site_terms, +.form_admin_settings_custom_css, +.form_admin_settings_closed_registrations_message { + textarea { + font-family: 'mastodon-font-monospace', monospace; + } +} + +.input-copy { + background: darken($ui-base-color, 10%); + border: 1px solid darken($ui-base-color, 14%); + border-radius: 4px; + display: flex; + align-items: center; + padding-right: 4px; + position: relative; + top: 1px; + transition: border-color 300ms linear; + + &__wrapper { + flex: 1 1 auto; + } + + input[type=text] { + background: transparent; + border: 0; + padding: 10px; + font-size: 14px; + font-family: 'mastodon-font-monospace', monospace; + } + + button { + flex: 0 0 auto; + margin: 4px; + text-transform: none; + font-weight: 400; + font-size: 14px; + padding: 7px 18px; + padding-bottom: 6px; + width: auto; + transition: background 300ms linear; + } + + &.copied { + border-color: $valid-value-color; + transition: none; + + button { + background: $valid-value-color; + transition: none; + } + } +} diff --git a/app/javascript/flavours/glitch/styles/rtl.scss b/app/javascript/flavours/glitch/styles/rtl.scss index e9099a9e9..b8c0efad8 100644 --- a/app/javascript/flavours/glitch/styles/rtl.scss +++ b/app/javascript/flavours/glitch/styles/rtl.scss @@ -206,13 +206,19 @@ body.rtl { } .simple_form .input-with-append .input input { - padding-left: 127px; + padding-left: 142px; padding-right: 0; } .simple_form .input-with-append .append { right: auto; left: 0; + + &::after { + right: auto; + left: 0; + background-image: linear-gradient(to left, rgba($ui-base-color, 0), $ui-base-color); + } } .table th, diff --git a/app/javascript/mastodon/actions/dropdown_menu.js b/app/javascript/mastodon/actions/dropdown_menu.js index 217ba4e74..14f2939c7 100644 --- a/app/javascript/mastodon/actions/dropdown_menu.js +++ b/app/javascript/mastodon/actions/dropdown_menu.js @@ -1,8 +1,8 @@ export const DROPDOWN_MENU_OPEN = 'DROPDOWN_MENU_OPEN'; export const DROPDOWN_MENU_CLOSE = 'DROPDOWN_MENU_CLOSE'; -export function openDropdownMenu(id, placement) { - return { type: DROPDOWN_MENU_OPEN, id, placement }; +export function openDropdownMenu(id, placement, keyboard) { + return { type: DROPDOWN_MENU_OPEN, id, placement, keyboard }; } export function closeDropdownMenu(id) { diff --git a/app/javascript/mastodon/components/__tests__/__snapshots__/button-test.js.snap b/app/javascript/mastodon/components/__tests__/__snapshots__/button-test.js.snap index c3f018d90..5c04e0979 100644 --- a/app/javascript/mastodon/components/__tests__/__snapshots__/button-test.js.snap +++ b/app/javascript/mastodon/components/__tests__/__snapshots__/button-test.js.snap @@ -3,7 +3,6 @@ exports[`<Button /> adds class "button-secondary" if props.secondary given 1`] = ` <button className="button button-secondary" - disabled={undefined} onClick={[Function]} style={ Object { @@ -18,7 +17,6 @@ exports[`<Button /> adds class "button-secondary" if props.secondary given 1`] = exports[`<Button /> renders a button element 1`] = ` <button className="button" - disabled={undefined} onClick={[Function]} style={ Object { @@ -48,7 +46,6 @@ exports[`<Button /> renders a disabled attribute if props.disabled given 1`] = ` exports[`<Button /> renders class="button--block" if props.block given 1`] = ` <button className="button button--block" - disabled={undefined} onClick={[Function]} style={ Object { @@ -63,7 +60,6 @@ exports[`<Button /> renders class="button--block" if props.block given 1`] = ` exports[`<Button /> renders the children 1`] = ` <button className="button" - disabled={undefined} onClick={[Function]} style={ Object { @@ -82,7 +78,6 @@ exports[`<Button /> renders the children 1`] = ` exports[`<Button /> renders the given text 1`] = ` <button className="button" - disabled={undefined} onClick={[Function]} style={ Object { @@ -99,7 +94,6 @@ exports[`<Button /> renders the given text 1`] = ` exports[`<Button /> renders the props.text instead of children 1`] = ` <button className="button" - disabled={undefined} onClick={[Function]} style={ Object { diff --git a/app/javascript/mastodon/components/account.js b/app/javascript/mastodon/components/account.js index 8e6aa9d92..c021e3267 100644 --- a/app/javascript/mastodon/components/account.js +++ b/app/javascript/mastodon/components/account.js @@ -19,8 +19,8 @@ const messages = defineMessages({ unmute_notifications: { id: 'account.unmute_notifications', defaultMessage: 'Unmute notifications from @{name}' }, }); -@injectIntl -export default class Account extends ImmutablePureComponent { +export default @injectIntl +class Account extends ImmutablePureComponent { static propTypes = { account: ImmutablePropTypes.map.isRequired, diff --git a/app/javascript/mastodon/components/column_header.js b/app/javascript/mastodon/components/column_header.js index 56453aeac..457508d13 100644 --- a/app/javascript/mastodon/components/column_header.js +++ b/app/javascript/mastodon/components/column_header.js @@ -10,8 +10,8 @@ const messages = defineMessages({ moveRight: { id: 'column_header.moveRight_settings', defaultMessage: 'Move column to the right' }, }); -@injectIntl -export default class ColumnHeader extends React.PureComponent { +export default @injectIntl +class ColumnHeader extends React.PureComponent { static contextTypes = { router: PropTypes.object, diff --git a/app/javascript/mastodon/components/domain.js b/app/javascript/mastodon/components/domain.js index f657cb8d2..24f80e788 100644 --- a/app/javascript/mastodon/components/domain.js +++ b/app/javascript/mastodon/components/domain.js @@ -8,8 +8,8 @@ const messages = defineMessages({ unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unhide {domain}' }, }); -@injectIntl -export default class Account extends ImmutablePureComponent { +export default @injectIntl +class Account extends ImmutablePureComponent { static propTypes = { domain: PropTypes.string, diff --git a/app/javascript/mastodon/components/dropdown_menu.js b/app/javascript/mastodon/components/dropdown_menu.js index a5cf6479b..91b65a02f 100644 --- a/app/javascript/mastodon/components/dropdown_menu.js +++ b/app/javascript/mastodon/components/dropdown_menu.js @@ -23,6 +23,7 @@ class DropdownMenu extends React.PureComponent { placement: PropTypes.string, arrowOffsetLeft: PropTypes.string, arrowOffsetTop: PropTypes.string, + openedViaKeyboard: PropTypes.bool, }; static defaultProps = { @@ -42,13 +43,15 @@ class DropdownMenu extends React.PureComponent { componentDidMount () { document.addEventListener('click', this.handleDocumentClick, false); + document.addEventListener('keydown', this.handleKeyDown, false); document.addEventListener('touchend', this.handleDocumentClick, listenerOptions); - if (this.focusedItem) this.focusedItem.focus(); + if (this.focusedItem && this.props.openedViaKeyboard) this.focusedItem.focus(); this.setState({ mounted: true }); } componentWillUnmount () { document.removeEventListener('click', this.handleDocumentClick, false); + document.removeEventListener('keydown', this.handleKeyDown, false); document.removeEventListener('touchend', this.handleDocumentClick, listenerOptions); } @@ -62,13 +65,10 @@ class DropdownMenu extends React.PureComponent { handleKeyDown = e => { const items = Array.from(this.node.getElementsByTagName('a')); - const index = items.indexOf(e.currentTarget); + const index = items.indexOf(document.activeElement); let element; switch(e.key) { - case 'Enter': - this.handleClick(e); - break; case 'ArrowDown': element = items[index+1]; if (element) { @@ -96,6 +96,12 @@ class DropdownMenu extends React.PureComponent { } } + handleItemKeyDown = e => { + if (e.key === 'Enter') { + this.handleClick(e); + } + } + handleClick = e => { const i = Number(e.currentTarget.getAttribute('data-index')); const { action, to } = this.props.items[i]; @@ -120,7 +126,7 @@ class DropdownMenu extends React.PureComponent { return ( <li className='dropdown-menu__item' key={`${text}-${i}`}> - <a href={href} target='_blank' rel='noopener' role='button' tabIndex='0' ref={i === 0 ? this.setFocusRef : null} onClick={this.handleClick} onKeyDown={this.handleKeyDown} data-index={i}> + <a href={href} target='_blank' rel='noopener' role='button' tabIndex='0' ref={i === 0 ? this.setFocusRef : null} onClick={this.handleClick} onKeyDown={this.handleItemKeyDown} data-index={i}> {text} </a> </li> @@ -170,6 +176,7 @@ export default class Dropdown extends React.PureComponent { onClose: PropTypes.func.isRequired, dropdownPlacement: PropTypes.string, openDropdownId: PropTypes.number, + openedViaKeyboard: PropTypes.bool, }; static defaultProps = { @@ -180,14 +187,14 @@ export default class Dropdown extends React.PureComponent { id: id++, }; - handleClick = ({ target }) => { + handleClick = ({ target, type }) => { if (this.state.id === this.props.openDropdownId) { this.handleClose(); } else { const { top } = target.getBoundingClientRect(); const placement = top * 2 < innerHeight ? 'bottom' : 'top'; - this.props.onOpen(this.state.id, this.handleItemClick, placement); + this.props.onOpen(this.state.id, this.handleItemClick, placement, type !== 'click'); } } @@ -197,6 +204,11 @@ export default class Dropdown extends React.PureComponent { handleKeyDown = e => { switch(e.key) { + case ' ': + case 'Enter': + this.handleClick(e); + e.preventDefault(); + break; case 'Escape': this.handleClose(); break; @@ -233,7 +245,7 @@ export default class Dropdown extends React.PureComponent { } render () { - const { icon, items, size, title, disabled, dropdownPlacement, openDropdownId } = this.props; + const { icon, items, size, title, disabled, dropdownPlacement, openDropdownId, openedViaKeyboard } = this.props; const open = this.state.id === openDropdownId; return ( @@ -249,7 +261,7 @@ export default class Dropdown extends React.PureComponent { /> <Overlay show={open} placement={dropdownPlacement} target={this.findTarget}> - <DropdownMenu items={items} onClose={this.handleClose} /> + <DropdownMenu items={items} onClose={this.handleClose} openedViaKeyboard={openedViaKeyboard} /> </Overlay> </div> ); diff --git a/app/javascript/mastodon/components/load_gap.js b/app/javascript/mastodon/components/load_gap.js index 012303ae1..ed4d445d0 100644 --- a/app/javascript/mastodon/components/load_gap.js +++ b/app/javascript/mastodon/components/load_gap.js @@ -6,8 +6,8 @@ const messages = defineMessages({ load_more: { id: 'status.load_more', defaultMessage: 'Load more' }, }); -@injectIntl -export default class LoadGap extends React.PureComponent { +export default @injectIntl +class LoadGap extends React.PureComponent { static propTypes = { disabled: PropTypes.bool, diff --git a/app/javascript/mastodon/components/media_gallery.js b/app/javascript/mastodon/components/media_gallery.js index 6e1310cd6..a1785196f 100644 --- a/app/javascript/mastodon/components/media_gallery.js +++ b/app/javascript/mastodon/components/media_gallery.js @@ -179,8 +179,8 @@ class Item extends React.PureComponent { } -@injectIntl -export default class MediaGallery extends React.PureComponent { +export default @injectIntl +class MediaGallery extends React.PureComponent { static propTypes = { sensitive: PropTypes.bool, diff --git a/app/javascript/mastodon/components/relative_timestamp.js b/app/javascript/mastodon/components/relative_timestamp.js index 9609714a1..57d99dd19 100644 --- a/app/javascript/mastodon/components/relative_timestamp.js +++ b/app/javascript/mastodon/components/relative_timestamp.js @@ -86,8 +86,8 @@ export const timeAgoString = (intl, date, now, year) => { return relativeTime; }; -@injectIntl -export default class RelativeTimestamp extends React.Component { +export default @injectIntl +class RelativeTimestamp extends React.Component { static propTypes = { intl: PropTypes.object.isRequired, diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js index 43647acc0..6c595c712 100644 --- a/app/javascript/mastodon/components/status.js +++ b/app/javascript/mastodon/components/status.js @@ -35,8 +35,8 @@ export const textForScreenReader = (intl, status, rebloggedByText = false) => { return values.join(', '); }; -@injectIntl -export default class Status extends ImmutablePureComponent { +export default @injectIntl +class Status extends ImmutablePureComponent { static contextTypes = { router: PropTypes.object, diff --git a/app/javascript/mastodon/components/status_action_bar.js b/app/javascript/mastodon/components/status_action_bar.js index 6d44a4b45..e7e5b0a6c 100644 --- a/app/javascript/mastodon/components/status_action_bar.js +++ b/app/javascript/mastodon/components/status_action_bar.js @@ -42,8 +42,8 @@ const obfuscatedCount = count => { } }; -@injectIntl -export default class StatusActionBar extends ImmutablePureComponent { +export default @injectIntl +class StatusActionBar extends ImmutablePureComponent { static contextTypes = { router: PropTypes.object, diff --git a/app/javascript/mastodon/containers/dropdown_menu_container.js b/app/javascript/mastodon/containers/dropdown_menu_container.js index 7cbcdcd35..73c8a1e53 100644 --- a/app/javascript/mastodon/containers/dropdown_menu_container.js +++ b/app/javascript/mastodon/containers/dropdown_menu_container.js @@ -8,15 +8,16 @@ const mapStateToProps = state => ({ isModalOpen: state.get('modal').modalType === 'ACTIONS', dropdownPlacement: state.getIn(['dropdown_menu', 'placement']), openDropdownId: state.getIn(['dropdown_menu', 'openId']), + openedViaKeyboard: state.getIn(['dropdown_menu', 'keyboard']), }); const mapDispatchToProps = (dispatch, { status, items }) => ({ - onOpen(id, onItemClick, dropdownPlacement) { + onOpen(id, onItemClick, dropdownPlacement, keyboard) { dispatch(isUserTouching() ? openModal('ACTIONS', { status, actions: items, onClick: onItemClick, - }) : openDropdownMenu(id, dropdownPlacement)); + }) : openDropdownMenu(id, dropdownPlacement, keyboard)); }, onClose(id) { dispatch(closeModal()); diff --git a/app/javascript/mastodon/features/account/components/action_bar.js b/app/javascript/mastodon/features/account/components/action_bar.js index bc6f86628..c9ae2df98 100644 --- a/app/javascript/mastodon/features/account/components/action_bar.js +++ b/app/javascript/mastodon/features/account/components/action_bar.js @@ -2,7 +2,7 @@ import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; import DropdownMenuContainer from '../../../containers/dropdown_menu_container'; -import { Link } from 'react-router-dom'; +import { NavLink } from 'react-router-dom'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import { me } from '../../../initial_state'; import { shortNumberFormat } from '../../../utils/numbers'; @@ -36,8 +36,8 @@ const messages = defineMessages({ unendorse: { id: 'account.unendorse', defaultMessage: 'Don\'t feature on profile' }, }); -@injectIntl -export default class ActionBar extends React.PureComponent { +export default @injectIntl +class ActionBar extends React.PureComponent { static propTypes = { account: ImmutablePropTypes.map.isRequired, @@ -60,6 +60,13 @@ export default class ActionBar extends React.PureComponent { }); } + isStatusesPageActive = (match, location) => { + if (!match) { + return false; + } + return !location.pathname.match(/\/(followers|following)\/?$/); + } + render () { const { account, intl } = this.props; @@ -147,20 +154,20 @@ export default class ActionBar extends React.PureComponent { <div className='account__action-bar'> <div className='account__action-bar-links'> - <Link className='account__action-bar__tab' to={`/accounts/${account.get('id')}`} title={intl.formatNumber(account.get('statuses_count'))}> + <NavLink isActive={this.isStatusesPageActive} activeClassName='active' className='account__action-bar__tab' to={`/accounts/${account.get('id')}`} title={intl.formatNumber(account.get('statuses_count'))}> <FormattedMessage id='account.posts' defaultMessage='Toots' /> <strong>{shortNumberFormat(account.get('statuses_count'))}</strong> - </Link> + </NavLink> - <Link className='account__action-bar__tab' to={`/accounts/${account.get('id')}/following`} title={intl.formatNumber(account.get('following_count'))}> + <NavLink exact activeClassName='active' className='account__action-bar__tab' to={`/accounts/${account.get('id')}/following`} title={intl.formatNumber(account.get('following_count'))}> <FormattedMessage id='account.follows' defaultMessage='Follows' /> <strong>{shortNumberFormat(account.get('following_count'))}</strong> - </Link> + </NavLink> - <Link className='account__action-bar__tab' to={`/accounts/${account.get('id')}/followers`} title={intl.formatNumber(account.get('followers_count'))}> + <NavLink exact activeClassName='active' className='account__action-bar__tab' to={`/accounts/${account.get('id')}/followers`} title={intl.formatNumber(account.get('followers_count'))}> <FormattedMessage id='account.followers' defaultMessage='Followers' /> <strong>{shortNumberFormat(account.get('followers_count'))}</strong> - </Link> + </NavLink> </div> <div className='account__action-bar-dropdown'> diff --git a/app/javascript/mastodon/features/account/components/header.js b/app/javascript/mastodon/features/account/components/header.js index eb9236aeb..11ae58905 100644 --- a/app/javascript/mastodon/features/account/components/header.js +++ b/app/javascript/mastodon/features/account/components/header.js @@ -15,8 +15,18 @@ const messages = defineMessages({ requested: { id: 'account.requested', defaultMessage: 'Awaiting approval. Click to cancel follow request' }, unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' }, edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' }, + linkVerifiedOn: { id: 'account.link_verified_on', defaultMessage: 'Ownership of this link was checked on {date}' }, }); +const dateFormatOptions = { + month: 'short', + day: 'numeric', + year: 'numeric', + hour12: false, + hour: '2-digit', + minute: '2-digit', +}; + class Avatar extends ImmutablePureComponent { static propTypes = { @@ -65,8 +75,8 @@ class Avatar extends ImmutablePureComponent { } -@injectIntl -export default class Header extends ImmutablePureComponent { +export default @injectIntl +class Header extends ImmutablePureComponent { static propTypes = { account: ImmutablePropTypes.map, @@ -163,7 +173,10 @@ export default class Header extends ImmutablePureComponent { {fields.map((pair, i) => ( <dl key={i}> <dt dangerouslySetInnerHTML={{ __html: pair.get('name_emojified') }} title={pair.get('name')} /> - <dd dangerouslySetInnerHTML={{ __html: pair.get('value_emojified') }} title={pair.get('value_plain')} /> + + <dd className={pair.get('verified_at') && 'verified'} title={pair.get('value_plain')}> + {pair.get('verified_at') && <span title={intl.formatMessage(messages.linkVerifiedOn, { date: intl.formatDate(pair.get('verified_at'), dateFormatOptions) })}><i className='fa fa-check verified__mark' /></span>} <span dangerouslySetInnerHTML={{ __html: pair.get('value_emojified') }} /> + </dd> </dl> ))} </div> diff --git a/app/javascript/mastodon/features/account_gallery/index.js b/app/javascript/mastodon/features/account_gallery/index.js index a6c464aff..32cb5ebdc 100644 --- a/app/javascript/mastodon/features/account_gallery/index.js +++ b/app/javascript/mastodon/features/account_gallery/index.js @@ -43,8 +43,8 @@ class LoadMoreMedia extends ImmutablePureComponent { } -@connect(mapStateToProps) -export default class AccountGallery extends ImmutablePureComponent { +export default @connect(mapStateToProps) +class AccountGallery extends ImmutablePureComponent { static propTypes = { params: PropTypes.object.isRequired, diff --git a/app/javascript/mastodon/features/account_timeline/index.js b/app/javascript/mastodon/features/account_timeline/index.js index 934513cd7..6055af51d 100644 --- a/app/javascript/mastodon/features/account_timeline/index.js +++ b/app/javascript/mastodon/features/account_timeline/index.js @@ -23,8 +23,8 @@ const mapStateToProps = (state, { params: { accountId }, withReplies = false }) }; }; -@connect(mapStateToProps) -export default class AccountTimeline extends ImmutablePureComponent { +export default @connect(mapStateToProps) +class AccountTimeline extends ImmutablePureComponent { static propTypes = { params: PropTypes.object.isRequired, diff --git a/app/javascript/mastodon/features/blocks/index.js b/app/javascript/mastodon/features/blocks/index.js index 68661a37c..ca7ce6f8e 100644 --- a/app/javascript/mastodon/features/blocks/index.js +++ b/app/javascript/mastodon/features/blocks/index.js @@ -20,9 +20,9 @@ const mapStateToProps = state => ({ accountIds: state.getIn(['user_lists', 'blocks', 'items']), }); -@connect(mapStateToProps) +export default @connect(mapStateToProps) @injectIntl -export default class Blocks extends ImmutablePureComponent { +class Blocks extends ImmutablePureComponent { static propTypes = { params: PropTypes.object.isRequired, diff --git a/app/javascript/mastodon/features/community_timeline/components/column_settings.js b/app/javascript/mastodon/features/community_timeline/components/column_settings.js index f4325f58d..8250190a7 100644 --- a/app/javascript/mastodon/features/community_timeline/components/column_settings.js +++ b/app/javascript/mastodon/features/community_timeline/components/column_settings.js @@ -4,8 +4,8 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import { injectIntl, FormattedMessage } from 'react-intl'; import SettingToggle from '../../notifications/components/setting_toggle'; -@injectIntl -export default class ColumnSettings extends React.PureComponent { +export default @injectIntl +class ColumnSettings extends React.PureComponent { static propTypes = { settings: ImmutablePropTypes.map.isRequired, diff --git a/app/javascript/mastodon/features/community_timeline/index.js b/app/javascript/mastodon/features/community_timeline/index.js index 48d2b3f68..7d26c98b0 100644 --- a/app/javascript/mastodon/features/community_timeline/index.js +++ b/app/javascript/mastodon/features/community_timeline/index.js @@ -25,9 +25,9 @@ const mapStateToProps = (state, { onlyMedia, columnId }) => { }; }; -@connect(mapStateToProps) +export default @connect(mapStateToProps) @injectIntl -export default class CommunityTimeline extends React.PureComponent { +class CommunityTimeline extends React.PureComponent { static contextTypes = { router: PropTypes.object, diff --git a/app/javascript/mastodon/features/compose/components/action_bar.js b/app/javascript/mastodon/features/compose/components/action_bar.js index daee18552..95d6eeb06 100644 --- a/app/javascript/mastodon/features/compose/components/action_bar.js +++ b/app/javascript/mastodon/features/compose/components/action_bar.js @@ -17,8 +17,8 @@ const messages = defineMessages({ filters: { id: 'navigation_bar.filters', defaultMessage: 'Muted words' }, }); -@injectIntl -export default class ActionBar extends React.PureComponent { +export default @injectIntl +class ActionBar extends React.PureComponent { static propTypes = { account: ImmutablePropTypes.map.isRequired, diff --git a/app/javascript/mastodon/features/compose/components/compose_form.js b/app/javascript/mastodon/features/compose/components/compose_form.js index cc9145683..eec93fc28 100644 --- a/app/javascript/mastodon/features/compose/components/compose_form.js +++ b/app/javascript/mastodon/features/compose/components/compose_form.js @@ -28,8 +28,8 @@ const messages = defineMessages({ publishLoud: { id: 'compose_form.publish_loud', defaultMessage: '{publish}!' }, }); -@injectIntl -export default class ComposeForm extends ImmutablePureComponent { +export default @injectIntl +class ComposeForm extends ImmutablePureComponent { static propTypes = { intl: PropTypes.object.isRequired, diff --git a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js index 4fc32db8a..c1429c756 100644 --- a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js +++ b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js @@ -261,6 +261,7 @@ class EmojiPickerMenu extends React.PureComponent { skin={skinTone} showPreview={false} backgroundImageFn={backgroundImageFn} + autoFocus emojiTooltip /> @@ -277,8 +278,8 @@ class EmojiPickerMenu extends React.PureComponent { } -@injectIntl -export default class EmojiPickerDropdown extends React.PureComponent { +export default @injectIntl +class EmojiPickerDropdown extends React.PureComponent { static propTypes = { custom_emojis: ImmutablePropTypes.list, diff --git a/app/javascript/mastodon/features/compose/components/privacy_dropdown.js b/app/javascript/mastodon/features/compose/components/privacy_dropdown.js index e19778fd2..7b5482f05 100644 --- a/app/javascript/mastodon/features/compose/components/privacy_dropdown.js +++ b/app/javascript/mastodon/features/compose/components/privacy_dropdown.js @@ -149,8 +149,8 @@ class PrivacyDropdownMenu extends React.PureComponent { } -@injectIntl -export default class PrivacyDropdown extends React.PureComponent { +export default @injectIntl +class PrivacyDropdown extends React.PureComponent { static propTypes = { isUserTouching: PropTypes.func, diff --git a/app/javascript/mastodon/features/compose/components/reply_indicator.js b/app/javascript/mastodon/features/compose/components/reply_indicator.js index 6f358a98b..142223f3d 100644 --- a/app/javascript/mastodon/features/compose/components/reply_indicator.js +++ b/app/javascript/mastodon/features/compose/components/reply_indicator.js @@ -12,8 +12,8 @@ const messages = defineMessages({ cancel: { id: 'reply_indicator.cancel', defaultMessage: 'Cancel' }, }); -@injectIntl -export default class ReplyIndicator extends ImmutablePureComponent { +export default @injectIntl +class ReplyIndicator extends ImmutablePureComponent { static contextTypes = { router: PropTypes.object, diff --git a/app/javascript/mastodon/features/compose/components/search.js b/app/javascript/mastodon/features/compose/components/search.js index 71c0a203f..d203d8780 100644 --- a/app/javascript/mastodon/features/compose/components/search.js +++ b/app/javascript/mastodon/features/compose/components/search.js @@ -43,8 +43,8 @@ class SearchPopout extends React.PureComponent { } -@injectIntl -export default class Search extends React.PureComponent { +export default @injectIntl +class Search extends React.PureComponent { static propTypes = { value: PropTypes.string.isRequired, diff --git a/app/javascript/mastodon/features/compose/components/upload.js b/app/javascript/mastodon/features/compose/components/upload.js index 3d09217dc..e377da90c 100644 --- a/app/javascript/mastodon/features/compose/components/upload.js +++ b/app/javascript/mastodon/features/compose/components/upload.js @@ -11,8 +11,8 @@ const messages = defineMessages({ description: { id: 'upload_form.description', defaultMessage: 'Describe for the visually impaired' }, }); -@injectIntl -export default class Upload extends ImmutablePureComponent { +export default @injectIntl +class Upload extends ImmutablePureComponent { static propTypes = { media: ImmutablePropTypes.map.isRequired, diff --git a/app/javascript/mastodon/features/compose/components/upload_button.js b/app/javascript/mastodon/features/compose/components/upload_button.js index 8b9609138..b6fe770ea 100644 --- a/app/javascript/mastodon/features/compose/components/upload_button.js +++ b/app/javascript/mastodon/features/compose/components/upload_button.js @@ -23,9 +23,9 @@ const iconStyle = { lineHeight: '27px', }; -@connect(makeMapStateToProps) +export default @connect(makeMapStateToProps) @injectIntl -export default class UploadButton extends ImmutablePureComponent { +class UploadButton extends ImmutablePureComponent { static propTypes = { disabled: PropTypes.bool, diff --git a/app/javascript/mastodon/features/compose/index.js b/app/javascript/mastodon/features/compose/index.js index b7394a39e..cf1714b71 100644 --- a/app/javascript/mastodon/features/compose/index.js +++ b/app/javascript/mastodon/features/compose/index.js @@ -30,9 +30,9 @@ const mapStateToProps = (state, ownProps) => ({ showSearch: ownProps.multiColumn ? state.getIn(['search', 'submitted']) && !state.getIn(['search', 'hidden']) : ownProps.isSearchPage, }); -@connect(mapStateToProps) +export default @connect(mapStateToProps) @injectIntl -export default class Compose extends React.PureComponent { +class Compose extends React.PureComponent { static propTypes = { dispatch: PropTypes.func.isRequired, diff --git a/app/javascript/mastodon/features/compose/util/url_regex.js b/app/javascript/mastodon/features/compose/util/url_regex.js index d5e39e0d5..7f1e17620 100644 --- a/app/javascript/mastodon/features/compose/util/url_regex.js +++ b/app/javascript/mastodon/features/compose/util/url_regex.js @@ -170,7 +170,7 @@ export const urlRegex = (function() { ')' + '\\)', 'i'); - // Valid end-of-path chracters (so /foo. does not gobble the period). + // Valid end-of-path characters (so /foo. does not gobble the period). // 1. Allow =&# for empty URL parameters and other URL-join artifacts regexen.validUrlPathEndingChars = regexSupplant(/[^#{spaces_group}\(\)\?!\*';:=\,\.\$%\[\]#{pd}~&\|@]|(?:#{validUrlBalancedParens})/i); // Allow @ in a url, but only in the middle. Catch things like http://example.com/@user/ diff --git a/app/javascript/mastodon/features/direct_timeline/components/column_settings.js b/app/javascript/mastodon/features/direct_timeline/components/column_settings.js index a992b27bb..b629c128d 100644 --- a/app/javascript/mastodon/features/direct_timeline/components/column_settings.js +++ b/app/javascript/mastodon/features/direct_timeline/components/column_settings.js @@ -9,8 +9,8 @@ const messages = defineMessages({ settings: { id: 'home.settings', defaultMessage: 'Column settings' }, }); -@injectIntl -export default class ColumnSettings extends React.PureComponent { +export default @injectIntl +class ColumnSettings extends React.PureComponent { static propTypes = { settings: ImmutablePropTypes.map.isRequired, diff --git a/app/javascript/mastodon/features/direct_timeline/index.js b/app/javascript/mastodon/features/direct_timeline/index.js index dd289ce56..3c7e2d007 100644 --- a/app/javascript/mastodon/features/direct_timeline/index.js +++ b/app/javascript/mastodon/features/direct_timeline/index.js @@ -17,9 +17,9 @@ const mapStateToProps = state => ({ hasUnread: state.getIn(['timelines', 'direct', 'unread']) > 0, }); -@connect(mapStateToProps) +export default @connect(mapStateToProps) @injectIntl -export default class DirectTimeline extends React.PureComponent { +class DirectTimeline extends React.PureComponent { static propTypes = { dispatch: PropTypes.func.isRequired, diff --git a/app/javascript/mastodon/features/domain_blocks/index.js b/app/javascript/mastodon/features/domain_blocks/index.js index 2c40bf72d..5c1bd1161 100644 --- a/app/javascript/mastodon/features/domain_blocks/index.js +++ b/app/javascript/mastodon/features/domain_blocks/index.js @@ -21,9 +21,9 @@ const mapStateToProps = state => ({ domains: state.getIn(['domain_lists', 'blocks', 'items']), }); -@connect(mapStateToProps) +export default @connect(mapStateToProps) @injectIntl -export default class Blocks extends ImmutablePureComponent { +class Blocks extends ImmutablePureComponent { static propTypes = { params: PropTypes.object.isRequired, diff --git a/app/javascript/mastodon/features/favourited_statuses/index.js b/app/javascript/mastodon/features/favourited_statuses/index.js index 499530cd9..fa9401b90 100644 --- a/app/javascript/mastodon/features/favourited_statuses/index.js +++ b/app/javascript/mastodon/features/favourited_statuses/index.js @@ -21,9 +21,9 @@ const mapStateToProps = state => ({ hasMore: !!state.getIn(['status_lists', 'favourites', 'next']), }); -@connect(mapStateToProps) +export default @connect(mapStateToProps) @injectIntl -export default class Favourites extends ImmutablePureComponent { +class Favourites extends ImmutablePureComponent { static propTypes = { dispatch: PropTypes.func.isRequired, diff --git a/app/javascript/mastodon/features/favourites/index.js b/app/javascript/mastodon/features/favourites/index.js index 74a683ccc..d1ac229a2 100644 --- a/app/javascript/mastodon/features/favourites/index.js +++ b/app/javascript/mastodon/features/favourites/index.js @@ -15,8 +15,8 @@ const mapStateToProps = (state, props) => ({ accountIds: state.getIn(['user_lists', 'favourited_by', props.params.statusId]), }); -@connect(mapStateToProps) -export default class Favourites extends ImmutablePureComponent { +export default @connect(mapStateToProps) +class Favourites extends ImmutablePureComponent { static propTypes = { params: PropTypes.object.isRequired, diff --git a/app/javascript/mastodon/features/follow_requests/components/account_authorize.js b/app/javascript/mastodon/features/follow_requests/components/account_authorize.js index 4fc5638d9..a3b524db1 100644 --- a/app/javascript/mastodon/features/follow_requests/components/account_authorize.js +++ b/app/javascript/mastodon/features/follow_requests/components/account_authorize.js @@ -13,8 +13,8 @@ const messages = defineMessages({ reject: { id: 'follow_request.reject', defaultMessage: 'Reject' }, }); -@injectIntl -export default class AccountAuthorize extends ImmutablePureComponent { +export default @injectIntl +class AccountAuthorize extends ImmutablePureComponent { static propTypes = { account: ImmutablePropTypes.map.isRequired, diff --git a/app/javascript/mastodon/features/follow_requests/index.js b/app/javascript/mastodon/features/follow_requests/index.js index cb574e08d..56ae8764b 100644 --- a/app/javascript/mastodon/features/follow_requests/index.js +++ b/app/javascript/mastodon/features/follow_requests/index.js @@ -20,9 +20,9 @@ const mapStateToProps = state => ({ accountIds: state.getIn(['user_lists', 'follow_requests', 'items']), }); -@connect(mapStateToProps) +export default @connect(mapStateToProps) @injectIntl -export default class FollowRequests extends ImmutablePureComponent { +class FollowRequests extends ImmutablePureComponent { static propTypes = { params: PropTypes.object.isRequired, diff --git a/app/javascript/mastodon/features/followers/index.js b/app/javascript/mastodon/features/followers/index.js index 97d59cc4a..b9ca7f3dd 100644 --- a/app/javascript/mastodon/features/followers/index.js +++ b/app/javascript/mastodon/features/followers/index.js @@ -22,8 +22,8 @@ const mapStateToProps = (state, props) => ({ hasMore: !!state.getIn(['user_lists', 'followers', props.params.accountId, 'next']), }); -@connect(mapStateToProps) -export default class Followers extends ImmutablePureComponent { +export default @connect(mapStateToProps) +class Followers extends ImmutablePureComponent { static propTypes = { params: PropTypes.object.isRequired, diff --git a/app/javascript/mastodon/features/following/index.js b/app/javascript/mastodon/features/following/index.js index 17bc7ec6e..b3e160240 100644 --- a/app/javascript/mastodon/features/following/index.js +++ b/app/javascript/mastodon/features/following/index.js @@ -22,8 +22,8 @@ const mapStateToProps = (state, props) => ({ hasMore: !!state.getIn(['user_lists', 'following', props.params.accountId, 'next']), }); -@connect(mapStateToProps) -export default class Following extends ImmutablePureComponent { +export default @connect(mapStateToProps) +class Following extends ImmutablePureComponent { static propTypes = { params: PropTypes.object.isRequired, diff --git a/app/javascript/mastodon/features/getting_started/index.js b/app/javascript/mastodon/features/getting_started/index.js index 97c726f62..d5ba5cbce 100644 --- a/app/javascript/mastodon/features/getting_started/index.js +++ b/app/javascript/mastodon/features/getting_started/index.js @@ -53,9 +53,9 @@ const badgeDisplay = (number, limit) => { } }; -@connect(mapStateToProps, mapDispatchToProps) +export default @connect(mapStateToProps, mapDispatchToProps) @injectIntl -export default class GettingStarted extends ImmutablePureComponent { +class GettingStarted extends ImmutablePureComponent { static propTypes = { intl: PropTypes.object.isRequired, diff --git a/app/javascript/mastodon/features/hashtag_timeline/index.js b/app/javascript/mastodon/features/hashtag_timeline/index.js index b67486f07..63efdf1bd 100644 --- a/app/javascript/mastodon/features/hashtag_timeline/index.js +++ b/app/javascript/mastodon/features/hashtag_timeline/index.js @@ -13,8 +13,8 @@ const mapStateToProps = (state, props) => ({ hasUnread: state.getIn(['timelines', `hashtag:${props.params.id}`, 'unread']) > 0, }); -@connect(mapStateToProps) -export default class HashtagTimeline extends React.PureComponent { +export default @connect(mapStateToProps) +class HashtagTimeline extends React.PureComponent { static propTypes = { params: PropTypes.object.isRequired, diff --git a/app/javascript/mastodon/features/home_timeline/components/column_settings.js b/app/javascript/mastodon/features/home_timeline/components/column_settings.js index 932ac2049..455e21881 100644 --- a/app/javascript/mastodon/features/home_timeline/components/column_settings.js +++ b/app/javascript/mastodon/features/home_timeline/components/column_settings.js @@ -4,8 +4,8 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import { injectIntl, FormattedMessage } from 'react-intl'; import SettingToggle from '../../notifications/components/setting_toggle'; -@injectIntl -export default class ColumnSettings extends React.PureComponent { +export default @injectIntl +class ColumnSettings extends React.PureComponent { static propTypes = { settings: ImmutablePropTypes.map.isRequired, diff --git a/app/javascript/mastodon/features/home_timeline/index.js b/app/javascript/mastodon/features/home_timeline/index.js index 12dab0e44..3ffa7a681 100644 --- a/app/javascript/mastodon/features/home_timeline/index.js +++ b/app/javascript/mastodon/features/home_timeline/index.js @@ -19,9 +19,9 @@ const mapStateToProps = state => ({ isPartial: state.getIn(['timelines', 'home', 'items', 0], null) === null, }); -@connect(mapStateToProps) +export default @connect(mapStateToProps) @injectIntl -export default class HomeTimeline extends React.PureComponent { +class HomeTimeline extends React.PureComponent { static propTypes = { dispatch: PropTypes.func.isRequired, diff --git a/app/javascript/mastodon/features/keyboard_shortcuts/index.js b/app/javascript/mastodon/features/keyboard_shortcuts/index.js index 2d86953c6..ab1ac511e 100644 --- a/app/javascript/mastodon/features/keyboard_shortcuts/index.js +++ b/app/javascript/mastodon/features/keyboard_shortcuts/index.js @@ -9,8 +9,8 @@ const messages = defineMessages({ heading: { id: 'keyboard_shortcuts.heading', defaultMessage: 'Keyboard Shortcuts' }, }); -@injectIntl -export default class KeyboardShortcuts extends ImmutablePureComponent { +export default @injectIntl +class KeyboardShortcuts extends ImmutablePureComponent { static propTypes = { intl: PropTypes.object.isRequired, diff --git a/app/javascript/mastodon/features/list_editor/components/account.js b/app/javascript/mastodon/features/list_editor/components/account.js index c78c58e24..48085af43 100644 --- a/app/javascript/mastodon/features/list_editor/components/account.js +++ b/app/javascript/mastodon/features/list_editor/components/account.js @@ -31,9 +31,9 @@ const mapDispatchToProps = (dispatch, { accountId }) => ({ onAdd: () => dispatch(addToListEditor(accountId)), }); -@connect(makeMapStateToProps, mapDispatchToProps) +export default @connect(makeMapStateToProps, mapDispatchToProps) @injectIntl -export default class Account extends ImmutablePureComponent { +class Account extends ImmutablePureComponent { static propTypes = { account: ImmutablePropTypes.map.isRequired, diff --git a/app/javascript/mastodon/features/list_editor/components/search.js b/app/javascript/mastodon/features/list_editor/components/search.js index 45c4d0f2e..f7617fe58 100644 --- a/app/javascript/mastodon/features/list_editor/components/search.js +++ b/app/javascript/mastodon/features/list_editor/components/search.js @@ -19,9 +19,9 @@ const mapDispatchToProps = dispatch => ({ onChange: value => dispatch(changeListSuggestions(value)), }); -@connect(mapStateToProps, mapDispatchToProps) +export default @connect(mapStateToProps, mapDispatchToProps) @injectIntl -export default class Search extends React.PureComponent { +class Search extends React.PureComponent { static propTypes = { intl: PropTypes.object.isRequired, diff --git a/app/javascript/mastodon/features/list_editor/index.js b/app/javascript/mastodon/features/list_editor/index.js index 65f7420de..aab0cdd0c 100644 --- a/app/javascript/mastodon/features/list_editor/index.js +++ b/app/javascript/mastodon/features/list_editor/index.js @@ -22,9 +22,9 @@ const mapDispatchToProps = dispatch => ({ onReset: () => dispatch(resetListEditor()), }); -@connect(mapStateToProps, mapDispatchToProps) +export default @connect(mapStateToProps, mapDispatchToProps) @injectIntl -export default class ListEditor extends ImmutablePureComponent { +class ListEditor extends ImmutablePureComponent { static propTypes = { listId: PropTypes.string.isRequired, diff --git a/app/javascript/mastodon/features/list_timeline/index.js b/app/javascript/mastodon/features/list_timeline/index.js index a655451b1..5b047ace4 100644 --- a/app/javascript/mastodon/features/list_timeline/index.js +++ b/app/javascript/mastodon/features/list_timeline/index.js @@ -25,9 +25,9 @@ const mapStateToProps = (state, props) => ({ hasUnread: state.getIn(['timelines', `list:${props.params.id}`, 'unread']) > 0, }); -@connect(mapStateToProps) +export default @connect(mapStateToProps) @injectIntl -export default class ListTimeline extends React.PureComponent { +class ListTimeline extends React.PureComponent { static contextTypes = { router: PropTypes.object, diff --git a/app/javascript/mastodon/features/lists/components/new_list_form.js b/app/javascript/mastodon/features/lists/components/new_list_form.js index eed6efc25..739246640 100644 --- a/app/javascript/mastodon/features/lists/components/new_list_form.js +++ b/app/javascript/mastodon/features/lists/components/new_list_form.js @@ -20,9 +20,9 @@ const mapDispatchToProps = dispatch => ({ onSubmit: () => dispatch(submitListEditor(true)), }); -@connect(mapStateToProps, mapDispatchToProps) +export default @connect(mapStateToProps, mapDispatchToProps) @injectIntl -export default class NewListForm extends React.PureComponent { +class NewListForm extends React.PureComponent { static propTypes = { value: PropTypes.string.isRequired, diff --git a/app/javascript/mastodon/features/lists/index.js b/app/javascript/mastodon/features/lists/index.js index 127347730..24f40c16b 100644 --- a/app/javascript/mastodon/features/lists/index.js +++ b/app/javascript/mastodon/features/lists/index.js @@ -31,9 +31,9 @@ const mapStateToProps = state => ({ lists: getOrderedLists(state), }); -@connect(mapStateToProps) +export default @connect(mapStateToProps) @injectIntl -export default class Lists extends ImmutablePureComponent { +class Lists extends ImmutablePureComponent { static propTypes = { params: PropTypes.object.isRequired, diff --git a/app/javascript/mastodon/features/mutes/index.js b/app/javascript/mastodon/features/mutes/index.js index 7bf9c1464..f979ef72f 100644 --- a/app/javascript/mastodon/features/mutes/index.js +++ b/app/javascript/mastodon/features/mutes/index.js @@ -20,9 +20,9 @@ const mapStateToProps = state => ({ accountIds: state.getIn(['user_lists', 'mutes', 'items']), }); -@connect(mapStateToProps) +export default @connect(mapStateToProps) @injectIntl -export default class Mutes extends ImmutablePureComponent { +class Mutes extends ImmutablePureComponent { static propTypes = { params: PropTypes.object.isRequired, diff --git a/app/javascript/mastodon/features/notifications/components/notification.js b/app/javascript/mastodon/features/notifications/components/notification.js index 07fec84b2..ed4a44ca6 100644 --- a/app/javascript/mastodon/features/notifications/components/notification.js +++ b/app/javascript/mastodon/features/notifications/components/notification.js @@ -16,8 +16,8 @@ const notificationForScreenReader = (intl, message, timestamp) => { return output.join(', '); }; -@injectIntl -export default class Notification extends ImmutablePureComponent { +export default @injectIntl +class Notification extends ImmutablePureComponent { static contextTypes = { router: PropTypes.object, diff --git a/app/javascript/mastodon/features/notifications/index.js b/app/javascript/mastodon/features/notifications/index.js index b7d7f361c..66af0baaf 100644 --- a/app/javascript/mastodon/features/notifications/index.js +++ b/app/javascript/mastodon/features/notifications/index.js @@ -31,9 +31,9 @@ const mapStateToProps = state => ({ hasMore: state.getIn(['notifications', 'hasMore']), }); -@connect(mapStateToProps) +export default @connect(mapStateToProps) @injectIntl -export default class Notifications extends React.PureComponent { +class Notifications extends React.PureComponent { static propTypes = { columnId: PropTypes.string, diff --git a/app/javascript/mastodon/features/pinned_statuses/index.js b/app/javascript/mastodon/features/pinned_statuses/index.js index c6eb689d2..98cdbda3c 100644 --- a/app/javascript/mastodon/features/pinned_statuses/index.js +++ b/app/javascript/mastodon/features/pinned_statuses/index.js @@ -18,9 +18,9 @@ const mapStateToProps = state => ({ hasMore: !!state.getIn(['status_lists', 'pins', 'next']), }); -@connect(mapStateToProps) +export default @connect(mapStateToProps) @injectIntl -export default class PinnedStatuses extends ImmutablePureComponent { +class PinnedStatuses extends ImmutablePureComponent { static propTypes = { dispatch: PropTypes.func.isRequired, diff --git a/app/javascript/mastodon/features/public_timeline/index.js b/app/javascript/mastodon/features/public_timeline/index.js index 6d5c4118d..46d972251 100644 --- a/app/javascript/mastodon/features/public_timeline/index.js +++ b/app/javascript/mastodon/features/public_timeline/index.js @@ -25,9 +25,9 @@ const mapStateToProps = (state, { onlyMedia, columnId }) => { }; }; -@connect(mapStateToProps) +export default @connect(mapStateToProps) @injectIntl -export default class PublicTimeline extends React.PureComponent { +class PublicTimeline extends React.PureComponent { static contextTypes = { router: PropTypes.object, diff --git a/app/javascript/mastodon/features/reblogs/index.js b/app/javascript/mastodon/features/reblogs/index.js index acb9b40f9..c05d21c74 100644 --- a/app/javascript/mastodon/features/reblogs/index.js +++ b/app/javascript/mastodon/features/reblogs/index.js @@ -15,8 +15,8 @@ const mapStateToProps = (state, props) => ({ accountIds: state.getIn(['user_lists', 'reblogged_by', props.params.statusId]), }); -@connect(mapStateToProps) -export default class Reblogs extends ImmutablePureComponent { +export default @connect(mapStateToProps) +class Reblogs extends ImmutablePureComponent { static propTypes = { params: PropTypes.object.isRequired, diff --git a/app/javascript/mastodon/features/standalone/community_timeline/index.js b/app/javascript/mastodon/features/standalone/community_timeline/index.js index c8ae9b304..f917f41c9 100644 --- a/app/javascript/mastodon/features/standalone/community_timeline/index.js +++ b/app/javascript/mastodon/features/standalone/community_timeline/index.js @@ -12,9 +12,9 @@ const messages = defineMessages({ title: { id: 'standalone.public_title', defaultMessage: 'A look inside...' }, }); -@connect() +export default @connect() @injectIntl -export default class CommunityTimeline extends React.PureComponent { +class CommunityTimeline extends React.PureComponent { static propTypes = { dispatch: PropTypes.func.isRequired, diff --git a/app/javascript/mastodon/features/standalone/hashtag_timeline/index.js b/app/javascript/mastodon/features/standalone/hashtag_timeline/index.js index 931ca2a32..45c263257 100644 --- a/app/javascript/mastodon/features/standalone/hashtag_timeline/index.js +++ b/app/javascript/mastodon/features/standalone/hashtag_timeline/index.js @@ -7,8 +7,8 @@ import Column from '../../../components/column'; import ColumnHeader from '../../../components/column_header'; import { connectHashtagStream } from '../../../actions/streaming'; -@connect() -export default class HashtagTimeline extends React.PureComponent { +export default @connect() +class HashtagTimeline extends React.PureComponent { static propTypes = { dispatch: PropTypes.func.isRequired, diff --git a/app/javascript/mastodon/features/standalone/public_timeline/index.js b/app/javascript/mastodon/features/standalone/public_timeline/index.js index 115c51d85..618696eb1 100644 --- a/app/javascript/mastodon/features/standalone/public_timeline/index.js +++ b/app/javascript/mastodon/features/standalone/public_timeline/index.js @@ -12,9 +12,9 @@ const messages = defineMessages({ title: { id: 'standalone.public_title', defaultMessage: 'A look inside...' }, }); -@connect() +export default @connect() @injectIntl -export default class PublicTimeline extends React.PureComponent { +class PublicTimeline extends React.PureComponent { static propTypes = { dispatch: PropTypes.func.isRequired, diff --git a/app/javascript/mastodon/features/status/components/action_bar.js b/app/javascript/mastodon/features/status/components/action_bar.js index f5977c02c..fa6fd56e5 100644 --- a/app/javascript/mastodon/features/status/components/action_bar.js +++ b/app/javascript/mastodon/features/status/components/action_bar.js @@ -28,8 +28,8 @@ const messages = defineMessages({ embed: { id: 'status.embed', defaultMessage: 'Embed' }, }); -@injectIntl -export default class ActionBar extends React.PureComponent { +export default @injectIntl +class ActionBar extends React.PureComponent { static contextTypes = { router: PropTypes.object, diff --git a/app/javascript/mastodon/features/status/index.js b/app/javascript/mastodon/features/status/index.js index 48931b2d6..7d1bc2ca4 100644 --- a/app/javascript/mastodon/features/status/index.js +++ b/app/javascript/mastodon/features/status/index.js @@ -104,9 +104,9 @@ const makeMapStateToProps = () => { return mapStateToProps; }; -@injectIntl +export default @injectIntl @connect(makeMapStateToProps) -export default class Status extends ImmutablePureComponent { +class Status extends ImmutablePureComponent { static contextTypes = { router: PropTypes.object, diff --git a/app/javascript/mastodon/features/ui/components/boost_modal.js b/app/javascript/mastodon/features/ui/components/boost_modal.js index 1c90d10dd..b128e67d2 100644 --- a/app/javascript/mastodon/features/ui/components/boost_modal.js +++ b/app/javascript/mastodon/features/ui/components/boost_modal.js @@ -13,8 +13,8 @@ const messages = defineMessages({ reblog: { id: 'status.reblog', defaultMessage: 'Boost' }, }); -@injectIntl -export default class BoostModal extends ImmutablePureComponent { +export default @injectIntl +class BoostModal extends ImmutablePureComponent { static contextTypes = { router: PropTypes.object, diff --git a/app/javascript/mastodon/features/ui/components/columns_area.js b/app/javascript/mastodon/features/ui/components/columns_area.js index a72ba06ab..ed338c2eb 100644 --- a/app/javascript/mastodon/features/ui/components/columns_area.js +++ b/app/javascript/mastodon/features/ui/components/columns_area.js @@ -35,8 +35,8 @@ const messages = defineMessages({ const shouldHideFAB = path => path.match(/^\/statuses\//); -@component => injectIntl(component, { withRef: true }) -export default class ColumnsArea extends ImmutablePureComponent { +export default @(component => injectIntl(component, { withRef: true })) +class ColumnsArea extends ImmutablePureComponent { static contextTypes = { router: PropTypes.object.isRequired, diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modal.js b/app/javascript/mastodon/features/ui/components/confirmation_modal.js index 86588c46a..f0f3ad134 100644 --- a/app/javascript/mastodon/features/ui/components/confirmation_modal.js +++ b/app/javascript/mastodon/features/ui/components/confirmation_modal.js @@ -3,8 +3,8 @@ import PropTypes from 'prop-types'; import { injectIntl, FormattedMessage } from 'react-intl'; import Button from '../../../components/button'; -@injectIntl -export default class ConfirmationModal extends React.PureComponent { +export default @injectIntl +class ConfirmationModal extends React.PureComponent { static propTypes = { message: PropTypes.node.isRequired, diff --git a/app/javascript/mastodon/features/ui/components/embed_modal.js b/app/javascript/mastodon/features/ui/components/embed_modal.js index 52aab00d0..2afb6f3d7 100644 --- a/app/javascript/mastodon/features/ui/components/embed_modal.js +++ b/app/javascript/mastodon/features/ui/components/embed_modal.js @@ -4,8 +4,8 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import { FormattedMessage, injectIntl } from 'react-intl'; import api from '../../../api'; -@injectIntl -export default class EmbedModal extends ImmutablePureComponent { +export default @injectIntl +class EmbedModal extends ImmutablePureComponent { static propTypes = { url: PropTypes.string.isRequired, diff --git a/app/javascript/mastodon/features/ui/components/focal_point_modal.js b/app/javascript/mastodon/features/ui/components/focal_point_modal.js index 21bf6d81b..7488a3598 100644 --- a/app/javascript/mastodon/features/ui/components/focal_point_modal.js +++ b/app/javascript/mastodon/features/ui/components/focal_point_modal.js @@ -19,8 +19,8 @@ const mapDispatchToProps = (dispatch, { id }) => ({ }); -@connect(mapStateToProps, mapDispatchToProps) -export default class FocalPointModal extends ImmutablePureComponent { +export default @connect(mapStateToProps, mapDispatchToProps) +class FocalPointModal extends ImmutablePureComponent { static propTypes = { media: ImmutablePropTypes.map.isRequired, diff --git a/app/javascript/mastodon/features/ui/components/media_modal.js b/app/javascript/mastodon/features/ui/components/media_modal.js index 83b9e1b50..d29a4a6a7 100644 --- a/app/javascript/mastodon/features/ui/components/media_modal.js +++ b/app/javascript/mastodon/features/ui/components/media_modal.js @@ -18,8 +18,8 @@ const messages = defineMessages({ export const previewState = 'previewMediaModal'; -@injectIntl -export default class MediaModal extends ImmutablePureComponent { +export default @injectIntl +class MediaModal extends ImmutablePureComponent { static propTypes = { media: ImmutablePropTypes.list.isRequired, @@ -149,7 +149,7 @@ export default class MediaModal extends ImmutablePureComponent { startTime={time || 0} onCloseVideo={onClose} detailed - description={image.get('description')} + alt={image.get('description')} key={image.get('url')} /> ); diff --git a/app/javascript/mastodon/features/ui/components/mute_modal.js b/app/javascript/mastodon/features/ui/components/mute_modal.js index 73e48cf09..ac356b42a 100644 --- a/app/javascript/mastodon/features/ui/components/mute_modal.js +++ b/app/javascript/mastodon/features/ui/components/mute_modal.js @@ -33,9 +33,9 @@ const mapDispatchToProps = dispatch => { }; }; -@connect(mapStateToProps, mapDispatchToProps) +export default @connect(mapStateToProps, mapDispatchToProps) @injectIntl -export default class MuteModal extends React.PureComponent { +class MuteModal extends React.PureComponent { static propTypes = { isSubmitting: PropTypes.bool.isRequired, diff --git a/app/javascript/mastodon/features/ui/components/onboarding_modal.js b/app/javascript/mastodon/features/ui/components/onboarding_modal.js index 9b713cf9e..25241bcd0 100644 --- a/app/javascript/mastodon/features/ui/components/onboarding_modal.js +++ b/app/javascript/mastodon/features/ui/components/onboarding_modal.js @@ -177,9 +177,9 @@ const mapStateToProps = state => ({ domain: state.getIn(['meta', 'domain']), }); -@connect(mapStateToProps) +export default @connect(mapStateToProps) @injectIntl -export default class OnboardingModal extends React.PureComponent { +class OnboardingModal extends React.PureComponent { static propTypes = { onClose: PropTypes.func.isRequired, diff --git a/app/javascript/mastodon/features/ui/components/report_modal.js b/app/javascript/mastodon/features/ui/components/report_modal.js index 90f001319..bc6b18664 100644 --- a/app/javascript/mastodon/features/ui/components/report_modal.js +++ b/app/javascript/mastodon/features/ui/components/report_modal.js @@ -37,9 +37,9 @@ const makeMapStateToProps = () => { return mapStateToProps; }; -@connect(makeMapStateToProps) +export default @connect(makeMapStateToProps) @injectIntl -export default class ReportModal extends ImmutablePureComponent { +class ReportModal extends ImmutablePureComponent { static propTypes = { isSubmitting: PropTypes.bool, @@ -106,6 +106,7 @@ export default class ReportModal extends ImmutablePureComponent { onChange={this.handleCommentChange} onKeyDown={this.handleKeyDown} disabled={isSubmitting} + autoFocus /> {domain && ( diff --git a/app/javascript/mastodon/features/ui/components/tabs_bar.js b/app/javascript/mastodon/features/ui/components/tabs_bar.js index 60bc56eef..16236ea51 100644 --- a/app/javascript/mastodon/features/ui/components/tabs_bar.js +++ b/app/javascript/mastodon/features/ui/components/tabs_bar.js @@ -24,9 +24,9 @@ export function getLink (index) { return links[index].props.to; } -@injectIntl +export default @injectIntl @withRouter -export default class TabsBar extends React.PureComponent { +class TabsBar extends React.PureComponent { static propTypes = { intl: PropTypes.object.isRequired, diff --git a/app/javascript/mastodon/features/ui/components/video_modal.js b/app/javascript/mastodon/features/ui/components/video_modal.js index 9ed4a43ad..7cf3eb4d4 100644 --- a/app/javascript/mastodon/features/ui/components/video_modal.js +++ b/app/javascript/mastodon/features/ui/components/video_modal.js @@ -24,7 +24,7 @@ export default class VideoModal extends ImmutablePureComponent { startTime={time} onCloseVideo={onClose} detailed - description={media.get('description')} + alt={media.get('description')} /> </div> </div> diff --git a/app/javascript/mastodon/features/ui/components/zoomable_image.js b/app/javascript/mastodon/features/ui/components/zoomable_image.js index 0a0a4d41a..3f6562bc9 100644 --- a/app/javascript/mastodon/features/ui/components/zoomable_image.js +++ b/app/javascript/mastodon/features/ui/components/zoomable_image.js @@ -137,6 +137,7 @@ export default class ZoomableImage extends React.PureComponent { role='presentation' ref={this.setImageRef} alt={alt} + title={alt} src={src} style={{ transform: `scale(${scale})`, diff --git a/app/javascript/mastodon/features/ui/index.js b/app/javascript/mastodon/features/ui/index.js index 91eb37900..2781c5d64 100644 --- a/app/javascript/mastodon/features/ui/index.js +++ b/app/javascript/mastodon/features/ui/index.js @@ -187,10 +187,10 @@ class SwitchingColumnsArea extends React.PureComponent { } -@connect(mapStateToProps) +export default @connect(mapStateToProps) @injectIntl @withRouter -export default class UI extends React.PureComponent { +class UI extends React.PureComponent { static contextTypes = { router: PropTypes.object.isRequired, diff --git a/app/javascript/mastodon/features/ui/util/react_router_helpers.js b/app/javascript/mastodon/features/ui/util/react_router_helpers.js index 32dfe320b..d452b871f 100644 --- a/app/javascript/mastodon/features/ui/util/react_router_helpers.js +++ b/app/javascript/mastodon/features/ui/util/react_router_helpers.js @@ -26,7 +26,7 @@ WrappedSwitch.propTypes = { children: PropTypes.node, }; -// Small Wraper to extract the params from the route and pass +// Small Wrapper to extract the params from the route and pass // them to the rendered component, together with the content to // be rendered inside (the children) export class WrappedRoute extends React.Component { diff --git a/app/javascript/mastodon/features/video/index.js b/app/javascript/mastodon/features/video/index.js index 52b395f88..d17253957 100644 --- a/app/javascript/mastodon/features/video/index.js +++ b/app/javascript/mastodon/features/video/index.js @@ -84,8 +84,8 @@ export const getPointerPosition = (el, event) => { return position; }; -@injectIntl -export default class Video extends React.PureComponent { +export default @injectIntl +class Video extends React.PureComponent { static propTypes = { preview: PropTypes.string, @@ -252,11 +252,12 @@ export default class Video extends React.PureComponent { } handleOpenVideo = () => { - const { src, preview, width, height } = this.props; + const { src, preview, width, height, alt } = this.props; const media = fromJS({ type: 'video', url: src, preview_url: preview, + description: alt, width, height, }); diff --git a/app/javascript/mastodon/initial_state.js b/app/javascript/mastodon/initial_state.js index 8751a5636..4c6922f9b 100644 --- a/app/javascript/mastodon/initial_state.js +++ b/app/javascript/mastodon/initial_state.js @@ -11,7 +11,7 @@ export const boostModal = getMeta('boost_modal'); export const deleteModal = getMeta('delete_modal'); export const me = getMeta('me'); export const searchEnabled = getMeta('search_enabled'); -export const maxChars = getMeta('max_toot_chars') || 500; +export const maxChars = (initialState && initialState.max_toot_chars) || 500; export const invitesEnabled = getMeta('invites_enabled'); export const version = getMeta('version'); diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 677911e4e..56d78ae64 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -15,6 +15,7 @@ "account.follows.empty": "هذا المستخدِم لا يتبع أحدًا بعد.", "account.follows_you": "يتابعك", "account.hide_reblogs": "إخفاء ترقيات @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "وسائط", "account.mention": "أُذكُر @{name}", "account.moved_to": "{name} إنتقل إلى :", diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index da1ab62e6..e3cfabee3 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -1,174 +1,175 @@ { - "account.badges.bot": "Bot", - "account.block": "Block @{name}", + "account.badges.bot": "Robó", + "account.block": "Bloquiar a @{name}", "account.block_domain": "Hide everything from {domain}", "account.blocked": "Blocked", - "account.direct": "Direct message @{name}", + "account.direct": "Unviar un mensaxe direutu a @{name}", "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.domain_blocked": "Domain hidden", - "account.edit_profile": "Edit profile", + "account.edit_profile": "Editar perfil", "account.endorse": "Feature on profile", "account.follow": "Follow", - "account.followers": "Followers", + "account.followers": "Siguidores", "account.followers.empty": "No one follows this user yet.", "account.follows": "Follows", - "account.follows.empty": "This user doesn't follow anyone yet.", + "account.follows.empty": "Esti usuariu entá nun sigue a naide.", "account.follows_you": "Follows you", "account.hide_reblogs": "Hide boosts from @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Media", - "account.mention": "Mention @{name}", + "account.mention": "Mentar a @{name}", "account.moved_to": "{name} has moved to:", - "account.mute": "Mute @{name}", + "account.mute": "Silenciar a @{name}", "account.mute_notifications": "Mute notifications from @{name}", "account.muted": "Muted", "account.posts": "Toots", - "account.posts_with_replies": "Toots and replies", + "account.posts_with_replies": "Toots y rempuestes", "account.report": "Report @{name}", "account.requested": "Awaiting approval. Click to cancel follow request", "account.share": "Share @{name}'s profile", "account.show_reblogs": "Show boosts from @{name}", - "account.unblock": "Unblock @{name}", + "account.unblock": "Desbloquiar a @{name}", "account.unblock_domain": "Unhide {domain}", "account.unendorse": "Don't feature on profile", "account.unfollow": "Unfollow", "account.unmute": "Unmute @{name}", "account.unmute_notifications": "Unmute notifications from @{name}", "account.view_full_profile": "View full profile", - "alert.unexpected.message": "An unexpected error occurred.", - "alert.unexpected.title": "Oops!", - "boost_modal.combo": "You can press {combo} to skip this next time", + "alert.unexpected.message": "Asocedió un fallu inesperáu.", + "alert.unexpected.title": "¡Ups!", + "boost_modal.combo": "Pues primir {combo} pa saltar esto la próxima vegada", "bundle_column_error.body": "Something went wrong while loading this component.", "bundle_column_error.retry": "Try again", "bundle_column_error.title": "Network error", "bundle_modal_error.close": "Close", "bundle_modal_error.message": "Something went wrong while loading this component.", "bundle_modal_error.retry": "Try again", - "column.blocks": "Blocked users", + "column.blocks": "Usuarios bloquiaos", "column.community": "Local timeline", - "column.direct": "Direct messages", - "column.domain_blocks": "Hidden domains", - "column.favourites": "Favourites", - "column.follow_requests": "Follow requests", - "column.home": "Home", - "column.lists": "Lists", - "column.mutes": "Muted users", - "column.notifications": "Notifications", - "column.pins": "Pinned toot", - "column.public": "Federated timeline", - "column_back_button.label": "Back", + "column.direct": "Mensaxes direutos", + "column.domain_blocks": "Dominios anubríos", + "column.favourites": "Favoritos", + "column.follow_requests": "Solicitúes de siguimientu", + "column.home": "Aniciu", + "column.lists": "Llistes", + "column.mutes": "Usuarios silenciaos", + "column.notifications": "Avisos", + "column.pins": "Toots fixaos", + "column.public": "Llinia temporal federada", + "column_back_button.label": "Atrás", "column_header.hide_settings": "Hide settings", - "column_header.moveLeft_settings": "Move column to the left", - "column_header.moveRight_settings": "Move column to the right", + "column_header.moveLeft_settings": "Mover la columna a la esquierda", + "column_header.moveRight_settings": "Mover la columna a la drecha", "column_header.pin": "Pin", "column_header.show_settings": "Show settings", - "column_header.unpin": "Unpin", - "column_subheading.settings": "Settings", + "column_header.unpin": "Desfixar", + "column_subheading.settings": "Axustes", "community.column_settings.media_only": "Media Only", - "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.", + "compose_form.direct_message_warning": "Esti toot namái va unviase a los usuarios mentaos.", "compose_form.direct_message_warning_learn_more": "Learn more", "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.", "compose_form.lock_disclaimer.lock": "locked", - "compose_form.placeholder": "What is on your mind?", + "compose_form.placeholder": "¿En qué pienses?", "compose_form.publish": "Toot", "compose_form.publish_loud": "{publish}!", "compose_form.sensitive.marked": "Media is marked as sensitive", "compose_form.sensitive.unmarked": "Media is not marked as sensitive", - "compose_form.spoiler.marked": "Text is hidden behind warning", - "compose_form.spoiler.unmarked": "Text is not hidden", - "compose_form.spoiler_placeholder": "Write your warning here", - "confirmation_modal.cancel": "Cancel", + "compose_form.spoiler.marked": "El testu nun va anubrise darrera d'una alvertencia", + "compose_form.spoiler.unmarked": "El testu va anubrise", + "compose_form.spoiler_placeholder": "Escribi equí l'avertencia", + "confirmation_modal.cancel": "Encaboxar", "confirmations.block.confirm": "Block", - "confirmations.block.message": "Are you sure you want to block {name}?", + "confirmations.block.message": "¿De xuru que quies bloquiar a {name}?", "confirmations.delete.confirm": "Delete", - "confirmations.delete.message": "Are you sure you want to delete this status?", + "confirmations.delete.message": "¿De xuru que quies desaniciar esti estáu?", "confirmations.delete_list.confirm": "Delete", - "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", + "confirmations.delete_list.message": "¿De xuru que quies desaniciar dafechu esta llista?", "confirmations.domain_block.confirm": "Hide entire domain", "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", "confirmations.mute.confirm": "Mute", - "confirmations.mute.message": "Are you sure you want to mute {name}?", + "confirmations.mute.message": "¿De xuru que quies silenciar a {name}?", "confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Here is what it will look like:", - "emoji_button.activity": "Activity", + "emoji_button.activity": "Actividá", "emoji_button.custom": "Custom", - "emoji_button.flags": "Flags", - "emoji_button.food": "Food & Drink", + "emoji_button.flags": "Banderes", + "emoji_button.food": "Comída y bébora", "emoji_button.label": "Insert emoji", - "emoji_button.nature": "Nature", - "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", - "emoji_button.objects": "Objects", - "emoji_button.people": "People", + "emoji_button.nature": "Natura", + "emoji_button.not_found": "¡Nun hai fustaxes! (╯°□°)╯︵ ┻━┻", + "emoji_button.objects": "Oxetos", + "emoji_button.people": "Xente", "emoji_button.recent": "Frequently used", "emoji_button.search": "Search...", "emoji_button.search_results": "Search results", - "emoji_button.symbols": "Symbols", - "emoji_button.travel": "Travel & Places", - "empty_column.blocks": "You haven't blocked any users yet.", + "emoji_button.symbols": "Símbolos", + "emoji_button.travel": "Viaxes y llugares", + "empty_column.blocks": "Entá nun bloquiesti a dengún usuariu.", "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", - "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", - "empty_column.domain_blocks": "There are no hidden domains yet.", + "empty_column.direct": "Entá nun tienes dengún mensaxe direutu. Cuando unvies o recibas dalgún, va apaecer equí", + "empty_column.domain_blocks": "Entá nun hai dominios anubríos.", "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.", - "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", + "empty_column.follow_requests": "Entá nun tienes denguna solicitú de siguimientu. Cuando recibas una, va amosase equí.", "empty_column.hashtag": "There is nothing in this hashtag yet.", "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.", - "empty_column.home.public_timeline": "the public timeline", + "empty_column.home.public_timeline": "la llinia temporal pública", "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", - "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", - "empty_column.mutes": "You haven't muted any users yet.", - "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", + "empty_column.lists": "Entá nun tienes denguna llista. Cuando crees una, va amosase equí.", + "empty_column.mutes": "Enta nun silenciesti a dengún usuariu.", + "empty_column.notifications": "Entá nun tienes dengún avisu. Interactua con otros p'aniciar la conversación.", "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up", - "follow_request.authorize": "Authorize", - "follow_request.reject": "Reject", - "getting_started.developers": "Developers", - "getting_started.documentation": "Documentation", - "getting_started.find_friends": "Find friends from Twitter", + "follow_request.authorize": "Autorizar", + "follow_request.reject": "Refugar", + "getting_started.developers": "Desendolcadores", + "getting_started.documentation": "Documentación", + "getting_started.find_friends": "Alcontrar collacios de Twitter", "getting_started.heading": "Getting started", - "getting_started.invite": "Invite people", - "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", - "getting_started.security": "Security", - "getting_started.terms": "Terms of service", + "getting_started.invite": "Convidar xente", + "getting_started.open_source_notice": "Mastodon ye software de códigu abiertu. Pues collaborar o informar de fallos en {github} (GitHub).", + "getting_started.security": "Seguranza", + "getting_started.terms": "Términos del serviciu", "home.column_settings.basic": "Basic", "home.column_settings.show_reblogs": "Show boosts", "home.column_settings.show_replies": "Show replies", - "keyboard_shortcuts.back": "to navigate back", - "keyboard_shortcuts.blocked": "to open blocked users list", + "keyboard_shortcuts.back": "pa dir p'atrás", + "keyboard_shortcuts.blocked": "p'abrir la llista d'usuarios bloquiaos", "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", - "keyboard_shortcuts.description": "Description", - "keyboard_shortcuts.direct": "to open direct messages column", - "keyboard_shortcuts.down": "to move down in the list", + "keyboard_shortcuts.description": "Descripción", + "keyboard_shortcuts.direct": "p'abrir la columna de los mensaxes direutos", + "keyboard_shortcuts.down": "pa baxar na llista", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.favourite": "to favourite", - "keyboard_shortcuts.favourites": "to open favourites list", - "keyboard_shortcuts.federated": "to open federated timeline", - "keyboard_shortcuts.heading": "Keyboard Shortcuts", - "keyboard_shortcuts.home": "to open home timeline", - "keyboard_shortcuts.hotkey": "Hotkey", - "keyboard_shortcuts.legend": "to display this legend", - "keyboard_shortcuts.local": "to open local timeline", - "keyboard_shortcuts.mention": "to mention author", - "keyboard_shortcuts.muted": "to open muted users list", + "keyboard_shortcuts.favourites": "p'abrir la llista de favoritos", + "keyboard_shortcuts.federated": "p'abrir la llinia temporal federada", + "keyboard_shortcuts.heading": "Atayos del tecláu", + "keyboard_shortcuts.home": "p'abrir la llinia temporal d'aniciu", + "keyboard_shortcuts.hotkey": "Atayu", + "keyboard_shortcuts.legend": "p'amosar esta lleenda", + "keyboard_shortcuts.local": "p'abrir la llinia temporal llocal", + "keyboard_shortcuts.mention": "pa mentar al autor", + "keyboard_shortcuts.muted": "p'abrir la llista d'usuarios silenciaos", "keyboard_shortcuts.my_profile": "to open your profile", - "keyboard_shortcuts.notifications": "to open notifications column", - "keyboard_shortcuts.pinned": "to open pinned toots list", - "keyboard_shortcuts.profile": "to open author's profile", - "keyboard_shortcuts.reply": "to reply", - "keyboard_shortcuts.requests": "to open follow requests list", + "keyboard_shortcuts.notifications": "p'abrir la columna d'avisos", + "keyboard_shortcuts.pinned": "p'abrir la llista de toots fixaos", + "keyboard_shortcuts.profile": "p'abrir el perfil del autor", + "keyboard_shortcuts.reply": "pa responder", + "keyboard_shortcuts.requests": "p'abrir la llista de solicitúes de siguimientu", "keyboard_shortcuts.search": "to focus search", - "keyboard_shortcuts.start": "to open \"get started\" column", + "keyboard_shortcuts.start": "p'abrir la columna «entamar»", "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", - "keyboard_shortcuts.toot": "to start a brand new toot", + "keyboard_shortcuts.toot": "p'apenzar un toot nuevu", "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", - "keyboard_shortcuts.up": "to move up in the list", + "keyboard_shortcuts.up": "pa xubir na llista", "lightbox.close": "Close", - "lightbox.next": "Next", + "lightbox.next": "Siguiente", "lightbox.previous": "Previous", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", @@ -180,55 +181,55 @@ "lists.subheading": "Your lists", "loading_indicator.label": "Loading...", "media_gallery.toggle_visible": "Toggle visibility", - "missing_indicator.label": "Not found", - "missing_indicator.sublabel": "This resource could not be found", + "missing_indicator.label": "Nun s'alcontró", + "missing_indicator.sublabel": "Esti recursu nun pudo alcontrase", "mute_modal.hide_notifications": "Hide notifications from this user?", - "navigation_bar.apps": "Mobile apps", - "navigation_bar.blocks": "Blocked users", + "navigation_bar.apps": "Aplicaciones móviles", + "navigation_bar.blocks": "Usuarios bloquiaos", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.compose": "Compose new toot", - "navigation_bar.direct": "Direct messages", + "navigation_bar.direct": "Mensaxes direutos", "navigation_bar.discover": "Discover", - "navigation_bar.domain_blocks": "Hidden domains", - "navigation_bar.edit_profile": "Edit profile", - "navigation_bar.favourites": "Favourites", + "navigation_bar.domain_blocks": "Dominios anubríos", + "navigation_bar.edit_profile": "Editar perfil", + "navigation_bar.favourites": "Favoritos", "navigation_bar.filters": "Muted words", - "navigation_bar.follow_requests": "Follow requests", - "navigation_bar.info": "About this instance", - "navigation_bar.keyboard_shortcuts": "Hotkeys", + "navigation_bar.follow_requests": "Solicitúes de siguimientu", + "navigation_bar.info": "Tocante a esta instancia", + "navigation_bar.keyboard_shortcuts": "Atayos", "navigation_bar.lists": "Lists", - "navigation_bar.logout": "Logout", - "navigation_bar.mutes": "Muted users", + "navigation_bar.logout": "Zarrar sesión", + "navigation_bar.mutes": "Usuarios silenciaos", "navigation_bar.personal": "Personal", - "navigation_bar.pins": "Pinned toots", - "navigation_bar.preferences": "Preferences", - "navigation_bar.public_timeline": "Federated timeline", - "navigation_bar.security": "Security", + "navigation_bar.pins": "Toots fixaos", + "navigation_bar.preferences": "Preferencies", + "navigation_bar.public_timeline": "Llinia temporal federada", + "navigation_bar.security": "Seguranza", "notification.favourite": "{name} favourited your status", - "notification.follow": "{name} followed you", - "notification.mention": "{name} mentioned you", + "notification.follow": "{name} siguióte", + "notification.mention": "{name} mentóte", "notification.reblog": "{name} boosted your status", - "notifications.clear": "Clear notifications", - "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", - "notifications.column_settings.alert": "Desktop notifications", + "notifications.clear": "Llimpiar avisos", + "notifications.clear_confirmation": "¿De xuru que quies llimpiar dafechu tolos avisos?", + "notifications.column_settings.alert": "Avisos d'escritoriu", "notifications.column_settings.favourite": "Favourites:", - "notifications.column_settings.follow": "New followers:", - "notifications.column_settings.mention": "Mentions:", + "notifications.column_settings.follow": "Siguidores nuevos:", + "notifications.column_settings.mention": "Menciones:", "notifications.column_settings.push": "Push notifications", - "notifications.column_settings.push_meta": "This device", + "notifications.column_settings.push_meta": "Esti preséu", "notifications.column_settings.reblog": "Boosts:", - "notifications.column_settings.show": "Show in column", - "notifications.column_settings.sound": "Play sound", - "notifications.group": "{count} notifications", - "onboarding.done": "Done", - "onboarding.next": "Next", + "notifications.column_settings.show": "Amosar en columna", + "notifications.column_settings.sound": "Reproducir soníu", + "notifications.group": "{count} avisos", + "onboarding.done": "Fecho", + "onboarding.next": "Siguiente", "onboarding.page_five.public_timelines": "The local timeline shows public posts from everyone on {domain}. The federated timeline shows public posts from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.", - "onboarding.page_four.home": "The home timeline shows posts from people you follow.", + "onboarding.page_four.home": "La llinia temporal d'aniciu amuesa artículos de xente a la que sigues.", "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.", - "onboarding.page_one.federation": "Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.", + "onboarding.page_one.federation": "Mastodon ye una rede de sividores independientes xuníos pa facer una rede social grande. Nós llamamos instancies a esos sirvidores.", "onboarding.page_one.full_handle": "Your full handle", "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", - "onboarding.page_one.welcome": "Welcome to Mastodon!", + "onboarding.page_one.welcome": "¡Afáyate en Mastodon!", "onboarding.page_six.admin": "Your instance's admin is {admin}.", "onboarding.page_six.almost_done": "Almost done...", "onboarding.page_six.appetoot": "Bon Appetoot!", @@ -236,7 +237,7 @@ "onboarding.page_six.github": "Mastodon is free open-source software. You can report bugs, request features, or contribute to the code on {github}.", "onboarding.page_six.guidelines": "community guidelines", "onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!", - "onboarding.page_six.various_app": "mobile apps", + "onboarding.page_six.various_app": "aplicaciones móviles", "onboarding.page_three.profile": "Edit your profile to change your avatar, bio, and display name. There, you will also find other preferences.", "onboarding.page_three.search": "Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.", "onboarding.page_two.compose": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.", @@ -245,7 +246,7 @@ "privacy.direct.long": "Post to mentioned users only", "privacy.direct.short": "Direct", "privacy.private.long": "Post to followers only", - "privacy.private.short": "Followers-only", + "privacy.private.short": "Namái siguidores", "privacy.public.long": "Post to public timelines", "privacy.public.short": "Public", "privacy.unlisted.long": "Do not show in public timelines", @@ -254,44 +255,44 @@ "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", - "relative_time.just_now": "now", + "relative_time.just_now": "agora", "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", - "reply_indicator.cancel": "Cancel", + "reply_indicator.cancel": "Encaboxar", "report.forward": "Forward to {target}", "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?", "report.hint": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:", - "report.placeholder": "Additional comments", + "report.placeholder": "Comentarios adicionales", "report.submit": "Submit", "report.target": "Report {target}", "search.placeholder": "Search", "search_popout.search_format": "Advanced search format", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", - "search_popout.tips.hashtag": "hashtag", - "search_popout.tips.status": "status", + "search_popout.tips.hashtag": "etiqueta", + "search_popout.tips.status": "estáu", "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", - "search_popout.tips.user": "user", - "search_results.accounts": "People", + "search_popout.tips.user": "usuariu", + "search_results.accounts": "Xente", "search_results.hashtags": "Hashtags", "search_results.statuses": "Toots", "search_results.total": "{count, number} {count, plural, one {result} other {results}}", "standalone.public_title": "A look inside...", - "status.block": "Block @{name}", + "status.block": "Bloquiar a @{name}", "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "This post cannot be boosted", "status.delete": "Delete", "status.detailed_status": "Detailed conversation view", - "status.direct": "Direct message @{name}", - "status.embed": "Embed", + "status.direct": "Unviar un mensaxe direutu a @{name}", + "status.embed": "Empotrar", "status.favourite": "Favourite", "status.filtered": "Filtered", - "status.load_more": "Load more", + "status.load_more": "Cargar más", "status.media_hidden": "Media hidden", - "status.mention": "Mention @{name}", - "status.more": "More", - "status.mute": "Mute @{name}", + "status.mention": "Mentar a @{name}", + "status.more": "Más", + "status.mute": "Silenciar a @{name}", "status.mute_conversation": "Mute conversation", - "status.open": "Expand this status", + "status.open": "Espander esti estáu", "status.pin": "Pin on profile", "status.pinned": "Pinned toot", "status.reblog": "Boost", @@ -299,25 +300,25 @@ "status.reblogged_by": "{name} boosted", "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.", "status.redraft": "Delete & re-draft", - "status.reply": "Reply", + "status.reply": "Responder", "status.replyAll": "Reply to thread", "status.report": "Report @{name}", "status.sensitive_toggle": "Click to view", "status.sensitive_warning": "Sensitive content", "status.share": "Share", - "status.show_less": "Show less", + "status.show_less": "Amosar menos", "status.show_less_all": "Show less for all", - "status.show_more": "Show more", + "status.show_more": "Amosar más", "status.show_more_all": "Show more for all", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", "tabs_bar.federated_timeline": "Federated", - "tabs_bar.home": "Home", + "tabs_bar.home": "Aniciu", "tabs_bar.local_timeline": "Local", - "tabs_bar.notifications": "Notifications", + "tabs_bar.notifications": "Avisos", "tabs_bar.search": "Search", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", - "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", + "ui.beforeunload": "El borrador va perdese si coles de Mastodon.", "upload_area.title": "Drag & drop to upload", "upload_button.label": "Add media", "upload_form.description": "Describe for the visually impaired", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 725bbed41..5730c1354 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -15,6 +15,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Твой последовател", "account.hide_reblogs": "Hide boosts from @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Media", "account.mention": "Споменаване", "account.moved_to": "{name} has moved to:", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 3d8f7bae2..0364d0bba 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -15,6 +15,7 @@ "account.follows.empty": "Aquest usuari encara no segueix a ningú.", "account.follows_you": "Et segueix", "account.hide_reblogs": "Amaga els impulsos de @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Media", "account.mention": "Esmentar @{name}", "account.moved_to": "{name} s'ha mogut a:", diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json index d5aeab9f2..8bf083235 100644 --- a/app/javascript/mastodon/locales/co.json +++ b/app/javascript/mastodon/locales/co.json @@ -15,6 +15,7 @@ "account.follows.empty": "St'utilizatore ùn seguita nisunu.", "account.follows_you": "Vi seguita", "account.hide_reblogs": "Piattà spartere da @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Media", "account.mention": "Mintuvà @{name}", "account.moved_to": "{name} hè partutu nant'à:", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index c6c3095a7..46aa954e8 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -15,6 +15,7 @@ "account.follows.empty": "Tento uživatel ještě nikoho nesleduje.", "account.follows_you": "Sleduje vás", "account.hide_reblogs": "Skrýt boosty od uživatele @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Média", "account.mention": "Zmínit uživatele @{name}", "account.moved_to": "{name} se přesunul/a na:", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index 26af4d8f0..a2eea600a 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -1,121 +1,122 @@ { "account.badges.bot": "Bot", - "account.block": "Block @{name}", - "account.block_domain": "Hide everything from {domain}", - "account.blocked": "Blocked", - "account.direct": "Direct message @{name}", - "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", + "account.block": "Blociwch @{name}", + "account.block_domain": "Cuddiwch bopeth rhag {domain}", + "account.blocked": "Blociwyd", + "account.direct": "Neges breifat @{name}", + "account.disclaimer_full": "Gall y wybodaeth isod adlewyrchu darlun anghyflawn o broffil defnyddiwr.", "account.domain_blocked": "Domain hidden", - "account.edit_profile": "Edit profile", + "account.edit_profile": "Golygu proffil", "account.endorse": "Feature on profile", - "account.follow": "Follow", - "account.followers": "Followers", - "account.followers.empty": "No one follows this user yet.", - "account.follows": "Follows", - "account.follows.empty": "This user doesn't follow anyone yet.", - "account.follows_you": "Follows you", + "account.follow": "Dilyn", + "account.followers": "Dilynwyr", + "account.followers.empty": "Nid oes neb yn dilyn y defnyddiwr hwn eto.", + "account.follows": "Yn dilyn", + "account.follows.empty": "Nid yw'r defnyddiwr hwn yn dilyn unrhyw un eto.", + "account.follows_you": "Yn eich dilyn chi", "account.hide_reblogs": "Hide boosts from @{name}", - "account.media": "Media", - "account.mention": "Mention @{name}", - "account.moved_to": "{name} has moved to:", + "account.link_verified_on": "Ownership of this link was checked on {date}", + "account.media": "Cyfryngau", + "account.mention": "Crybwyll @{name}", + "account.moved_to": "Mae @{name} wedi symud i:", "account.mute": "Mute @{name}", "account.mute_notifications": "Mute notifications from @{name}", - "account.muted": "Muted", - "account.posts": "Toots", + "account.muted": "Distewyd", + "account.posts": "Tŵtiau", "account.posts_with_replies": "Toots and replies", - "account.report": "Report @{name}", + "account.report": "Adroddwch @{name}", "account.requested": "Awaiting approval. Click to cancel follow request", - "account.share": "Share @{name}'s profile", + "account.share": "Rhannwch broffil @{name}", "account.show_reblogs": "Show boosts from @{name}", - "account.unblock": "Unblock @{name}", - "account.unblock_domain": "Unhide {domain}", + "account.unblock": "Dadflociwch @{name}", + "account.unblock_domain": "Dadguddiwch {domain}", "account.unendorse": "Don't feature on profile", - "account.unfollow": "Unfollow", + "account.unfollow": "Daddilynwch", "account.unmute": "Unmute @{name}", "account.unmute_notifications": "Unmute notifications from @{name}", "account.view_full_profile": "View full profile", - "alert.unexpected.message": "An unexpected error occurred.", - "alert.unexpected.title": "Oops!", + "alert.unexpected.message": "Digwyddodd gwall annisgwyl.", + "alert.unexpected.title": "Wps!", "boost_modal.combo": "You can press {combo} to skip this next time", - "bundle_column_error.body": "Something went wrong while loading this component.", - "bundle_column_error.retry": "Try again", - "bundle_column_error.title": "Network error", + "bundle_column_error.body": "Aeth rhywbeth o'i le tra'n llwytho'r elfen hon.", + "bundle_column_error.retry": "Ceisiwch eto", + "bundle_column_error.title": "Gwall rhwydwaith", "bundle_modal_error.close": "Close", - "bundle_modal_error.message": "Something went wrong while loading this component.", - "bundle_modal_error.retry": "Try again", - "column.blocks": "Blocked users", - "column.community": "Local timeline", - "column.direct": "Direct messages", - "column.domain_blocks": "Hidden domains", - "column.favourites": "Favourites", - "column.follow_requests": "Follow requests", + "bundle_modal_error.message": "Aeth rhywbeth o'i le tra'n llwytho'r elfen hon.", + "bundle_modal_error.retry": "Ceiswich eto", + "column.blocks": "Defnyddwyr a flociwyd", + "column.community": "Llinell amser lleol", + "column.direct": "Negeseuon preifat", + "column.domain_blocks": "Parthau cuddiedig", + "column.favourites": "Ffefrynnau", + "column.follow_requests": "Ceisiadau dilyn", "column.home": "Hafan", - "column.lists": "Lists", - "column.mutes": "Muted users", - "column.notifications": "Notifications", + "column.lists": "Rhestrau", + "column.mutes": "Defnyddwyr a ddistewyd", + "column.notifications": "Hysbysiadau", "column.pins": "Pinned toot", "column.public": "Federated timeline", "column_back_button.label": "Nôl", "column_header.hide_settings": "Hide settings", - "column_header.moveLeft_settings": "Move column to the left", - "column_header.moveRight_settings": "Move column to the right", - "column_header.pin": "Pin", - "column_header.show_settings": "Show settings", - "column_header.unpin": "Unpin", - "column_subheading.settings": "Settings", - "community.column_settings.media_only": "Media Only", - "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.", - "compose_form.direct_message_warning_learn_more": "Learn more", - "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", - "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.", - "compose_form.lock_disclaimer.lock": "locked", - "compose_form.placeholder": "What is on your mind?", - "compose_form.publish": "Toot", + "column_header.moveLeft_settings": "Symudwch y golofn i'r chwith", + "column_header.moveRight_settings": "Symudwch y golofn i'r dde", + "column_header.pin": "Piniwch", + "column_header.show_settings": "Dangos gosodiadau", + "column_header.unpin": "Dadbiniwch", + "column_subheading.settings": "Gosodiadau", + "community.column_settings.media_only": "Cyfryngau yn unig", + "compose_form.direct_message_warning": "Mi fydd y tŵt hwn ond yn cael ei anfon at y defnyddwyr sy'n cael eu crybwyll.", + "compose_form.direct_message_warning_learn_more": "Dysgwch fwy", + "compose_form.hashtag_warning": "Ni fydd y tŵt hwn wedi ei restru o dan unrhyw hashnod gan ei fod heb ei restru. Dim ond tŵtiau cyhoeddus gellid chwilota amdanynt drwy hashnod.", + "compose_form.lock_disclaimer": "Nid yw eich cyfri wedi'i {locked}. Gall unrhyw un eich dilyn i weld eich POSTS dilynwyr-yn-unig.", + "compose_form.lock_disclaimer.lock": "wedi ei gloi", + "compose_form.placeholder": "Be syd ar eich meddwl?", + "compose_form.publish": "Tŵt", "compose_form.publish_loud": "{publish}!", "compose_form.sensitive.marked": "Media is marked as sensitive", "compose_form.sensitive.unmarked": "Media is not marked as sensitive", - "compose_form.spoiler.marked": "Text is hidden behind warning", - "compose_form.spoiler.unmarked": "Text is not hidden", - "compose_form.spoiler_placeholder": "Write your warning here", + "compose_form.spoiler.marked": "Testun wedi ei guddio gan rybudd", + "compose_form.spoiler.unmarked": "Nid yw'r testun wedi ei guddio", + "compose_form.spoiler_placeholder": "Ysgrifenwch eich rhybudd yma", "confirmation_modal.cancel": "Cancel", - "confirmations.block.confirm": "Block", - "confirmations.block.message": "Are you sure you want to block {name}?", - "confirmations.delete.confirm": "Delete", - "confirmations.delete.message": "Are you sure you want to delete this status?", - "confirmations.delete_list.confirm": "Delete", - "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", + "confirmations.block.confirm": "Blociwch", + "confirmations.block.message": "Ydych chi'n sicr eich bod eisiau blocio {name}?", + "confirmations.delete.confirm": "Dileu", + "confirmations.delete.message": "Ydych chi'n sicr eich bod eisiau dileu y statws hwn?", + "confirmations.delete_list.confirm": "Dileu", + "confirmations.delete_list.message": "Ydych chi'n sicr eich bod eisiau dileu y rhestr hwn am byth?", "confirmations.domain_block.confirm": "Hide entire domain", "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", "confirmations.mute.confirm": "Mute", - "confirmations.mute.message": "Are you sure you want to mute {name}?", + "confirmations.mute.message": "Ydych chi'n sicr eich bod am ddistewi {name}?", "confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.", - "confirmations.unfollow.confirm": "Unfollow", - "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "confirmations.unfollow.confirm": "Dad-ddilynwch", + "confirmations.unfollow.message": "Ydych chi'n sicr eich bod am ddad-ddilyn {name}?", "embed.instructions": "Embed this status on your website by copying the code below.", - "embed.preview": "Here is what it will look like:", - "emoji_button.activity": "Activity", + "embed.preview": "Dyma sut olwg fydd arno:", + "emoji_button.activity": "Gweithgarwch", "emoji_button.custom": "Custom", - "emoji_button.flags": "Flags", - "emoji_button.food": "Food & Drink", - "emoji_button.label": "Insert emoji", - "emoji_button.nature": "Nature", - "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", - "emoji_button.objects": "Objects", - "emoji_button.people": "People", - "emoji_button.recent": "Frequently used", - "emoji_button.search": "Search...", - "emoji_button.search_results": "Search results", - "emoji_button.symbols": "Symbols", - "emoji_button.travel": "Travel & Places", - "empty_column.blocks": "You haven't blocked any users yet.", + "emoji_button.flags": "Baneri", + "emoji_button.food": "Bwyd a Diod", + "emoji_button.label": "Mewnosodwch emoji", + "emoji_button.nature": "Natur", + "emoji_button.not_found": "Dim emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.objects": "Gwrthrychau", + "emoji_button.people": "Pobl", + "emoji_button.recent": "Defnyddir yn aml", + "emoji_button.search": "Chwilio...", + "emoji_button.search_results": "Canlyniadau chwilio", + "emoji_button.symbols": "Symbolau", + "emoji_button.travel": "Teithio & Llefydd", + "empty_column.blocks": "Nid ydych wedi blocio unrhyw ddefnyddwyr eto.", "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", - "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", - "empty_column.domain_blocks": "There are no hidden domains yet.", - "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", - "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.", + "empty_column.direct": "Nid oes gennych unrhyw negeseuon preifat eto. Pan y byddwch yn anfon neu derbyn un, mi fydd yn ymddangos yma.", + "empty_column.domain_blocks": "Nid oes yna unrhyw barthau cuddiedig eto.", + "empty_column.favourited_statuses": "Nid oes gennych unrhyw hoff dwtiau eto. Pan y byddwch yn hoffi un, mi fydd yn ymddangos yma.", + "empty_column.favourites": "Nid oes neb wedi hoffi'r tŵt yma eto. Pan bydd rhywun yn ei hoffi, mi fyddent yn ymddangos yma.", "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", - "empty_column.hashtag": "There is nothing in this hashtag yet.", + "empty_column.hashtag": "Nid oes dim ar yr hashnod hwn eto.", "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.", "empty_column.home.public_timeline": "the public timeline", "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", @@ -123,120 +124,120 @@ "empty_column.mutes": "You haven't muted any users yet.", "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up", - "follow_request.authorize": "Authorize", - "follow_request.reject": "Reject", - "getting_started.developers": "Developers", - "getting_started.documentation": "Documentation", - "getting_started.find_friends": "Find friends from Twitter", - "getting_started.heading": "Getting started", - "getting_started.invite": "Invite people", + "follow_request.authorize": "Caniatau", + "follow_request.reject": "Gwrthod", + "getting_started.developers": "Datblygwyr", + "getting_started.documentation": "Dogfennaeth", + "getting_started.find_friends": "Canfod ffrindiau o Twitter", + "getting_started.heading": "Dechrau", + "getting_started.invite": "Gwahoddwch bobl", "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", - "getting_started.security": "Security", + "getting_started.security": "Diogelwch", "getting_started.terms": "Terms of service", - "home.column_settings.basic": "Basic", + "home.column_settings.basic": "Syml", "home.column_settings.show_reblogs": "Show boosts", - "home.column_settings.show_replies": "Show replies", + "home.column_settings.show_replies": "Dangoswch ymatebion", "keyboard_shortcuts.back": "to navigate back", "keyboard_shortcuts.blocked": "to open blocked users list", "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", - "keyboard_shortcuts.description": "Description", - "keyboard_shortcuts.direct": "to open direct messages column", - "keyboard_shortcuts.down": "to move down in the list", - "keyboard_shortcuts.enter": "to open status", - "keyboard_shortcuts.favourite": "to favourite", - "keyboard_shortcuts.favourites": "to open favourites list", + "keyboard_shortcuts.description": "Disgrifiad", + "keyboard_shortcuts.direct": "i agor colofn negeseuon preifat", + "keyboard_shortcuts.down": "i symud lawr yn y rhestr", + "keyboard_shortcuts.enter": "i agor statws", + "keyboard_shortcuts.favourite": "i hoffi", + "keyboard_shortcuts.favourites": "i agor rhestr hoffi", "keyboard_shortcuts.federated": "to open federated timeline", "keyboard_shortcuts.heading": "Keyboard Shortcuts", "keyboard_shortcuts.home": "to open home timeline", "keyboard_shortcuts.hotkey": "Hotkey", "keyboard_shortcuts.legend": "to display this legend", "keyboard_shortcuts.local": "to open local timeline", - "keyboard_shortcuts.mention": "to mention author", + "keyboard_shortcuts.mention": "i grybwyll yr awdur", "keyboard_shortcuts.muted": "to open muted users list", - "keyboard_shortcuts.my_profile": "to open your profile", - "keyboard_shortcuts.notifications": "to open notifications column", + "keyboard_shortcuts.my_profile": "i agor eich proffil", + "keyboard_shortcuts.notifications": "i agor colofn hysbysiadau", "keyboard_shortcuts.pinned": "to open pinned toots list", - "keyboard_shortcuts.profile": "to open author's profile", - "keyboard_shortcuts.reply": "to reply", + "keyboard_shortcuts.profile": "i agor proffil yr awdur", + "keyboard_shortcuts.reply": "i ateb", "keyboard_shortcuts.requests": "to open follow requests list", "keyboard_shortcuts.search": "to focus search", "keyboard_shortcuts.start": "to open \"get started\" column", "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", - "keyboard_shortcuts.toot": "to start a brand new toot", + "keyboard_shortcuts.toot": "i ddechrau tŵt newydd sbon", "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", "keyboard_shortcuts.up": "to move up in the list", - "lightbox.close": "Close", - "lightbox.next": "Next", + "lightbox.close": "Cau", + "lightbox.next": "Nesaf", "lightbox.previous": "Previous", - "lists.account.add": "Add to list", + "lists.account.add": "Ychwanegwch at restr", "lists.account.remove": "Remove from list", - "lists.delete": "Delete list", - "lists.edit": "Edit list", - "lists.new.create": "Add list", + "lists.delete": "Dileu rhestr", + "lists.edit": "Golygwch restr", + "lists.new.create": "Ychwanegwch restr", "lists.new.title_placeholder": "New list title", "lists.search": "Search among people you follow", - "lists.subheading": "Your lists", - "loading_indicator.label": "Loading...", + "lists.subheading": "Eich rhestrau", + "loading_indicator.label": "Llwytho...", "media_gallery.toggle_visible": "Toggle visibility", - "missing_indicator.label": "Not found", - "missing_indicator.sublabel": "This resource could not be found", - "mute_modal.hide_notifications": "Hide notifications from this user?", - "navigation_bar.apps": "Mobile apps", - "navigation_bar.blocks": "Blocked users", + "missing_indicator.label": "Heb ei ganfod", + "missing_indicator.sublabel": "Ni ellid canfod yr adnodd hwn", + "mute_modal.hide_notifications": "Cuddiwch hysbysiadau rhag y defnyddiwr hwn?", + "navigation_bar.apps": "Apiau symudol", + "navigation_bar.blocks": "Defnyddwyr wedi eu blocio", "navigation_bar.community_timeline": "Local timeline", - "navigation_bar.compose": "Compose new toot", - "navigation_bar.direct": "Direct messages", - "navigation_bar.discover": "Discover", - "navigation_bar.domain_blocks": "Hidden domains", - "navigation_bar.edit_profile": "Edit profile", - "navigation_bar.favourites": "Favourites", + "navigation_bar.compose": "Cyfansoddwch dŵt newydd", + "navigation_bar.direct": "Negeseuon preifat", + "navigation_bar.discover": "Darganfyddwch", + "navigation_bar.domain_blocks": "Parthau cuddiedig", + "navigation_bar.edit_profile": "Golygu proffil", + "navigation_bar.favourites": "Ffefrynnau", "navigation_bar.filters": "Muted words", - "navigation_bar.follow_requests": "Follow requests", + "navigation_bar.follow_requests": "Ceisiadau dilyn", "navigation_bar.info": "About this instance", "navigation_bar.keyboard_shortcuts": "Hotkeys", - "navigation_bar.lists": "Lists", - "navigation_bar.logout": "Logout", + "navigation_bar.lists": "Rhestrau", + "navigation_bar.logout": "Allgofnodi", "navigation_bar.mutes": "Muted users", - "navigation_bar.personal": "Personal", - "navigation_bar.pins": "Pinned toots", - "navigation_bar.preferences": "Preferences", + "navigation_bar.personal": "Personol", + "navigation_bar.pins": "Tŵtiau wedi eu pinio", + "navigation_bar.preferences": "Dewisiadau", "navigation_bar.public_timeline": "Federated timeline", - "navigation_bar.security": "Security", - "notification.favourite": "{name} favourited your status", - "notification.follow": "{name} followed you", + "navigation_bar.security": "Diogelwch", + "notification.favourite": "hoffodd {name} eich statws", + "notification.follow": "dilynodd {name} chi", "notification.mention": "{name} mentioned you", "notification.reblog": "{name} boosted your status", - "notifications.clear": "Clear notifications", + "notifications.clear": "Clirio hysbysiadau", "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", "notifications.column_settings.alert": "Desktop notifications", - "notifications.column_settings.favourite": "Favourites:", - "notifications.column_settings.follow": "New followers:", + "notifications.column_settings.favourite": "Ffefrynnau:", + "notifications.column_settings.follow": "Dilynwyr newydd:", "notifications.column_settings.mention": "Mentions:", "notifications.column_settings.push": "Push notifications", "notifications.column_settings.push_meta": "This device", "notifications.column_settings.reblog": "Boosts:", "notifications.column_settings.show": "Show in column", - "notifications.column_settings.sound": "Play sound", - "notifications.group": "{count} notifications", + "notifications.column_settings.sound": "Chwarae sain", + "notifications.group": "{count} o hysbysiadau", "onboarding.done": "Done", - "onboarding.next": "Next", + "onboarding.next": "Nesaf", "onboarding.page_five.public_timelines": "The local timeline shows public posts from everyone on {domain}. The federated timeline shows public posts from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.", "onboarding.page_four.home": "The home timeline shows posts from people you follow.", "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.", "onboarding.page_one.federation": "Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.", "onboarding.page_one.full_handle": "Your full handle", "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", - "onboarding.page_one.welcome": "Welcome to Mastodon!", + "onboarding.page_one.welcome": "Croeso i Mastodon!", "onboarding.page_six.admin": "Your instance's admin is {admin}.", "onboarding.page_six.almost_done": "Almost done...", - "onboarding.page_six.appetoot": "Bon Appetoot!", + "onboarding.page_six.appetoot": "Bon Apetŵt!", "onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.", "onboarding.page_six.github": "Mastodon is free open-source software. You can report bugs, request features, or contribute to the code on {github}.", - "onboarding.page_six.guidelines": "community guidelines", + "onboarding.page_six.guidelines": "canllawiau cymunedol", "onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!", - "onboarding.page_six.various_app": "mobile apps", + "onboarding.page_six.various_app": "apiau symudol", "onboarding.page_three.profile": "Edit your profile to change your avatar, bio, and display name. There, you will also find other preferences.", "onboarding.page_three.search": "Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.", "onboarding.page_two.compose": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.", @@ -245,50 +246,50 @@ "privacy.direct.long": "Post to mentioned users only", "privacy.direct.short": "Direct", "privacy.private.long": "Post to followers only", - "privacy.private.short": "Followers-only", + "privacy.private.short": "Dilynwyr-yn-unig", "privacy.public.long": "Post to public timelines", - "privacy.public.short": "Public", + "privacy.public.short": "Cyhoeddus", "privacy.unlisted.long": "Do not show in public timelines", - "privacy.unlisted.short": "Unlisted", - "regeneration_indicator.label": "Loading…", - "regeneration_indicator.sublabel": "Your home feed is being prepared!", + "privacy.unlisted.short": "Heb ei restru", + "regeneration_indicator.label": "Llwytho…", + "regeneration_indicator.sublabel": "Mae eich ffrwd cartref yn cael ei baratoi!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", - "relative_time.just_now": "now", + "relative_time.just_now": "nawr", "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", - "reply_indicator.cancel": "Cancel", + "reply_indicator.cancel": "Canslo", "report.forward": "Forward to {target}", "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?", "report.hint": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:", - "report.placeholder": "Additional comments", + "report.placeholder": "Sylwadau ychwanegol", "report.submit": "Submit", "report.target": "Report {target}", - "search.placeholder": "Search", + "search.placeholder": "Chwilio", "search_popout.search_format": "Advanced search format", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", - "search_popout.tips.hashtag": "hashtag", - "search_popout.tips.status": "status", + "search_popout.tips.hashtag": "hashnod", + "search_popout.tips.status": "statws", "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", - "search_popout.tips.user": "user", - "search_results.accounts": "People", - "search_results.hashtags": "Hashtags", - "search_results.statuses": "Toots", + "search_popout.tips.user": "defnyddiwr", + "search_results.accounts": "Pobl", + "search_results.hashtags": "Hanshnodau", + "search_results.statuses": "Twtiau", "search_results.total": "{count, number} {count, plural, one {result} other {results}}", "standalone.public_title": "A look inside...", "status.block": "Block @{name}", "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "This post cannot be boosted", - "status.delete": "Delete", + "status.delete": "Dileu", "status.detailed_status": "Detailed conversation view", - "status.direct": "Direct message @{name}", - "status.embed": "Embed", + "status.direct": "Neges breifat @{name}", + "status.embed": "Plannu", "status.favourite": "Favourite", "status.filtered": "Filtered", - "status.load_more": "Load more", + "status.load_more": "Llwythwch mwy", "status.media_hidden": "Media hidden", "status.mention": "Mention @{name}", - "status.more": "More", + "status.more": "Mwy", "status.mute": "Mute @{name}", "status.mute_conversation": "Mute conversation", "status.open": "Expand this status", @@ -299,23 +300,23 @@ "status.reblogged_by": "{name} boosted", "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.", "status.redraft": "Delete & re-draft", - "status.reply": "Reply", - "status.replyAll": "Reply to thread", + "status.reply": "Ateb", + "status.replyAll": "Ateb i edefyn", "status.report": "Report @{name}", "status.sensitive_toggle": "Click to view", - "status.sensitive_warning": "Sensitive content", - "status.share": "Share", - "status.show_less": "Show less", - "status.show_less_all": "Show less for all", - "status.show_more": "Show more", + "status.sensitive_warning": "Cynnwys sensitif", + "status.share": "Rhannwch", + "status.show_less": "Dangoswch lai", + "status.show_less_all": "Dangoswch lai i bawb", + "status.show_more": "Dangoswch fwy", "status.show_more_all": "Show more for all", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", "tabs_bar.federated_timeline": "Federated", - "tabs_bar.home": "Home", - "tabs_bar.local_timeline": "Local", - "tabs_bar.notifications": "Notifications", - "tabs_bar.search": "Search", + "tabs_bar.home": "Hafan", + "tabs_bar.local_timeline": "Lleol", + "tabs_bar.notifications": "Hysbysiadau", + "tabs_bar.search": "Chwilio", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Drag & drop to upload", @@ -323,7 +324,7 @@ "upload_form.description": "Describe for the visually impaired", "upload_form.focus": "Crop", "upload_form.undo": "Delete", - "upload_progress.label": "Uploading...", + "upload_progress.label": "Uwchlwytho...", "video.close": "Close video", "video.exit_fullscreen": "Exit full screen", "video.expand": "Expand video", @@ -331,6 +332,6 @@ "video.hide": "Hide video", "video.mute": "Mute sound", "video.pause": "Pause", - "video.play": "Play", + "video.play": "Chwarae", "video.unmute": "Unmute sound" } diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index f5ce7d0b9..959a50377 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -15,6 +15,7 @@ "account.follows.empty": "Denne bruger følger endnu ikke nogen.", "account.follows_you": "Følger dig", "account.hide_reblogs": "Skjul fremhævelserne fra @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Medie", "account.mention": "Nævn @{name}", "account.moved_to": "{name} er flyttet til:", @@ -200,7 +201,7 @@ "navigation_bar.logout": "Logud", "navigation_bar.mutes": "Dæmpede brugere", "navigation_bar.personal": "Personligt", - "navigation_bar.pins": "Fastgjorte toots", + "navigation_bar.pins": "Fastgjorte trut", "navigation_bar.preferences": "Præferencer", "navigation_bar.public_timeline": "Fælles tidslinje", "navigation_bar.security": "Sikkerhed", @@ -273,7 +274,7 @@ "search_popout.tips.user": "bruger", "search_results.accounts": "Folk", "search_results.hashtags": "Emnetags", - "search_results.statuses": "Toote", + "search_results.statuses": "Trut", "search_results.total": "{count, number} {count, plural, et {result} andre {results}}", "standalone.public_title": "Et kig indenfor...", "status.block": "Bloker @{name}", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 0bfdfc46a..4f1b2c8a0 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -15,6 +15,7 @@ "account.follows.empty": "Dieses Profil folgt noch niemandem.", "account.follows_you": "Folgt dir", "account.hide_reblogs": "Geteilte Beiträge von @{name} verbergen", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Medien", "account.mention": "@{name} erwähnen", "account.moved_to": "{name} ist umgezogen auf:", @@ -113,7 +114,7 @@ "empty_column.direct": "Du hast noch keine Direktnachrichten erhalten. Wenn du eine sendest oder empfängst, wird sie hier zu sehen sein.", "empty_column.domain_blocks": "Es ist noch keine versteckten Domains.", "empty_column.favourited_statuses": "Du hast noch keine favorisierten Tröts. Wenn du einen favorisierst, wird er hier erscheinen.", - "empty_column.favourites": "Noch niemand hat diesen Tröt favorisiert. Sobald es jemand tut, wird das hier angezeigt.", + "empty_column.favourites": "Noch niemand hat diesen Beitrag favorisiert. Sobald es jemand tut, wird das hier angezeigt.", "empty_column.follow_requests": "Du hast noch keine Folge-Anfragen. Sobald du eine erhältst, wird sie hier angezeigt.", "empty_column.hashtag": "Unter diesem Hashtag gibt es noch nichts.", "empty_column.home": "Deine Startseite ist leer! Besuche {public} oder nutze die Suche, um loszulegen und andere Leute zu finden.", @@ -140,32 +141,32 @@ "keyboard_shortcuts.blocked": "Liste blockierter Profile öffnen", "keyboard_shortcuts.boost": "boosten", "keyboard_shortcuts.column": "einen Status in einer der Spalten fokussieren", - "keyboard_shortcuts.compose": "um das Textfeld zu fokussieren", + "keyboard_shortcuts.compose": "fokussiere das Tröt-Eingabefeld", "keyboard_shortcuts.description": "Beschreibung", "keyboard_shortcuts.direct": "Direct-Message-Spalte öffnen", "keyboard_shortcuts.down": "sich in der Liste hinunter bewegen", - "keyboard_shortcuts.enter": "um den Status zu öffnen", + "keyboard_shortcuts.enter": "Status öffnen", "keyboard_shortcuts.favourite": "um zu favorisieren", "keyboard_shortcuts.favourites": "Favoriten-Liste öffnen", "keyboard_shortcuts.federated": "Förderierte Zeitleiste öffnen", "keyboard_shortcuts.heading": "Tastenkombinationen", "keyboard_shortcuts.home": "Startseite öffnen", "keyboard_shortcuts.hotkey": "Tastenkürzel", - "keyboard_shortcuts.legend": "um diese Übersicht anzuzeigen", + "keyboard_shortcuts.legend": "diese Übersicht anzeigen", "keyboard_shortcuts.local": "Lokale Zeitleiste öffnen", "keyboard_shortcuts.mention": "um Autor_in zu erwähnen", "keyboard_shortcuts.muted": "Liste stummgeschalteter Profile öffnen", "keyboard_shortcuts.my_profile": "Dein Profil öffnen", "keyboard_shortcuts.notifications": "Benachrichtigungsspalte öffnen", "keyboard_shortcuts.pinned": "Liste angehefteter Tröts öffnen", - "keyboard_shortcuts.profile": "um Profil des Autors zu öffnen", - "keyboard_shortcuts.reply": "um zu antworten", + "keyboard_shortcuts.profile": "Profil des Autors öffnen", + "keyboard_shortcuts.reply": "antworten", "keyboard_shortcuts.requests": "Liste der Folge-Anfragen öffnen", - "keyboard_shortcuts.search": "um die Suche zu fokussieren", + "keyboard_shortcuts.search": "Suche fokussieren", "keyboard_shortcuts.start": "\"Erste Schritte-Spalte öffnen", - "keyboard_shortcuts.toggle_hidden": "um den Text hinter einer Inhaltswarnung zu verstecken oder ihn anzuzeigen", - "keyboard_shortcuts.toot": "um einen neuen Toot zu beginnen", - "keyboard_shortcuts.unfocus": "um das Textfeld/die Suche nicht mehr zu fokussieren", + "keyboard_shortcuts.toggle_hidden": "Text hinter einer Inhaltswarnung verstecken/anzeigen", + "keyboard_shortcuts.toot": "einen neuen Toot beginnen", + "keyboard_shortcuts.unfocus": "Textfeld/die Suche nicht mehr fokussieren", "keyboard_shortcuts.up": "sich in der Liste hinauf bewegen", "lightbox.close": "Schließen", "lightbox.next": "Weiter", @@ -186,7 +187,7 @@ "navigation_bar.apps": "Mobile Apps", "navigation_bar.blocks": "Blockierte Profile", "navigation_bar.community_timeline": "Lokale Zeitleiste", - "navigation_bar.compose": "Neuen Tröt verfassen", + "navigation_bar.compose": "Neuen Beitrag verfassen", "navigation_bar.direct": "Direktnachrichten", "navigation_bar.discover": "Entdecken", "navigation_bar.domain_blocks": "Versteckte Domains", @@ -297,7 +298,7 @@ "status.reblog": "Teilen", "status.reblog_private": "An das eigentliche Publikum teilen", "status.reblogged_by": "{name} teilte", - "status.reblogs.empty": "Diesen Tröt hat noch niemand geboostet. Sobald es jemand tut, wird er hier angezeigt.", + "status.reblogs.empty": "Diesen Beitrag hat noch niemand geboostet. Sobald es jemand tun, wird er hier angezeigt.", "status.redraft": "Löschen und neu erstellen", "status.reply": "Antworten", "status.replyAll": "Auf Thread antworten", diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index aef1f5ea1..5215bfb4e 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -611,6 +611,10 @@ "id": "account.edit_profile" }, { + "defaultMessage": "Ownership of this link was checked on {date}", + "id": "account.link_verified_on" + }, + { "defaultMessage": "Follows you", "id": "account.follows_you" }, @@ -1837,6 +1841,15 @@ { "descriptors": [ { + "defaultMessage": "Toot", + "id": "compose_form.publish" + } + ], + "path": "app/javascript/mastodon/features/ui/components/columns_area.json" + }, + { + "descriptors": [ + { "defaultMessage": "Cancel", "id": "confirmation_modal.cancel" } diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index ad7f040d6..9c2a31722 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -15,6 +15,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Σε ακολουθεί", "account.hide_reblogs": "Απόκρυψη προωθήσεων από @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Πολυμέσα", "account.mention": "Ανάφερε @{name}", "account.moved_to": "{name} μεταφέρθηκε στο:", diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index def1e0a56..b117dad95 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -15,6 +15,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Follows you", "account.hide_reblogs": "Hide boosts from @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Media", "account.mention": "Mention @{name}", "account.moved_to": "{name} has moved to:", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index ab584840e..dcc565eb9 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -15,6 +15,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Sekvas vin", "account.hide_reblogs": "Kaŝi diskonigojn de @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Aŭdovidaĵoj", "account.mention": "Mencii @{name}", "account.moved_to": "{name} moviĝis al:", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 07e110048..355c901fa 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -7,14 +7,15 @@ "account.disclaimer_full": "La siguiente información del usuario puede estar incompleta.", "account.domain_blocked": "Dominio oculto", "account.edit_profile": "Editar perfil", - "account.endorse": "Feature on profile", + "account.endorse": "Mostrar en perfil", "account.follow": "Seguir", "account.followers": "Seguidores", - "account.followers.empty": "No one follows this user yet.", + "account.followers.empty": "Nadie sigue a este usuario todavía.", "account.follows": "Sigue", - "account.follows.empty": "This user doesn't follow anyone yet.", + "account.follows.empty": "Este usuario todavía no sigue a nadie.", "account.follows_you": "Te sigue", "account.hide_reblogs": "Ocultar retoots de @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Media", "account.mention": "Mencionar a @{name}", "account.moved_to": "{name} se ha mudado a:", @@ -29,12 +30,12 @@ "account.show_reblogs": "Mostrar retoots de @{name}", "account.unblock": "Desbloquear a @{name}", "account.unblock_domain": "Mostrar a {domain}", - "account.unendorse": "Don't feature on profile", + "account.unendorse": "No mostrar en el perfil", "account.unfollow": "Dejar de seguir", "account.unmute": "Dejar de silenciar a @{name}", "account.unmute_notifications": "Dejar de silenciar las notificaciones de @{name}", "account.view_full_profile": "Ver perfil completo", - "alert.unexpected.message": "An unexpected error occurred.", + "alert.unexpected.message": "Hubo un error inesperado.", "alert.unexpected.title": "Oops!", "boost_modal.combo": "Puedes presionar {combo} para saltear este aviso la próxima vez", "bundle_column_error.body": "Algo salió mal al cargar este componente.", @@ -45,8 +46,8 @@ "bundle_modal_error.retry": "Inténtalo de nuevo", "column.blocks": "Usuarios bloqueados", "column.community": "Línea de tiempo local", - "column.direct": "Direct messages", - "column.domain_blocks": "Hidden domains", + "column.direct": "Mensajes directos", + "column.domain_blocks": "Dominios ocultos", "column.favourites": "Favoritos", "column.follow_requests": "Solicitudes de seguimiento", "column.home": "Inicio", @@ -63,9 +64,9 @@ "column_header.show_settings": "Mostrar ajustes", "column_header.unpin": "Dejar de fijar", "column_subheading.settings": "Ajustes", - "community.column_settings.media_only": "Media Only", - "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.", - "compose_form.direct_message_warning_learn_more": "Learn more", + "community.column_settings.media_only": "Solo media", + "compose_form.direct_message_warning": "Este toot solo será enviado a los usuarios mencionados.", + "compose_form.direct_message_warning_learn_more": "Aprender mas", "compose_form.hashtag_warning": "Este toot no se mostrará bajo hashtags porque no es público. Sólo los toots públicos se pueden buscar por hashtag.", "compose_form.lock_disclaimer": "Tu cuenta no está bloqueada. Todos pueden seguirte para ver tus toots solo para seguidores.", "compose_form.lock_disclaimer.lock": "bloqueado", @@ -85,11 +86,11 @@ "confirmations.delete_list.confirm": "Delete", "confirmations.delete_list.message": "¿Seguro que quieres borrar esta lista permanentemente?", "confirmations.domain_block.confirm": "Ocultar dominio entero", - "confirmations.domain_block.message": "¿Seguro de que quieres bloquear al dominio entero? En algunos casos es preferible bloquear o silenciar objetivos determinados.", + "confirmations.domain_block.message": "¿Seguro de que quieres bloquear al dominio {domain} entero? En general unos cuantos bloqueos y silenciados concretos es suficiente y preferible.", "confirmations.mute.confirm": "Silenciar", "confirmations.mute.message": "¿Estás seguro de que quieres silenciar a {name}?", - "confirmations.redraft.confirm": "Delete & redraft", - "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", + "confirmations.redraft.confirm": "Borrar y volver a borrador", + "confirmations.redraft.message": "Estás seguro de que quieres borrar este estado y volverlo a borrador? Perderás todas las respuestas, impulsos y favoritos asociados a él, y las respuestas a la publicación original quedarán huérfanos.", "confirmations.unfollow.confirm": "Dejar de seguir", "confirmations.unfollow.message": "¿Estás seguro de que quieres dejar de seguir a {name}?", "embed.instructions": "Añade este toot a tu sitio web con el siguiente código.", @@ -108,62 +109,62 @@ "emoji_button.search_results": "Resultados de búsqueda", "emoji_button.symbols": "Símbolos", "emoji_button.travel": "Viajes y lugares", - "empty_column.blocks": "You haven't blocked any users yet.", + "empty_column.blocks": "Aún no has bloqueado a ningún usuario.", "empty_column.community": "La línea de tiempo local está vacía. ¡Escribe algo para empezar la fiesta!", - "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", - "empty_column.domain_blocks": "There are no hidden domains yet.", - "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", - "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.", - "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", + "empty_column.direct": "Aún no tienes ningún mensaje directo. Cuando envíes o recibas uno, se mostrará aquí.", + "empty_column.domain_blocks": "Todavía no hay dominios ocultos.", + "empty_column.favourited_statuses": "Aún no tienes toots preferidos. Cuando marques uno como favorito, aparecerá aquí.", + "empty_column.favourites": "Nadie ha marcado este toot como preferido. Cuando alguien lo haga, aparecerá aquí.", + "empty_column.follow_requests": "No tienes ninguna petición de seguidor. Cuando recibas una, se mostrará aquí.", "empty_column.hashtag": "No hay nada en este hashtag aún.", "empty_column.home": "No estás siguiendo a nadie aún. Visita {public} o haz búsquedas para empezar y conocer gente nueva.", "empty_column.home.public_timeline": "la línea de tiempo pública", "empty_column.list": "No hay nada en esta lista aún. Cuando miembros de esta lista publiquen nuevos estatus, estos aparecerán qui.", - "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", - "empty_column.mutes": "You haven't muted any users yet.", + "empty_column.lists": "No tienes ninguna lista. cuando crees una, se mostrará aquí.", + "empty_column.mutes": "Aún no has silenciado a ningún usuario.", "empty_column.notifications": "No tienes ninguna notificación aún. Interactúa con otros para empezar una conversación.", "empty_column.public": "¡No hay nada aquí! Escribe algo públicamente, o sigue usuarios de otras instancias manualmente para llenarlo", "follow_request.authorize": "Autorizar", "follow_request.reject": "Rechazar", - "getting_started.developers": "Developers", + "getting_started.developers": "Desarrolladores", "getting_started.documentation": "Documentation", - "getting_started.find_friends": "Find friends from Twitter", + "getting_started.find_friends": "Encuentra a tus amigos desde Twitter", "getting_started.heading": "Primeros pasos", - "getting_started.invite": "Invite people", + "getting_started.invite": "Invitar usuarios", "getting_started.open_source_notice": "Mastodon es software libre. Puedes contribuir o reportar errores en {github}.", - "getting_started.security": "Security", - "getting_started.terms": "Terms of service", + "getting_started.security": "Seguridad", + "getting_started.terms": "Términos de servicio", "home.column_settings.basic": "Básico", "home.column_settings.show_reblogs": "Mostrar retoots", "home.column_settings.show_replies": "Mostrar respuestas", "keyboard_shortcuts.back": "volver atrás", - "keyboard_shortcuts.blocked": "to open blocked users list", + "keyboard_shortcuts.blocked": "abrir una lista de usuarios bloqueados", "keyboard_shortcuts.boost": "retootear", "keyboard_shortcuts.column": "enfocar un estado en una de las columnas", "keyboard_shortcuts.compose": "enfocar el área de texto de redacción", "keyboard_shortcuts.description": "Description", - "keyboard_shortcuts.direct": "to open direct messages column", + "keyboard_shortcuts.direct": "abrir la columna de mensajes directos", "keyboard_shortcuts.down": "mover hacia abajo en la lista", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.favourite": "añadir a favoritos", - "keyboard_shortcuts.favourites": "to open favourites list", - "keyboard_shortcuts.federated": "to open federated timeline", + "keyboard_shortcuts.favourites": "abrir la lista de favoritos", + "keyboard_shortcuts.federated": "abrir el timeline federado", "keyboard_shortcuts.heading": "Keyboard Shortcuts", - "keyboard_shortcuts.home": "to open home timeline", + "keyboard_shortcuts.home": "abrir el timeline propio", "keyboard_shortcuts.hotkey": "Tecla caliente", "keyboard_shortcuts.legend": "para mostrar esta leyenda", - "keyboard_shortcuts.local": "to open local timeline", + "keyboard_shortcuts.local": "abrir el timeline local", "keyboard_shortcuts.mention": "para mencionar al autor", - "keyboard_shortcuts.muted": "to open muted users list", - "keyboard_shortcuts.my_profile": "to open your profile", - "keyboard_shortcuts.notifications": "to open notifications column", - "keyboard_shortcuts.pinned": "to open pinned toots list", - "keyboard_shortcuts.profile": "to open author's profile", + "keyboard_shortcuts.muted": "abrir la lista de usuarios silenciados", + "keyboard_shortcuts.my_profile": "abrir tu perfil", + "keyboard_shortcuts.notifications": "abrir la columna de notificaciones", + "keyboard_shortcuts.pinned": "abrir la lista de toots destacados", + "keyboard_shortcuts.profile": "abrir el perfil del autor", "keyboard_shortcuts.reply": "para responder", - "keyboard_shortcuts.requests": "to open follow requests list", + "keyboard_shortcuts.requests": "abrir la lista de peticiones de seguidores", "keyboard_shortcuts.search": "para poner el foco en la búsqueda", - "keyboard_shortcuts.start": "to open \"get started\" column", - "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", + "keyboard_shortcuts.start": "abrir la columna \"comenzar\"", + "keyboard_shortcuts.toggle_hidden": "mostrar/ocultar texto tras aviso de contenido (CW)", "keyboard_shortcuts.toot": "para comenzar un nuevo toot", "keyboard_shortcuts.unfocus": "para retirar el foco de la caja de redacción/búsqueda", "keyboard_shortcuts.up": "para ir hacia arriba en la lista", @@ -183,19 +184,19 @@ "missing_indicator.label": "No encontrado", "missing_indicator.sublabel": "No se encontró este recurso", "mute_modal.hide_notifications": "Ocultar notificaciones de este usuario?", - "navigation_bar.apps": "Mobile apps", + "navigation_bar.apps": "Aplicaciones móviles", "navigation_bar.blocks": "Usuarios bloqueados", "navigation_bar.community_timeline": "Historia local", - "navigation_bar.compose": "Compose new toot", - "navigation_bar.direct": "Direct messages", - "navigation_bar.discover": "Discover", - "navigation_bar.domain_blocks": "Hidden domains", + "navigation_bar.compose": "Escribir un nuevo toot", + "navigation_bar.direct": "Mensajes directos", + "navigation_bar.discover": "Descubrir", + "navigation_bar.domain_blocks": "Dominios ocultos", "navigation_bar.edit_profile": "Editar perfil", "navigation_bar.favourites": "Favoritos", - "navigation_bar.filters": "Muted words", + "navigation_bar.filters": "Palabras silenciadas", "navigation_bar.follow_requests": "Solicitudes para seguirte", "navigation_bar.info": "Información adicional", - "navigation_bar.keyboard_shortcuts": "Atajos de teclado", + "navigation_bar.keyboard_shortcuts": "Atajos", "navigation_bar.lists": "Listas", "navigation_bar.logout": "Cerrar sesión", "navigation_bar.mutes": "Usuarios silenciados", @@ -203,7 +204,7 @@ "navigation_bar.pins": "Toots fijados", "navigation_bar.preferences": "Preferencias", "navigation_bar.public_timeline": "Historia federada", - "navigation_bar.security": "Security", + "navigation_bar.security": "Seguridad", "notification.favourite": "{name} marcó tu estado como favorito", "notification.follow": "{name} te empezó a seguir", "notification.mention": "{name} te ha mencionado", @@ -219,7 +220,7 @@ "notifications.column_settings.reblog": "Retoots:", "notifications.column_settings.show": "Mostrar en columna", "notifications.column_settings.sound": "Reproducir sonido", - "notifications.group": "{count} notifications", + "notifications.group": "{count} notificaciones", "onboarding.done": "Listo", "onboarding.next": "Siguiente", "onboarding.page_five.public_timelines": "La línea de tiempo local muestra toots públicos de todos en {domain}. La línea de tiempo federada muestra toots públicos de cualquiera a quien la gente de {domain} siga. Estas son las líneas de tiempo públicas, una buena forma de conocer gente nueva.", @@ -272,19 +273,19 @@ "search_popout.tips.text": "El texto simple devuelve correspondencias de nombre, usuario y hashtag", "search_popout.tips.user": "usuario", "search_results.accounts": "Gente", - "search_results.hashtags": "Hashtags", + "search_results.hashtags": "Etiquetas", "search_results.statuses": "Toots", "search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}", "standalone.public_title": "Un pequeño vistazo...", "status.block": "Block @{name}", - "status.cancel_reblog_private": "Unboost", + "status.cancel_reblog_private": "Des-impulsar", "status.cannot_reblog": "Este toot no puede retootearse", "status.delete": "Borrar", - "status.detailed_status": "Detailed conversation view", - "status.direct": "Direct message @{name}", + "status.detailed_status": "Vista de conversación detallada", + "status.direct": "Mensaje directo a @{name}", "status.embed": "Incrustado", "status.favourite": "Favorito", - "status.filtered": "Filtered", + "status.filtered": "Filtrado", "status.load_more": "Cargar más", "status.media_hidden": "Contenido multimedia oculto", "status.mention": "Mencionar", @@ -295,10 +296,10 @@ "status.pin": "Fijar", "status.pinned": "Toot fijado", "status.reblog": "Retootear", - "status.reblog_private": "Boost to original audience", + "status.reblog_private": "Implusar a la audiencia original", "status.reblogged_by": "Retooteado por {name}", - "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.", - "status.redraft": "Delete & re-draft", + "status.reblogs.empty": "Nadie impulsó este toot todavía. Cuando alguien lo haga, aparecerá aqui.", + "status.redraft": "Borrar y volver a borrador", "status.reply": "Responder", "status.replyAll": "Responder al hilo", "status.report": "Reportar", @@ -315,14 +316,14 @@ "tabs_bar.home": "Inicio", "tabs_bar.local_timeline": "Local", "tabs_bar.notifications": "Notificaciones", - "tabs_bar.search": "Search", + "tabs_bar.search": "Buscar", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "ui.beforeunload": "Tu borrador se perderá si sales de Mastodon.", "upload_area.title": "Arrastra y suelta para subir", - "upload_button.label": "Subir multimedia", + "upload_button.label": "Subir multimedia (JPEG, PNG, GIF, WebM, MP4, MOV)", "upload_form.description": "Describir para los usuarios con dificultad visual", "upload_form.focus": "Recortar", - "upload_form.undo": "Deshacer", + "upload_form.undo": "Borrar", "upload_progress.label": "Subiendo…", "video.close": "Cerrar video", "video.exit_fullscreen": "Salir de pantalla completa", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index 433815c66..1dc42ae68 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -15,6 +15,7 @@ "account.follows.empty": "Erabiltzaile honek ez du inor jarraitzen oraindik.", "account.follows_you": "Jarraitzen zaitu", "account.hide_reblogs": "Ezkutatu @{name}(r)en bultzadak", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Media", "account.mention": "Aipatu @{name}", "account.moved_to": "{name} hona lekualdatu da:", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index 44956aeb3..2e3999918 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -15,6 +15,7 @@ "account.follows.empty": "این کاربر هنوز هیچ کسی را پی نمیگیرد.", "account.follows_you": "پیگیر شماست", "account.hide_reblogs": "پنهان کردن بازبوقهای @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "عکس و ویدیو", "account.mention": "نامبردن از @{name}", "account.moved_to": "{name} منتقل شده است به:", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index fd23e7ff5..f6c0469be 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -15,6 +15,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Seuraa sinua", "account.hide_reblogs": "Piilota buustaukset käyttäjältä @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Media", "account.mention": "Mainitse @{name}", "account.moved_to": "{name} on muuttanut instanssiin:", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index e77d00286..075bdcf30 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -15,6 +15,7 @@ "account.follows.empty": "Cet utilisateur ne suit personne pour l'instant.", "account.follows_you": "Vous suit", "account.hide_reblogs": "Masquer les partages de @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Média", "account.mention": "Mentionner", "account.moved_to": "{name} a déménagé vers :", @@ -147,22 +148,22 @@ "keyboard_shortcuts.enter": "pour ouvrir le statut", "keyboard_shortcuts.favourite": "vers les favoris", "keyboard_shortcuts.favourites": "pour ouvrir une liste de favoris", - "keyboard_shortcuts.federated": "to open federated timeline", + "keyboard_shortcuts.federated": "pour ouvrir le fil public global", "keyboard_shortcuts.heading": "Raccourcis clavier", - "keyboard_shortcuts.home": "to open home timeline", + "keyboard_shortcuts.home": "pour ouvrir l'accueil", "keyboard_shortcuts.hotkey": "Raccourci", "keyboard_shortcuts.legend": "pour afficher cette légende", - "keyboard_shortcuts.local": "to open local timeline", + "keyboard_shortcuts.local": "pour ouvrir le fil public local", "keyboard_shortcuts.mention": "pour mentionner l’auteur·rice", "keyboard_shortcuts.muted": "pour ouvrir la liste des utilisateurs rendus muets", "keyboard_shortcuts.my_profile": "pour ouvrir votre profil", "keyboard_shortcuts.notifications": "pour ouvrir votre colonne de notifications", - "keyboard_shortcuts.pinned": "to open pinned toots list", + "keyboard_shortcuts.pinned": "pour ouvrir une liste des pouets épinglés", "keyboard_shortcuts.profile": "pour ouvrir le profil de l’auteur·rice", "keyboard_shortcuts.reply": "pour répondre", "keyboard_shortcuts.requests": "pour ouvrir la liste de demandes de suivi", "keyboard_shortcuts.search": "pour cibler la recherche", - "keyboard_shortcuts.start": "to open \"get started\" column", + "keyboard_shortcuts.start": "pour ouvrir la colonne \"pour commencer\"", "keyboard_shortcuts.toggle_hidden": "pour afficher/cacher un texte derrière CW", "keyboard_shortcuts.toot": "pour démarrer un tout nouveau pouet", "keyboard_shortcuts.unfocus": "pour recentrer composer textarea/search", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index c550306ac..8b830ae7b 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -15,6 +15,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Séguena", "account.hide_reblogs": "Ocultar repeticións de @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Medios", "account.mention": "Mencionar @{name}", "account.moved_to": "{name} marchou a:", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index e9a13b02d..4aee82212 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -15,6 +15,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "במעקב אחריך", "account.hide_reblogs": "להסתיר הידהודים מאת @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "מדיה", "account.mention": "אזכור של @{name}", "account.moved_to": "החשבון {name} הועבר אל:", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index 7da45c3a4..a138cf589 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -15,6 +15,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "te slijedi", "account.hide_reblogs": "Hide boosts from @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Media", "account.mention": "Spomeni @{name}", "account.moved_to": "{name} has moved to:", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index c9d32135a..6a4d0ecf0 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -15,6 +15,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Követnek téged", "account.hide_reblogs": "Rejtsd el a tülkölést @{name}-tól/től", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Média", "account.mention": "@{name} említése", "account.moved_to": "{name} átköltözött:", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index 1376f6894..7d7090236 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -15,6 +15,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Հետեւում է քեզ", "account.hide_reblogs": "Թաքցնել @{name}֊ի տարածածները", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Մեդիա", "account.mention": "Նշել @{name}֊ին", "account.moved_to": "{name}֊ը տեղափոխվել է՝", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index e8b087e9d..c8ed00e9f 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -15,6 +15,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Mengikuti anda", "account.hide_reblogs": "Sembunyikan boosts dari @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Media", "account.mention": "Balasan @{name}", "account.moved_to": "{name} telah pindah ke:", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index a3ea121e4..c92ceccd1 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -15,6 +15,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Sequas tu", "account.hide_reblogs": "Hide boosts from @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Media", "account.mention": "Mencionar @{name}", "account.moved_to": "{name} has moved to:", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index fa0956fe3..e9eb62e71 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -7,14 +7,15 @@ "account.disclaimer_full": "Il profilo dell'utente mostrato qui sotto potrebbe essere incompleto.", "account.domain_blocked": "Dominio nascosto", "account.edit_profile": "Modifica profilo", - "account.endorse": "Feature on profile", + "account.endorse": "Metti in evidenza sul profilo", "account.follow": "Segui", "account.followers": "Seguaci", - "account.followers.empty": "No one follows this user yet.", + "account.followers.empty": "Ancora nessuno segue questo utente.", "account.follows": "Segue", - "account.follows.empty": "This user doesn't follow anyone yet.", + "account.follows.empty": "Questo utente non segue ancora nessuno.", "account.follows_you": "Ti segue", "account.hide_reblogs": "Nascondi condivisioni da @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Media", "account.mention": "Menziona @{name}", "account.moved_to": "{name} si è trasferito su:", @@ -29,7 +30,7 @@ "account.show_reblogs": "Mostra condivisioni da @{name}", "account.unblock": "Sblocca @{name}", "account.unblock_domain": "Non nascondere {domain}", - "account.unendorse": "Don't feature on profile", + "account.unendorse": "Non mettere in evidenza sul profilo", "account.unfollow": "Non seguire", "account.unmute": "Non silenziare @{name}", "account.unmute_notifications": "Non silenziare più le notifiche da @{name}", @@ -108,19 +109,19 @@ "emoji_button.search_results": "Risultati della ricerca", "emoji_button.symbols": "Simboli", "emoji_button.travel": "Viaggi e luoghi", - "empty_column.blocks": "You haven't blocked any users yet.", + "empty_column.blocks": "Non hai ancora bloccato nessun utente.", "empty_column.community": "La timeline locale è vuota. Condividi qualcosa pubblicamente per dare inizio alla festa!", "empty_column.direct": "Non hai ancora nessun messaggio diretto. Quando ne manderai o riceverai qualcuno, apparirà qui.", - "empty_column.domain_blocks": "There are no hidden domains yet.", - "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", - "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.", - "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", + "empty_column.domain_blocks": "Non vi sono domini nascosti.", + "empty_column.favourited_statuses": "Non hai ancora segnato nessun toot come apprezzato. Quando lo farai, comparirà qui.", + "empty_column.favourites": "Nessuno ha ancora segnato questo toot come apprezzato. Quando qualcuno lo farà, apparirà qui.", + "empty_column.follow_requests": "Non hai ancora ricevuto nessuna richiesta di seguirti. Quando ne arriveranno, saranno mostrate qui.", "empty_column.hashtag": "Non c'è ancora nessun post con questo hashtag.", "empty_column.home": "Non stai ancora seguendo nessuno. Visita {public} o usa la ricerca per incontrare nuove persone.", "empty_column.home.public_timeline": "la timeline pubblica", "empty_column.list": "Non c'è niente in questo elenco ancora. Quando i membri di questo elenco postano nuovi stati, questi appariranno qui.", - "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", - "empty_column.mutes": "You haven't muted any users yet.", + "empty_column.lists": "Non hai ancora nessuna lista. Quando ne creerai qualcuna, comparirà qui.", + "empty_column.mutes": "Non hai ancora silenziato nessun utente.", "empty_column.notifications": "Non hai ancora nessuna notifica. Interagisci con altri per iniziare conversazioni.", "empty_column.public": "Qui non c'è nulla! Scrivi qualcosa pubblicamente, o aggiungi utenti da altri server per riempire questo spazio", "follow_request.authorize": "Autorizza", @@ -137,32 +138,32 @@ "home.column_settings.show_reblogs": "Mostra post condivisi", "home.column_settings.show_replies": "Mostra risposte", "keyboard_shortcuts.back": "per tornare indietro", - "keyboard_shortcuts.blocked": "to open blocked users list", + "keyboard_shortcuts.blocked": "per aprire l'elenco degli utenti bloccati", "keyboard_shortcuts.boost": "per condividere", "keyboard_shortcuts.column": "per portare il focus su uno status in una delle colonne", "keyboard_shortcuts.compose": "per portare il focus nell'area di composizione", "keyboard_shortcuts.description": "Descrizione", - "keyboard_shortcuts.direct": "to open direct messages column", + "keyboard_shortcuts.direct": "per aprire la colonna dei messaggi diretti", "keyboard_shortcuts.down": "per spostarsi in basso nella lista", "keyboard_shortcuts.enter": "per aprire lo status", "keyboard_shortcuts.favourite": "per segnare come apprezzato", - "keyboard_shortcuts.favourites": "to open favourites list", - "keyboard_shortcuts.federated": "to open federated timeline", + "keyboard_shortcuts.favourites": "per aprire l'elenco dei toot apprezzati", + "keyboard_shortcuts.federated": "per aprire la timeline federata", "keyboard_shortcuts.heading": "Tasti di scelta rapida", - "keyboard_shortcuts.home": "to open home timeline", + "keyboard_shortcuts.home": "per aprire la timeline home", "keyboard_shortcuts.hotkey": "Tasto di scelta rapida", "keyboard_shortcuts.legend": "per mostrare questa spiegazione", - "keyboard_shortcuts.local": "to open local timeline", + "keyboard_shortcuts.local": "per aprire la timeline locale", "keyboard_shortcuts.mention": "per menzionare l'autore", - "keyboard_shortcuts.muted": "to open muted users list", - "keyboard_shortcuts.my_profile": "to open your profile", - "keyboard_shortcuts.notifications": "to open notifications column", - "keyboard_shortcuts.pinned": "to open pinned toots list", + "keyboard_shortcuts.muted": "per aprire l'elenco degli utenti silenziati", + "keyboard_shortcuts.my_profile": "per aprire il tuo profilo", + "keyboard_shortcuts.notifications": "per aprire la colonna delle notifiche", + "keyboard_shortcuts.pinned": "per aprire l'elenco dei toot fissati in cima", "keyboard_shortcuts.profile": "per aprire il profilo dell'autore", "keyboard_shortcuts.reply": "per rispondere", - "keyboard_shortcuts.requests": "to open follow requests list", + "keyboard_shortcuts.requests": "per aprire l'elenco delle richieste di seguirti", "keyboard_shortcuts.search": "per spostare il focus sulla ricerca", - "keyboard_shortcuts.start": "to open \"get started\" column", + "keyboard_shortcuts.start": "per aprire la colonna \"Come iniziare\"", "keyboard_shortcuts.toggle_hidden": "per mostrare/nascondere il testo dei CW", "keyboard_shortcuts.toot": "per iniziare a scrivere un toot completamente nuovo", "keyboard_shortcuts.unfocus": "per uscire dall'area di composizione o dalla ricerca", @@ -183,10 +184,10 @@ "missing_indicator.label": "Non trovato", "missing_indicator.sublabel": "Risorsa non trovata", "mute_modal.hide_notifications": "Nascondere le notifiche da quest'utente?", - "navigation_bar.apps": "Mobile apps", + "navigation_bar.apps": "App per dispositivi mobili", "navigation_bar.blocks": "Utenti bloccati", "navigation_bar.community_timeline": "Timeline locale", - "navigation_bar.compose": "Compose new toot", + "navigation_bar.compose": "Componi nuovo toot", "navigation_bar.direct": "Messaggi diretti", "navigation_bar.discover": "Scopri", "navigation_bar.domain_blocks": "Domini nascosti", @@ -280,7 +281,7 @@ "status.cancel_reblog_private": "Annulla condivisione", "status.cannot_reblog": "Questo post non può essere condiviso", "status.delete": "Elimina", - "status.detailed_status": "Detailed conversation view", + "status.detailed_status": "Vista conversazione dettagliata", "status.direct": "Messaggio diretto @{name}", "status.embed": "Incorpora", "status.favourite": "Apprezzato", @@ -297,7 +298,7 @@ "status.reblog": "Condividi", "status.reblog_private": "Condividi con i destinatari iniziali", "status.reblogged_by": "{name} ha condiviso", - "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.", + "status.reblogs.empty": "Nessuno ha ancora condiviso questo toot. Quando qualcuno lo farà, comparirà qui.", "status.redraft": "Cancella e riscrivi", "status.reply": "Rispondi", "status.replyAll": "Rispondi alla conversazione", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 6ec9321de..04a2e4692 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -15,6 +15,7 @@ "account.follows.empty": "まだ誰もフォローしていません。", "account.follows_you": "フォローされています", "account.hide_reblogs": "@{name}さんからのブーストを非表示", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "メディア", "account.mention": "@{name}さんにトゥート", "account.moved_to": "{name}さんは引っ越しました:", diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json index 6ad129254..ec6e211c6 100644 --- a/app/javascript/mastodon/locales/ka.json +++ b/app/javascript/mastodon/locales/ka.json @@ -15,6 +15,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "მოგყვებათ", "account.hide_reblogs": "დაიმალოს ბუსტები @{name}-სგან", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "მედია", "account.mention": "ასახელეთ @{name}", "account.moved_to": "{name} გადავიდა:", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 50f785c1a..15e8524e0 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -15,6 +15,7 @@ "account.follows.empty": "이 유저는 아직 아무도 팔로우 하고 있지 않습니다.", "account.follows_you": "날 팔로우합니다", "account.hide_reblogs": "@{name}의 부스트를 숨기기", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "미디어", "account.mention": "@{name}에게 글쓰기", "account.moved_to": "{name}는 계정을 이동했습니다:", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 5623bc54f..f829146f1 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -15,6 +15,7 @@ "account.follows.empty": "Deze gebruiker volgt nog niemand.", "account.follows_you": "Volgt jou", "account.hide_reblogs": "Verberg boosts van @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Media", "account.mention": "Vermeld @{name}", "account.moved_to": "{name} is verhuisd naar:", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index d533ac315..e531789a9 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -15,6 +15,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Følger deg", "account.hide_reblogs": "Skjul fremhevinger fra @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Media", "account.mention": "Nevn @{name}", "account.moved_to": "{name} har flyttet til:", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index 254e9a2a5..182710038 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -15,6 +15,7 @@ "account.follows.empty": "Aqueste utilizaire sèc pas degun pel moment.", "account.follows_you": "Vos sèc", "account.hide_reblogs": "Rescondre los partatges de @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Mèdias", "account.mention": "Mencionar @{name}", "account.moved_to": "{name} a mudat los catons a :", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index c5f28c2d0..aa2535bf7 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -15,6 +15,7 @@ "account.follows.empty": "Ten użytkownik nie śledzi jeszcze nikogo.", "account.follows_you": "Śledzi Cię", "account.hide_reblogs": "Ukryj podbicia od @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Zawartość multimedialna", "account.mention": "Wspomnij o @{name}", "account.moved_to": "{name} przeniósł(-osła) się do:", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index ed6ea3674..9c48f0bc1 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -15,6 +15,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Segue você", "account.hide_reblogs": "Esconder compartilhamentos de @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Mídia", "account.mention": "Mencionar @{name}", "account.moved_to": "{name} se mudou para:", diff --git a/app/javascript/mastodon/locales/pt.json b/app/javascript/mastodon/locales/pt.json index 2f601cb32..096fded95 100644 --- a/app/javascript/mastodon/locales/pt.json +++ b/app/javascript/mastodon/locales/pt.json @@ -15,6 +15,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "É teu seguidor", "account.hide_reblogs": "Esconder partilhas de @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Media", "account.mention": "Mencionar @{name}", "account.moved_to": "{name} mudou a sua conta para:", diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json index f3c540f2e..fda82136e 100644 --- a/app/javascript/mastodon/locales/ro.json +++ b/app/javascript/mastodon/locales/ro.json @@ -1,145 +1,146 @@ { "account.badges.bot": "Bot", - "account.block": "Blocheaza @{name}", + "account.block": "Blochează @{name}", "account.block_domain": "Ascunde tot de la {domain}", "account.blocked": "Blocat", "account.direct": "Mesaj direct @{name}", - "account.disclaimer_full": "Informatiile de la jos pot reflecta profilul incomplet al utilizatorului.", + "account.disclaimer_full": "Informațiile de mai jos pot reflecta profilul incomplet al utilizatorului.", "account.domain_blocked": "Domeniu ascuns", - "account.edit_profile": "Editeaza profilul", - "account.endorse": "Promoveaza pe profil", - "account.follow": "Urmareste", - "account.followers": "Urmaritori", - "account.followers.empty": "Nimeni nu urmareste acest utilizator inca.", - "account.follows": "Urmareste", - "account.follows.empty": "Acest utilizator nu urmareste pe nimeni inca.", - "account.follows_you": "Te urmareste", - "account.hide_reblogs": "Ascunde promovarile de la @{name}", + "account.edit_profile": "Editează profilul", + "account.endorse": "Redistribuie pe profil", + "account.follow": "Urmărește", + "account.followers": "Urmăritori", + "account.followers.empty": "Nimeni nu urmărește acest utilizator incă.", + "account.follows": "Urmărește", + "account.follows.empty": "Acest utilizator nu urmărește pe nimeni incă.", + "account.follows_you": "Te urmărește", + "account.hide_reblogs": "Ascunde redistribuirile de la @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Media", - "account.mention": "Mentioneaza @{name}", + "account.mention": "Menționează @{name}", "account.moved_to": "{name} a fost mutat la:", - "account.mute": "Opreste @{name}", - "account.mute_notifications": "Opreste notificarile de la @{name}", + "account.mute": "Oprește @{name}", + "account.mute_notifications": "Oprește notificările de la @{name}", "account.muted": "Oprit", - "account.posts": "Postare", - "account.posts_with_replies": "Postari si replici", - "account.report": "Raporteaza @{name}", - "account.requested": "Asteapta aprobare. Apasa pentru a anula cererea de urmarire", + "account.posts": "Postări", + "account.posts_with_replies": "Postări și replici", + "account.report": "Raportează @{name}", + "account.requested": "Așteaptă aprobare. Apasă pentru a anula cererea de urmărire", "account.share": "Distribuie profilul lui @{name}", - "account.show_reblogs": "Arata promovarile de la @{name}", - "account.unblock": "Deblocheaza @{name}", - "account.unblock_domain": "Arata {domain}", + "account.show_reblogs": "Arată redistribuirile de la @{name}", + "account.unblock": "Deblochează @{name}", + "account.unblock_domain": "Arată {domain}", "account.unendorse": "Nu promova pe profil", - "account.unfollow": "Nu mai urmari", - "account.unmute": "Porneste notificarile @{name}", - "account.unmute_notifications": "Porneste notificarile de la @{name}", + "account.unfollow": "Nu mai urmări", + "account.unmute": "Pornește notificările @{name}", + "account.unmute_notifications": "Pornește notificările de la @{name}", "account.view_full_profile": "Vezi profilul complet", - "alert.unexpected.message": "A aparut o eroare neasteptata.", + "alert.unexpected.message": "A apărut o eroare neașteptată.", "alert.unexpected.title": "Hopa!", - "boost_modal.combo": "Poti apasa {combo} pentru a sari peste asta data viitoare", - "bundle_column_error.body": "Ceva nu a functionat la incarcarea acestui component.", - "bundle_column_error.retry": "Incearca din nou", - "bundle_column_error.title": "Eoare de retea", - "bundle_modal_error.close": "Inchis", - "bundle_modal_error.message": "Ceva nu a functionat in timupul incacarii acestui component.", - "bundle_modal_error.retry": "Incearca din nou", - "column.blocks": "Utilizatori blocati", + "boost_modal.combo": "Poți apăsa {combo} pentru a sări peste asta data viitoare", + "bundle_column_error.body": "Ceva nu a funcționat la încărcarea acestui component.", + "bundle_column_error.retry": "Încearcă din nou", + "bundle_column_error.title": "Eoare de rețea", + "bundle_modal_error.close": "Închide", + "bundle_modal_error.message": "Ceva nu a funcționat în timupul încărcării acestui component.", + "bundle_modal_error.retry": "Încearcă din nou", + "column.blocks": "Utilizatori blocați", "column.community": "Fluxul Local", "column.direct": "Mesaje directe", "column.domain_blocks": "Domenii ascunse", "column.favourites": "Favorite", - "column.follow_requests": "Cereri de urmarire", - "column.home": "Acasa", + "column.follow_requests": "Cereri de urmărire", + "column.home": "Acasă", "column.lists": "Liste", - "column.mutes": "Utilizatori opriti", - "column.notifications": "Notificari", - "column.pins": "Postari fixate", + "column.mutes": "Utilizatori opriți", + "column.notifications": "Notificări", + "column.pins": "Postări fixate", "column.public": "Flux global", - "column_back_button.label": "Inapoi", - "column_header.hide_settings": "Ascunde setarile", - "column_header.moveLeft_settings": "Muta coloana la stanga", - "column_header.moveRight_settings": "Muta coloaba la dreapta", - "column_header.pin": "Fixeaza", - "column_header.show_settings": "Arata setarile", - "column_header.unpin": "Elibereaza", - "column_subheading.settings": "Setari", + "column_back_button.label": "Înapoi", + "column_header.hide_settings": "Ascunde setările", + "column_header.moveLeft_settings": "Mută coloana la stânga", + "column_header.moveRight_settings": "Mută coloana la dreapta", + "column_header.pin": "Fixează", + "column_header.show_settings": "Arată setările", + "column_header.unpin": "Eliberează", + "column_subheading.settings": "Setări", "community.column_settings.media_only": "Doar media", - "compose_form.direct_message_warning": "Aceasta postare va fi trimisa doar utilizatorilor mentionati.", - "compose_form.direct_message_warning_learn_more": "Afla mai multe", - "compose_form.hashtag_warning": "Aceasta postare nu va fi listata sub nici un hastag. Doar postarile publice pot fi gasite dupa un hastag.", - "compose_form.lock_disclaimer": "Contul tau nu este {locked}. Toata lumea te poate urmari pentru a vedea postarile doar pentru utilizatori.", - "compose_form.lock_disclaimer.lock": "blocat", - "compose_form.placeholder": "La ce te gandesti?", - "compose_form.publish": "Postare", + "compose_form.direct_message_warning": "Această postare va fi trimisă doar utilizatorilor menționați.", + "compose_form.direct_message_warning_learn_more": "Află mai multe", + "compose_form.hashtag_warning": "Această postare nu va fi listată sub nici un hastag. Doar postările publice pot fi găsite dupa un hastag.", + "compose_form.lock_disclaimer": "Contul tău nu este {locked}. Toată lumea te poate urmări pentru a vedea postările doar pentru urmăritori.", + "compose_form.lock_disclaimer.lock": "privat", + "compose_form.placeholder": "La ce te gândești?", + "compose_form.publish": "Postează", "compose_form.publish_loud": "{publish}!", - "compose_form.sensitive.marked": "Continutul media este marcat ca sensibil", - "compose_form.sensitive.unmarked": "Continutul media nu este marcat ca sensibil", + "compose_form.sensitive.marked": "Conținutul media este marcat ca sensibil", + "compose_form.sensitive.unmarked": "Conținutul media nu este marcat ca sensibil", "compose_form.spoiler.marked": "Textul este ascuns sub advertizare", "compose_form.spoiler.unmarked": "Textul nu este ascuns", "compose_form.spoiler_placeholder": "Scrie adveritzarea aici", - "confirmation_modal.cancel": "Anuleaza", - "confirmations.block.confirm": "Blocheaza", - "confirmations.block.message": "Esti sigur ca vrei sa blochezi {name}?", - "confirmations.delete.confirm": "Sterge", - "confirmations.delete.message": "Esti sigur ca vrei sa stergi asta?", - "confirmations.delete_list.confirm": "Sterge", - "confirmations.delete_list.message": "Esti sigur ca vrei sa stergi permanent aceasta lista?", + "confirmation_modal.cancel": "Anulează", + "confirmations.block.confirm": "Blochează", + "confirmations.block.message": "Ești sigur că vrei să blochezi {name}?", + "confirmations.delete.confirm": "Șterge", + "confirmations.delete.message": "Ești șigur că vrei să ștergi asta?", + "confirmations.delete_list.confirm": "Șterge", + "confirmations.delete_list.message": "Ești sigur că vrei să ștergi permanent această listă?", "confirmations.domain_block.confirm": "Ascunde tot domeniul", - "confirmations.domain_block.message": "Esti absolut sigur ca vrei sa blochezi complet {domain}? In cele mai multe cazuti raportarea sau oprirea anumitor lucruri este sufucienta si de preferat. Nu vei mai vedea nici un continut de la acest domeniu in nici un flux public sau in notificarile tale. Urmaritorii tai de la acele domenii vor fi retrasi.", - "confirmations.mute.confirm": "Opreste", - "confirmations.mute.message": "Esti sigur ca vrei sa opresti {name}?", - "confirmations.redraft.confirm": "Strge si salveaza din nou", - "confirmations.redraft.message": "Esti sigur ca vrei sa faci asta? Tot ce tine de aceasta postare, inclusiv raspunsurile vor fi deconectate.", - "confirmations.unfollow.confirm": "Nu mai urmari", - "confirmations.unfollow.message": "Esti sigur ca nu mai vrei sa urmaresti {name}?", - "embed.instructions": "Insereaza aceasta postare pe site-ul tau adaugand codul de mai jos.", - "embed.preview": "Cam asa va arata:", + "confirmations.domain_block.message": "Ești absolut sigur că vrei să blochezi complet {domain}? În cele mai multe cazuri raportarea sau oprirea anumitor lucruri este suficientă și de preferat. Nu vei mai vedea nici un conținut de la acest domeniu in nici un flux public sau în notificările tale. Urmăritorii tăi de la acele domenii vor fi retrași.", + "confirmations.mute.confirm": "Oprește", + "confirmations.mute.message": "Ești sigur că vrei să oprești {name}?", + "confirmations.redraft.confirm": "Șterge și salvează ca ciornă", + "confirmations.redraft.message": "Ești sigur că vrei să faci asta? Tot ce ține de această postare, inclusiv răspunsurile vor fi deconectate.", + "confirmations.unfollow.confirm": "Nu mai urmări", + "confirmations.unfollow.message": "Ești sigur că nu mai vrei să îl urmărești pe {name}?", + "embed.instructions": "Inserează această postare pe site-ul tău adăugând codul de mai jos.", + "embed.preview": "Cam așa va arăta:", "emoji_button.activity": "Activitate", "emoji_button.custom": "Personalizat", "emoji_button.flags": "Marcaje", - "emoji_button.food": "Mancare si Bauturi", - "emoji_button.label": "Insereaza un emoji", - "emoji_button.nature": "Natura", - "emoji_button.not_found": "Fara emojiuri (╯°□°)╯︵ ┻━┻", + "emoji_button.food": "Mâncare și Băuturi", + "emoji_button.label": "Inserează un emoji", + "emoji_button.nature": "Natură", + "emoji_button.not_found": "Fară emojiuri (╯°□°)╯︵ ┻━┻", "emoji_button.objects": "Obiecte", "emoji_button.people": "Persoane", "emoji_button.recent": "Utilizate frecvent", - "emoji_button.search": "Cauta...", - "emoji_button.search_results": "Rezultatele cautarii", + "emoji_button.search": "Caută...", + "emoji_button.search_results": "Rezultatele căutării", "emoji_button.symbols": "Simboluri", - "emoji_button.travel": "Calatorii si Locuri", - "empty_column.blocks": "Nu ai blocat nici un utilizator inca.", - "empty_column.community": "Nimic in fluxul local. Scrie ceva public pentru a impinge bila la deal!", - "empty_column.direct": "Nu ai nici un mesaj direct inca. Cand trimiti sau primesti unul, vor fi afisare aici.", - "empty_column.domain_blocks": "Nu sunt domenii ascunse inca.", - "empty_column.favourited_statuses": "Nu ai nici o postare favorita inca. Cand vei avea, vor fi afisare inca.", - "empty_column.favourites": "Nimeni nu are inca nici o postare favorita. Cand cineva va adauga la favorite, vor aparea aici.", - "empty_column.follow_requests": "Nu ai inca nici o cerete de urmarire. Cand vei primi una, va fi afisata aici.", - "empty_column.hashtag": "Acest hastag nu a fost folosit in nici o postare inca.", - "empty_column.home": "Fluxul tau este gol. Viziteaza {public} sau fa o cautare pentru a incepe a incepe si a cunoaste alti oameni.", + "emoji_button.travel": "Călătorii si Locuri", + "empty_column.blocks": "Nu ai blocat nici un utilizator incă.", + "empty_column.community": "Fluxul local este gol. Scrie ceva public pentru a împinge bila la vale!", + "empty_column.direct": "Nu ai nici un mesaj direct incă. Când trimiți sau primești unul, vor fi afișate aici.", + "empty_column.domain_blocks": "Nu sunt domenii ascunse incă.", + "empty_column.favourited_statuses": "Nu ai nici o postare favorită încă. Când vei avea, vor fi afișate aici.", + "empty_column.favourites": "Nimeni nu are această postare adăugată la favorite. Când cineva o va face va fi afișat aici.", + "empty_column.follow_requests": "Nu ai încă nici o cerere de urmărire. Când vei primi una, va fi afișată aici.", + "empty_column.hashtag": "Acest hastag nu a fost folosit încă nicăieri.", + "empty_column.home": "Fluxul tău este gol. Vizitează {public} sau fă o căutare pentru a începe să cunoști oameni noi.", "empty_column.home.public_timeline": "fluxul public", - "empty_column.list": "Nu este nimic inca in aceasta lista. Cand membri acestei liste vor incepe sa posteze, va aparea aici.", - "empty_column.lists": "Nu ai inca nici o lista. Cand vei crea una, va aparea aici.", - "empty_column.mutes": "Nu ai oprit nici un utilizator inca.", - "empty_column.notifications": "Nu ai nici o notificare inca. Interactioneaza cu altii pentru a incepe o conversatie.", - "empty_column.public": "Nu este nimci aici inca! Scrie ceva public, sau urmareste alti utilizatori din alte medii pentru a porni fluxul", - "follow_request.authorize": "Autorizeaza", + "empty_column.list": "Nu este nimic încă în această listă. Când membrii acestei liste vor începe să posteze, va apărea aici.", + "empty_column.lists": "Nu ai încă nici o listă. Când vei crea una, va apărea aici.", + "empty_column.mutes": "Nu ai oprit nici un utilizator incă.", + "empty_column.notifications": "Nu ai nici o notificare încă. Interacționează cu alții pentru a începe o conversație.", + "empty_column.public": "Nu este nimci aici încă! Scrie ceva public, sau urmărește alți utilizatori din alte instanțe pentru a porni fluxul", + "follow_request.authorize": "Autorizează", "follow_request.reject": "Respinge", - "getting_started.developers": "Dezvolatori", - "getting_started.documentation": "Documentatie", - "getting_started.find_friends": "Gaseste prietenii de pe Twitter", - "getting_started.heading": "Incepe", - "getting_started.invite": "Invita oameni", - "getting_started.open_source_notice": "Mastodon este o retea de socializare de tip open source. Poti contribui la dezvoltarea ei sau sa semnalezi erorirle pe GitHub la {github}.", + "getting_started.developers": "Dezvoltatori", + "getting_started.documentation": "Documentație", + "getting_started.find_friends": "Importă din Twitter", + "getting_started.heading": "Începe", + "getting_started.invite": "Invită oameni", + "getting_started.open_source_notice": "Mastodon este o rețea de socializare de tip open source. Puteți contribuii la dezvoltarea ei sau să semnalați erorile pe GitHub la {github}.", "getting_started.security": "Securitate", "getting_started.terms": "Termenii de Utilizare", - "home.column_settings.basic": "De baza", - "home.column_settings.show_reblogs": "Arata promovarile", - "home.column_settings.show_replies": "Arata raspunsurile", - "keyboard_shortcuts.back": "navigheaza inapoi", - "keyboard_shortcuts.blocked": "sa deschida lista utilizatorilor blocati", - "keyboard_shortcuts.boost": "sa promoveze", - "keyboard_shortcuts.column": "sa focuzeze o postare in una dintre coloane", + "home.column_settings.basic": "De bază", + "home.column_settings.show_reblogs": "Arată redistribuirile", + "home.column_settings.show_replies": "Arată răspunsurile", + "keyboard_shortcuts.back": "navighează inapoi", + "keyboard_shortcuts.blocked": "să deschidă lista utilizatorilor blocați", + "keyboard_shortcuts.boost": "să redistribuie", + "keyboard_shortcuts.column": "să focuzeze o postare in una dintre coloane", "keyboard_shortcuts.compose": "sa focuzeze zona de compunere", "keyboard_shortcuts.description": "Descriere", "keyboard_shortcuts.direct": "sa deschida coloane de mesaje directe", @@ -148,9 +149,9 @@ "keyboard_shortcuts.favourite": "sa adauge la favorite", "keyboard_shortcuts.favourites": "sa deschida lista cu favorite", "keyboard_shortcuts.federated": "sa deschida fluxul global", - "keyboard_shortcuts.heading": "Comenzi din tastature", + "keyboard_shortcuts.heading": "Comenzi din tastatură", "keyboard_shortcuts.home": "sa deschida fluxul principal", - "keyboard_shortcuts.hotkey": "Prescurtari", + "keyboard_shortcuts.hotkey": "Prescurtări", "keyboard_shortcuts.legend": "sa afiseze aceasta legenda", "keyboard_shortcuts.local": "sa deschida fluxul local", "keyboard_shortcuts.mention": "sa mentioneze autorul", @@ -167,170 +168,170 @@ "keyboard_shortcuts.toot": "sa inceapa o noua postare", "keyboard_shortcuts.unfocus": "sa dezactiveze compunerea/cautarea", "keyboard_shortcuts.up": "sa mute mai sus in lista", - "lightbox.close": "Inchide", - "lightbox.next": "Urmatorul", + "lightbox.close": "Închide", + "lightbox.next": "Următorul", "lightbox.previous": "Precedentul", - "lists.account.add": "Adauga in lista", - "lists.account.remove": "Elimina din lista", - "lists.delete": "Sterge lista", - "lists.edit": "Editeaza lista", - "lists.new.create": "Adauga lista", - "lists.new.title_placeholder": "Titlul pentru noua lista", - "lists.search": "Cauta printre persoanale pe care le urmaresti", + "lists.account.add": "Adaugă în listă", + "lists.account.remove": "Elimină din listă", + "lists.delete": "Șterge listă", + "lists.edit": "Editează lista", + "lists.new.create": "Adaugă listă", + "lists.new.title_placeholder": "Titlu pentru noua listă", + "lists.search": "Caută printre persoanale pe care le urmărești", "lists.subheading": "Listele tale", - "loading_indicator.label": "Incarcare...", - "media_gallery.toggle_visible": "Comutati vizibilitatea", - "missing_indicator.label": "Nu a fost gasit", - "missing_indicator.sublabel": "Aceasta resursa nu a putut fi gasita", - "mute_modal.hide_notifications": "Ascunzi notificarile de la acest utilizator?", - "navigation_bar.apps": "Aplicatii mobile", - "navigation_bar.blocks": "Utilizatori blocati", + "loading_indicator.label": "Încărcare...", + "media_gallery.toggle_visible": "Comutați vizibilitatea", + "missing_indicator.label": "Nu a fost găsit", + "missing_indicator.sublabel": "Această resursă nu a putut fi găsită", + "mute_modal.hide_notifications": "Ascunzi notificările de la acest utilizator?", + "navigation_bar.apps": "Aplicații mobile", + "navigation_bar.blocks": "Utilizatori blocați", "navigation_bar.community_timeline": "Flux local", - "navigation_bar.compose": "Compune o noua postare", + "navigation_bar.compose": "Compune o nouă postare", "navigation_bar.direct": "Mesaje directe", - "navigation_bar.discover": "Descopera", + "navigation_bar.discover": "Descoperă", "navigation_bar.domain_blocks": "Domenii ascunse", - "navigation_bar.edit_profile": "Editeaza profilul", + "navigation_bar.edit_profile": "Editează profilul", "navigation_bar.favourites": "Favorite", "navigation_bar.filters": "Cuvinte oprite", - "navigation_bar.follow_requests": "Cereri de urmarire", - "navigation_bar.info": "Despre aceasta instanta", - "navigation_bar.keyboard_shortcuts": "Prescurtari", + "navigation_bar.follow_requests": "Cereri de urmărire", + "navigation_bar.info": "Despre această instanță", + "navigation_bar.keyboard_shortcuts": "Prescurtări", "navigation_bar.lists": "Liste", "navigation_bar.logout": "Deconectare", - "navigation_bar.mutes": "Utilizatori opriti", + "navigation_bar.mutes": "Utilizatori opriți", "navigation_bar.personal": "Personal", - "navigation_bar.pins": "Postari fixate", - "navigation_bar.preferences": "Preferinte", + "navigation_bar.pins": "Postări fixate", + "navigation_bar.preferences": "Preferințe", "navigation_bar.public_timeline": "Flux global", "navigation_bar.security": "Securitate", - "notification.favourite": "{name} a adaugat statusul tau la favorite", - "notification.follow": "{name} te urmareste", - "notification.mention": "{name} te-a mentionat", + "notification.favourite": "{name} a adăugat statusul tău la favorite", + "notification.follow": "{name} te urmărește", + "notification.mention": "{name} te-a menționat", "notification.reblog": "{name} a redistribuit postarea ta", - "notifications.clear": "Sterge notificarile", - "notifications.clear_confirmation": "Esti sigur ca vrei sa stergi toate notificarile?", - "notifications.column_settings.alert": "Notificari desktop", + "notifications.clear": "Șterge notificările", + "notifications.clear_confirmation": "Ești sigur că vrei să ștergi toate notificările?", + "notifications.column_settings.alert": "Notificări pe desktop", "notifications.column_settings.favourite": "Favorite:", - "notifications.column_settings.follow": "Noi urmaritori:", - "notifications.column_settings.mention": "Mentiuni:", - "notifications.column_settings.push": "Notificari push", + "notifications.column_settings.follow": "Noi urmăritori:", + "notifications.column_settings.mention": "Mențiuni:", + "notifications.column_settings.push": "Notificări push", "notifications.column_settings.push_meta": "Acest dispozitiv", "notifications.column_settings.reblog": "Redistribuite:", - "notifications.column_settings.show": "Arata in coloana", - "notifications.column_settings.sound": "Reda sunet", - "notifications.group": "{count} notificari", + "notifications.column_settings.show": "Arată în coloană", + "notifications.column_settings.sound": "Redă sunet", + "notifications.group": "{count} notificări", "onboarding.done": "Gata", - "onboarding.next": "Urmatorul", - "onboarding.page_five.public_timelines": "Fluxul local afiseaza postarile publice de la toti utilizatorii pe {domain}. Fluxul global afiseaza postarile publice de la toti utilizatorii din reteaua mastodon pe care utilizatorii de pe {domain} ii urmaresc. Acestea sunt fluxurile publice, un mod grozav de a descoperi oameni noi.", - "onboarding.page_four.home": "Fluxul Acasa arata postarile celor pe care ii urmaresti.", - "onboarding.page_four.notifications": "Coloana de notificari arata cand cineva interactioneaza cu tine.", - "onboarding.page_one.federation": "Mastodon este o retea independenta de servere care impreuna formeaza o imensa retea de socializare. Noi numim aceste servere istante.", - "onboarding.page_one.full_handle": "Id-ul tau complet", - "onboarding.page_one.handle_hint": "Aceasta este ceea ce trebuie sa le spuneti prietenilor cand vor sa va caute.", + "onboarding.next": "Următorul", + "onboarding.page_five.public_timelines": "Fluxul local afișează postările publice de la toți utilizatorii pe {domain}. Fluxul global afișează postările publice de la toți utilizatorii din rețeaua mastodon pe care utilizatorii de pe {domain} ii urmăresc. Acestea sunt fluxurile publice, un mod grozav de a descoperi oameni noi.", + "onboarding.page_four.home": "Fluxul Acasă arată postarile celor pe care ii urmărești.", + "onboarding.page_four.notifications": "Coloana de notificări arată când cineva interacționează cu tine.", + "onboarding.page_one.federation": "Mastodon este o rețea independentă de servere care împreună formează o imensă retea de socializare. Noi numim aceste servere istanțe.", + "onboarding.page_one.full_handle": "Id-ul tău complet", + "onboarding.page_one.handle_hint": "Asta este ceea ce trebuie să le spuneți prietenilor când vor să vă caute.", "onboarding.page_one.welcome": "Bun venit la Mastodon!", - "onboarding.page_six.admin": "Administatorul acestei instante este {admin}.", + "onboarding.page_six.admin": "Administatorul acestei instanțe este {admin}.", "onboarding.page_six.almost_done": "Aproape gata...", - "onboarding.page_six.appetoot": "Distractie placuta!", - "onboarding.page_six.apps_available": "Acestea sunt {apps} disponibile pentru iOS, Android si alte platforme.", - "onboarding.page_six.github": "Mastodon este un software de tip open source. Poti raporta erori, cere facilitati, sau sa contribuiti pe {github}.", - "onboarding.page_six.guidelines": "instructiunile comunitatii", - "onboarding.page_six.read_guidelines": "Va rugam cititi {domain} {guidelines}!", - "onboarding.page_six.various_app": "aplicatii mobile", - "onboarding.page_three.profile": "Editeaza poriflul pentru a schimba avatarul, bio si numele. Tot acolo vei gasi si alte preferinte.", - "onboarding.page_three.search": "Utilizeaza bara de cautare pentru a gasi oameni sau hastaguri precum {illustration} si {introductions}. Pentru a gasi o persoana care nu este inscrisa pe aceasta instanta foloseste id-ul lor complet.", - "onboarding.page_two.compose": "Scrie postari din coloana pentru compunere. Poti incarca imagini, schimba setarile de confidentialitate, si adauga advertisemente asupra continutului cu ajutorul iconitelor.", + "onboarding.page_six.appetoot": "Distracție plăcută!", + "onboarding.page_six.apps_available": "Acestea sunt {apps} disponibile pentru iOS, Android și alte platforme.", + "onboarding.page_six.github": "Mastodon este un software de tip open source. Puteți raporta erori, cere facilități, sau să contribuiți pe {github}.", + "onboarding.page_six.guidelines": "regulamentul comunității", + "onboarding.page_six.read_guidelines": "Vă rugăm citiți {domain} {guidelines}!", + "onboarding.page_six.various_app": "aplicații mobile", + "onboarding.page_three.profile": "Editează profilul pentru a modifica fotografia de profil, descrierea si numele. Tot acolo vei găsi și alte preferințe.", + "onboarding.page_three.search": "Utilizează bara de căutare pentru a găsi oameni sau hastaguri precum {illustration} și {introductions}. Pentru a găsi o persoană care nu este înscrisă pe această instanță folosește id-ul lui complet.", + "onboarding.page_two.compose": "Scrie postări din coloana pentru compunere. Poți încărca imagini, schimba setările de confidențialitate, și adăuga advertisemente asupra conținutului.", "onboarding.skip": "Omite", - "privacy.change": "Ajusteaza confidentialitatea statusului", - "privacy.direct.long": "Posteaza doar pentru utilizatorii mentionati", + "privacy.change": "Cine vede asta", + "privacy.direct.long": "Postează doar pentru utilizatorii menționați", "privacy.direct.short": "Direct", - "privacy.private.long": "Posteaza doar pentru urmaritori", - "privacy.private.short": "Doar urmaritori", - "privacy.public.long": "Posteaza in fluxul public", + "privacy.private.long": "Postează doar pentru urmăritori", + "privacy.private.short": "Doar urmăritorii", + "privacy.public.long": "Postează în fluxul public", "privacy.public.short": "Public", "privacy.unlisted.long": "Nu afisa in fluxul public", "privacy.unlisted.short": "Nelistat", - "regeneration_indicator.label": "Incarcare…", - "regeneration_indicator.sublabel": "Fluxul tau este in preparare!", + "regeneration_indicator.label": "Încărcare…", + "regeneration_indicator.sublabel": "Fluxul tău este în preparare!", "relative_time.days": "{number}z", "relative_time.hours": "{number}h", "relative_time.just_now": "acum", - "relative_time.minutes": "{number}l", + "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", - "reply_indicator.cancel": "Anuleaza", - "report.forward": "Redirectioneaza catre {target}", - "report.forward_hint": "Acest cont este de pe un alt server. Trimitem o copie anonima a raportului si acolo?", - "report.hint": "Sesizarea va fi trimsa catre moderatorii acestei instante. Poti oferi o explicatie pentru aceasta sesizare mai jos:", - "report.placeholder": "Comentarii optionale", + "reply_indicator.cancel": "Anulează", + "report.forward": "Redirecționează catre {target}", + "report.forward_hint": "Acest cont este de pe un alt server. Trimitem o copie anonimă a raportului și acolo?", + "report.hint": "Sesizarea va fi trimsă către moderatorii acestei instanțe. Poți oferi o explicație pentru această sesizare mai jos:", + "report.placeholder": "Comentarii opționale", "report.submit": "Trimite", - "report.target": "Raporteaza {target}", - "search.placeholder": "Cauta", - "search_popout.search_format": "Formate pentru cautare avansata", - "search_popout.tips.full_text": "Textele simple returneaza statusuri pe care le-ai scris, favorizat, redistribuit, sau in care au fost mentionate, deasmenea si utilizatorii sau hastagurile care se potrivesc.", + "report.target": "Raportează {target}", + "search.placeholder": "Caută", + "search_popout.search_format": "Formate pentru căutare avansată", + "search_popout.tips.full_text": "Textele simple returnează statusuri pe care le-ai scris, favorizat, redistribuit, sau în care sunt menționate , deasmenea și utilizatorii sau hastagurile care se potrivesc.", "search_popout.tips.hashtag": "hashtag", "search_popout.tips.status": "status", - "search_popout.tips.text": "Textele simple returneaza numele, numele de utilizarori si hastagurile care se potrivesc", + "search_popout.tips.text": "Textele simple returnează nume, nume de utilizarori și hastagurile care se potrivesc", "search_popout.tips.user": "utilizator", "search_results.accounts": "Oameni", "search_results.hashtags": "Hashtaguri", - "search_results.statuses": "Postari", + "search_results.statuses": "Postări", "search_results.total": "{count, number} {count, plural, one {result} other {results}}", - "standalone.public_title": "O privire in interior...", - "status.block": "Blocheaza @{name}", + "standalone.public_title": "Se întâmplă acum", + "status.block": "Blochează @{name}", "status.cancel_reblog_private": "Nedistribuit", - "status.cannot_reblog": "Aceasta postare nu poate fi redistribuita", - "status.delete": "Sterge", - "status.detailed_status": "Conversatia detailata", + "status.cannot_reblog": "Această postare nu poate fi redistribuită", + "status.delete": "Șterge", + "status.detailed_status": "Conversația detailată", "status.direct": "Mesaj direct @{name}", - "status.embed": "Incorporare", + "status.embed": "Încorporare", "status.favourite": "Favorite", "status.filtered": "Sortate", - "status.load_more": "Incarca mai multe", - "status.media_hidden": "Media ascunsa", - "status.mention": "Mentioneaza @{name}", + "status.load_more": "Încarcă mai multe", + "status.media_hidden": "Media ascunsă", + "status.mention": "Mentionează @{name}", "status.more": "Mai mult", - "status.mute": "Opreste @{name}", - "status.mute_conversation": "Opreste conversatia", + "status.mute": "Oprește @{name}", + "status.mute_conversation": "Oprește conversația", "status.open": "Extinde acest status", - "status.pin": "Fixeaza pe profil", - "status.pinned": "Postare fixata", + "status.pin": "Fixează pe profil", + "status.pinned": "Postare fixată", "status.reblog": "Redistribuie", - "status.reblog_private": "Redistribuie la audienta originala", + "status.reblog_private": "Redistribuie către audiența originală", "status.reblogged_by": "{name} redistribuit", - "status.reblogs.empty": "Nimeni nu a redistribuit aceasta postare inca. Cand cineva o va face, va aparea aici.", - "status.redraft": "Sterge si adauga la ciorne", - "status.reply": "Raspunde", - "status.replyAll": "Raspunde la topic", - "status.report": "Raporteaza @{name}", - "status.sensitive_toggle": "Afiseaza", - "status.sensitive_warning": "Continut sensibil", + "status.reblogs.empty": "Nimeni nu a redistribuit această postare până acum. Când cineva o va face, va apărea aici.", + "status.redraft": "Șterge și adaugă la ciorne", + "status.reply": "Răspunde", + "status.replyAll": "Răspunde la topic", + "status.report": "Raportează @{name}", + "status.sensitive_toggle": "Afișează", + "status.sensitive_warning": "Conținut sensibil", "status.share": "Distribuie", - "status.show_less": "Arata mai putin", - "status.show_less_all": "Arata mai putin pentru toti", - "status.show_more": "Arata mai mult", - "status.show_more_all": "Arata mai mult pentru toti", - "status.unmute_conversation": "Reporneste conversatia", - "status.unpin": "Elibereaza din profil", + "status.show_less": "Arată mai puțin", + "status.show_less_all": "Arată mai puțin pentru toți", + "status.show_more": "Arată mai mult", + "status.show_more_all": "Arată mai mult pentru toți", + "status.unmute_conversation": "Repornește conversația", + "status.unpin": "Eliberează din profil", "tabs_bar.federated_timeline": "Global", - "tabs_bar.home": "Acasa", + "tabs_bar.home": "Acasă", "tabs_bar.local_timeline": "Local", - "tabs_bar.notifications": "Notificari", - "tabs_bar.search": "Cautare", + "tabs_bar.notifications": "Notificări", + "tabs_bar.search": "Căutare", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} vorbesc", - "ui.beforeunload": "Ciorna se va priede daca parasesti pagina.", - "upload_area.title": "Trage si elibereaza pentru a incarca", - "upload_button.label": "Adauga media (JPEG, PNG, GIF, WebM, MP4, MOV)", - "upload_form.description": "Adauga o descriere pentru persoanele cu deficiente de vedere", + "ui.beforeunload": "Postarea se va pierde dacă părăsești pagina.", + "upload_area.title": "Trage și eliberează pentru a încărca", + "upload_button.label": "Adaugă media (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_form.description": "Adaugă o descriere pentru persoanele cu deficiențe de vedere", "upload_form.focus": "Taie", - "upload_form.undo": "Sterge", - "upload_progress.label": "Se Incarca...", - "video.close": "Inchide video", - "video.exit_fullscreen": "Inchide", + "upload_form.undo": "Șterge", + "upload_progress.label": "Se Încarcă...", + "video.close": "Închide video", + "video.exit_fullscreen": "Închide", "video.expand": "Extinde video", - "video.fullscreen": "Ecran intreg", + "video.fullscreen": "Ecran întreg", "video.hide": "Ascunde video", - "video.mute": "Opreste sonorul", - "video.pause": "Pauza", + "video.mute": "Oprește sonorul", + "video.pause": "Pauză", "video.play": "Redare", - "video.unmute": "Reporneste sunetul" + "video.unmute": "Repornește sunetul" } diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index 83cbb5240..8961136a3 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -15,6 +15,7 @@ "account.follows.empty": "Этот пользователь ни на кого не подписан.", "account.follows_you": "Подписан(а) на Вас", "account.hide_reblogs": "Скрыть продвижения от @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Медиа", "account.mention": "Упомянуть", "account.moved_to": "Ищите {name} здесь:", @@ -63,7 +64,7 @@ "column_header.show_settings": "Показать настройки", "column_header.unpin": "Открепить", "column_subheading.settings": "Настройки", - "community.column_settings.media_only": "Только медиа", + "community.column_settings.media_only": "Только с медиа", "compose_form.direct_message_warning": "Этот статус будет виден только упомянутым пользователям.", "compose_form.direct_message_warning_learn_more": "Узнать больше", "compose_form.hashtag_warning": "Этот пост не будет показывается в поиске по хэштегу, т.к. он непубличный. Только публичные посты можно найти в поиске по хэштегу.", @@ -76,7 +77,7 @@ "compose_form.sensitive.unmarked": "Медиафайлы не отмечены как чувствительные", "compose_form.spoiler.marked": "Текст скрыт за предупреждением", "compose_form.spoiler.unmarked": "Текст не скрыт", - "compose_form.spoiler_placeholder": "Напишите свое предупреждение здесь", + "compose_form.spoiler_placeholder": "Текст предупреждения", "confirmation_modal.cancel": "Отмена", "confirmations.block.confirm": "Заблокировать", "confirmations.block.message": "Вы уверены, что хотите заблокировать {name}?", @@ -290,7 +291,7 @@ "status.mention": "Упомянуть @{name}", "status.more": "Больше", "status.mute": "Заглушить @{name}", - "status.mute_conversation": "Заглушить тред", + "status.mute_conversation": "Заглушить всю цепочку", "status.open": "Развернуть статус", "status.pin": "Закрепить в профиле", "status.pinned": "Закреплённый статус", @@ -300,7 +301,7 @@ "status.reblogs.empty": "Никто ещё не продвинул этот статус. Как только кто-то это сделает, они появятся здесь.", "status.redraft": "Удалить и исправить", "status.reply": "Ответить", - "status.replyAll": "Ответить на тред", + "status.replyAll": "Ответить всем", "status.report": "Пожаловаться", "status.sensitive_toggle": "Нажмите для просмотра", "status.sensitive_warning": "Чувствительный контент", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index edfd69a25..1264b6d08 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -15,6 +15,7 @@ "account.follows.empty": "Tento užívateľ ešte nikoho nenásleduje.", "account.follows_you": "Následuje ťa", "account.hide_reblogs": "Skryť povýšenia od @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Médiá", "account.mention": "Spomeň @{name}", "account.moved_to": "{name} sa presunul/a na:", @@ -89,7 +90,7 @@ "confirmations.mute.confirm": "Ignoruj", "confirmations.mute.message": "Naozaj chcete ignorovať {name}?", "confirmations.redraft.confirm": "Vyčistiť a prepísať", - "confirmations.redraft.message": "Si si istý/á, že chceš vymazať a prepísať tento príspevok? Jeho nadobudnuté odpovede, povýšenia a obľúbenia, ale i odpovede na pôvodný príspevok budú odlúčené.", + "confirmations.redraft.message": "Si si istý/á, že chceš premazať a prepísať tento príspevok? Jeho nadobudnuté odpovede, povýšenia a obľúbenia, ale i odpovede na pôvodný príspevok budú odlúčené.", "confirmations.unfollow.confirm": "Nesledovať", "confirmations.unfollow.message": "Naozaj chcete prestať sledovať {name}?", "embed.instructions": "Umiestni kód uvedený nižšie pre pridanie tohto statusu na tvoju web stránku.", @@ -111,16 +112,16 @@ "empty_column.blocks": "Ešte si nikoho nezablokoval/a.", "empty_column.community": "Lokálna časová os je prázdna. Napíšte niečo, aby sa to tu začalo hýbať!", "empty_column.direct": "Ešte nemáš žiadne súkromné správy. Keď nejakú pošleš, alebo dostaneš, ukáže sa tu.", - "empty_column.domain_blocks": "There are no hidden domains yet.", - "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", + "empty_column.domain_blocks": "Žiadne domény ešte niesú skryté.", + "empty_column.favourited_statuses": "Nemáš obľúbené ešte žiadne príspevky. Keď si nejaký obľúbiš, bude zobrazený práve tu.", "empty_column.favourites": "Tento toot si ešte nikto neobľúbil. Ten kto si ho obľúbi, bude zobrazený tu.", - "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", + "empty_column.follow_requests": "Ešte nemáš žiadne požiadavky o následovanie. Keď nejaké dostaneš, budú tu zobrazené.", "empty_column.hashtag": "Pod týmto hashtagom sa ešte nič nenachádza.", "empty_column.home": "Tvoja lokálna osa je zatiaľ prázdna! Pre začiatok navštív {public}, alebo použi vyhľadávanie a nájdi tak aj iných užívateľov.", "empty_column.home.public_timeline": "verejná časová os", "empty_column.list": "Tento zoznam je ešte prázdny. Keď ale členovia tohoto zoznamu napíšu nové správy, tak tie sa objavia priamo tu.", - "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", - "empty_column.mutes": "You haven't muted any users yet.", + "empty_column.lists": "Nemáš ešte žiadne zoznamy. Keď nejaký vytvoríš, bude zobrazený práve tu.", + "empty_column.mutes": "Ešte si nestĺmil žiadných užívateľov.", "empty_column.notifications": "Nemáš ešte žiadne oznámenia. Zapoj sa s niekym do debaty a komunikuj s ostatnými aby diskusia mohla začať.", "empty_column.public": "Ešte tu nič nie je. Napíš niečo verejne alebo začnite sledovať užívateľov z iných Mastodon serverov, aby tu tak niečo pribudlo", "follow_request.authorize": "Povoľ prístup", @@ -137,32 +138,32 @@ "home.column_settings.show_reblogs": "Zobraziť povýšené", "home.column_settings.show_replies": "Ukázať odpovede", "keyboard_shortcuts.back": "dostať sa naspäť", - "keyboard_shortcuts.blocked": "to open blocked users list", + "keyboard_shortcuts.blocked": "otvor zoznam blokovaných užívateľov", "keyboard_shortcuts.boost": "vyzdvihnúť", "keyboard_shortcuts.column": "zamerať sa na status v jednom zo stĺpcov", "keyboard_shortcuts.compose": "zamerať sa na písaciu plochu", "keyboard_shortcuts.description": "Popis", - "keyboard_shortcuts.direct": "to open direct messages column", + "keyboard_shortcuts.direct": "otvor panel súkromných správ", "keyboard_shortcuts.down": "posunúť sa dole v zozname", "keyboard_shortcuts.enter": "otvoriť správu", "keyboard_shortcuts.favourite": "pridať do obľúbených", - "keyboard_shortcuts.favourites": "to open favourites list", - "keyboard_shortcuts.federated": "to open federated timeline", + "keyboard_shortcuts.favourites": "otvor zoznam obľúbených", + "keyboard_shortcuts.federated": "otvor federovanú časovú os", "keyboard_shortcuts.heading": "Klávesové skratky", - "keyboard_shortcuts.home": "to open home timeline", + "keyboard_shortcuts.home": "otvor domácu časovú os", "keyboard_shortcuts.hotkey": "Klávesa", "keyboard_shortcuts.legend": "zobraziť túto legendu", - "keyboard_shortcuts.local": "to open local timeline", + "keyboard_shortcuts.local": "otvor miestnu časovú os", "keyboard_shortcuts.mention": "spomenúť autora", - "keyboard_shortcuts.muted": "to open muted users list", - "keyboard_shortcuts.my_profile": "to open your profile", - "keyboard_shortcuts.notifications": "to open notifications column", - "keyboard_shortcuts.pinned": "to open pinned toots list", - "keyboard_shortcuts.profile": "to open author's profile", + "keyboard_shortcuts.muted": "otvor zoznam stíšených užívateľov", + "keyboard_shortcuts.my_profile": "otvor svoj profil", + "keyboard_shortcuts.notifications": "otvor panel oboznámení", + "keyboard_shortcuts.pinned": "otvor zoznam pripnutých príspevkov", + "keyboard_shortcuts.profile": "otvor autorov profil", "keyboard_shortcuts.reply": "odpovedať", - "keyboard_shortcuts.requests": "to open follow requests list", + "keyboard_shortcuts.requests": "otvor zoznam požiadavok k následovaniu", "keyboard_shortcuts.search": "zamerať sa na vyhľadávanie", - "keyboard_shortcuts.start": "to open \"get started\" column", + "keyboard_shortcuts.start": "otvor panel ''začíname''", "keyboard_shortcuts.toggle_hidden": "ukáž/skry text za CW", "keyboard_shortcuts.toot": "začať úplne novú hlášku", "keyboard_shortcuts.unfocus": "nesústrediť sa na písaciu plochu, alebo hľadanie", @@ -183,10 +184,10 @@ "missing_indicator.label": "Nenájdené", "missing_indicator.sublabel": "Tento zdroj sa nepodarilo nájsť", "mute_modal.hide_notifications": "Skryť notifikácie od tohoto užívateľa?", - "navigation_bar.apps": "Mobile apps", + "navigation_bar.apps": "Mobilné aplikácie", "navigation_bar.blocks": "Blokovaní užívatelia", "navigation_bar.community_timeline": "Lokálna časová os", - "navigation_bar.compose": "Compose new toot", + "navigation_bar.compose": "Napíš nový príspevok", "navigation_bar.direct": "Súkromné správy", "navigation_bar.discover": "Objavuj", "navigation_bar.domain_blocks": "Skryté domény", @@ -280,7 +281,7 @@ "status.cancel_reblog_private": "Nezdieľaj", "status.cannot_reblog": "Tento príspevok nemôže byť re-tootnutý", "status.delete": "Zmazať", - "status.detailed_status": "Detailed conversation view", + "status.detailed_status": "Podrobný náhľad celej konverzácie", "status.direct": "Súkromná správa @{name}", "status.embed": "Vložiť", "status.favourite": "Páči sa mi", @@ -297,7 +298,7 @@ "status.reblog": "Povýšiť", "status.reblog_private": "Povýš k pôvodnému publiku", "status.reblogged_by": "{name} povýšil/a", - "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.", + "status.reblogs.empty": "Nikto ešte nepovýšil tento príspevok. Keď tak niekto urobí, bude to zobrazené práve tu.", "status.redraft": "Vymaž a prepíš", "status.reply": "Odpovedať", "status.replyAll": "Odpovedať na diskusiu", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index 8f6c2e3d5..6250aab62 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -15,6 +15,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Ti sledi", "account.hide_reblogs": "Skrij napuhke od @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Mediji", "account.mention": "Omeni @{name}", "account.moved_to": "{name} se je premaknil na:", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index 0f56f642a..0ef07a170 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -15,6 +15,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Prati Vas", "account.hide_reblogs": "Sakrij podrške koje daje korisnika @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Mediji", "account.mention": "Pomeni korisnika @{name}", "account.moved_to": "{name} se pomerio na:", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index 81a37cc4c..ca2c1b225 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -1,6 +1,6 @@ { "account.badges.bot": "Бот", - "account.block": "Блокирај корисника @{name}", + "account.block": "Блокирај @{name}", "account.block_domain": "Сакриј све са домена {domain}", "account.blocked": "Блокиран", "account.direct": "Директна порука @{name}", @@ -9,12 +9,13 @@ "account.edit_profile": "Измени профил", "account.endorse": "Приказати на профилу", "account.follow": "Запрати", - "account.followers": "Пратиоца", - "account.followers.empty": "Нико још увек не прати овог корисника.", + "account.followers": "Пратиоци", + "account.followers.empty": "Тренутно нико не прати овог корисника.", "account.follows": "Прати", - "account.follows.empty": "Овај корисник не прати никога за сад.", + "account.follows.empty": "Корисник тренутно не прати никога.", "account.follows_you": "Прати Вас", "account.hide_reblogs": "Сакриј подршке које даје корисника @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Медији", "account.mention": "Помени корисника @{name}", "account.moved_to": "{name} се померио на:", @@ -22,7 +23,7 @@ "account.mute_notifications": "Искључи обавештења од корисника @{name}", "account.muted": "Ућуткан", "account.posts": "Трубе", - "account.posts_with_replies": "Трубе са одговорима", + "account.posts_with_replies": "Трубе и одговори", "account.report": "Пријави @{name}", "account.requested": "Чекам одобрење. Кликните да поништите захтев за праћење", "account.share": "Подели профил корисника @{name}", @@ -44,17 +45,17 @@ "bundle_modal_error.message": "Нешто није било у реду при учитавању ове компоненте.", "bundle_modal_error.retry": "Покушајте поново", "column.blocks": "Блокирани корисници", - "column.community": "Локална лајна", + "column.community": "Локална временска линија", "column.direct": "Директне поруке", "column.domain_blocks": "Скривени домени", - "column.favourites": "Омиљени", + "column.favourites": "Омиљене", "column.follow_requests": "Захтеви за праћење", "column.home": "Почетна", "column.lists": "Листе", "column.mutes": "Ућуткани корисници", "column.notifications": "Обавештења", - "column.pins": "Прикачени тутови", - "column.public": "Федерисана лајна", + "column.pins": "Прикачене трубе", + "column.public": "Здружена временска линија", "column_back_button.label": "Назад", "column_header.hide_settings": "Сакриј поставке", "column_header.moveLeft_settings": "Помери колону улево", @@ -70,12 +71,12 @@ "compose_form.lock_disclaimer": "Ваш налог није {locked}. Свако може да Вас запрати и да види објаве намењене само Вашим пратиоцима.", "compose_form.lock_disclaimer.lock": "закључан", "compose_form.placeholder": "Шта Вам је на уму?", - "compose_form.publish": "Тутни", + "compose_form.publish": "Труби", "compose_form.publish_loud": "{publish}!", "compose_form.sensitive.marked": "Медији су означени као осетљиви", "compose_form.sensitive.unmarked": "Медији су означени као не-осетљиви", - "compose_form.spoiler.marked": "Текст је скривен иза упозорења", - "compose_form.spoiler.unmarked": "Текст није скривен", + "compose_form.spoiler.marked": "Текст је сакривен иза упозорења", + "compose_form.spoiler.unmarked": "Текст није сакривен", "compose_form.spoiler_placeholder": "Овде упишите упозорење", "confirmation_modal.cancel": "Поништи", "confirmations.block.confirm": "Блокирај", @@ -89,7 +90,7 @@ "confirmations.mute.confirm": "Ућуткај", "confirmations.mute.message": "Да ли стварно желите да ућуткате корисника {name}?", "confirmations.redraft.confirm": "Избриши и преправи", - "confirmations.redraft.message": "Да ли сте сигурно да желите да избришете овај статус и да га преправите*? Омиљеновање и подршке ће бити изгубљене, а одговори на оригинални пост ће бити поништени.", + "confirmations.redraft.message": "Да ли сте сигурни да желите да избришете овај статус и да га преправите? Сва стављања у омиљене трубе, као и подршке ће бити изгубљене, а одговори на оригинални пост ће бити поништени.", "confirmations.unfollow.confirm": "Отпрати", "confirmations.unfollow.message": "Да ли сте сигурни да желите да отпратите корисника {name}?", "embed.instructions": "Угради овај статус на Ваш веб сајт копирањем кода испод.", @@ -97,25 +98,25 @@ "emoji_button.activity": "Активност", "emoji_button.custom": "Произвољно", "emoji_button.flags": "Заставе", - "emoji_button.food": "Храна & пиће", - "emoji_button.label": "Убаци смајли", + "emoji_button.food": "Храна и пиће", + "emoji_button.label": "Убаци емоџи", "emoji_button.nature": "Природа", - "emoji_button.not_found": "Нема смајлија!! (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "Нема емоџија!! (╯°□°)╯︵ ┻━┻", "emoji_button.objects": "Објекти", "emoji_button.people": "Људи", "emoji_button.recent": "Најчешће коришћени", "emoji_button.search": "Претрага...", "emoji_button.search_results": "Резултати претраге", "emoji_button.symbols": "Симболи", - "emoji_button.travel": "Путовања & места", + "emoji_button.travel": "Путовања и места", "empty_column.blocks": "Још увек немате блокираних корисника.", - "empty_column.community": "Локална лајна је празна. Напишите нешто јавно да лајна продува!", + "empty_column.community": "Локална временска линија је празна. Напишите нешто јавно да започнете!", "empty_column.direct": "Још увек немате директних порука. Када пошаљете или примите једну, појавиће се овде.", "empty_column.domain_blocks": "Још увек нема сакривених домена.", "empty_column.favourited_statuses": "Још увек немате труба које су вам се свиделе. Када вам се једна свиди, појавиће се овде.", "empty_column.favourites": "Још увек се никоме није свидела ова труба. Када се некоме свиди, појавиће се овде.", "empty_column.follow_requests": "Још увек немате захтева за праћење. Када примите захтев, појавиће се овде.", - "empty_column.hashtag": "Тренутно нема ништа на овом хештегу.", + "empty_column.hashtag": "Тренутно нема ништа на овој означеној тараби.", "empty_column.home": "Ваша временска линија је празна! Посетите {public} или користите претрагу да почнете и да упознате нове људе.", "empty_column.home.public_timeline": "јавна временска линија", "empty_column.list": "У овој листи још нема ничега. Када чланови листе објаве нове статусе, они ће се појавити овде.", @@ -147,7 +148,7 @@ "keyboard_shortcuts.enter": "да отворите статус", "keyboard_shortcuts.favourite": "да означите као омиљено", "keyboard_shortcuts.favourites": "да отворите листу фаворита", - "keyboard_shortcuts.federated": "да отворите федерализовану временску линију", + "keyboard_shortcuts.federated": "да отворите здружену временску линију", "keyboard_shortcuts.heading": "Пречице на тастатури", "keyboard_shortcuts.home": "да отворите временску линију почетне", "keyboard_shortcuts.hotkey": "Пречица", @@ -185,13 +186,13 @@ "mute_modal.hide_notifications": "Сакриј обавештења од овог корисника?", "navigation_bar.apps": "Мобилне апликације", "navigation_bar.blocks": "Блокирани корисници", - "navigation_bar.community_timeline": "Локална лајна", + "navigation_bar.community_timeline": "Локална временска линија", "navigation_bar.compose": "Саставите нову трубу", "navigation_bar.direct": "Директне поруке", "navigation_bar.discover": "Откриј", "navigation_bar.domain_blocks": "Сакривени домени", "navigation_bar.edit_profile": "Измени профил", - "navigation_bar.favourites": "Омиљени", + "navigation_bar.favourites": "Омиљене", "navigation_bar.filters": "Пригушене речи", "navigation_bar.follow_requests": "Захтеви за праћење", "navigation_bar.info": "О овој инстанци", @@ -200,14 +201,14 @@ "navigation_bar.logout": "Одјава", "navigation_bar.mutes": "Ућуткани корисници", "navigation_bar.personal": "Personal", - "navigation_bar.pins": "Прикачени тутови", + "navigation_bar.pins": "Прикачене трубе", "navigation_bar.preferences": "Подешавања", - "navigation_bar.public_timeline": "Федерисана лајна", - "navigation_bar.security": "Сигурност", - "notification.favourite": "{name} је ставио Ваш статус као омиљени", - "notification.follow": "{name} Вас је запратио", - "notification.mention": "{name} Вас је поменуо", - "notification.reblog": "{name} је подржао(ла) Ваш статус", + "navigation_bar.public_timeline": "Здружена временска линија", + "navigation_bar.security": "Безбедност", + "notification.favourite": "{name} је ставио/ла Ваш статус као омиљени", + "notification.follow": "{name} Вас је запратио/ла", + "notification.mention": "{name} Вас је поменуо/ла", + "notification.reblog": "{name} је подржао/ла Ваш статус", "notifications.clear": "Очисти обавештења", "notifications.clear_confirmation": "Да ли сте сигурно да трајно желите да очистите Ваша обавештења?", "notifications.column_settings.alert": "Обавештења на радној површини", @@ -222,18 +223,18 @@ "notifications.group": "{count} обавештења", "onboarding.done": "Готово", "onboarding.next": "Следеће", - "onboarding.page_five.public_timelines": "Локална лајна приказује све јавне статусе од свих на домену {domain}. Федерисана лајна приказује јавне статусе од свих људи које прате корисници са домена {domain}. Ово су јавне лајне, сјајан начин да откријете нове људе.", - "onboarding.page_four.home": "Почетна лајна приказује статусе људи које Ви пратите.", + "onboarding.page_five.public_timelines": "Локална временска линија приказује све јавне статусе од свих на домену {domain}. Здружена временска линија приказује јавне статусе од свих људи које прате корисници са домена {domain}. Ово су јавне временске линије, сјајан начин да откријете нове људе.", + "onboarding.page_four.home": "Почетна временска линија приказује статусе људи које Ви пратите.", "onboarding.page_four.notifications": "Колона са обавештењима Вам приказује када неко прича са Вама.", "onboarding.page_one.federation": "Мастодонт је мрежа независних сервера који се увезују да направе једну већу друштвену мрежу. Ове сервере зовемо инстанцама.", "onboarding.page_one.full_handle": "Ваш пун надимак", "onboarding.page_one.handle_hint": "Ово бисте рекли својим пријатељима да траже.", - "onboarding.page_one.welcome": "Добродошли на Мастодонт!", + "onboarding.page_one.welcome": "Добродошли на Мастодон!", "onboarding.page_six.admin": "Администратор Ваше инстанце је {admin}.", "onboarding.page_six.almost_done": "Још мало, па готово...", "onboarding.page_six.appetoot": "Пријатутно!", "onboarding.page_six.apps_available": "Постоје {apps} доступне за iOS, Андроид и друге платформе.", - "onboarding.page_six.github": "Мастодонт је слободан софтвер отвореног кода. Можете пријављивати грешке, потраживати нове фунцкионалности, или учествујући у програмирању. Наш изворни код је овде: {github}.", + "onboarding.page_six.github": "Мастодон је слободан софтвер отвореног кода. Можете пријављивати грешке, потраживати нове фунцкионалности, или учествујући у програмирању. Наш изворни код је овде {github}.", "onboarding.page_six.guidelines": "смернице заједнице", "onboarding.page_six.read_guidelines": "Прочитејте {guidelines} домена {domain}!", "onboarding.page_six.various_app": "мобилне апликације", @@ -248,7 +249,7 @@ "privacy.private.short": "Само за пратиоце", "privacy.public.long": "Објави на јавној лајни", "privacy.public.short": "Јавно", - "privacy.unlisted.long": "Не објављуј на јавним лајнама", + "privacy.unlisted.long": "Не објављуј на јавним временским линијама", "privacy.unlisted.short": "Неизлистано", "regeneration_indicator.label": "Учитавање…", "regeneration_indicator.sublabel": "Ваша почетна страница се припрема!", @@ -306,23 +307,23 @@ "status.sensitive_warning": "Осетљив садржај", "status.share": "Подели", "status.show_less": "Прикажи мање", - "status.show_less_all": "Show less for all", + "status.show_less_all": "Прикажи мање за све", "status.show_more": "Прикажи више", - "status.show_more_all": "Show more for all", + "status.show_more_all": "Прикажи више за све", "status.unmute_conversation": "Укључи преписку", "status.unpin": "Откачи са профила", "tabs_bar.federated_timeline": "Федерисано", "tabs_bar.home": "Почетна", "tabs_bar.local_timeline": "Локално", "tabs_bar.notifications": "Обавештења", - "tabs_bar.search": "Search", - "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", + "tabs_bar.search": "Претрага", + "trends.count_by_accounts": "{count} {rawCount, plural, one {човек} other {људи}} прича", "ui.beforeunload": "Ако напустите Мастодонт, изгубићете написани нацрт.", "upload_area.title": "Превуците овде да отпремите", "upload_button.label": "Додај мултимедију (JPEG, PNG, GIF, WebM, MP4, MOV)", "upload_form.description": "Опишите за особе са оштећеним видом", "upload_form.focus": "Подесите", - "upload_form.undo": "Избриши", + "upload_form.undo": "Обриши", "upload_progress.label": "Отпремам...", "video.close": "Затвори видео", "video.exit_fullscreen": "Напусти цео екран", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index 498f6b411..c7df96cf5 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -15,6 +15,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Följer dig", "account.hide_reblogs": "Dölj knuffar från @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Media", "account.mention": "Nämna @{name}", "account.moved_to": "{name} har flyttat till:", diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json index d80eba2c1..e0237c023 100644 --- a/app/javascript/mastodon/locales/ta.json +++ b/app/javascript/mastodon/locales/ta.json @@ -15,6 +15,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Follows you", "account.hide_reblogs": "Hide boosts from @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Media", "account.mention": "Mention @{name}", "account.moved_to": "{name} has moved to:", diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json index bbe575fde..49f3ce2d9 100644 --- a/app/javascript/mastodon/locales/te.json +++ b/app/javascript/mastodon/locales/te.json @@ -7,14 +7,15 @@ "account.disclaimer_full": "క్రింది సమాచారం వాడుకరి యొక్క ప్రొఫైల్ను అసంపూర్తిగా ప్రతిబింబించవచ్చు.", "account.domain_blocked": "డొమైన్ దాచిపెట్టబడినది", "account.edit_profile": "ప్రొఫైల్ని సవరించండి", - "account.endorse": "Feature on profile", + "account.endorse": "ప్రొఫైల్లో చూపించు", "account.follow": "అనుసరించు", "account.followers": "అనుచరులు", - "account.followers.empty": "No one follows this user yet.", + "account.followers.empty": "ఈ వినియోగదారుడిని ఇంకా ఎవరూ అనుసరించడంలేదు.", "account.follows": "అనుసరిస్తున్నవి", - "account.follows.empty": "This user doesn't follow anyone yet.", + "account.follows.empty": "ఈ వినియోగదారి ఇంకా ఎవరినీ అనుసరించడంలేదు.", "account.follows_you": "మిమ్మల్ని అనుసరిస్తున్నారు", "account.hide_reblogs": "@{name} నుంచి బూస్ట్ లను దాచిపెట్టు", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "మీడియా", "account.mention": "@{name}ను ప్రస్తావించు", "account.moved_to": "{name} ఇక్కడికి మారారు:", @@ -29,7 +30,7 @@ "account.show_reblogs": "@{name}నుంచి బూస్ట్ లను చూపించు", "account.unblock": "@{name}పై బ్లాక్ ను తొలగించు", "account.unblock_domain": "{domain}ను దాచవద్దు", - "account.unendorse": "Don't feature on profile", + "account.unendorse": "ప్రొఫైల్లో చూపించవద్దు", "account.unfollow": "అనుసరించవద్దు", "account.unmute": "@{name}పై మ్యూట్ ని తొలగించు", "account.unmute_notifications": "@{name} నుంచి ప్రకటనలపై మ్యూట్ ని తొలగించు", @@ -89,7 +90,7 @@ "confirmations.mute.confirm": "మ్యూట్ చేయి", "confirmations.mute.message": "{name}ను మీరు ఖచ్చితంగా మ్యూట్ చేయాలనుకుంటున్నారా?", "confirmations.redraft.confirm": "తొలగించు & తిరగరాయు", - "confirmations.redraft.message": "మీరు ఖచ్చితంగా ఈ స్టేటస్ ని తొలగించి తిరగరాయాలనుకుంటున్నారా? మీరు అన్ని ప్రత్యుత్తరాలను, బూస్ట్ లను మరియు ఇష్టపడినవి కోల్పోతారు.", + "confirmations.redraft.message": "మీరు ఖచ్చితంగా ఈ స్టేటస్ ని తొలగించి తిరగరాయాలనుకుంటున్నారా? ఈ స్టేటస్ యొక్క బూస్ట్ లు మరియు ఇష్టాలు పోతాయి,మరియు ప్రత్యుత్తరాలు అనాధలు అయిపోతాయి.", "confirmations.unfollow.confirm": "అనుసరించవద్దు", "confirmations.unfollow.message": "{name}ను మీరు ఖచ్చితంగా అనుసరించవద్దనుకుంటున్నారా?", "embed.instructions": "దిగువ కోడ్ను కాపీ చేయడం ద్వారా మీ వెబ్సైట్లో ఈ స్టేటస్ ని పొందుపరచండి.", @@ -108,19 +109,19 @@ "emoji_button.search_results": "శోధన ఫలితాలు", "emoji_button.symbols": "చిహ్నాలు", "emoji_button.travel": "ప్రయాణం & ప్రదేశాలు", - "empty_column.blocks": "You haven't blocked any users yet.", + "empty_column.blocks": "మీరు ఇంకా ఏ వినియోగదారులనూ బ్లాక్ చేయలేదు.", "empty_column.community": "స్థానిక కాలక్రమం ఖాళీగా ఉంది. మొదలుపెట్టడానికి బహిరంగంగా ఏదో ఒకటి వ్రాయండి!", "empty_column.direct": "మీకు ఇంకా ఏ ప్రత్యక్ష సందేశాలు లేవు. మీరు ఒకదాన్ని పంపినప్పుడు లేదా స్వీకరించినప్పుడు, అది ఇక్కడ చూపబడుతుంది.", - "empty_column.domain_blocks": "There are no hidden domains yet.", - "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", - "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.", - "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", + "empty_column.domain_blocks": "దాచబడిన డొమైన్లు ఇంకా ఏమీ లేవు.", + "empty_column.favourited_statuses": "మీకు ఇష్టపడిన టూట్లు ఇంకా ఎమీ లేవు. మీరు ఒకదానిని ఇష్టపడినప్పుడు, అది ఇక్కడ కనిపిస్తుంది.", + "empty_column.favourites": "ఈ టూట్ను ఇంకా ఎవరూ ఇష్టపడలేదు. ఎవరైనా అలా చేసినప్పుడు, అవి ఇక్కడ కనబడతాయి.", + "empty_column.follow_requests": "మీకు ఇంకా ఫాలో రిక్వెస్టులు ఏమీ రాలేదు. మీకు ఒకటి రాగానే, అది ఇక్కడ కనబడుతుంది.", "empty_column.hashtag": "ఇంకా హాష్ ట్యాగ్లో ఏమీ లేదు.", "empty_column.home": "మీ హోమ్ కాలక్రమం ఖాళీగా ఉంది! {Public} ను సందర్శించండి లేదా ఇతర వినియోగదారులను కలుసుకోవడానికి మరియు అన్వేషణ కోసం శోధనను ఉపయోగించండి.", "empty_column.home.public_timeline": "ప్రజా కాలక్రమం", "empty_column.list": "ఇంకా ఈ జాబితాలో ఏదీ లేదు. ఈ జాబితాలోని సభ్యులు కొత్త స్టేటస్ లను పోస్ట్ చేసినప్పుడు, అవి ఇక్కడ కనిపిస్తాయి.", - "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", - "empty_column.mutes": "You haven't muted any users yet.", + "empty_column.lists": "మీకు ఇంకా జాబితాలు ఏమీ లేవు. మీరు ఒకటి సృష్టించగానే, అది ఇక్కడ కనబడుతుంది.", + "empty_column.mutes": "మీరు ఇంకా ఏ వినియోగదారులనూ మ్యూట్ చేయలేదు.", "empty_column.notifications": "మీకు ఇంకా ఏ నోటిఫికేషన్లు లేవు. సంభాషణను ప్రారంభించడానికి ఇతరులతో ప్రతిస్పందించండి.", "empty_column.public": "ఇక్కడ ఏమీ లేదు! దీన్ని నింపడానికి బహిరంగంగా ఏదైనా వ్రాయండి, లేదా ఇతర దృష్టాంతాల్లోని వినియోగదారులను అనుసరించండి", "follow_request.authorize": "అనుమతించు", @@ -137,32 +138,32 @@ "home.column_settings.show_reblogs": "బూస్ట్ లను చూపించు", "home.column_settings.show_replies": "ప్రత్యుత్తరాలను చూపించు", "keyboard_shortcuts.back": "వెనక్కి తిరిగి వెళ్ళడానికి", - "keyboard_shortcuts.blocked": "to open blocked users list", + "keyboard_shortcuts.blocked": "బ్లాక్ చేయబడిన వినియోగదారుల జాబితాను తెరవడానికి", "keyboard_shortcuts.boost": "బూస్ట్ చేయడానికి", "keyboard_shortcuts.column": "నిలువు వరుసలలో ఒకదానిపై దృష్టి పెట్టడానికి", "keyboard_shortcuts.compose": "కంపోజ్ టెక్స్ట్ఏరియా పై దృష్టి పెట్టడానికి", "keyboard_shortcuts.description": "Description", - "keyboard_shortcuts.direct": "to open direct messages column", + "keyboard_shortcuts.direct": "నేరుగా పంపిన సందేశాల నిలువు వరుసను తెరువడానికి", "keyboard_shortcuts.down": "జాబితాలో క్రిందికి వెళ్ళడానికి", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.favourite": "ఇష్టపడడానికి", - "keyboard_shortcuts.favourites": "to open favourites list", - "keyboard_shortcuts.federated": "to open federated timeline", + "keyboard_shortcuts.favourites": "ఇష్టాల జాబితాను తెరవడానికి", + "keyboard_shortcuts.federated": "సమాఖ్య కాలక్రమాన్ని తెరవడానికి", "keyboard_shortcuts.heading": "కీబోర్డ్ సత్వరమార్గాలు", - "keyboard_shortcuts.home": "to open home timeline", + "keyboard_shortcuts.home": "హోమ్ కాలక్రమాన్ని తెరవడానికి", "keyboard_shortcuts.hotkey": "హాట్ కీ", "keyboard_shortcuts.legend": "ఈ లెజెండ్ ప్రదర్శించడానికి", - "keyboard_shortcuts.local": "to open local timeline", + "keyboard_shortcuts.local": "లోకల్ కాలక్రమాన్ని తెరవడానికి", "keyboard_shortcuts.mention": "రచయితను ప్రస్తావించడానికి", - "keyboard_shortcuts.muted": "to open muted users list", - "keyboard_shortcuts.my_profile": "to open your profile", - "keyboard_shortcuts.notifications": "to open notifications column", - "keyboard_shortcuts.pinned": "to open pinned toots list", + "keyboard_shortcuts.muted": "మ్యూట్ చేయబడిన వినియోగదారుల జాబితాను తెరవడానికి", + "keyboard_shortcuts.my_profile": "మీ ప్రొఫైల్ను తెరవడానికి", + "keyboard_shortcuts.notifications": "నోటిఫికేషన్ల నిలువు వరుసను తెరవడానికి", + "keyboard_shortcuts.pinned": "అతికించబడిన టూట్ల జాబితాను తెరవడానికి", "keyboard_shortcuts.profile": "రచయిత ప్రొఫైల్ ను తెరవాలంటే", "keyboard_shortcuts.reply": "ప్రత్యుత్తరం ఇవ్వడానికి", - "keyboard_shortcuts.requests": "to open follow requests list", + "keyboard_shortcuts.requests": "ఫాలో రిక్వెస్ట్ల జాబితాను తెరవడానికి", "keyboard_shortcuts.search": "శోధనపై దృష్టి పెట్టండి", - "keyboard_shortcuts.start": "to open \"get started\" column", + "keyboard_shortcuts.start": "\"ఇక్కడ ప్రారంభించండి\" నిలువు వరుసను తెరవడానికి", "keyboard_shortcuts.toggle_hidden": "CW వెనుక ఉన్న పాఠ్యాన్ని చూపడానికి / దాచడానికి", "keyboard_shortcuts.toot": "ఒక సరికొత్త టూట్ను ప్రారంభించడానికి", "keyboard_shortcuts.unfocus": "పాఠ్యం వ్రాసే ఏరియా/శోధన పట్టిక నుండి బయటకు రావడానికి", @@ -183,10 +184,10 @@ "missing_indicator.label": "దొరకలేదు", "missing_indicator.sublabel": "ఈ వనరు కనుగొనబడలేదు", "mute_modal.hide_notifications": "ఈ వినియోగదారు నుండి నోటిఫికేషన్లను దాచాలా?", - "navigation_bar.apps": "Mobile apps", + "navigation_bar.apps": "మొబైల్ ఆప్ లు", "navigation_bar.blocks": "బ్లాక్ చేయబడిన వినియోగదారులు", "navigation_bar.community_timeline": "స్థానిక కాలక్రమం", - "navigation_bar.compose": "Compose new toot", + "navigation_bar.compose": "కొత్త టూట్ను రాయండి", "navigation_bar.direct": "ప్రత్యక్ష సందేశాలు", "navigation_bar.discover": "కనుగొను", "navigation_bar.domain_blocks": "దాచిన డొమైన్లు", @@ -280,7 +281,7 @@ "status.cancel_reblog_private": "బూస్ట్ను తొలగించు", "status.cannot_reblog": "ఈ పోస్ట్ను బూస్ట్ చేయడం సాధ్యం కాదు", "status.delete": "తొలగించు", - "status.detailed_status": "Detailed conversation view", + "status.detailed_status": "వివరణాత్మక సంభాషణ వీక్షణ", "status.direct": "@{name}కు నేరుగా సందేశం పంపు", "status.embed": "ఎంబెడ్", "status.favourite": "ఇష్టపడు", @@ -297,7 +298,7 @@ "status.reblog": "బూస్ట్", "status.reblog_private": "అసలు ప్రేక్షకులకు బూస్ట్ చేయి", "status.reblogged_by": "{name} బూస్ట్ చేసారు", - "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.", + "status.reblogs.empty": "ఈ టూట్ను ఇంకా ఎవరూ బూస్ట్ చేయలేదు. ఎవరైనా చేసినప్పుడు, అవి ఇక్కడ కనబడతాయి.", "status.redraft": "తొలగించు & తిరగరాయు", "status.reply": "ప్రత్యుత్తరం", "status.replyAll": "సంభాషణకు ప్రత్యుత్తరం ఇవ్వండి", @@ -319,7 +320,7 @@ "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} మాట్లాడుతున్నారు", "ui.beforeunload": "మీరు మాస్టొడొన్ను వదిలివేస్తే మీ డ్రాఫ్ట్లు పోతాయి.", "upload_area.title": "అప్లోడ్ చేయడానికి డ్రాగ్ & డ్రాప్ చేయండి", - "upload_button.label": "మీడియాను జోడించండి", + "upload_button.label": "మీడియాను జోడించండి (JPEG, PNG, GIF, WebM, MP4, MOV)", "upload_form.description": "దృష్టి లోపమున్న వారి కోసం వివరించండి", "upload_form.focus": "కత్తిరించు", "upload_form.undo": "తొలగించు", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 5340fda92..2af5bfca1 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -15,6 +15,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Follows you", "account.hide_reblogs": "Hide boosts from @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Media", "account.mention": "Mention @{name}", "account.moved_to": "{name} has moved to:", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index cec07b87e..68dc37e6b 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -15,6 +15,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Seni takip ediyor", "account.hide_reblogs": "Hide boosts from @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Media", "account.mention": "Bahset @{name}", "account.moved_to": "{name} has moved to:", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 9a2c18e36..5517abdf8 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -15,6 +15,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Підписаний(-а) на Вас", "account.hide_reblogs": "Сховати передмухи від @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Медіа", "account.mention": "Згадати @{name}", "account.moved_to": "{name} переїхав на:", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index cf2e1a640..254beab42 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -15,6 +15,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "关注了你", "account.hide_reblogs": "隐藏来自 @{name} 的转嘟", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "媒体", "account.mention": "提及 @{name}", "account.moved_to": "{name} 已经迁移到:", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index dbad69191..ce141a8a7 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -15,6 +15,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "關注你", "account.hide_reblogs": "隱藏 @{name} 的轉推", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "媒體", "account.mention": "提及 @{name}", "account.moved_to": "{name} 已經遷移到:", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 4e437f0e0..fe4a81170 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -10,11 +10,12 @@ "account.endorse": "在個人資訊頁面上推薦對方", "account.follow": "關注", "account.followers": "關注者", - "account.followers.empty": "還沒有人關注這個使用者", + "account.followers.empty": "還沒有人關注這個使用者。", "account.follows": "正在關注", - "account.follows.empty": "這個使用者還沒有關注任何人", + "account.follows.empty": "這個使用者還沒有關注任何人。", "account.follows_you": "關注你", "account.hide_reblogs": "隱藏來自 @{name} 的轉推", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "媒體", "account.mention": "提到 @{name}", "account.moved_to": "{name} 已經移至:", @@ -89,7 +90,7 @@ "confirmations.mute.confirm": "消音", "confirmations.mute.message": "你確定要消音 {name} ?", "confirmations.redraft.confirm": "刪除 & 編輯", - "confirmations.redraft.message": "你確定要刪除這條嘟文並重新編輯它嗎? 所有相關的回覆、轉嘟與最愛都會被刪除。", + "confirmations.redraft.message": "你確定要刪除這條嘟文並重新編輯它嗎?所有相關的轉嘟與最愛都會被刪除,而對原始嘟文的回覆將會變成孤兒。", "confirmations.unfollow.confirm": "取消關注", "confirmations.unfollow.message": "真的不要繼續關注 {name} 了嗎?", "embed.instructions": "要內嵌此嘟文,請將以下代碼貼進你的網站。", @@ -183,7 +184,7 @@ "missing_indicator.label": "找不到", "missing_indicator.sublabel": "找不到此資源", "mute_modal.hide_notifications": "隱藏來自這個使用者的通知?", - "navigation_bar.apps": "Mobile apps", + "navigation_bar.apps": "行動應用程式", "navigation_bar.blocks": "封鎖的使用者", "navigation_bar.community_timeline": "本地時間軸", "navigation_bar.compose": "寫新的嘟文", @@ -284,7 +285,7 @@ "status.direct": "發送私訊給 @{name}", "status.embed": "嵌入", "status.favourite": "最愛", - "status.filtered": "Filtered", + "status.filtered": "已過濾", "status.load_more": "載入更多", "status.media_hidden": "隱藏媒體內容", "status.mention": "提到 @{name}", @@ -319,7 +320,7 @@ "trends.count_by_accounts": "{count} 位使用者在討論", "ui.beforeunload": "如果離開 Mastodon,你的草稿將會不見。", "upload_area.title": "拖放來上傳", - "upload_button.label": "上傳媒體檔案", + "upload_button.label": "上傳媒體檔案 (JPEG, PNG, GIF, WebM, MP4, MOV)", "upload_form.description": "為視障人士增加文字說明", "upload_form.focus": "裁切", "upload_form.undo": "刪除", diff --git a/app/javascript/mastodon/reducers/dropdown_menu.js b/app/javascript/mastodon/reducers/dropdown_menu.js index 5449884cc..36fd4f132 100644 --- a/app/javascript/mastodon/reducers/dropdown_menu.js +++ b/app/javascript/mastodon/reducers/dropdown_menu.js @@ -4,12 +4,12 @@ import { DROPDOWN_MENU_CLOSE, } from '../actions/dropdown_menu'; -const initialState = Immutable.Map({ openId: null, placement: null }); +const initialState = Immutable.Map({ openId: null, placement: null, keyboard: false }); export default function dropdownMenu(state = initialState, action) { switch (action.type) { case DROPDOWN_MENU_OPEN: - return state.merge({ openId: action.id, placement: action.placement }); + return state.merge({ openId: action.id, placement: action.placement, keyboard: action.keyboard }); case DROPDOWN_MENU_CLOSE: return state.get('openId') === action.id ? state.set('openId', null) : state; default: diff --git a/app/javascript/packs/public.js b/app/javascript/packs/public.js index 1cb491e17..a62974ec0 100644 --- a/app/javascript/packs/public.js +++ b/app/javascript/packs/public.js @@ -52,6 +52,7 @@ function main() { }); const reactComponents = document.querySelectorAll('[data-component]'); + if (reactComponents.length > 0) { import(/* webpackChunkName: "containers/media_container" */ '../mastodon/containers/media_container') .then(({ default: MediaContainer }) => { @@ -64,6 +65,7 @@ function main() { } const parallaxComponents = document.querySelectorAll('.parallax'); + if (parallaxComponents.length > 0 ) { new Rellax('.parallax', { speed: -1 }); } @@ -71,6 +73,7 @@ function main() { const history = createHistory(); const detailedStatuses = document.querySelectorAll('.public-layout .detailed-status'); const location = history.location; + if (detailedStatuses.length === 1 && (!location.state || !location.state.scrolledToDetailedStatus)) { detailedStatuses[0].scrollIntoView(); history.replace(location.pathname, { ...location.state, scrolledToDetailedStatus: true }); diff --git a/app/javascript/styles/mastodon/accessibility.scss b/app/javascript/styles/mastodon/accessibility.scss index 373bcd4ac..d33806c84 100644 --- a/app/javascript/styles/mastodon/accessibility.scss +++ b/app/javascript/styles/mastodon/accessibility.scss @@ -1,4 +1,4 @@ -$black-emojis: '8ball' 'ant' 'back' 'black_circle' 'black_large_square' 'black_medium_small_square' 'black_medium_square' 'black_nib' 'black_small_square' 'bomb' 'bust_in_silhouette' 'camera' 'camera_with_flash' 'clubs' 'copyright' 'curly_loop' 'currency_exchange' 'end' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign' 'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'lower_left_fountain_pen' 'on' 'registered' 'soon' 'spades' 'spider' 'tm' 'top' 'waving_black_flag' 'wavy_dash' 'video_game'; +$black-emojis: '8ball' 'ant' 'back' 'black_circle' 'black_heart' 'black_large_square' 'black_medium_small_square' 'black_medium_square' 'black_nib' 'black_small_square' 'bomb' 'bowling' 'bust_in_silhouette' 'busts_in_silhouette' 'camera' 'camera_with_flash' 'clubs' 'copyright' 'curly_loop' 'currency_exchange' 'dark_sunglasses' 'eight_pointed_black_star' 'electric_plug' 'end' 'female-guard' 'film_projector' 'fried_egg' 'gorilla' 'guardsman' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign' 'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'hocho' 'hole' 'joystick' 'kaaba' 'lower_left_ballpoint_pen' 'lower_left_fountain_pen' 'male-guard' 'microphone' 'mortar_board' 'movie_camera' 'musical_score' 'on' 'registered' 'soon' 'spades' 'speaking_head_in_silhouette' 'spider' 'telephone_receiver' 'tm' 'top' 'tophat' 'turkey' 'vhs' 'video_camera' 'video_game' 'water_buffalo' 'waving_black_flag' 'wavy_dash'; %white-emoji-outline { filter: drop-shadow(1px 1px 0 $white) drop-shadow(-1px 1px 0 $white) drop-shadow(1px -1px 0 $white) drop-shadow(-1px -1px 0 $white); diff --git a/app/javascript/styles/mastodon/accounts.scss b/app/javascript/styles/mastodon/accounts.scss index c27bc0df3..06effbdb2 100644 --- a/app/javascript/styles/mastodon/accounts.scss +++ b/app/javascript/styles/mastodon/accounts.scss @@ -265,6 +265,20 @@ } } + .verified { + border: 1px solid rgba($valid-value-color, 0.5); + background: rgba($valid-value-color, 0.25); + + a { + color: $valid-value-color; + font-weight: 500; + } + + &__mark { + color: $valid-value-color; + } + } + dl:last-child { border-bottom: 0; } diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss index 42f507296..9dfd89dc2 100644 --- a/app/javascript/styles/mastodon/admin.scss +++ b/app/javascript/styles/mastodon/admin.scss @@ -1,3 +1,5 @@ +$no-columns-breakpoint: 600px; + .admin-wrapper { display: flex; justify-content: center; @@ -24,12 +26,22 @@ height: 100px; } + @media screen and (max-width: $no-columns-breakpoint) { + & > a:first-child { + display: none; + } + } + ul { list-style: none; border-radius: 4px 0 0 4px; overflow: hidden; margin-bottom: 20px; + @media screen and (max-width: $no-columns-breakpoint) { + margin-bottom: 0; + } + a { display: block; padding: 15px; @@ -62,20 +74,24 @@ a { border: 0; padding: 15px 35px; + } + } - &.selected { - color: $primary-text-color; - background-color: $ui-highlight-color; - border-bottom: 0; - border-radius: 0; + .simple-navigation-active-leaf a { + color: $primary-text-color; + background-color: $ui-highlight-color; + border-bottom: 0; + border-radius: 0; - &:hover { - background-color: lighten($ui-highlight-color, 5%); - } - } + &:hover { + background-color: lighten($ui-highlight-color, 5%); } } } + + & > ul > .simple-navigation-active-leaf a { + border-radius: 4px 0 0 4px; + } } .content-wrapper { @@ -89,11 +105,19 @@ padding-top: 60px; padding-left: 25px; + @media screen and (max-width: $no-columns-breakpoint) { + max-width: none; + padding: 15px; + padding-top: 30px; + } + h2 { color: $secondary-text-color; font-size: 24px; line-height: 28px; font-weight: 400; + padding-bottom: 40px; + border-bottom: 1px solid lighten($ui-base-color, 8%); margin-bottom: 40px; } @@ -108,7 +132,7 @@ h4 { text-transform: uppercase; font-size: 13px; - font-weight: 500; + font-weight: 700; color: $darker-text-color; padding-bottom: 8px; margin-bottom: 8px; @@ -122,6 +146,11 @@ font-weight: 400; } + .fields-group h6 { + color: $primary-text-color; + font-weight: 500; + } + & > p { font-size: 14px; line-height: 18px; @@ -172,30 +201,7 @@ } } - .simple_form { - max-width: 400px; - - &.edit_user, - &.new_form_admin_settings, - &.new_form_two_factor_confirmation, - &.new_form_delete_confirmation, - &.new_import, - &.new_domain_block, - &.edit_domain_block { - max-width: none; - } - - .form_two_factor_confirmation_code, - .form_delete_confirmation_password { - max-width: 400px; - } - - .actions { - max-width: 400px; - } - } - - @media screen and (max-width: 600px) { + @media screen and (max-width: $no-columns-breakpoint) { display: block; overflow-y: auto; -webkit-overflow-scrolling: touch; @@ -209,16 +215,8 @@ .sidebar { width: 100%; - padding: 10px 0; + padding: 0; height: auto; - - .logo { - margin: 20px auto; - } - } - - .content { - padding-top: 20px; } } } @@ -567,3 +565,102 @@ a.name-tag, color: $dark-text-color; } } + +.report-card { + background: $ui-base-color; + border-radius: 4px; + margin-bottom: 20px; + + &__profile { + display: flex; + justify-content: space-between; + align-items: center; + padding: 15px; + + .account { + padding: 0; + border: 0; + + &__avatar-wrapper { + margin-left: 0; + } + } + + &__stats { + flex: 0 0 auto; + font-weight: 500; + color: $darker-text-color; + text-transform: uppercase; + text-align: right; + + a { + color: inherit; + text-decoration: none; + + &:focus, + &:hover, + &:active { + color: lighten($darker-text-color, 8%); + } + } + + .red { + color: $error-value-color; + } + } + } + + &__summary { + &__item { + display: flex; + justify-content: flex-start; + border-top: 1px solid darken($ui-base-color, 4%); + + &:hover { + background: lighten($ui-base-color, 2%); + } + + &__reported-by, + &__assigned { + padding: 15px; + flex: 0 0 auto; + box-sizing: border-box; + width: 150px; + color: $darker-text-color; + + &, + .username { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + } + + &__content { + flex: 1 1 auto; + max-width: calc(100% - 300px); + + &__icon { + color: $dark-text-color; + margin-right: 4px; + font-weight: 500; + } + } + + &__content a { + display: block; + box-sizing: border-box; + width: 100%; + padding: 15px; + text-decoration: none; + color: $darker-text-color; + } + } + } +} + +.one-line { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} diff --git a/app/javascript/styles/mastodon/basics.scss b/app/javascript/styles/mastodon/basics.scss index 7a6a1c490..3bbb31e6e 100644 --- a/app/javascript/styles/mastodon/basics.scss +++ b/app/javascript/styles/mastodon/basics.scss @@ -1,3 +1,10 @@ +@function hex-color($color) { + @if type-of($color) == 'color' { + $color: str-slice(ie-hex-str($color), 4); + } + @return '%23' + unquote($color) +} + body { font-family: 'mastodon-font-sans-serif', sans-serif; background: darken($ui-base-color, 8%); diff --git a/app/javascript/styles/mastodon/boost.scss b/app/javascript/styles/mastodon/boost.scss index 8e11cb596..5a6d6ae40 100644 --- a/app/javascript/styles/mastodon/boost.scss +++ b/app/javascript/styles/mastodon/boost.scss @@ -1,10 +1,3 @@ -@function hex-color($color) { - @if type-of($color) == 'color' { - $color: str-slice(ie-hex-str($color), 4); - } - @return '%23' + unquote($color) -} - button.icon-button i.fa-retweet { background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='22' height='209'><path d='M4.97 3.16c-.1.03-.17.1-.22.18L.8 8.24c-.2.3.03.78.4.8H3.6v2.68c0 4.26-.55 3.62 3.66 3.62h7.66l-2.3-2.84c-.03-.02-.03-.04-.05-.06H7.27c-.44 0-.72-.3-.72-.72v-2.7h2.5c.37.03.63-.48.4-.77L5.5 3.35c-.12-.17-.34-.25-.53-.2zm12.16.43c-.55-.02-1.32.02-2.4.02H7.1l2.32 2.85.03.06h5.25c.42 0 .72.28.72.72v2.7h-2.5c-.36.02-.56.54-.3.8l3.92 4.9c.18.25.6.25.78 0l3.94-4.9c.26-.28 0-.83-.37-.8H18.4v-2.7c0-3.15.4-3.62-1.25-3.66z' fill='#{hex-color($action-button-color)}' stroke-width='0'/><path d='M7.78 19.66c-.24.02-.44.25-.44.5v2.46h-.06c-1.08 0-1.86-.03-2.4-.03-1.64 0-1.25.43-1.25 3.65v4.47c0 4.26-.56 3.62 3.65 3.62H8.5l-1.3-1.06c-.1-.08-.18-.2-.2-.3-.02-.17.06-.35.2-.45l1.33-1.1H7.28c-.44 0-.72-.3-.72-.7v-4.48c0-.44.28-.72.72-.72h.06v2.5c0 .38.54.63.82.38l4.9-3.93c.25-.18.25-.6 0-.78l-4.9-3.92c-.1-.1-.24-.14-.38-.12zm9.34 2.93c-.54-.02-1.3.02-2.4.02h-1.25l1.3 1.07c.1.07.18.2.2.33.02.16-.06.3-.2.4l-1.33 1.1h1.28c.42 0 .72.28.72.72v4.47c0 .42-.3.72-.72.72h-.1v-2.47c0-.3-.3-.53-.6-.47-.07 0-.14.05-.2.1l-4.9 3.93c-.26.18-.26.6 0 .78l4.9 3.92c.27.25.82 0 .8-.38v-2.5h.1c4.27 0 3.65.67 3.65-3.62v-4.47c0-3.15.4-3.62-1.25-3.66zM10.34 38.66c-.24.02-.44.25-.43.5v2.47H7.3c-1.08 0-1.86-.04-2.4-.04-1.64 0-1.25.43-1.25 3.65v4.47c0 3.66-.23 3.7 2.34 3.66l-1.34-1.1c-.1-.08-.18-.2-.2-.3 0-.17.07-.35.2-.45l1.96-1.6c-.03-.06-.04-.13-.04-.2v-4.48c0-.44.28-.72.72-.72H9.9v2.5c0 .36.5.6.8.38l4.93-3.93c.24-.18.24-.6 0-.78l-4.94-3.92c-.1-.08-.23-.13-.36-.12zm5.63 2.93l1.34 1.1c.1.07.18.2.2.33.02.16-.03.3-.16.4l-1.96 1.6c.02.07.06.13.06.22v4.47c0 .42-.3.72-.72.72h-2.66v-2.47c0-.3-.3-.53-.6-.47-.06.02-.12.05-.18.1l-4.94 3.93c-.24.18-.24.6 0 .78l4.94 3.92c.28.22.78-.02.78-.38v-2.5h2.66c4.27 0 3.65.67 3.65-3.62v-4.47c0-3.66.34-3.7-2.4-3.66zM13.06 57.66c-.23.03-.4.26-.4.5v2.47H7.28c-1.08 0-1.86-.04-2.4-.04-1.64 0-1.25.43-1.25 3.65v4.87l2.93-2.37v-2.5c0-.44.28-.72.72-.72h5.38v2.5c0 .36.5.6.78.38l4.94-3.93c.24-.18.24-.6 0-.78l-4.94-3.92c-.1-.1-.24-.14-.38-.12zm5.3 6.15l-2.92 2.4v2.52c0 .42-.3.72-.72.72h-5.4v-2.47c0-.3-.32-.53-.6-.47-.07.02-.13.05-.2.1L3.6 70.52c-.25.18-.25.6 0 .78l4.93 3.92c.28.22.78-.02.78-.38v-2.5h5.42c4.27 0 3.65.67 3.65-3.62v-4.47-.44zM19.25 78.8c-.1.03-.2.1-.28.17l-.9.9c-.44-.3-1.36-.25-3.35-.25H7.28c-1.08 0-1.86-.03-2.4-.03-1.64 0-1.25.43-1.25 3.65v.7l2.93.3v-1c0-.44.28-.72.72-.72h7.44c.2 0 .37.08.5.2l-1.8 1.8c-.25.26-.08.76.27.8l6.27.7c.28.03.56-.25.53-.53l-.7-6.25c0-.27-.3-.48-.55-.44zm-17.2 6.1c-.2.07-.36.3-.33.54l.7 6.25c.02.36.58.55.83.27l.8-.8c.02 0 .04-.02.04 0 .46.24 1.37.17 3.18.17h7.44c4.27 0 3.65.67 3.65-3.62v-.75l-2.93-.3v1.05c0 .42-.3.72-.72.72H7.28c-.15 0-.3-.03-.4-.1L8.8 86.4c.3-.24.1-.8-.27-.84l-6.28-.65h-.2zM4.88 98.6c-1.33 0-1.34.48-1.3 2.3l1.14-1.37c.08-.1.22-.17.34-.2.16 0 .34.08.44.2l1.66 2.03c.04 0 .07-.03.12-.03h7.44c.34 0 .57.2.65.5h-2.43c-.34.05-.53.52-.3.78l3.92 4.95c.18.24.6.24.78 0l3.94-4.94c.22-.27-.02-.76-.37-.77H18.4c.02-3.9.6-3.4-3.66-3.4H7.28c-1.08 0-1.86-.04-2.4-.04zm.15 2.46c-.1.03-.2.1-.28.2l-3.94 4.9c-.2.28.03.77.4.78H3.6c-.02 3.94-.45 3.4 3.66 3.4h7.44c3.65 0 3.74.3 3.7-2.25l-1.1 1.34c-.1.1-.2.17-.32.2-.16 0-.34-.08-.44-.2l-1.65-2.03c-.06.02-.1.04-.18.04H7.28c-.35 0-.57-.2-.66-.5h2.44c.37 0 .63-.5.4-.78l-3.96-4.9c-.1-.15-.3-.23-.47-.2zM4.88 117.6c-1.16 0-1.3.3-1.3 1.56l1.14-1.38c.08-.1.22-.14.34-.16.16 0 .34.04.44.16l2.22 2.75h7c.42 0 .72.28.72.72v.53h-2.6c-.3.1-.43.54-.2.78l3.92 4.9c.18.25.6.25.78 0l3.94-4.9c.22-.28-.02-.77-.37-.78H18.4v-.53c0-4.2.72-3.63-3.66-3.63H7.28c-1.08 0-1.86-.03-2.4-.03zm.1 1.74c-.1.03-.17.1-.23.16L.8 124.44c-.2.28.03.77.4.78H3.6v.5c0 4.26-.55 3.62 3.66 3.62h7.44c1.03 0 1.74.02 2.28 0-.16.02-.34-.03-.44-.15l-2.22-2.76H7.28c-.44 0-.72-.3-.72-.72v-.5h2.5c.37.02.63-.5.4-.78L5.5 119.5c-.12-.15-.34-.22-.53-.16zm12.02 10c1.2-.02 1.4-.25 1.4-1.53l-1.1 1.36c-.07.1-.17.17-.3.18zM5.94 136.6l2.37 2.93h6.42c.42 0 .72.28.72.72v1.25h-2.6c-.3.1-.43.54-.2.78l3.92 4.9c.18.25.6.25.78 0l3.94-4.9c.22-.28-.02-.77-.37-.78H18.4v-1.25c0-4.2.72-3.63-3.66-3.63H7.28c-.6 0-.92-.02-1.34-.03zm-1.72.06c-.4.08-.54.3-.6.75l.6-.74zm.84.93c-.12 0-.24.08-.3.18l-3.95 4.9c-.24.3 0 .83.4.82H3.6v1.22c0 4.26-.55 3.62 3.66 3.62h7.44c.63 0 .97.02 1.4.03l-2.37-2.93H7.28c-.44 0-.72-.3-.72-.72v-1.22h2.5c.4.04.67-.53.4-.8l-3.96-4.92c-.1-.13-.27-.2-.44-.2zm13.28 10.03l-.56.7c.36-.07.5-.3.56-.7zM17.13 155.6c-.55-.02-1.32.03-2.4.03h-8.2l2.38 2.9h5.82c.42 0 .72.28.72.72v1.97H12.9c-.32.06-.48.52-.28.78l3.94 4.94c.2.23.6.22.78-.03l3.94-4.9c.22-.28-.02-.77-.37-.78H18.4v-1.97c0-3.15.4-3.62-1.25-3.66zm-12.1.28c-.1.02-.2.1-.28.18l-3.94 4.9c-.2.3.03.78.4.8H3.6v1.96c0 4.26-.55 3.62 3.66 3.62h8.24l-2.36-2.9H7.28c-.44 0-.72-.3-.72-.72v-1.97h2.5c.37.02.63-.5.4-.78l-3.96-4.9c-.1-.15-.3-.22-.47-.2zM5.13 174.5c-.15 0-.3.07-.38.2L.8 179.6c-.24.27 0 .82.4.8H3.6v2.32c0 4.26-.55 3.62 3.66 3.62h7.94l-2.35-2.9h-5.6c-.43 0-.7-.3-.7-.72v-2.3h2.5c.38.03.66-.54.4-.83l-3.97-4.9c-.1-.13-.23-.2-.38-.2zm12 .1c-.55-.02-1.32.03-2.4.03H6.83l2.35 2.9h5.52c.42 0 .72.28.72.72v2.34h-2.6c-.3.1-.43.53-.2.78l3.92 4.9c.18.24.6.24.78 0l3.94-4.9c.22-.3-.02-.78-.37-.8H18.4v-2.33c0-3.15.4-3.62-1.25-3.66zM4.97 193.16c-.1.03-.17.1-.22.18l-3.94 4.9c-.2.3.03.78.4.8H3.6v2.68c0 4.26-.55 3.62 3.66 3.62h7.66l-2.3-2.84c-.03-.02-.03-.04-.05-.06H7.27c-.44 0-.72-.3-.72-.72v-2.7h2.5c.37.03.63-.48.4-.77l-3.96-4.9c-.12-.17-.34-.25-.53-.2zm12.16.43c-.55-.02-1.32.03-2.4.03H7.1l2.32 2.84.03.06h5.25c.42 0 .72.28.72.72v2.7h-2.5c-.36.02-.56.54-.3.8l3.92 4.9c.18.25.6.25.78 0l3.94-4.9c.26-.28 0-.83-.37-.8H18.4v-2.7c0-3.15.4-3.62-1.25-3.66z' fill='#{hex-color($highlight-text-color)}' stroke-width='0'/></svg>"); diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 359b2b6a7..490e26ccc 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -1297,6 +1297,11 @@ a .account__avatar { flex: 0 1 100%; border-right: 1px solid lighten($ui-base-color, 8%); padding: 10px 0; + border-bottom: 4px solid transparent; + + &.active { + border-bottom: 4px solid $ui-highlight-color; + } & > span { display: block; @@ -1666,14 +1671,14 @@ a.account__display-name { &.top { bottom: -5px; - margin-left: -13px; + margin-left: -7px; border-width: 5px 7px 0; border-top-color: $ui-secondary-color; } &.bottom { top: -5px; - margin-left: -13px; + margin-left: -7px; border-width: 0 7px 5px; border-bottom-color: $ui-secondary-color; } @@ -5358,9 +5363,11 @@ noscript { overflow: hidden; margin: 20px -10px -20px; border-bottom: 0; + border-top: 0; dl { - border-top: 1px solid lighten($ui-base-color, 8%); + border-top: 1px solid lighten($ui-base-color, 4%); + border-bottom: 0; display: flex; } @@ -5387,6 +5394,11 @@ noscript { flex: 1 1 auto; color: $primary-text-color; background: $ui-base-color; + + &.verified { + border: 1px solid rgba($valid-value-color, 0.5); + background: rgba($valid-value-color, 0.25); + } } } diff --git a/app/javascript/styles/mastodon/containers.scss b/app/javascript/styles/mastodon/containers.scss index 2c2ce5d3b..47582f323 100644 --- a/app/javascript/styles/mastodon/containers.scss +++ b/app/javascript/styles/mastodon/containers.scss @@ -718,6 +718,14 @@ a { color: lighten($ui-highlight-color, 8%); } + + dl:first-child .verified { + border-radius: 0 4px 0 0; + } + + .verified a { + color: $valid-value-color; + } } .account__header__content { diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss index 144b4a519..cbd3de94c 100644 --- a/app/javascript/styles/mastodon/forms.scss +++ b/app/javascript/styles/mastodon/forms.scss @@ -1,3 +1,5 @@ +$no-columns-breakpoint: 600px; + code { font-family: 'mastodon-font-monospace', monospace; font-weight: 400; @@ -13,6 +15,60 @@ code { .input { margin-bottom: 15px; overflow: hidden; + + &.hidden { + margin: 0; + } + + &.radio_buttons { + .radio { + margin-bottom: 15px; + + &:last-child { + margin-bottom: 0; + } + } + + .radio > label { + position: relative; + padding-left: 28px; + + input { + position: absolute; + top: -2px; + left: 0; + } + } + } + + &.boolean { + position: relative; + margin-bottom: 0; + + .label_input > label { + font-family: inherit; + font-size: 14px; + padding-top: 5px; + color: $primary-text-color; + display: block; + width: auto; + } + + .label_input, + .hint { + padding-left: 28px; + } + + .label_input__wrapper { + position: static; + } + + label.checkbox { + position: absolute; + top: 2px; + left: 0; + } + } } .row { @@ -27,9 +83,22 @@ code { } } + .hint { + color: $darker-text-color; + + a { + color: $highlight-text-color; + } + + code { + border-radius: 3px; + padding: 0.2em 0.4em; + background: darken($ui-base-color, 12%); + } + } + span.hint { display: block; - color: $darker-text-color; font-size: 12px; margin-top: 4px; } @@ -44,17 +113,6 @@ code { line-height: 18px; margin-top: 15px; margin-bottom: 0; - color: $darker-text-color; - - a { - color: $highlight-text-color; - } - } - - code { - border-radius: 3px; - padding: 0.2em 0.4em; - background: darken($ui-base-color, 12%); } } @@ -72,87 +130,60 @@ code { } } - .label_input { - display: flex; + .input.with_floating_label { + .label_input { + display: flex; - label { - flex: 0 0 auto; + & > label { + font-family: inherit; + font-size: 14px; + color: $primary-text-color; + font-weight: 500; + min-width: 150px; + flex: 0 0 auto; + } + + input, + select { + flex: 1 1 auto; + } } - input { - flex: 1 1 auto; + &.select .hint { + margin-top: 6px; + margin-left: 150px; } } .input.with_label { - padding: 15px 0; - margin-bottom: 0; - - .label_input { - flex-wrap: wrap; - align-items: flex-start; - } - - &.file .label_input { - flex-wrap: nowrap; - } - - &.select .label_input { - align-items: initial; - } - .label_input > label { font-family: inherit; - font-size: 16px; + font-size: 14px; color: $primary-text-color; display: block; - padding-top: 5px; - margin-bottom: 5px; - flex: 1; - min-width: 150px; + margin-bottom: 8px; word-wrap: break-word; + font-weight: 500; + } - &.select { - flex: 0; - } - - & ~ * { - margin-left: 10px; - } + .hint { + margin-top: 6px; } ul { flex: 390px; } - - &.boolean { - padding: initial; - margin-bottom: initial; - - .label_input > label { - font-family: inherit; - font-size: 14px; - color: $primary-text-color; - display: block; - width: auto; - } - - label.checkbox { - position: relative; - padding-left: 25px; - flex: 1 1 auto; - } - } } .input.with_block_label { - padding-top: 15px; + max-width: none; & > label { font-family: inherit; font-size: 16px; color: $primary-text-color; display: block; + font-weight: 500; padding-top: 5px; } @@ -165,49 +196,70 @@ code { } } + .required abbr { + text-decoration: none; + color: lighten($error-value-color, 12%); + } + .fields-group { margin-bottom: 25px; - } - .input.radio_buttons .radio label { - margin-bottom: 5px; - font-family: inherit; - font-size: 14px; - color: $primary-text-color; - display: block; - width: auto; + .input:last-child { + margin-bottom: 0; + } } - .input.boolean { - margin-bottom: 5px; + .fields-row { + display: flex; + margin: 0 -10px; + padding-top: 5px; + margin-bottom: 25px; - label { - font-family: inherit; - font-size: 14px; - color: $primary-text-color; - display: block; - width: auto; + .input { + max-width: none; } - label.checkbox { - position: relative; - padding-left: 25px; + &__column { + box-sizing: border-box; + padding: 0 10px; flex: 1 1 auto; + min-height: 1px; + + &-6 { + max-width: 50%; + } } - input[type=checkbox] { - position: absolute; - left: 0; - top: 5px; - margin: 0; + .fields-group:last-child, + .fields-row__column.fields-group { + margin-bottom: 0; } - .hint { - padding-left: 25px; - margin-left: 0; + @media screen and (max-width: $no-columns-breakpoint) { + display: block; + margin-bottom: 0; + + &__column { + max-width: none; + } + + .fields-group:last-child, + .fields-row__column.fields-group, + .fields-row__column { + margin-bottom: 25px; + } } } + .input.radio_buttons .radio label { + margin-bottom: 5px; + font-family: inherit; + font-size: 14px; + color: $primary-text-color; + display: block; + width: auto; + } + .check_boxes { .checkbox { label { @@ -236,12 +288,7 @@ code { input[type=email], input[type=password], textarea { - background: transparent; box-sizing: border-box; - border: 0; - border-bottom: 2px solid $ui-primary-color; - border-radius: 2px 2px 0 0; - padding: 7px 4px; font-size: 16px; color: $primary-text-color; display: block; @@ -249,23 +296,31 @@ code { outline: 0; font-family: inherit; resize: vertical; + background: darken($ui-base-color, 10%); + border: 1px solid darken($ui-base-color, 14%); + border-radius: 4px; + padding: 10px; &:invalid { box-shadow: none; } &:focus:invalid { - border-bottom-color: lighten($error-red, 12%); + border-color: lighten($error-red, 12%); } &:required:valid { - border-bottom-color: $valid-value-color; + border-color: $valid-value-color; + } + + &:hover { + border-color: darken($ui-base-color, 20%); } &:active, &:focus { - border-bottom-color: $highlight-text-color; - background: rgba($base-overlay-background, 0.1); + border-color: $highlight-text-color; + background: darken($ui-base-color, 8%); } } @@ -349,22 +404,32 @@ code { } select { + appearance: none; + box-sizing: border-box; font-size: 16px; - max-height: 29px; + color: $primary-text-color; + display: block; + width: 100%; + outline: 0; + font-family: inherit; + resize: vertical; + background: darken($ui-base-color, 10%) url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 12%))}'/></svg>") no-repeat right 8px center / auto 16px; + border: 1px solid darken($ui-base-color, 14%); + border-radius: 4px; + padding: 10px; + height: 41px; } - .input-with-append { - position: relative; - - .input input { - padding-right: 142px; + .label_input { + &__wrapper { + position: relative; } - .append { + &__append { position: absolute; - right: 0; - top: 0; - padding: 7px 4px; + right: 1px; + top: 1px; + padding: 10px; padding-bottom: 9px; font-size: 16px; color: $dark-text-color; @@ -383,7 +448,7 @@ code { right: 0; bottom: 1px; width: 5px; - background-image: linear-gradient(to right, rgba($ui-base-color, 0), $ui-base-color); + background-image: linear-gradient(to right, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%)); } } } @@ -459,6 +524,30 @@ code { } } +.quick-nav { + list-style: none; + margin-bottom: 25px; + font-size: 14px; + + li { + display: inline-block; + margin-right: 10px; + } + + a { + color: $highlight-text-color; + text-transform: uppercase; + text-decoration: none; + font-weight: 700; + + &:hover, + &:focus, + &:active { + color: lighten($highlight-text-color, 8%); + } + } +} + .oauth-prompt, .follow-prompt { margin-bottom: 30px; @@ -632,3 +721,49 @@ code { font-family: 'mastodon-font-monospace', monospace; } } + +.input-copy { + background: darken($ui-base-color, 10%); + border: 1px solid darken($ui-base-color, 14%); + border-radius: 4px; + display: flex; + align-items: center; + padding-right: 4px; + position: relative; + top: 1px; + transition: border-color 300ms linear; + + &__wrapper { + flex: 1 1 auto; + } + + input[type=text] { + background: transparent; + border: 0; + padding: 10px; + font-size: 14px; + font-family: 'mastodon-font-monospace', monospace; + } + + button { + flex: 0 0 auto; + margin: 4px; + text-transform: none; + font-weight: 400; + font-size: 14px; + padding: 7px 18px; + padding-bottom: 6px; + width: auto; + transition: background 300ms linear; + } + + &.copied { + border-color: $valid-value-color; + transition: none; + + button { + background: $valid-value-color; + transition: none; + } + } +} diff --git a/app/javascript/styles/mastodon/reset.scss b/app/javascript/styles/mastodon/reset.scss index ff3b2c022..a140e8bc7 100644 --- a/app/javascript/styles/mastodon/reset.scss +++ b/app/javascript/styles/mastodon/reset.scss @@ -53,6 +53,11 @@ table { border-spacing: 0; } +html { + scrollbar-face-color: lighten($ui-base-color, 4%); + scrollbar-track-color: rgba($base-overlay-background, 0.1); +} + ::-webkit-scrollbar { width: 12px; height: 12px; diff --git a/app/lib/activitypub/activity/update.rb b/app/lib/activitypub/activity/update.rb index 6eebc3b5c..67dae3f81 100644 --- a/app/lib/activitypub/activity/update.rb +++ b/app/lib/activitypub/activity/update.rb @@ -11,6 +11,7 @@ class ActivityPub::Activity::Update < ActivityPub::Activity def update_account return if @account.uri != object_uri + ActivityPub::ProcessAccountService.new.call(@account.username, @account.domain, @object, signed_with_known_key: true) end end diff --git a/app/models/account.rb b/app/models/account.rb index c84a7406d..d0c4c1a6d 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -226,11 +226,19 @@ class Account < ApplicationRecord end def fields_attributes=(attributes) - fields = [] + fields = [] + old_fields = self[:fields] || [] if attributes.is_a?(Hash) attributes.each_value do |attr| next if attr[:name].blank? + + previous = old_fields.find { |item| item['value'] == attr[:value] } + + if previous && previous['verified_at'].present? + attr[:verified_at] = previous['verified_at'] + end + fields << attr end end @@ -238,13 +246,18 @@ class Account < ApplicationRecord self[:fields] = fields end + DEFAULT_FIELDS_SIZE = 4 + def build_fields - return if fields.size >= 4 + return if fields.size >= DEFAULT_FIELDS_SIZE + + tmp = self[:fields] || [] + + (DEFAULT_FIELDS_SIZE - tmp.size).times do + tmp << { name: '', value: '' } + end - raw_fields = self[:fields] || [] - add_fields = 4 - raw_fields.size - add_fields.times { raw_fields << { name: '', value: '' } } - self.fields = raw_fields + self.fields = tmp end def magic_key @@ -297,17 +310,32 @@ class Account < ApplicationRecord end class Field < ActiveModelSerializers::Model - attributes :name, :value, :account, :errors + attributes :name, :value, :verified_at, :account, :errors + + def initialize(account, attributes) + @account = account + @attributes = attributes + @name = attributes['name'].strip[0, 255] + @value = attributes['value'].strip[0, 255] + @verified_at = attributes['verified_at']&.to_datetime + @errors = {} + end + + def verified? + verified_at.present? + end + + def verifiable? + value.present? && value.start_with?('http://', 'https://') + end - def initialize(account, attr) - @account = account - @name = attr['name'].strip[0, 255] - @value = attr['value'].strip[0, 255] - @errors = {} + def mark_verified! + @verified_at = Time.now.utc + @attributes['verified_at'] = @verified_at end def to_h - { name: @name, value: @value } + { name: @name, value: @value, verified_at: @verified_at } end end diff --git a/app/models/status.rb b/app/models/status.rb index f9c0c68d9..028927cc3 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -248,7 +248,7 @@ class Status < ApplicationRecord def as_direct_timeline(account, limit = 20, max_id = nil, since_id = nil, cache_ids = false) # direct timeline is mix of direct message from_me and to_me. - # 2 querys are executed with pagination. + # 2 queries are executed with pagination. # constant expression using arel_table is required for partial index # _from_me part does not require any timeline filters diff --git a/app/serializers/rest/account_serializer.rb b/app/serializers/rest/account_serializer.rb index 3a724aa7c..d84b48afb 100644 --- a/app/serializers/rest/account_serializer.rb +++ b/app/serializers/rest/account_serializer.rb @@ -13,6 +13,10 @@ class REST::AccountSerializer < ActiveModel::Serializer class FieldSerializer < ActiveModel::Serializer attributes :name, :value + attribute :verified_at, if: :verifiable? + + delegate :verifiable?, to: :object + def value Formatter.instance.format_field(object.account, object.value) end diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb index 670a0e4d6..c77858f1d 100644 --- a/app/services/activitypub/process_account_service.rb +++ b/app/services/activitypub/process_account_service.rb @@ -34,6 +34,7 @@ class ActivityPub::ProcessAccountService < BaseService after_protocol_change! if protocol_changed? after_key_change! if key_changed? && !@options[:signed_with_known_key] check_featured_collection! if @account.featured_collection_url.present? + check_links! unless @account.fields.empty? @account rescue Oj::ParseError @@ -99,6 +100,10 @@ class ActivityPub::ProcessAccountService < BaseService ActivityPub::SynchronizeFeaturedCollectionWorker.perform_async(@account.id) end + def check_links! + VerifyAccountLinksWorker.perform_async(@account.id) + end + def actor_type if @json['type'].is_a?(Array) @json['type'].find { |type| ActivityPub::FetchRemoteAccountService::SUPPORTED_TYPES.include?(type) } diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb index 560a81768..4169c685b 100644 --- a/app/services/fetch_link_card_service.rb +++ b/app/services/fetch_link_card_service.rb @@ -29,7 +29,7 @@ class FetchLinkCardService < BaseService end attach_card if @card&.persisted? - rescue HTTP::Error, Addressable::URI::InvalidURIError, Mastodon::LengthValidationError => e + rescue HTTP::Error, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError => e Rails.logger.debug "Error fetching link #{@url}: #{e}" nil end @@ -87,34 +87,36 @@ class FetchLinkCardService < BaseService end def attempt_oembed - embed = FetchOEmbedService.new.call(@url, html: @html) + service = FetchOEmbedService.new + embed = service.call(@url, html: @html) + url = Addressable::URI.parse(service.endpoint_url) return false if embed.nil? @card.type = embed[:type] @card.title = embed[:title] || '' @card.author_name = embed[:author_name] || '' - @card.author_url = embed[:author_url] || '' + @card.author_url = embed[:author_url].present? ? (url + embed[:author_url]).to_s : '' @card.provider_name = embed[:provider_name] || '' - @card.provider_url = embed[:provider_url] || '' + @card.provider_url = embed[:provider_url].present? ? (url + embed[:provider_url]).to_s : '' @card.width = 0 @card.height = 0 case @card.type when 'link' - @card.image_remote_url = embed[:thumbnail_url] if embed[:thumbnail_url].present? + @card.image_remote_url = (url + embed[:thumbnail_url]).to_s if embed[:thumbnail_url].present? when 'photo' return false if embed[:url].blank? - @card.embed_url = embed[:url] - @card.image_remote_url = embed[:url] + @card.embed_url = (url + embed[:url]).to_s + @card.image_remote_url = (url + embed[:url]).to_s @card.width = embed[:width].presence || 0 @card.height = embed[:height].presence || 0 when 'video' @card.width = embed[:width].presence || 0 @card.height = embed[:height].presence || 0 @card.html = Formatter.instance.sanitize(embed[:html], Sanitize::Config::MASTODON_OEMBED) - @card.image_remote_url = embed[:thumbnail_url] if embed[:thumbnail_url].present? + @card.image_remote_url = (url + embed[:thumbnail_url]).to_s if embed[:thumbnail_url].present? when 'rich' # Most providers rely on <script> tags, which is a no-no return false @@ -146,7 +148,7 @@ class FetchLinkCardService < BaseService @card.title = meta_property(page, 'og:title').presence || page.at_xpath('//title')&.content || '' @card.description = meta_property(page, 'og:description').presence || meta_property(page, 'description') || '' - @card.image_remote_url = meta_property(page, 'og:image') if meta_property(page, 'og:image') + @card.image_remote_url = (Addressable::URI.parse(@url) + meta_property(page, 'og:image')).to_s if meta_property(page, 'og:image') return if @card.title.blank? && @card.html.blank? diff --git a/app/services/fetch_oembed_service.rb b/app/services/fetch_oembed_service.rb index 998228517..9ddf9b13b 100644 --- a/app/services/fetch_oembed_service.rb +++ b/app/services/fetch_oembed_service.rb @@ -31,7 +31,7 @@ class FetchOEmbedService return if @endpoint_url.blank? - @endpoint_url = Addressable::URI.parse(@endpoint_url).to_s + @endpoint_url = (Addressable::URI.parse(@url) + @endpoint_url).to_s rescue Addressable::URI::InvalidURIError @endpoint_url = nil end diff --git a/app/services/update_account_service.rb b/app/services/update_account_service.rb index 09ea377e7..ec69d944a 100644 --- a/app/services/update_account_service.rb +++ b/app/services/update_account_service.rb @@ -2,20 +2,26 @@ class UpdateAccountService < BaseService def call(account, params, raise_error: false) - was_locked = account.locked + was_locked = account.locked update_method = raise_error ? :update! : :update + account.send(update_method, params).tap do |ret| next unless ret + authorize_all_follow_requests(account) if was_locked && !account.locked + check_links(account) end end private def authorize_all_follow_requests(account) - follow_requests = FollowRequest.where(target_account: account) - AuthorizeFollowWorker.push_bulk(follow_requests) do |req| + AuthorizeFollowWorker.push_bulk(FollowRequest.where(target_account: account).select(:account_id, :target_account_id)) do |req| [req.account_id, req.target_account_id] end end + + def check_links(account) + VerifyAccountLinksWorker.perform_async(account.id) + end end diff --git a/app/services/verify_link_service.rb b/app/services/verify_link_service.rb new file mode 100644 index 000000000..7d53bc255 --- /dev/null +++ b/app/services/verify_link_service.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +class VerifyLinkService < BaseService + def call(field) + @link_back = ActivityPub::TagManager.instance.url_for(field.account) + @url = field.value + + perform_request! + + return unless link_back_present? + + field.mark_verified! + field.account.save! + rescue HTTP::Error, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError => e + Rails.logger.debug "Error fetching link #{@url}: #{e}" + nil + end + + private + + def perform_request! + @body = Request.new(:get, @url).add_headers('Accept' => 'text/html').perform do |res| + res.code != 200 ? nil : res.body_with_limit + end + end + + def link_back_present? + return false if @body.empty? + + links = Nokogiri::HTML(@body).xpath('//a[contains(concat(" ", normalize-space(@rel), " "), " me ")]|//link[contains(concat(" ", normalize-space(@rel), " "), " me ")]') + + if links.any? { |link| link['href'] == @link_back } + true + elsif links.empty? + false + else + link_redirects_back?(links.first['href']) + end + end + + def link_redirects_back?(test_url) + redirect_to_url = Request.new(:head, test_url, follow: false).perform do |res| + res.headers['Location'] + end + + redirect_to_url == @link_back + end +end diff --git a/app/views/about/_registration.html.haml b/app/views/about/_registration.html.haml index 6ca1d7129..ee4f8fe2e 100644 --- a/app/views/about/_registration.html.haml +++ b/app/views/about/_registration.html.haml @@ -1,13 +1,10 @@ = simple_form_for(new_user, url: user_registration_path) do |f| = f.simple_fields_for :account do |account_fields| - .input-with-append - = account_fields.input :username, autofocus: true, placeholder: t('simple_form.labels.defaults.username'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.username'), :autocomplete => 'off' } - .append - = "@#{site_hostname}" + = account_fields.input :username, wrapper: :with_label, autofocus: true, label: false, required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.username'), :autocomplete => 'off', placeholder: t('simple_form.labels.defaults.username') }, append: "@#{site_hostname}", hint: false - = f.input :email, placeholder: t('simple_form.labels.defaults.email'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.email'), :autocomplete => 'off' } - = f.input :password, placeholder: t('simple_form.labels.defaults.password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.password'), :autocomplete => 'off' } - = f.input :password_confirmation, placeholder: t('simple_form.labels.defaults.confirm_password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.confirm_password'), :autocomplete => 'off' } + = f.input :email, placeholder: t('simple_form.labels.defaults.email'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.email'), :autocomplete => 'off' }, hint: false + = f.input :password, placeholder: t('simple_form.labels.defaults.password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.password'), :autocomplete => 'off' }, hint: false + = f.input :password_confirmation, placeholder: t('simple_form.labels.defaults.confirm_password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.confirm_password'), :autocomplete => 'off' }, hint: false .actions = f.button :button, t('auth.register'), type: :submit, class: 'button button-primary' diff --git a/app/views/about/more.html.haml b/app/views/about/more.html.haml index 46eb17cf7..99028935f 100644 --- a/app/views/about/more.html.haml +++ b/app/views/about/more.html.haml @@ -24,7 +24,7 @@ %span= t 'about.status_count_after', count: @instance_presenter.status_count .row__mascot .landing-page__mascot - = image_tag asset_pack_path('elephant_ui_plane.svg') + = image_tag asset_pack_path('elephant_ui_plane.svg'), alt: '' .column-2 .landing-page__information.contact-widget diff --git a/app/views/about/show.html.haml b/app/views/about/show.html.haml index fd76a6b7d..48435fe9c 100644 --- a/app/views/about/show.html.haml +++ b/app/views/about/show.html.haml @@ -62,7 +62,7 @@ %span= t 'about.status_count_after', count: @instance_presenter.status_count .row__mascot .landing-page__mascot - = image_tag asset_pack_path('elephant_ui_plane.svg') + = image_tag asset_pack_path('elephant_ui_plane.svg'), alt: '' - else .column-2.non-preview @@ -94,7 +94,7 @@ %span= t 'about.status_count_after', count: @instance_presenter.status_count .row__mascot .landing-page__mascot - = image_tag asset_pack_path('elephant_ui_plane.svg') + = image_tag asset_pack_path('elephant_ui_plane.svg'), alt: '' - if Setting.timeline_preview .column-3 diff --git a/app/views/accounts/_bio.html.haml b/app/views/accounts/_bio.html.haml index 4e674beff..2ea34a048 100644 --- a/app/views/accounts/_bio.html.haml +++ b/app/views/accounts/_bio.html.haml @@ -4,8 +4,11 @@ - account.fields.each do |field| %dl %dt.emojify{ title: field.name }= Formatter.instance.format_field(account, field.name, custom_emojify: true) - %dd.emojify{ title: field.value }= Formatter.instance.format_field(account, field.value, custom_emojify: true) - + %dd{ title: field.value, class: custom_field_classes(field) } + - if field.verified? + %span.verified__mark{ title: t('accounts.link_verified_on', date: l(field.verified_at)) } + = fa_icon 'check' + = Formatter.instance.format_field(account, field.value, custom_emojify: true) = account_badge(account) - if account.note.present? diff --git a/app/views/accounts/_header.html.haml b/app/views/accounts/_header.html.haml index 95e55a1b0..3da270d27 100644 --- a/app/views/accounts/_header.html.haml +++ b/app/views/accounts/_header.html.haml @@ -3,7 +3,10 @@ = image_tag account.header.url, class: 'parallax' .public-account-header__bar = link_to short_account_url(account), class: 'avatar' do - = image_tag account.avatar.url + - if current_account&.user&.setting_auto_play_gif + = image_tag account.avatar_original_url + - else + = image_tag account.avatar_static_url .public-account-header__tabs .public-account-header__tabs__name %h1 @@ -13,7 +16,7 @@ = fa_icon('lock') if account.locked? .public-account-header__tabs__tabs .details-counters - .counter{ class: active_nav_class(short_account_url(account)) } + .counter{ class: active_nav_class(short_account_url(account)) + active_nav_class(short_account_with_replies_url(account)) + active_nav_class(short_account_media_url(account)) } = link_to short_account_url(account), class: 'u-url u-uid', title: number_with_delimiter(account.statuses_count) do %span.counter-number= number_to_human account.statuses_count, strip_insignificant_zeros: true %span.counter-label= t('accounts.posts', count: account.statuses_count) diff --git a/app/views/admin/change_emails/show.html.haml b/app/views/admin/change_emails/show.html.haml index a661b1ad6..6febef9b1 100644 --- a/app/views/admin/change_emails/show.html.haml +++ b/app/views/admin/change_emails/show.html.haml @@ -2,6 +2,11 @@ = t('admin.accounts.change_email.title', username: @account.acct) = simple_form_for @user, url: admin_account_change_email_path(@account.id) do |f| - = f.input :email, wrapper: :with_label, disabled: true, label: t('admin.accounts.change_email.current_email') - = f.input :unconfirmed_email, wrapper: :with_label, label: t('admin.accounts.change_email.new_email') - = f.button :submit, class: "button", value: t('admin.accounts.change_email.submit') + .fields-group + = f.input :email, wrapper: :with_label, disabled: true, label: t('admin.accounts.change_email.current_email') + + .fields-group + = f.input :unconfirmed_email, wrapper: :with_label, label: t('admin.accounts.change_email.new_email') + + .actions + = f.button :submit, class: "button", value: t('admin.accounts.change_email.submit') diff --git a/app/views/admin/custom_emojis/new.html.haml b/app/views/admin/custom_emojis/new.html.haml index 672afe435..e15a07cb8 100644 --- a/app/views/admin/custom_emojis/new.html.haml +++ b/app/views/admin/custom_emojis/new.html.haml @@ -5,8 +5,9 @@ = render 'shared/error_messages', object: @custom_emoji .fields-group - = f.input :shortcode, placeholder: t('admin.custom_emojis.shortcode'), hint: t('admin.custom_emojis.shortcode_hint') - = f.input :image, input_html: { accept: 'image/png' }, hint: t('admin.custom_emojis.image_hint') + = f.input :shortcode, wrapper: :with_label, label: t('admin.custom_emojis.shortcode'), hint: t('admin.custom_emojis.shortcode_hint') + .fields-group + = f.input :image, wrapper: :with_label, input_html: { accept: 'image/png' }, hint: t('admin.custom_emojis.image_hint') .actions = f.button :button, t('admin.custom_emojis.upload'), type: :submit diff --git a/app/views/admin/domain_blocks/new.html.haml b/app/views/admin/domain_blocks/new.html.haml index 38fa90169..6e514f833 100644 --- a/app/views/admin/domain_blocks/new.html.haml +++ b/app/views/admin/domain_blocks/new.html.haml @@ -4,14 +4,15 @@ = simple_form_for @domain_block, url: admin_domain_blocks_path do |f| = render 'shared/error_messages', object: @domain_block - %p.hint= t('.hint') + .fields-row + .fields-row__column.fields-row__column-6.fields-group + = f.input :domain, wrapper: :with_label, label: t('admin.domain_blocks.domain'), hint: t('.hint'), required: true - = f.input :domain, placeholder: t('admin.domain_blocks.domain') - = f.input :severity, collection: DomainBlock.severities.keys, wrapper: :with_label, include_blank: false, label_method: lambda { |type| t(".severity.#{type}") } + .fields-row__column.fields-row__column-6.fields-group + = f.input :severity, collection: DomainBlock.severities.keys, wrapper: :with_label, include_blank: false, label_method: lambda { |type| t(".severity.#{type}") }, hint: t('.severity.desc_html') - %p.hint= t('.severity.desc_html') - - = f.input :reject_media, as: :boolean, wrapper: :with_label, label: I18n.t('admin.domain_blocks.reject_media'), hint: I18n.t('admin.domain_blocks.reject_media_hint') + .fields-group + = f.input :reject_media, as: :boolean, wrapper: :with_label, label: I18n.t('admin.domain_blocks.reject_media'), hint: I18n.t('admin.domain_blocks.reject_media_hint') .actions = f.button :button, t('.create'), type: :submit diff --git a/app/views/admin/email_domain_blocks/new.html.haml b/app/views/admin/email_domain_blocks/new.html.haml index bcae867d9..f372fa512 100644 --- a/app/views/admin/email_domain_blocks/new.html.haml +++ b/app/views/admin/email_domain_blocks/new.html.haml @@ -4,7 +4,8 @@ = simple_form_for @email_domain_block, url: admin_email_domain_blocks_path do |f| = render 'shared/error_messages', object: @email_domain_block - = f.input :domain, placeholder: t('admin.email_domain_blocks.domain') + .fields-group + = f.input :domain, wrapper: :with_label, label: t('admin.email_domain_blocks.domain') .actions = f.button :button, t('.create'), type: :submit diff --git a/app/views/admin/reports/_account.html.haml b/app/views/admin/reports/_account.html.haml deleted file mode 100644 index 9ac161c9c..000000000 --- a/app/views/admin/reports/_account.html.haml +++ /dev/null @@ -1,19 +0,0 @@ -- size ||= 36 - -.account.compact - .account__wrapper - - if account.nil? - .account__display-name - .account__avatar-wrapper - .account__avatar{ style: "background-image: url(#{full_asset_url('avatars/original/missing.png', skip_pipeline: true)}); width: #{size}px; height: #{size}px; background-size: #{size}px #{size}px" } - %span.display-name - %strong= t 'about.contact_missing' - %span.display-name__account= t 'about.contact_unavailable' - - else - = link_to TagManager.instance.url_for(account), class: 'account__display-name' do - .account__avatar-wrapper - .account__avatar{ style: "background-image: url(#{account.avatar.url}); width: #{size}px; height: #{size}px; background-size: #{size}px #{size}px" } - %span.display-name - %bdi - %strong.display-name__html.emojify= display_name(account, custom_emojify: true) - %span.display-name__account @#{account.acct} diff --git a/app/views/admin/reports/_report.html.haml b/app/views/admin/reports/_report.html.haml deleted file mode 100644 index 7b25c924b..000000000 --- a/app/views/admin/reports/_report.html.haml +++ /dev/null @@ -1,29 +0,0 @@ -%tr - %td.id - = "##{report.id}" - %td.target - = admin_account_link_to report.target_account - %td.reporter - - if report.account.local? - = admin_account_link_to report.account - - else - = report.account.domain - %td - %div{ title: report.comment } - = truncate(report.comment, length: 30, separator: ' ') - %div - - unless report.statuses.empty? - %span{ title: t('admin.accounts.statuses') } - = fa_icon('comment') - = report.statuses.count - - unless report.media_attachments.empty? - %span{ title: t('admin.accounts.media_attachments') } - = fa_icon('camera') - = report.media_attachments.count - %td - - if report.assigned_account.nil? - \- - - else - = admin_account_link_to report.assigned_account - %td - = table_link_to 'circle', t('admin.reports.view'), admin_report_path(report) diff --git a/app/views/admin/reports/index.html.haml b/app/views/admin/reports/index.html.haml index 44a531f2c..d73faccb0 100644 --- a/app/views/admin/reports/index.html.haml +++ b/app/views/admin/reports/index.html.haml @@ -8,17 +8,45 @@ %li= filter_link_to t('admin.reports.unresolved'), resolved: nil %li= filter_link_to t('admin.reports.resolved'), resolved: '1' -.table-wrapper - %table.table - %thead - %tr - %th= t('admin.reports.id') - %th= t('admin.reports.target') - %th= t('admin.reports.reported_by') - %th= t('admin.reports.report_contents') - %th= t('admin.reports.assigned') - %th - %tbody - = render @reports +- @reports.group_by(&:target_account_id).each do |target_account_id, reports| + - target_account = reports.first.target_account + .report-card + .report-card__profile + = account_link_to target_account, '', size: 36, path: admin_account_path(target_account.id) + .report-card__profile__stats + = link_to pluralize(target_account.targeted_moderation_notes.count, t('admin.reports.account.note')), admin_account_path(target_account.id) + %br/ + - if target_account.suspended? + %span.red= t('admin.accounts.suspended') + - elsif target_account.silenced? + %span.red= t('admin.accounts.silenced') + - elsif target_account.user&.disabled? + %span.red= t('admin.accounts.disabled') + - else + %span.neutral= t('admin.accounts.no_limits_imposed') + .report-card__summary + - reports.each do |report| + .report-card__summary__item + .report-card__summary__item__reported-by + - if report.account.local? + = admin_account_link_to report.account + - else + = report.account.domain + .report-card__summary__item__content + = link_to admin_report_path(report) do + .one-line= report.comment.presence || t('admin.reports.comment.none') + %span.report-card__summary__item__content__icon{ title: t('admin.accounts.statuses') } + = fa_icon('comment') + = report.statuses.count + + %span.report-card__summary__item__content__icon{ title: t('admin.accounts.media_attachments') } + = fa_icon('camera') + = report.media_attachments.count + + .report-card__summary__item__assigned + - if report.assigned_account.present? + = admin_account_link_to report.assigned_account + - else + \- = paginate @reports diff --git a/app/views/admin/settings/edit.html.haml b/app/views/admin/settings/edit.html.haml index abe7ecf32..b4abbf815 100644 --- a/app/views/admin/settings/edit.html.haml +++ b/app/views/admin/settings/edit.html.haml @@ -2,24 +2,37 @@ = t('admin.settings.title') = simple_form_for @admin_settings, url: admin_settings_path, html: { method: :patch } do |f| - .actions.actions--top - = f.button :button, t('generic.save_changes'), type: :submit .fields-group - = f.input :site_title, placeholder: t('admin.settings.site_title') - = f.input :site_short_description, wrapper: :with_block_label, as: :text, label: t('admin.settings.site_short_description.title'), hint: t('admin.settings.site_short_description.desc_html'), input_html: { rows: 2 } + = f.input :site_title, wrapper: :with_label, label: t('admin.settings.site_title') + + .fields-group + = f.input :flavour, collection: Themes.instance.flavours, label_method: lambda { |flavour| I18n.t("flavours.#{flavour}.name", default: flavour) }, wrapper: :with_label, include_blank: false + + .fields-row + .fields-row__column.fields-row__column-6.fields-group + = f.input :site_contact_username, wrapper: :with_label, label: t('admin.settings.contact_information.username') + .fields-row__column.fields-row__column-6.fields-group + = f.input :site_contact_email, wrapper: :with_label, label: t('admin.settings.contact_information.email') + + .fields-group = f.input :site_description, wrapper: :with_block_label, as: :text, label: t('admin.settings.site_description.title'), hint: t('admin.settings.site_description.desc_html'), input_html: { rows: 4 } - = f.input :site_contact_username, placeholder: t('admin.settings.contact_information.username') - = f.input :site_contact_email, placeholder: t('admin.settings.contact_information.email') - %hr/ + .fields-group + = f.input :site_short_description, wrapper: :with_block_label, as: :text, label: t('admin.settings.site_short_description.title'), hint: t('admin.settings.site_short_description.desc_html'), input_html: { rows: 2 } + + .fields-row + .fields-row__column.fields-row__column-6.fields-group + = f.input :thumbnail, as: :file, wrapper: :with_block_label, label: t('admin.settings.thumbnail.title'), hint: t('admin.settings.thumbnail.desc_html') + .fields-row__column.fields-row__column-6.fields-group + = f.input :hero, as: :file, wrapper: :with_block_label, label: t('admin.settings.hero.title'), hint: t('admin.settings.hero.desc_html') + + %hr.spacer/ .fields-group - = f.input :flavour, collection: Themes.instance.flavours, label_method: lambda { |flavour| I18n.t("flavours.#{flavour}.name", default: flavour) }, wrapper: :with_label, include_blank: false - = f.input :thumbnail, as: :file, wrapper: :with_block_label, label: t('admin.settings.thumbnail.title'), hint: t('admin.settings.thumbnail.desc_html') - = f.input :hero, as: :file, wrapper: :with_block_label, label: t('admin.settings.hero.title'), hint: t('admin.settings.hero.desc_html') + = f.input :bootstrap_timeline_accounts, wrapper: :with_block_label, label: t('admin.settings.bootstrap_timeline_accounts.title'), hint: t('admin.settings.bootstrap_timeline_accounts.desc_html') - %hr/ + %hr.spacer/ .fields-group = f.input :timeline_preview, as: :boolean, wrapper: :with_label, label: t('admin.settings.timeline_preview.title'), hint: t('admin.settings.timeline_preview.desc_html') @@ -37,34 +50,24 @@ = f.input :open_deletion, as: :boolean, wrapper: :with_label, label: t('admin.settings.registrations.deletion.title'), hint: t('admin.settings.registrations.deletion.desc_html') .fields-group - = f.input :closed_registrations_message, as: :text, wrapper: :with_block_label, label: t('admin.settings.registrations.closed_message.title'), hint: t('admin.settings.registrations.closed_message.desc_html'), input_html: { rows: 8 } - - %hr/ - - .fields-group - = f.input :min_invite_role, wrapper: :with_label, collection: %i(disabled user moderator admin), label: t('admin.settings.registrations.min_invite_role.title'), label_method: lambda { |role| role == :disabled ? t('admin.settings.registrations.min_invite_role.disabled') : t("admin.accounts.roles.#{role}") }, as: :radio_buttons, include_blank: false, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li' - - %hr/ + = f.input :activity_api_enabled, as: :boolean, wrapper: :with_label, label: t('admin.settings.activity_api_enabled.title'), hint: t('admin.settings.activity_api_enabled.desc_html') .fields-group - = f.input :site_extended_description, wrapper: :with_block_label, as: :text, label: t('admin.settings.site_description_extended.title'), hint: t('admin.settings.site_description_extended.desc_html'), input_html: { rows: 8 } - = f.input :site_terms, wrapper: :with_block_label, as: :text, label: t('admin.settings.site_terms.title'), hint: t('admin.settings.site_terms.desc_html'), input_html: { rows: 8 } - = f.input :custom_css, wrapper: :with_block_label, as: :text, input_html: { rows: 8 }, label: t('admin.settings.custom_css.title'), hint: t('admin.settings.custom_css.desc_html') - %hr/ + = f.input :peers_api_enabled, as: :boolean, wrapper: :with_label, label: t('admin.settings.peers_api_enabled.title'), hint: t('admin.settings.peers_api_enabled.desc_html') .fields-group - = f.input :bootstrap_timeline_accounts, wrapper: :with_block_label, label: t('admin.settings.bootstrap_timeline_accounts.title'), hint: t('admin.settings.bootstrap_timeline_accounts.desc_html') + = f.input :preview_sensitive_media, as: :boolean, wrapper: :with_label, label: t('admin.settings.preview_sensitive_media.title'), hint: t('admin.settings.preview_sensitive_media.desc_html') - %hr/ + %hr.spacer/ .fields-group - = f.input :activity_api_enabled, as: :boolean, wrapper: :with_label, label: t('admin.settings.activity_api_enabled.title'), hint: t('admin.settings.activity_api_enabled.desc_html') + = f.input :min_invite_role, wrapper: :with_label, collection: %i(disabled user moderator admin), label: t('admin.settings.registrations.min_invite_role.title'), label_method: lambda { |role| role == :disabled ? t('admin.settings.registrations.min_invite_role.disabled') : t("admin.accounts.roles.#{role}") }, include_blank: false, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li' .fields-group - = f.input :peers_api_enabled, as: :boolean, wrapper: :with_label, label: t('admin.settings.peers_api_enabled.title'), hint: t('admin.settings.peers_api_enabled.desc_html') - - .fields-group - = f.input :preview_sensitive_media, as: :boolean, wrapper: :with_label, label: t('admin.settings.preview_sensitive_media.title'), hint: t('admin.settings.preview_sensitive_media.desc_html') + = f.input :closed_registrations_message, as: :text, wrapper: :with_block_label, label: t('admin.settings.registrations.closed_message.title'), hint: t('admin.settings.registrations.closed_message.desc_html'), input_html: { rows: 8 } + = f.input :site_extended_description, wrapper: :with_block_label, as: :text, label: t('admin.settings.site_description_extended.title'), hint: t('admin.settings.site_description_extended.desc_html'), input_html: { rows: 8 } + = f.input :site_terms, wrapper: :with_block_label, as: :text, label: t('admin.settings.site_terms.title'), hint: t('admin.settings.site_terms.desc_html'), input_html: { rows: 8 } + = f.input :custom_css, wrapper: :with_block_label, as: :text, input_html: { rows: 8 }, label: t('admin.settings.custom_css.title'), hint: t('admin.settings.custom_css.desc_html') .actions = f.button :button, t('generic.save_changes'), type: :submit diff --git a/app/views/auth/confirmations/finish_signup.html.haml b/app/views/auth/confirmations/finish_signup.html.haml index 4b5161d6b..9d09b74e1 100644 --- a/app/views/auth/confirmations/finish_signup.html.haml +++ b/app/views/auth/confirmations/finish_signup.html.haml @@ -8,7 +8,8 @@ = msg %br - = f.input :email + .fields-group + = f.input :email, wrapper: :with_label, required: true, hint: false .actions = f.submit t('auth.confirm_email'), class: 'button' diff --git a/app/views/auth/confirmations/new.html.haml b/app/views/auth/confirmations/new.html.haml index 07ca4a7da..4a1bedaa4 100644 --- a/app/views/auth/confirmations/new.html.haml +++ b/app/views/auth/confirmations/new.html.haml @@ -4,7 +4,8 @@ = simple_form_for(resource, as: resource_name, url: confirmation_path(resource_name), html: { method: :post }) do |f| = render 'shared/error_messages', object: resource - = f.input :email, autofocus: true, required: true, placeholder: t('simple_form.labels.defaults.email'), input_html: { 'aria-label' => t('simple_form.labels.defaults.email') } + .fields-group + = f.input :email, autofocus: true, wrapper: :with_label, label: t('simple_form.labels.defaults.email'), input_html: { 'aria-label' => t('simple_form.labels.defaults.email') }, hint: false .actions = f.button :button, t('auth.resend_confirmation'), type: :submit diff --git a/app/views/auth/passwords/edit.html.haml b/app/views/auth/passwords/edit.html.haml index 53d1769d6..383d44f00 100644 --- a/app/views/auth/passwords/edit.html.haml +++ b/app/views/auth/passwords/edit.html.haml @@ -7,8 +7,10 @@ - if !use_seamless_external_login? || resource.encrypted_password.present? = f.input :reset_password_token, as: :hidden - = f.input :password, autofocus: true, placeholder: t('simple_form.labels.defaults.new_password'), input_html: { 'aria-label' => t('simple_form.labels.defaults.new_password'), :autocomplete => 'off' } - = f.input :password_confirmation, placeholder: t('simple_form.labels.defaults.confirm_new_password'), input_html: { 'aria-label' => t('simple_form.labels.defaults.confirm_new_password'), :autocomplete => 'off' } + .fields-group + = f.input :password, wrapper: :with_label, autofocus: true, label: t('simple_form.labels.defaults.new_password'), input_html: { 'aria-label' => t('simple_form.labels.defaults.new_password'), :autocomplete => 'off' }, required: true + .fields-group + = f.input :password_confirmation, wrapper: :with_label, label: t('simple_form.labels.defaults.confirm_new_password'), input_html: { 'aria-label' => t('simple_form.labels.defaults.confirm_new_password'), :autocomplete => 'off' }, required: true .actions = f.button :button, t('auth.set_new_password'), type: :submit diff --git a/app/views/auth/passwords/new.html.haml b/app/views/auth/passwords/new.html.haml index f4d22031a..bae5b24ba 100644 --- a/app/views/auth/passwords/new.html.haml +++ b/app/views/auth/passwords/new.html.haml @@ -4,7 +4,8 @@ = simple_form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| = render 'shared/error_messages', object: resource - = f.input :email, autofocus: true, required: true, placeholder: t('simple_form.labels.defaults.email'), input_html: { 'aria-label' => t('simple_form.labels.defaults.email') } + .fields-group + = f.input :email, autofocus: true, wrapper: :with_label, label: t('simple_form.labels.defaults.email'), input_html: { 'aria-label' => t('simple_form.labels.defaults.email') }, hint: false .actions = f.button :button, t('auth.reset_password'), type: :submit diff --git a/app/views/auth/registrations/edit.html.haml b/app/views/auth/registrations/edit.html.haml index 05fc7df31..7fc08a23b 100644 --- a/app/views/auth/registrations/edit.html.haml +++ b/app/views/auth/registrations/edit.html.haml @@ -1,24 +1,32 @@ - content_for :page_title do = t('auth.security') -%h4= t('auth.change_password') = simple_form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put, class: 'auth_edit' }) do |f| = render 'shared/error_messages', object: resource - if !use_seamless_external_login? || resource.encrypted_password.present? - = f.input :email, placeholder: t('simple_form.labels.defaults.email'), input_html: { 'aria-label' => t('simple_form.labels.defaults.email') } - = f.input :password, placeholder: t('simple_form.labels.defaults.new_password'), input_html: { 'aria-label' => t('simple_form.labels.defaults.new_password'), :autocomplete => 'off' } - = f.input :password_confirmation, placeholder: t('simple_form.labels.defaults.confirm_new_password'), input_html: { 'aria-label' => t('simple_form.labels.defaults.confirm_new_password'), :autocomplete => 'off' } - = f.input :current_password, placeholder: t('simple_form.labels.defaults.current_password'), input_html: { 'aria-label' => t('simple_form.labels.defaults.current_password'), :autocomplete => 'off' } + .fields-group + = f.input :email, wrapper: :with_label, input_html: { 'aria-label' => t('simple_form.labels.defaults.email') }, required: true, hint: false + + .fields-group + = f.input :password, wrapper: :with_label, input_html: { 'aria-label' => t('simple_form.labels.defaults.new_password'), :autocomplete => 'off' }, hint: false + + .fields-group + = f.input :password_confirmation, wrapper: :with_label, label: t('simple_form.labels.defaults.confirm_new_password'), input_html: { 'aria-label' => t('simple_form.labels.defaults.confirm_new_password'), :autocomplete => 'off' } + + .fields-group + = f.input :current_password, wrapper: :with_label, input_html: { 'aria-label' => t('simple_form.labels.defaults.current_password'), :autocomplete => 'off' }, required: true .actions = f.button :button, t('generic.save_changes'), type: :submit - else %p.hint= t('users.seamless_external_login') +%hr.spacer/ + = render 'sessions' - if open_deletion? - + %hr.spacer/ %h4= t('auth.delete_account') %p.muted-hint= t('auth.delete_account_html', path: settings_delete_path) diff --git a/app/views/auth/registrations/new.html.haml b/app/views/auth/registrations/new.html.haml index 200ed42de..72ce8e531 100644 --- a/app/views/auth/registrations/new.html.haml +++ b/app/views/auth/registrations/new.html.haml @@ -13,18 +13,22 @@ = render 'application/card', account: @invite.user.account = f.simple_fields_for :account do |ff| - .input-with-append - = ff.input :username, autofocus: true, placeholder: t('simple_form.labels.defaults.username'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.username'), :autocomplete => 'off' } - .append - = "@#{site_hostname}" - - = f.input :email, placeholder: t('simple_form.labels.defaults.email'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.email'), :autocomplete => 'off' } - = f.input :password, placeholder: t('simple_form.labels.defaults.password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.password'), :autocomplete => 'off' } - = f.input :password_confirmation, placeholder: t('simple_form.labels.defaults.confirm_password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.confirm_password'), :autocomplete => 'off' } + .fields-group + = ff.input :username, wrapper: :with_label, autofocus: true, label: t('simple_form.labels.defaults.username'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.username'), :autocomplete => 'off' }, append: "@#{site_hostname}", hint: t('simple_form.hints.defaults.username', domain: site_hostname) + + .fields-group + = f.input :email, wrapper: :with_label, label: t('simple_form.labels.defaults.email'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.email'), :autocomplete => 'off' } + + .fields-group + = f.input :password, wrapper: :with_label, label: t('simple_form.labels.defaults.password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.password'), :autocomplete => 'off' } + .fields-group + = f.input :password_confirmation, wrapper: :with_label, label: t('simple_form.labels.defaults.confirm_password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.confirm_password'), :autocomplete => 'off' } + = f.input :invite_code, as: :hidden + %p.hint= t('auth.agreement_html', rules_path: about_more_path, terms_path: terms_path) + .actions = f.button :button, t('auth.register'), type: :submit - %p.hint.subtle-hint=t('auth.agreement_html', rules_path: about_more_path, terms_path: terms_path) .form-footer= render 'auth/shared/links' diff --git a/app/views/auth/sessions/new.html.haml b/app/views/auth/sessions/new.html.haml index 0c9f9d5fe..ceb169408 100644 --- a/app/views/auth/sessions/new.html.haml +++ b/app/views/auth/sessions/new.html.haml @@ -5,11 +5,13 @@ = render partial: 'shared/og' = simple_form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| - - if use_seamless_external_login? - = f.input :email, autofocus: true, placeholder: t('simple_form.labels.defaults.username_or_email'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.username_or_email') } - - else - = f.input :email, autofocus: true, placeholder: t('simple_form.labels.defaults.email'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.email') } - = f.input :password, placeholder: t('simple_form.labels.defaults.password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.password'), :autocomplete => 'off' } + .fields-group + - if use_seamless_external_login? + = f.input :email, autofocus: true, wrapper: :with_label, label: t('simple_form.labels.defaults.username_or_email'), input_html: { 'aria-label' => t('simple_form.labels.defaults.username_or_email') }, hint: false + - else + = f.input :email, autofocus: true, wrapper: :with_label, label: t('simple_form.labels.defaults.email'), input_html: { 'aria-label' => t('simple_form.labels.defaults.email') }, hint: false + .fields-group + = f.input :password, wrapper: :with_label, label: t('simple_form.labels.defaults.password'), input_html: { 'aria-label' => t('simple_form.labels.defaults.password'), :autocomplete => 'off' }, hint: false .actions = f.button :button, t('auth.login'), type: :submit diff --git a/app/views/auth/sessions/two_factor.html.haml b/app/views/auth/sessions/two_factor.html.haml index 1af3193ae..4e6bbd7a9 100644 --- a/app/views/auth/sessions/two_factor.html.haml +++ b/app/views/auth/sessions/two_factor.html.haml @@ -4,7 +4,8 @@ = simple_form_for(resource, as: resource_name, url: session_path(resource_name), method: :post) do |f| %p.hint{ style: 'margin-bottom: 25px' }= t('simple_form.hints.sessions.otp') - = f.input :otp_attempt, type: :number, placeholder: t('simple_form.labels.defaults.otp_attempt'), input_html: { 'aria-label' => t('simple_form.labels.defaults.otp_attempt'), :autocomplete => 'off' }, required: true, autofocus: true + .fields-group + = f.input :otp_attempt, type: :number, wrapper: :with_label, label: t('simple_form.labels.defaults.otp_attempt'), input_html: { 'aria-label' => t('simple_form.labels.defaults.otp_attempt'), :autocomplete => 'off' }, autofocus: true .actions = f.button :button, t('auth.login'), type: :submit diff --git a/app/views/filters/_fields.html.haml b/app/views/filters/_fields.html.haml index a5a3f0337..fb94a07fc 100644 --- a/app/views/filters/_fields.html.haml +++ b/app/views/filters/_fields.html.haml @@ -1,14 +1,16 @@ -.fields-group - = f.input :phrase, as: :string, wrapper: :with_block_label +.fields-row + .fields-row__column.fields-row__column-6.fields-group + = f.input :phrase, as: :string, wrapper: :with_label, hint: false + .fields-row__column.fields-row__column-6.fields-group + = f.input :expires_in, wrapper: :with_label, collection: [30.minutes, 1.hour, 6.hours, 12.hours, 1.day, 1.week].map(&:to_i), label_method: lambda { |i| I18n.t("invites.expires_in.#{i}") }, prompt: I18n.t('invites.expires_in_prompt') .fields-group = f.input :context, wrapper: :with_block_label, collection: CustomFilter::VALID_CONTEXTS, as: :check_boxes, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li', label_method: lambda { |context| I18n.t("filters.contexts.#{context}") }, include_blank: false +%hr.spacer/ + .fields-group = f.input :irreversible, wrapper: :with_label .fields-group = f.input :whole_word, wrapper: :with_label - -.fields-group - = f.input :expires_in, wrapper: :with_label, collection: [30.minutes, 1.hour, 6.hours, 12.hours, 1.day, 1.week].map(&:to_i), label_method: lambda { |i| I18n.t("invites.expires_in.#{i}") }, prompt: I18n.t('invites.expires_in_prompt') diff --git a/app/views/invites/_form.html.haml b/app/views/invites/_form.html.haml index 42a107bb2..3a2a5ef0e 100644 --- a/app/views/invites/_form.html.haml +++ b/app/views/invites/_form.html.haml @@ -1,9 +1,11 @@ = simple_form_for(@invite, url: controller.is_a?(Admin::InvitesController) ? admin_invites_path : invites_path) do |f| = render 'shared/error_messages', object: @invite - .fields-group - = f.input :max_uses, wrapper: :with_label, collection: [1, 5, 10, 25, 50, 100], label_method: lambda { |num| I18n.t('invites.max_uses', count: num) }, prompt: I18n.t('invites.max_uses_prompt') - = f.input :expires_in, wrapper: :with_label, collection: [30.minutes, 1.hour, 6.hours, 12.hours, 1.day, 1.week].map(&:to_i), label_method: lambda { |i| I18n.t("invites.expires_in.#{i}") }, prompt: I18n.t('invites.expires_in_prompt') + .fields-row + .fields-row__column.fields-row__column-6.fields-group + = f.input :max_uses, wrapper: :with_label, collection: [1, 5, 10, 25, 50, 100], label_method: lambda { |num| I18n.t('invites.max_uses', count: num) }, prompt: I18n.t('invites.max_uses_prompt') + .fields-row__column.fields-row__column-6.fields-group + = f.input :expires_in, wrapper: :with_label, collection: [30.minutes, 1.hour, 6.hours, 12.hours, 1.day, 1.week].map(&:to_i), label_method: lambda { |i| I18n.t("invites.expires_in.#{i}") }, prompt: I18n.t('invites.expires_in_prompt') .fields-group = f.input :autofollow, wrapper: :with_label diff --git a/app/views/invites/index.html.haml b/app/views/invites/index.html.haml index f4c5047fa..fb827f6e6 100644 --- a/app/views/invites/index.html.haml +++ b/app/views/invites/index.html.haml @@ -6,7 +6,7 @@ = render 'form' - %hr/ + %hr.spacer/ %table.table %thead diff --git a/app/views/layouts/modal.html.haml b/app/views/layouts/modal.html.haml index a86b4fd3f..b6e33ca91 100644 --- a/app/views/layouts/modal.html.haml +++ b/app/views/layouts/modal.html.haml @@ -5,7 +5,7 @@ .name = t 'users.signed_in_as' %span.username @#{current_account.local_username_and_domain} - = link_to destroy_user_session_path, method: :delete, class: 'logout-link icon-button' do + = link_to destroy_user_session_path(continue: true), method: :delete, class: 'logout-link icon-button' do = fa_icon 'sign-out' .container-alt= yield diff --git a/app/views/settings/applications/_fields.html.haml b/app/views/settings/applications/_fields.html.haml index db90df349..6a2863b20 100644 --- a/app/views/settings/applications/_fields.html.haml +++ b/app/views/settings/applications/_fields.html.haml @@ -1,6 +1,8 @@ .fields-group - = f.input :name, placeholder: t('activerecord.attributes.doorkeeper/application.name') - = f.input :website, placeholder: t('activerecord.attributes.doorkeeper/application.website') + = f.input :name, wrapper: :with_label, label: t('activerecord.attributes.doorkeeper/application.name') + +.fields-group + = f.input :website, wrapper: :with_label, label: t('activerecord.attributes.doorkeeper/application.website') .fields-group = f.input :redirect_uri, wrapper: :with_block_label, label: t('activerecord.attributes.doorkeeper/application.redirect_uri'), hint: t('doorkeeper.applications.help.redirect_uri') diff --git a/app/views/settings/exports/show.html.haml b/app/views/settings/exports/show.html.haml index 792dccd9e..6c030b1ab 100644 --- a/app/views/settings/exports/show.html.haml +++ b/app/views/settings/exports/show.html.haml @@ -9,7 +9,7 @@ %td= number_to_human_size @export.total_storage %td %tr - %th= t('accounts.statuses', count: @export.total_statuses) + %th= t('accounts.posts', count: @export.total_statuses) %td= number_with_delimiter @export.total_statuses %td %tr diff --git a/app/views/settings/imports/show.html.haml b/app/views/settings/imports/show.html.haml index 2b43cb134..4512fc714 100644 --- a/app/views/settings/imports/show.html.haml +++ b/app/views/settings/imports/show.html.haml @@ -2,10 +2,8 @@ = t('settings.import') = simple_form_for @import, url: settings_import_path do |f| - %p.hint= t('imports.preface') - .field-group - = f.input :type, collection: Import.types.keys, wrapper: :with_label, include_blank: false, label_method: lambda { |type| I18n.t("imports.types.#{type}") }, as: :radio_buttons, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li' + = f.input :type, collection: Import.types.keys, wrapper: :with_block_label, include_blank: false, label_method: lambda { |type| I18n.t("imports.types.#{type}") }, hint: t('imports.preface') .field-group = f.input :data, wrapper: :with_block_label, hint: t('simple_form.hints.imports.data') diff --git a/app/views/settings/preferences/show.html.haml b/app/views/settings/preferences/show.html.haml index 9092780c3..bb267db8a 100644 --- a/app/views/settings/preferences/show.html.haml +++ b/app/views/settings/preferences/show.html.haml @@ -1,29 +1,32 @@ - content_for :page_title do = t('settings.preferences') +%ul.quick-nav + %li= link_to t('preferences.languages'), '#settings_languages' + %li= link_to t('preferences.publishing'), '#settings_publishing' + %li= link_to t('preferences.other'), '#settings_other' + %li= link_to t('preferences.web'), '#settings_web' + = simple_form_for current_user, url: settings_preferences_path, html: { method: :put } do |f| = render 'shared/error_messages', object: current_user - .actions.actions--top - = f.button :button, t('generic.save_changes'), type: :submit - - %h4= t 'preferences.languages' + .fields-row#settings_languages + .fields-group.fields-row__column.fields-row__column-6 + = f.input :locale, collection: I18n.available_locales, wrapper: :with_label, include_blank: false, label_method: lambda { |locale| human_locale(locale) }, selected: I18n.locale + .fields-group.fields-row__column.fields-row__column-6 + = f.input :setting_default_language, collection: [nil] + filterable_languages.sort, wrapper: :with_label, label_method: lambda { |locale| locale.nil? ? I18n.t('statuses.language_detection') : human_locale(locale) }, required: false, include_blank: false .fields-group - = f.input :locale, collection: I18n.available_locales, wrapper: :with_label, include_blank: false, label_method: lambda { |locale| human_locale(locale) }, selected: I18n.locale - - = f.input :setting_default_language, collection: [nil] + filterable_languages.sort, wrapper: :with_label, label_method: lambda { |locale| locale.nil? ? I18n.t('statuses.language_detection') : human_locale(locale) }, required: false, include_blank: false - = f.input :chosen_languages, collection: filterable_languages.sort, wrapper: :with_block_label, include_blank: false, label_method: lambda { |locale| human_locale(locale) }, required: false, as: :check_boxes, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li' - %h4= t 'preferences.publishing' + %hr#settings_publishing/ .fields-group - = f.input :setting_default_privacy, collection: Status.visibilities.keys - ['direct'], wrapper: :with_label, include_blank: false, label_method: lambda { |visibility| safe_join([I18n.t("statuses.visibilities.#{visibility}"), content_tag(:span, I18n.t("statuses.visibilities.#{visibility}_long"), class: 'hint')]) }, required: false, as: :radio_buttons, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li' + = f.input :setting_default_privacy, collection: Status.visibilities.keys - ['direct'], wrapper: :with_floating_label, include_blank: false, label_method: lambda { |visibility| safe_join([I18n.t("statuses.visibilities.#{visibility}"), content_tag(:span, I18n.t("statuses.visibilities.#{visibility}_long"), class: 'hint')]) }, required: false, as: :radio_buttons, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li' = f.input :setting_default_sensitive, as: :boolean, wrapper: :with_label - %h4= t 'preferences.other' + %hr#settings_other/ .fields-group = f.input :setting_noindex, as: :boolean, wrapper: :with_label @@ -31,7 +34,7 @@ .fields-group = f.input :setting_hide_network, as: :boolean, wrapper: :with_label - %h4= t 'preferences.web' + %hr#settings_web/ .fields-group = f.input :setting_unfollow_modal, as: :boolean, wrapper: :with_label diff --git a/app/views/settings/profiles/show.html.haml b/app/views/settings/profiles/show.html.haml index 1acbb9b8a..6b61fa9c9 100644 --- a/app/views/settings/profiles/show.html.haml +++ b/app/views/settings/profiles/show.html.haml @@ -4,16 +4,21 @@ = simple_form_for @account, url: settings_profile_path, html: { method: :put } do |f| = render 'shared/error_messages', object: @account - .fields-group - = f.input :display_name, placeholder: t('simple_form.labels.defaults.display_name'), hint: t('simple_form.hints.defaults.display_name', count: 30 - @account.display_name.size).html_safe - = f.input :note, placeholder: t('simple_form.labels.defaults.note'), hint: t('simple_form.hints.defaults.note', count: 500 - @account.note.size).html_safe + .fields-row + .fields-row__column.fields-group.fields-row__column-6 + = f.input :display_name, wrapper: :with_label, hint: t('simple_form.hints.defaults.display_name', count: 30 - @account.display_name.size).html_safe + = f.input :note, wrapper: :with_label, hint: t('simple_form.hints.defaults.note', count: 500 - @account.note.size).html_safe - = render 'application/card', account: @account + .fields-row + .fields-row__column.fields-row__column-6 + = render 'application/card', account: @account - .fields-group - = f.input :avatar, wrapper: :with_label, input_html: { accept: AccountAvatar::IMAGE_MIME_TYPES.join(',') }, hint: t('simple_form.hints.defaults.avatar', dimensions: '400x400', size: number_to_human_size(AccountAvatar::LIMIT)) + .fields-row__column.fields-group.fields-row__column-6 + = f.input :avatar, wrapper: :with_label, input_html: { accept: AccountAvatar::IMAGE_MIME_TYPES.join(',') }, hint: t('simple_form.hints.defaults.avatar', dimensions: '400x400', size: number_to_human_size(AccountAvatar::LIMIT)) + + = f.input :header, wrapper: :with_label, input_html: { accept: AccountHeader::IMAGE_MIME_TYPES.join(',') }, hint: t('simple_form.hints.defaults.header', dimensions: '1500x500', size: number_to_human_size(AccountHeader::LIMIT)) - = f.input :header, wrapper: :with_label, input_html: { accept: AccountHeader::IMAGE_MIME_TYPES.join(',') }, hint: t('simple_form.hints.defaults.header', dimensions: '1500x500', size: number_to_human_size(AccountHeader::LIMIT)) + %hr.spacer/ .fields-group = f.input :locked, as: :boolean, wrapper: :with_label, hint: t('simple_form.hints.defaults.locked') @@ -21,15 +26,27 @@ .fields-group = f.input :bot, as: :boolean, wrapper: :with_label, hint: t('simple_form.hints.defaults.bot') - .fields-group - .input.with_block_label - %label= t('simple_form.labels.defaults.fields') - %span.hint= t('simple_form.hints.defaults.fields') + %hr.spacer/ + + .fields-row + .fields-row__column.fields-group.fields-row__column-6 + .input.with_block_label + %label= t('simple_form.labels.defaults.fields') + %span.hint= t('simple_form.hints.defaults.fields') - = f.simple_fields_for :fields do |fields_f| - .row - = fields_f.input :name, placeholder: t('simple_form.labels.account.fields.name') - = fields_f.input :value, placeholder: t('simple_form.labels.account.fields.value') + = f.simple_fields_for :fields do |fields_f| + .row + = fields_f.input :name, placeholder: t('simple_form.labels.account.fields.name') + = fields_f.input :value, placeholder: t('simple_form.labels.account.fields.value') + + .fields-row__column.fields-group.fields-row__column-6 + %h6= t('verification.verification') + %p.hint= t('verification.explanation_html') + + .input-copy + .input-copy__wrapper + %input{ type: :text, maxlength: '999', spellcheck: 'false', readonly: 'true', value: link_to('Mastodon', ActivityPub::TagManager.instance.url_for(@account), rel: 'me').to_str } + %button{ type: :button }= t('generic.copy') .actions = f.button :button, t('generic.save_changes'), type: :submit @@ -38,3 +55,9 @@ %h6= t('auth.migrate_account') %p.muted-hint= t('auth.migrate_account_html', path: settings_migration_path) + +- if open_deletion? + %hr.spacer/ + + %h6= t('auth.delete_account') + %p.muted-hint= t('auth.delete_account_html', path: settings_delete_path) diff --git a/app/views/settings/two_factor_authentication/confirmations/new.html.haml b/app/views/settings/two_factor_authentication/confirmations/new.html.haml index fd4a3e768..e64155299 100644 --- a/app/views/settings/two_factor_authentication/confirmations/new.html.haml +++ b/app/views/settings/two_factor_authentication/confirmations/new.html.haml @@ -11,7 +11,8 @@ %p.hint= t('two_factor_authentication.manual_instructions') %samp.qr-alternative__code= current_user.otp_secret.scan(/.{4}/).join(' ') - = f.input :code, hint: t('two_factor_authentication.code_hint'), placeholder: t('simple_form.labels.defaults.otp_attempt'), input_html: { :autocomplete => 'off' } + .fields-group + = f.input :code, wrapper: :with_label, hint: t('two_factor_authentication.code_hint'), label: t('simple_form.labels.defaults.otp_attempt'), input_html: { :autocomplete => 'off' }, required: true .actions = f.button :button, t('two_factor_authentication.enable'), type: :submit diff --git a/app/views/settings/two_factor_authentications/show.html.haml b/app/views/settings/two_factor_authentications/show.html.haml index 67a64a046..259bcd1ef 100644 --- a/app/views/settings/two_factor_authentications/show.html.haml +++ b/app/views/settings/two_factor_authentications/show.html.haml @@ -10,7 +10,7 @@ %hr/ = simple_form_for @confirmation, url: settings_two_factor_authentication_path, method: :delete do |f| - = f.input :code, hint: t('two_factor_authentication.code_hint'), placeholder: t('simple_form.labels.defaults.otp_attempt'), input_html: { :autocomplete => 'off' } + = f.input :code, wrapper: :with_label, hint: t('two_factor_authentication.code_hint'), label: t('simple_form.labels.defaults.otp_attempt'), input_html: { :autocomplete => 'off' }, required: true .actions = f.button :button, t('two_factor_authentication.disable'), type: :submit diff --git a/app/workers/verify_account_links_worker.rb b/app/workers/verify_account_links_worker.rb new file mode 100644 index 000000000..901498583 --- /dev/null +++ b/app/workers/verify_account_links_worker.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +class VerifyAccountLinksWorker + include Sidekiq::Worker + + sidekiq_options queue: 'pull', retry: false, unique: :until_executed + + def perform(account_id) + account = Account.find(account_id) + + account.fields.each do |field| + next unless !field.verified? && field.verifiable? + VerifyLinkService.new.call(field) + end + + account.save! if account.changed? + rescue ActiveRecord::RecordNotFound + true + end +end diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 000000000..a506ad8ce --- /dev/null +++ b/babel.config.js @@ -0,0 +1,65 @@ +module.exports = (api) => { + const env = api.env(); + + const envOptions = { + debug: false, + loose: true, + modules: false, + }; + + const config = { + presets: [ + '@babel/react', + ['@babel/env', envOptions], + ], + plugins: [ + '@babel/syntax-dynamic-import', + ['@babel/proposal-object-rest-spread', { useBuiltIns: true }], + ['@babel/proposal-decorators', { legacy: true }], + '@babel/proposal-class-properties', + ['react-intl', { messagesDir: './build/messages' }], + 'preval', + ], + }; + + switch (env) { + case 'production': + envOptions.debug = false; + config.plugins.push(...[ + 'lodash', + [ + 'transform-react-remove-prop-types', + { + mode: 'remove', + removeImport: true, + additionalLibraries: [ + 'react-immutable-proptypes', + ], + }, + ], + '@babel/transform-react-inline-elements', + [ + '@babel/transform-runtime', + { + helpers: true, + regenerator: false, + useESModules: true, + }, + ], + ]); + break; + case 'development': + envOptions.debug = true; + config.plugins.push(...[ + '@babel/transform-react-jsx-source', + '@babel/transform-react-jsx-self', + ]); + break; + case 'test': + envOptions.modules = 'commonjs'; + break; + } + + return config; +}; + diff --git a/bin/tootctl b/bin/tootctl index 2fe02523a..f26e1c7ed 100755 --- a/bin/tootctl +++ b/bin/tootctl @@ -1,4 +1,5 @@ #!/usr/bin/env ruby APP_PATH = File.expand_path('../config/application', __dir__) +require_relative '../config/boot' require_relative '../lib/cli' Mastodon::CLI.start(ARGV) diff --git a/bin/webpack b/bin/webpack index 0869ad277..465832722 100755 --- a/bin/webpack +++ b/bin/webpack @@ -1,7 +1,7 @@ #!/usr/bin/env ruby ENV["RAILS_ENV"] ||= ENV["RACK_ENV"] || "development" -ENV["NODE_ENV"] ||= ENV["NODE_ENV"] || "development" +ENV["NODE_ENV"] ||= "development" require "pathname" ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", diff --git a/bin/webpack-dev-server b/bin/webpack-dev-server index 251f65e8e..faa69f078 100755 --- a/bin/webpack-dev-server +++ b/bin/webpack-dev-server @@ -1,7 +1,7 @@ #!/usr/bin/env ruby ENV["RAILS_ENV"] ||= ENV["RACK_ENV"] || "development" -ENV["NODE_ENV"] ||= ENV["NODE_ENV"] || "development" +ENV["NODE_ENV"] ||= "development" require "pathname" ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", diff --git a/config/application.rb b/config/application.rb index 151b1d0b4..06ff8ed36 100644 --- a/config/application.rb +++ b/config/application.rb @@ -43,6 +43,7 @@ module Mastodon :bg, :ca, :co, + :cs, :cy, :da, :de, diff --git a/config/environments/test.rb b/config/environments/test.rb index 1c1891561..a35cadcfa 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -23,7 +23,7 @@ Rails.application.configure do config.consider_all_requests_local = true config.action_controller.perform_caching = false - # The default store, file_store is shared by processses parallely executed + # The default store, file_store is shared by processes parallelly executed # and should not be used. config.cache_store = :memory_store diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index cd9bacf68..3e4c9a79d 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -10,6 +10,7 @@ Warden::Manager.after_set_user except: :fetch do |user, warden| expires: 1.year.from_now, httponly: true, secure: (Rails.env.production? || ENV['LOCAL_HTTPS'] == 'true'), + same_site: :lax, } end @@ -20,6 +21,7 @@ Warden::Manager.after_fetch do |user, warden| expires: 1.year.from_now, httponly: true, secure: (Rails.env.production? || ENV['LOCAL_HTTPS'] == 'true'), + same_site: :lax, } else warden.logout diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb index 3dc0edd6f..c0757b6b5 100644 --- a/config/initializers/session_store.rb +++ b/config/initializers/session_store.rb @@ -1,3 +1,3 @@ # Be sure to restart your server when you modify this file. -Rails.application.config.session_store :cookie_store, key: '_mastodon_session', secure: (Rails.env.production? || ENV['LOCAL_HTTPS'] == 'true') +Rails.application.config.session_store :cookie_store, key: '_mastodon_session', secure: (Rails.env.production? || ENV['LOCAL_HTTPS'] == 'true'), same_site: :lax diff --git a/config/initializers/simple_form.rb b/config/initializers/simple_form.rb index 5983918cd..386ede654 100644 --- a/config/initializers/simple_form.rb +++ b/config/initializers/simple_form.rb @@ -1,4 +1,15 @@ # Use this setup block to configure all options available in SimpleForm. + +module AppendComponent + def append(wrapper_options = nil) + @append ||= begin + options[:append].to_s.html_safe if options[:append].present? + end + end +end + +SimpleForm.include_component(AppendComponent) + SimpleForm.setup do |config| # Wrappers are used by the form builder to generate a # complete input. You can remove any component from the @@ -52,6 +63,22 @@ SimpleForm.setup do |config| config.wrappers :with_label, class: [:input, :with_label], hint_class: :field_with_hint, error_class: :field_with_errors do |b| b.use :html5 + + b.wrapper tag: :div, class: :label_input do |ba| + ba.use :label + + ba.wrapper tag: :div, class: :label_input__wrapper do |bb| + bb.use :input + bb.optional :append, wrap_with: { tag: :div, class: 'label_input__append' } + end + end + + b.use :hint, wrap_with: { tag: :span, class: :hint } + b.use :error, wrap_with: { tag: :span, class: :error } + end + + config.wrappers :with_floating_label, class: [:input, :with_floating_label], hint_class: :field_with_hint, error_class: :field_with_errors do |b| + b.use :html5 b.use :label_input, wrap_with: { tag: :div, class: :label_input } b.use :hint, wrap_with: { tag: :span, class: :hint } b.use :error, wrap_with: { tag: :span, class: :error } @@ -111,12 +138,12 @@ SimpleForm.setup do |config| # config.item_wrapper_class = nil # How the label text should be generated altogether with the required text. - # config.label_text = lambda { |label, required, explicit_label| "#{required} #{label}" } + config.label_text = lambda { |label, required, explicit_label| "#{label} #{required}" } # You can define the class to use on all labels. Default is nil. # config.label_class = nil - # You can define the default class to be used on forms. Can be overriden + # You can define the default class to be used on forms. Can be overridden # with `html: { :class }`. Defaulting to none. # config.default_form_class = nil diff --git a/config/initializers/twitter_regex.rb b/config/initializers/twitter_regex.rb index c227f92d3..76b23f416 100644 --- a/config/initializers/twitter_regex.rb +++ b/config/initializers/twitter_regex.rb @@ -28,7 +28,7 @@ module Twitter )/iox REGEXEN[:valid_url] = %r{ ( # $1 total match - (#{REGEXEN[:valid_url_preceding_chars]}) # $2 Preceeding chracter + (#{REGEXEN[:valid_url_preceding_chars]}) # $2 Preceding character ( # $3 URL ((https?|dat|dweb|ipfs|ipns|ssb|gopher):\/\/)? # $4 Protocol (optional) (#{REGEXEN[:valid_domain]}) # $5 Domain(s) diff --git a/config/locales/activerecord.ast.yml b/config/locales/activerecord.ast.yml index 0b77eecf2..0d161faf2 100644 --- a/config/locales/activerecord.ast.yml +++ b/config/locales/activerecord.ast.yml @@ -1,2 +1 @@ ---- -ast: +ast: {} diff --git a/config/locales/activerecord.cy.yml b/config/locales/activerecord.cy.yml index f1dabe347..55eb78e74 100644 --- a/config/locales/activerecord.cy.yml +++ b/config/locales/activerecord.cy.yml @@ -1,3 +1,13 @@ --- cy: - activerecord: {} + activerecord: + errors: + models: + account: + attributes: + username: + invalid: dim ond llythrennau, rhifau a tanlinellau + status: + attributes: + reblog: + taken: o'r statws sy'n bodoli'n barod diff --git a/config/locales/ar.yml b/config/locales/ar.yml index eee2bb0b9..94f0cbf8a 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -30,17 +30,23 @@ ar: other_instances: خوادم أخرى privacy_policy: سياسة الخصوصية source_code: الشفرة المصدرية - status_count_after: منشورات + status_count_after: + one: منشور + other: منشورات status_count_before: نشروا terms: شروط الخدمة - user_count_after: مستخدِمين + user_count_after: + one: مستخدِم + other: مستخدِمين user_count_before: يستضيف what_is_mastodon: ما هو ماستدون ؟ accounts: choices_html: 'توصيات %{name} :' follow: إتبع - followers: متابِعون - following: يتابعون + followers: + one: مُتابِع + other: مُتابِعون + following: مُتابَع joined: انضم·ت في %{date} media: الوسائط moved_html: "%{name} إنتقلَ إلى %{new_profile_link} :" @@ -50,7 +56,9 @@ ar: people_who_follow: الأشخاص الذين يتبعون %{name} pin_errors: following: يجب أن تكون مِن متابعي حساب الشخص الذي تريد إبرازه - posts: تبويقات + posts: + one: تبويق + other: تبويقات posts_tab_heading: تبويقات posts_with_replies: التبويقات و الردود reserved_username: إسم المستخدم محجوز @@ -256,7 +264,9 @@ ar: suspend: تعليق severity: الشدة show: - affected_accounts: هناك %{count} حسابات في قاعدة البيانات متأثرة بذلك + affected_accounts: + one: حساب واحد معني في قاعدة البيانات + other: "%{count} حسابات معنية في قاعدة البيانات" retroactive: silence: إلغاء الكتم عن كافة الحسابات المتواجدة على هذا النطاق suspend: إلغاء التعليق المفروض على كافة حسابات هذا النطاق @@ -313,7 +323,6 @@ ar: comment: none: لا شيء created_at: ذكرت - id: معرّف ID mark_as_resolved: إعتبار التقرير كمحلول mark_as_unresolved: علام كغير محلولة notes: @@ -324,7 +333,6 @@ ar: placeholder: قم بوصف الإجراءات التي تم اتخاذها أو أي تحديثات أخرى ذات علاقة … reopen: إعادة فتح التقرير report: 'التقرير #%{id}' - report_contents: المحتويات reported_account: حساب مُبلّغ عنه reported_by: أبلغ عنه من طرف resolved: معالجة @@ -332,12 +340,10 @@ ar: silence_account: كتم و إخفاء الحساب status: الحالة suspend_account: فرض تعليق على الحساب - target: الهدف title: التقارير unassign: إلغاء تعيين unresolved: غير معالجة updated_at: محدث - view: عرض settings: activity_api_enabled: desc_html: عدد المنشورات المحلية و المستخدمين النشطين و التسجيلات الأسبوعية الجديدة @@ -358,6 +364,7 @@ ar: desc_html: أسماء النطاقات التي إلتقى بها مثيل الخادوم على البيئة الموحَّدة فيديفرس title: نشر عدد مثيلات الخوادم التي تم مصادفتها preview_sensitive_media: + desc_html: روابط المُعَاينة على مواقع الويب الأخرى ستقوم بعرض صُوَر مصغّرة حتى و إن كانت الوسائط حساسة. title: إظهار الصور الحساسة في مُعاينات أوبن غراف registrations: closed_message: @@ -532,6 +539,9 @@ ar: thread: المحادثات edit: title: تعديل عامل التصفية + errors: + invalid_context: لم تقم بتحديد أي مجال أو أنّ المجال غير صالح + invalid_irreversible: إلّا مجالات الإشعارات و الخيط الرئيسي معنية بالتصفية اللارجعية index: delete: إزالة title: عوامل التصفية @@ -553,9 +563,11 @@ ar: generic: changes_saved_msg: تم حفظ التعديلات بنجاح ! save_changes: حفظ التغييرات - validation_errors: هناك شيء ليس على ما يرام ! رجاءًا تحقق من الأخطاء الـ %{count} أسفله + validation_errors: + one: هناك شيء ما لا يبدو أنه على ما يُرام بعدُ. يُرجى الإطلاع على الخطأ أدناه + other: هناك شيء ليس على ما يُرام! يُرجى معاينة الأخطاء الـ %{count} التالية imports: - preface: You can import certain data like all the people you are following or blocking into your account on this instance, from files created by an export on another instance. + preface: بإمكانك استيراد بيانات قد قُمتَ بتصديرها مِن مثيل خادوم آخَر، كقوائم المستخدِمين الذين كنتَ تتابِعهم أو قُمتَ بحظرهم. success: تم تحميل بياناتك بنجاح وسيتم معالجتها في الوقت المناسب types: blocking: قائمة المحظورين @@ -576,7 +588,9 @@ ar: expires_in_prompt: أبدا generate: توليد invited_by: 'تمت دعوتك من طرف :' - max_uses: "%{count} استخدامات" + max_uses: + one: استعمال واحد + other: "%{count} استخدامات" max_uses_prompt: بلا حدود prompt: توليد و مشاركة روابط للسماح للآخَرين بالنفاذ إلى مثيل الخادوم هذا table: @@ -602,8 +616,11 @@ ar: action: معاينة كافة الإشعارات body: هذا هو مُلَخَّص الرسائل التي فاتتك وذلك منذ آخر زيارة لك في %{since} mention: "%{name} أشار إليك في :" - new_followers_summary: و لقد تحصلت على %{count} متتبعين جدد أثناء فترة غيابك ! رائع ! - subject: "%{count} إشعارات جديدة منذ زيارتك الأخيرة \U0001F418" + new_followers_summary: + one: و لقد تحصّلت أيضا على متابِع جديد أثناء فترة غيابك! يا للروعة! + subject: + one: "إشعار جديد واحد منذ آخر زيارة لك لـ \U0001F418" + other: "%{count} إشعارات جديدة منذ آخر زيارة لك إلى \U0001F418" title: أثناء فترة غيابك … favourite: body: 'أُعجب %{name} بمنشورك :' @@ -721,11 +738,17 @@ ar: statuses: attached: description: 'مُرفَق : %{attached}' - image: "%{count} صور" - video: "%{count} فيديوهات" + image: + one: "%{count} صورة" + other: "%{count} صُوَر" + video: + one: "%{count} فيديو" + other: "%{count} فيديوهات" boosted_from_html: تم إعادة ترقيته مِن %{acct_link} content_warning: 'تحذير عن المحتوى : %{warning}' - disallowed_hashtags: 'يحتوي على وسوم ممنوعة : %{tags}' + disallowed_hashtags: + one: 'يحتوي على وسم ممنوع: %{tags}' + other: 'يحتوي على أحد الوسوم الممنوعة: %{tags}' language_detection: اكتشاف اللغة تلقائيا open_in_web: إفتح في الويب over_character_limit: تم تجاوز حد الـ %{max} حرف المسموح بها @@ -746,7 +769,7 @@ ar: unlisted_long: يُمكن لأيٍ كان رُؤيتَه و لكن لن يُعرَض على الخيوط العامة stream_entries: pinned: تبويق مثبّت - reblogged: رقى + reblogged: رقّاه sensitive_content: محتوى حساس terms: title: شروط الخدمة وسياسة الخصوصية على %{instance} diff --git a/config/locales/ast.yml b/config/locales/ast.yml index 9cc80ef16..98986cdd0 100644 --- a/config/locales/ast.yml +++ b/config/locales/ast.yml @@ -4,8 +4,11 @@ ast: about_mastodon_html: Mastodon ye una rede social basada en protocolos abiertos y software de códigu llibre. Ye descentralizada, como'l corréu electrónicu. about_this: Tocante a administered_by: 'Alministráu por:' + api: API contact: Contautu + contact_missing: Nun s'afitó contact_unavailable: N/D + documentation: Documentación extended_description_html: | <h3>Un llugar bonu pa les regles</h3> <p>Entá nun se configuró la descripción estendida.</p> @@ -18,11 +21,16 @@ ast: hosted_on: Mastodon ta agospiáu en %{domain} learn_more: Deprendi más source_code: Códigu fonte - status_count_after: estaos + status_count_after: + other: estaos + terms: Términos del serviciu user_count_after: usuarios what_is_mastodon: "¿Qué ye Mastodon?" accounts: - followers: Siguidores + followers: + one: Siguidor + other: Siguidores + joined: Xunióse en %{date} moved_html: "%{name} mudóse a %{new_profile_link}:" network_hidden: Esta información nun ta disponible nothing_here: "¡Equí nun hai nada!" @@ -51,12 +59,14 @@ ast: admin: Alministrador moderator: Llendador user: Usuariu + statuses: Estaos title: Cuentes username: Nome d'usuariu web: Web action_logs: actions: create_domain_block: "%{name} bloquió'l dominiu %{target}" + disable_custom_emoji: "%{name} desactivó'l fustaxe %{target}" disable_user: "%{name} desactivó l'aniciu de sesión del usuariu %{target}" custom_emojis: by_domain: Dominiu @@ -88,7 +98,6 @@ ast: title: Invitaciones reports: are_you_sure: "¿De xuru?" - id: ID status: Estáu settings: registrations: @@ -102,6 +111,8 @@ ast: failed_to_execute: Fallu al executar subscriptions: title: WebSub + suspensions: + warning_html: 'El suspender esta cuenta va desaniciar <strong>de mou irreversible</strong> los sos datos qu''inclúin:' title: Alministración admin_mailer: new_report: @@ -112,12 +123,15 @@ ast: invalid_url: La URL apurrida nun ye válida warning: Ten curiáu con estos datos, ¡enxamás nun los compartas con naide! auth: + agreement_html: Aniciando sesión aceutes siguir <a href="%{rules_path}">les regles de la instancia</a> y <a href="%{terms_path}">los nuesos términos del serviciu</a>. change_password: Contraseña delete_account_html: Si deseyes desaniciar la to cuenta, pues <a href="%{path}">siguir equí</a>. Va pidísete la confirmación. forgot_password: "¿Escaeciesti la contraseña?" + login: Aniciar sesión providers: cas: CAS saml: SAML + register: Rexistrase security: Seguranza authorize_follow: already_following: Yá tas siguiendo a esta cuenta @@ -181,6 +195,7 @@ ast: acct: nome_usuariu@dominiu de la cuenta nueva notification_mailer: digest: + body: Equí hai un resume de los mensaxes que nun viesti dende la última visita'l %{since} mention: "%{name} mentóte en:" subject: other: "%{count} avisos nuevos dende la última visita \U0001F418" @@ -204,8 +219,13 @@ ast: languages: Llingües web: Web remote_follow: + acct: Introduz el nome_usuariu@dominiu dende'l que lo quies facer no_account_html: "¿Nun tienes una cuenta? Pues <a href='%{sign_up_path}' target='_blank'>rexistrate equí</a>" + proceed: Siguir prompt: 'Vas siguir a:' + remote_interaction: + proceed: Interactuar + prompt: 'Quies interactuar con esti toot:' remote_unfollow: error: Fallu sessions: @@ -251,6 +271,7 @@ ast: notifications: Avisos preferences: Preferencies settings: Axustes + two_factor_authentication: Autenticación en dos pasos statuses: attached: image: @@ -263,15 +284,21 @@ ast: limit: Yá fixesti'l númberu máxiumu de toots show_more: Amosar más title: "%{name}: «%{quote}»" + visibilities: + private: Namái siguidores stream_entries: sensitive_content: Conteníu sensible themes: default: Mastodon two_factor_authentication: code_hint: Introduz el códigu xeneráu pola aplicación autenticadora pa confirmar + disable: Desactivar enabled: L'autenticación en dos pasos ta activada enabled_success: L'autenticación en dos pasos activóse con ésitu + generate_recovery_codes: Xenerar códigos de recuperación + lost_recovery_codes: Los códigos de recuperación permítente recuperar l'accesu a la cuenta si pierdes el teléfonu. Si tamién pierdes esos códigos, pues xeneralos de nueves equí. Los códigos de recuperación vieyos van invalidase. manual_instructions: 'Si nun pues escaniar el códigu QR y precises introducilu a mano, equí ta''l secretu en testu planu:' + recovery_codes: Códigos de recuperación user_mailer: welcome: full_handle_hint: Esto ye lo que-yos diríes a los collacios pa que puean unviate mensaxes o siguite dende otra instancia. diff --git a/config/locales/ca.yml b/config/locales/ca.yml index e17e95832..a75a34d2c 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -322,7 +322,6 @@ ca: comment: none: Cap created_at: Reportat - id: ID mark_as_resolved: Marca com a resolt mark_as_unresolved: Marcar sense resoldre notes: @@ -333,7 +332,6 @@ ca: placeholder: Descriu les accions que s'han pres o qualsevol altra actualització relacionada… reopen: Reobrir informe report: 'Informe #%{id}' - report_contents: Contingut reported_account: Compte reportat reported_by: Reportat per resolved: Resolt @@ -341,12 +339,10 @@ ca: silence_account: Silencia el compte status: Estat suspend_account: Suspèn el compte - target: Objectiu title: Informes unassign: Treure assignació unresolved: No resolt updated_at: Actualitzat - view: Visualització settings: activity_api_enabled: desc_html: Compte d'estatus publicats localment, usuaris actius i registres nous en períodes setmanals diff --git a/config/locales/co.yml b/config/locales/co.yml index f21471ff7..69533e527 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -322,7 +322,6 @@ co: comment: none: Nisunu created_at: Palisatu - id: ID mark_as_resolved: Indicà cum’è chjosu mark_as_unresolved: Indicà cum’è sempre apertu notes: @@ -333,7 +332,6 @@ co: placeholder: Per parlà di l’azzione pigliate, o altre messe à ghjornu nant’à u signalamentu… reopen: Riapre u signalamentu report: 'Signalamente #%{id}' - report_contents: Cuntenuti reported_account: Contu palisatu reported_by: Palisatu da resolved: Scioltu è chjosu @@ -341,12 +339,10 @@ co: silence_account: Silenzà u contu status: Statutu suspend_account: Suspende u contu - target: Oggettu title: Signalamenti unassign: Disassignà unresolved: Micca sciolti updated_at: Messi à ghjornu - view: Vede settings: activity_api_enabled: desc_html: Numeri di statuti creati quì, utilizatori attivi, è arregistramenti novi tutte e settimane diff --git a/config/locales/cs.yml b/config/locales/cs.yml index ae2d3c04f..937589a1b 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -47,7 +47,7 @@ cs: one: Sledovatel other: Sledovatelé following: Sleduje - joined: Připojil/a se %{date} + joined: Připojil/a se v %{date} media: Média moved_html: 'Účet %{name} byl přesunut na %{new_profile_link}:' network_hidden: Tato informace není k dispozici @@ -322,7 +322,6 @@ cs: comment: none: Žádné created_at: Nahlášené - id: ID mark_as_resolved: Označit jako vyřešené mark_as_unresolved: Označit jako nevyřešené notes: @@ -333,7 +332,6 @@ cs: placeholder: Popište, jaké akce byly vykonány, nebo jakékoliv jiné související aktuality... reopen: Znovu otevřít nahlášení report: 'Nahlásit #%{id}' - report_contents: Obsah reported_account: Nahlášený účet reported_by: Nahlášeno uživatelem resolved: Vyřešeno @@ -341,12 +339,10 @@ cs: silence_account: Utišit účet status: Stav suspend_account: Suspendovat účet - target: Cíl title: Nahlášení unassign: Odebrat unresolved: Nevyřešeno updated_at: Aktualizováno - view: Zobrazit settings: activity_api_enabled: desc_html: Počty lokálně publikovaných příspěvků, aktivních uživatelů a nových registrací, v týdenních intervalech @@ -679,10 +675,10 @@ cs: acct: Napište svou přezdívku@doménu, ze které chcete jednat missing_resource: Nemůžeme najít požadované přesměrovací URL pro váš účet no_account_html: Ještě nemáte účet? Můžete se <a href='%{sign_up_path}' target='_blank'>registrovat zde</a> - proceed: Pokračujte pro sledování + proceed: Pokračovat ke sledování prompt: 'Budete sledovat:' remote_interaction: - proceed: Pokračujte k interakci + proceed: Pokračovat k interakci prompt: 'Chcete interagovat s tímto tootem:' remote_unfollow: error: Chyba @@ -778,7 +774,7 @@ cs: unlisted_long: Všichni mohou vidět, ale není zahrnut ve veřejných časových osách stream_entries: pinned: Připnutý toot - reblogged: boostnutý + reblogged: boostnul/a sensitive_content: Citlivý obsah terms: body_html: | @@ -831,7 +827,7 @@ cs: <p>Ano. Cookies jsou malé soubory, které stránka nebo její poskytovatel uloží na pevný disk vašeho počítače (pokud to dovolíte). Tyto cookies umožňují stránce rozpoznat váš prohlížeč a, pokud máte registrovaný účet, přidružit ho s vaším registrovaným účtem.</p> - <p>POužíváme cookies pro pochopení a ukládání vašich předvoleb pro budoucí návštěvy.</p> + <p>Používáme cookies pro pochopení a ukládání vašich předvoleb pro budoucí návštěvy.</p> <hr class="spacer" /> @@ -847,7 +843,7 @@ cs: <h3 id="children">Používání stránky dětmi</h3> - <p>Pokud se tento server nachází v EU nebo EHP: Naše stránka, produkty a služby jsou všechny směřovány na lidi, kterým je alespoň 16 let. Pokud je vám méně než 16, dle požadavků nařízení GDPR (<a href="https://cs.wikipedia.org/wiki/Obecn%C3%A9_na%C5%99%C3%ADzen%C3%AD_o_ochran%C4%9B_osobn%C3%ADch_%C3%BAdaj%C5%AF">Obecné nařízení o ochě sobních údajů</a>) </p> + <p>Pokud se tento server nachází v EU nebo EHP: Naše stránka, produkty a služby jsou všechny směřovány na lidi, kterým je alespoň 16 let. Pokud je vám méně než 16, dle požadavků nařízení GDPR (<a href="https://cs.wikipedia.org/wiki/Obecn%C3%A9_na%C5%99%C3%ADzen%C3%AD_o_ochran%C4%9B_osobn%C3%ADch_%C3%BAdaj%C5%AF">Obecné nařízení o ochě sobních údajů</a>) tuto stránku nepoužívejte.</p> <p>Pokud se tento server nachází v USA: Naše stránka, produkty a služby jsou všechny směřovány na lidi, kterým je alespoň 13 let. Pokud je vám méně než 13, dle požadavků zákona COPPA (<a href="https://cs.wikipedia.org/wiki/Children%27s_online_privacy_protection_act">Children's Online Privacy Protection Act</a>) tuto stránku nepoužívejte.</p> diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 84e8d9e2b..1cdba065b 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -1,22 +1,40 @@ --- cy: about: - about_hashtag_html: Dyma dwtiau cyhoeddus wedi eu tagio gyda <strong>#%{hashtag}</strong>. Gallwch ryngweithio gyda nhw os oes gennych gyfrif yn unrhywle yn y ffedysawd. + about_hashtag_html: Dyma dwtiau cyhoeddus wedi eu tagio gyda <strong>#%{hashtag}</strong>. Gallwch ryngweithio gyda nhw os oes gennych gyfrif yn unrhyw le yn y bydysawd. + about_mastodon_html: Mae Mastodon yn rwydwaith cymdeithasol sy'n seiliedig ar brotocolau gwe a meddalwedd cod agored rhad ac am ddim. Yn debyg i e-bost mae'n ddatganoledig. about_this: Ynghylch administered_by: 'Gweinyddir gan:' api: API apps: Apiau symudol + closed_registrations: Mae Mastodon yn rwydwaith cymdeithasol sy'n seiliedig ar brotocolau gwe a meddalwedd cod agored rhad ac am ddim. Mae'n ddatganoledig fel e-bost. contact: Cyswllt + contact_missing: Heb ei osod + contact_unavailable: Ddim yn berthnasol documentation: Dogfennaeth + extended_description_html: | + <h3>Lle da ar gyfer rheolau</h3> + <p>Nid yw'r disgrifiad estynedig wedi ei osod eto.</p> + features: + humane_approach_body: Gan ddysgu o fethiannau rhwydweithiau eraill, mae Mastodon yn anelu i wneud penderfyniadau dylunio moesol i ymladd camddefnydd o gyfryngau cymdeithasol. + humane_approach_title: Agwedd fwy dynol + not_a_product_body: Nid yw Mastodon yn rhwydwaith fasnachol. Nid oes hysbysebion, cloddio data na gerddi caeedig. Nid oes awdurdod canolog. + not_a_product_title: Rwyt yn berson, nid yn gynnyrch + real_conversation_title: Wedi ei adeiladu ar gyfer trafodaeth go iawn + within_reach_title: Bob tro o fewn gafael + generic_description: Mae %{domain} yn un gweinydd yn y rhwydwaith + hosted_on: Mastodon wedi ei weinyddu ar %{domain} learn_more: Dysgu mwy privacy_policy: Polisi preifatrwydd source_code: Cod ffynhonnell status_count_after: one: statws - terms: Telerau Gwasanaeth + status_count_before: Pwy ysgrifennodd + terms: Telerau gwasanaeth user_count_after: one: defnyddiwr - other: defnyddiwyr + other: defnyddwyr + user_count_before: Cartref i what_is_mastodon: Beth yw Mastodon? accounts: choices_html: 'Dewisiadau %{name}:' @@ -24,14 +42,22 @@ cy: followers: one: Dilynwr other: Dilynwyr + following: Yn dilyn joined: Ymunodd %{date} media: Cyfryngau - network_hidden: Nid yw'r wybodaeth hon ar gael + moved_html: 'Mae %{name} wedi symud i %{new_profile_link}:' + network_hidden: Nid yw'r wybodaeth hyn ar gael nothing_here: Does dim byd yma! + people_followed_by: Pobl y mae %{name} yn ei ddilyn + people_who_follow: Pobl sy'n dilyn %{name} + pin_errors: + following: Rhaid i ti fod yn dilyn y person yr ydych am ei gymeradwyo yn barod posts: - one: Twt - other: Twtiau - posts_tab_heading: Twtiau + one: Tŵt + other: Tŵtiau + posts_tab_heading: Tŵtiau + posts_with_replies: Tŵtiau ac atebion + reserved_username: Mae'r enw defnyddior yn neilltuedig roles: admin: Gweinyddwr bot: Bot @@ -40,12 +66,15 @@ cy: admin: account_moderation_notes: create: Gadael nodyn + created_msg: Crewyd nodyn cymedroli yn llwyddiannus! delete: Dileu + destroyed_msg: Dinistrwyd nodyn cymedroli yn llwyddiannus! accounts: are_you_sure: Ydych chi'n siŵr? avatar: Afatar by_domain: Parth change_email: + changed_msg: E-bost cyfri wedi ei newid yn llwyddiannus! current_email: E-bost Cyfredol label: Newid E-bost new_email: E-bost Newydd @@ -53,57 +82,220 @@ cy: title: Newid E-bost i %{username} confirm: Cadarnhau confirmed: Cadarnhawyd + confirming: Cadarnhau + demote: Diraddio disable: Diffodd + disable_two_factor_authentication: Diffodd 2FA + disabled: Wedi ei ddiffodd + display_name: Enw arddangos domain: Parth edit: Golygu email: E-bost email_status: Statws E-bost enable: Galluogi + enabled: Wedi ei alluogi feed_url: Ffrwd URL + followers: Dilynwyr + followers_url: URL Dilynwyr + follows: Yn dilyn inbox_url: URL Mewnflwch ip: IP location: all: Popeth - local: Leol + local: Lleol remote: Pell title: Lleoliad + login_status: Statws mewngofnodi media_attachments: Atodiadau + memorialize: Troi yn gofeb moderation: all: Popeth + silenced: Wedi ei dawelu + suspended: Wedi ei atal title: Cymedroli - outbox_url: URL blwch allan + moderation_notes: Nodiadau cymedroli + most_recent_activity: Gweithgarwch diweddaraf + most_recent_ip: IP diweddaraf + not_subscribed: Heb danysgrifio + order: + alphabetic: Allfabetig + most_recent: Mwyaf diweddaraf + title: Trefn + outbox_url: Allflwch URL profile_url: URL proffil + promote: Hyrwyddo + protocol: Protocol public: Cyhoeddus + push_subscription_expires: Tanysgrifiad PUSH yn dod i ben + redownload: Adnewyddwch afatar + remove_avatar: Dilewch afatar + resend_confirmation: + already_confirmed: Mae'r defnyddiwr hwn wedi ei gadarnhau yn barod + send: Ailanfonwch e-bost cadarnhad + success: E-bost cadarnhau wedi ei anfon yn llwyddiannus! reset: Ailosod - reset_password: Newid cyfrinair + reset_password: Ailosod cyfrinair + resubscribe: Aildanysgrifio + role: Caniatâd roles: + admin: Gweinyddwr + moderator: Safonwr + staff: Staff user: Defnyddiwr + salmon_url: URL Eog search: Chwilio + shared_inbox_url: URL Mewnflwch wedi ei rannu show: + created_reports: Adroddiadau a grewyd gan y cyfri hwn report: adrodd + targeted_reports: Adroddiadau am y cyfri hwn + silence: Tawelu subscribe: Tanysgrifio title: Cyfrifon + unconfirmed_email: E-bost heb ei gadarnhau + undo_silenced: Dadwneud tawelu + undo_suspension: Dadwneud ataliad + unsubscribe: Dad-danysgrifio username: Enw defnyddiwr web: Gwe + action_logs: + actions: + assigned_to_self_report: Aseiniodd %{name} adroddiad %{target} i'w hunan + change_email_user: Newidodd %{name} gyfeiriad e-bost y defnyddiwr %{target} + confirm_user: Cadarnhaodd %{name} gyfeiriad e-bost y defnyddiwr %{target} + create_custom_emoji: Uwchlwythodd %{name} emoji newydd %{target} + create_domain_block: Blociodd %{name} y parth %{target} + create_email_domain_block: Cosbrestrwyd parth e-bost %{target} gan %{name} + demote_user: Diraddiodd %{name} y defnyddiwr %{target} + destroy_domain_block: Dadflociodd %{name} y parth %{target} + deleted_status: "(statws wedi ei ddileu)" + title: Log archwilio custom_emojis: by_domain: Parth + copied_msg: Llwyddwyd i greu copi lleol o'r emoji copy: Copïo + copy_failed_msg: Methwyd i greu copi lleol o'r emoji hwnnw + created_msg: Llwyddwyd i greu emoji! delete: Dileu + destroyed_msg: Llwyddwyd i ddinistrio emoji! + disable: Diffodd + disabled_msg: Llwyddwyd i ddiffodd ye emoji hwnnw + emoji: Emoji enable: Galluogi + enabled_msg: Llwyddwyd i ganiatau yr emoji hwnnw + image_hint: PNG hyd at 50KB listed: Rhestredig + new: + title: Ychwanegu emoji personol newydd + overwrite: Trosysgrifio + shortcode_hint: O leiaf 2 lythyren, dim ond llythrennau alffaniwmerig a tanlinellau + title: Emoji personol + unlisted: Heb ei restru + update_failed_msg: Ni allwyd diweddaru'r emoji hwnnw + updated_msg: Llwyddwyd i ddiweddaru'r emoji! upload: Lanlwytho dashboard: config: Cyfluniad + feature_invites: Dolenni gwahodd feature_registrations: Cofrestriadau features: Nodweddion + open_reports: adroddiadau agored + recent_users: Defnyddwyr diweddar + search: Chwilio testun llawn software: Meddalwedd + space: Defnydd o ofod title: Dangosfwrdd + total_users: cyfanswm defnyddwyr trends: Tueddiadau + week_interactions: ymadweithiau yr wythnos hon + week_users_active: gweithredol yr wythnos hon + week_users_new: defnyddwyr yr wythnos hon + domain_blocks: + domain: Parth + new: + create: Creu bloc + severity: + noop: Dim + silence: Tawelwch + suspend: Atal + reject_media: Gwrthod dogfennau cyfryngau + severities: + noop: Dim + silence: Tawelwch + suspend: Atal + severity: Difrifoldeb + show: + affected_accounts: + one: Mae un cyfri yn y bas data wedi ei effeithio + other: "%{count} o gyfrifoedd yn y bas data wedi eu hefeithio" + retroactive: + silence: Dad-dawelu pob cyfri presennol o'r parth hwn + undo: Dadwneud + undo: Dadwneud + email_domain_blocks: + add_new: Ychwanegu + created_msg: Llwyddwyd i ychwanegu parth e-bost i'r gosbrestr + delete: Dileu + destroyed_msg: Llwyddwyd i ddileu parth e-bost o'r gosbrestr + domain: Parth + new: + create: Ychwanegu parth + title: Cosbrestr e-bost instances: + account_count: Cyfrifoedd hysbys domain_name: Parth + reset: Ailosod + search: Chwilio + title: INSTANCES hysbys + invites: + filter: + all: Pob + available: Ar gael + expired: Wedi dod i ben + title: Hidlo + title: Gwahoddiadau + relays: + save_and_enable: Cadw a galluogi + status: Statws + reports: + account: + note: nodyn + report: adroddiad + are_you_sure: Ydych chi'n sicr? + comment: + none: Dim + created_at: Adroddwyd + mark_as_resolved: Nodwch wedi ei ddatrys + mark_as_unresolved: Nodwch heb ei ddatrys + notes: + create: Ychwanegwch nodyn + create_and_resolve: Datruswch a nodyn + create_and_unresolve: Ailagorwch a nodyn + delete: Dilëwch + reopen: Ailagorwch adroddiad + report: 'Adroddiad #%{id}' + reported_by: Adroddwyd gan + resolved: Wedi ei ddatrys + resolved_msg: Llwyddwyd i ddatrys yr adroddiad! + silence_account: Tawelwch y cyfrif + status: Statws + title: Adroddiadau + unassign: Dadneilltuo + unresolved: Heb ei ddatrys + updated_at: Diweddarwyd settings: + activity_api_enabled: + title: Cyhoeddwch ystatedgau agregau am weithgaredd defnyddwyr contact_information: email: E-bost busnes + registrations: + deletion: + desc_html: Caniatewch i unrhywun i ddileu eu cyfrif + min_invite_role: + disabled: Neb + title: Caniatewch wahoddiadau gan + open: + desc_html: Caniatewch i unrhywun greu cyfrif auth: change_password: Cyfrinair authorize_follow: diff --git a/config/locales/da.yml b/config/locales/da.yml index e469fd3c0..f59c2123d 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -1,7 +1,7 @@ --- da: about: - about_hashtag_html: Disse er offentlige toots der indeholder tagget <strong>#%{hashtag}</strong>. Du kan interagere med dem hvis du har en konto hvor som helst i fediverset. + about_hashtag_html: Disse er offentlige trut der indeholder tagget <strong>#%{hashtag}</strong>. Du kan interagere med dem hvis du har en konto hvor som helst i fediverset. about_mastodon_html: Mastodon er et socialt netværk der er baseret på åbne web protokoller og frit, open-source source software. Der er decentraliseret ligesom e-mail tjenester. about_this: Om administered_by: 'Administreret af:' @@ -20,7 +20,7 @@ da: humane_approach_title: En mere human tilgang not_a_product_body: Mastodon er ikke et kommercielt netværk. Ingen reklamer, ingen datamining, ingen indhegnet haver. Der er ingen central regering. not_a_product_title: Du er en person, ikke et produkt - real_conversation_body: Med 500 tegn til din rådighed og understøttelse af granulært indhold og multimedie advarsler, kan du udtrykke dig på en hvilken som helst måde du ønsker. + real_conversation_body: Med 500 tegn til din rådighed og understøttelse af granulært indhold og medie advarsler, kan du udtrykke dig på en hvilken som helst måde du ønsker. real_conversation_title: Bygget til rigtige samtaler within_reach_body: Adskillige apps for iOS, Android og andre platforme takket være et udviklervenligt API økosystem tillader dig at holde kontakten med dine venner hvor som helst. within_reach_title: Altid indenfor rækkevidde @@ -48,7 +48,7 @@ da: other: Følgere following: Følger joined: Tilmeldt den %{date} - media: Multimedia + media: Medier moved_html: "%{name} er flyttet til %{new_profile_link}:" network_hidden: Denne information er ikke tilgængelig nothing_here: Der er intet her! @@ -110,7 +110,7 @@ da: remote: Fjernt title: Placering login_status: Status på login - media_attachments: Multimedie bilag + media_attachments: Medie bilag memorialize: Omdan til et memoriam moderation: all: Alle @@ -256,7 +256,7 @@ da: silence: Dæmp suspend: Udeluk title: Ny domæne blokering - reject_media: Afvis multimedie filer + reject_media: Afvis medie filer reject_media_hint: Fjerner lokalt lagrede multimedie filer og nægter at hente nogen i fremtiden. Irrelevant for udelukkelser severities: noop: Ingen @@ -322,7 +322,6 @@ da: comment: none: Ingen created_at: Anmeldt - id: ID mark_as_resolved: Marker som værende løst mark_as_unresolved: Marker som værende uløst notes: @@ -333,7 +332,6 @@ da: placeholder: Beskriv hvilke handlinger der er blevet udført, eller andre relevante opdateringer... reopen: Genåben anmeldelse report: 'Anmeldelse #%{id}' - report_contents: Indhold reported_account: Anmeldt konto reported_by: Anmeldt af resolved: Løst @@ -341,12 +339,10 @@ da: silence_account: Dæmp konto status: Status suspend_account: Udeluk konto - target: Mål title: Anmeldelser unassign: Utildel unresolved: Uløst updated_at: Opdateret - view: Se settings: activity_api_enabled: desc_html: Antal af lokalt opslåede statusser, aktive brugere, og nye registreringer i ugentlige opdelinger @@ -736,7 +732,7 @@ da: delete: Sletning af konto development: Udvikling edit_profile: Rediger profil - export: Data exportering + export: Data eksportering followers: Godkendte følgere import: Importer migrate: Konto migrering diff --git a/config/locales/de.yml b/config/locales/de.yml index e1d594053..0dcd86e98 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -41,7 +41,7 @@ de: user_count_before: Zuhause für what_is_mastodon: Was ist Mastodon? accounts: - choices_html: "%{name} empfielt:" + choices_html: "%{name} empfiehlt:" follow: Folgen followers: one: Folgende @@ -304,6 +304,7 @@ de: enable_hint: Sobald aktiviert wird dein Server alle öffentlichen Beiträge dieses Relays abonnieren und wird alle öffentlichen Beiträge dieses Servers an es senden. inbox_url: Relay-URL pending: Warte auf Zustimmung des Relays + save_and_enable: Speichern und aktivieren setup: Relayverbindung einrichten status: Status title: Relays @@ -321,7 +322,6 @@ de: comment: none: Kein created_at: Gemeldet - id: ID mark_as_resolved: Als gelöst markieren mark_as_unresolved: Als ungelöst markieren notes: @@ -332,7 +332,6 @@ de: placeholder: Beschreibe, welche Maßnahmen ergriffen wurden oder irgendwelche andere Neuigkeiten… reopen: Meldung wieder öffnen report: 'Meldung #%{id}' - report_contents: Inhalt reported_account: Gemeldetes Konto reported_by: Gemeldet von resolved: Gelöst @@ -340,12 +339,10 @@ de: silence_account: Konto stummschalten status: Status suspend_account: Konto sperren - target: Ziel title: Meldungen unassign: Zuweisung entfernen unresolved: Ungelöst updated_at: Aktualisiert - view: Ansehen settings: activity_api_enabled: desc_html: Anzahl der lokal geposteten Beiträge, aktiven Nutzern und neuen Registrierungen in wöchentlichen Zusammenfassungen diff --git a/config/locales/devise.ast.yml b/config/locales/devise.ast.yml index 0b77eecf2..0d161faf2 100644 --- a/config/locales/devise.ast.yml +++ b/config/locales/devise.ast.yml @@ -1,2 +1 @@ ---- -ast: +ast: {} diff --git a/config/locales/devise.cy.yml b/config/locales/devise.cy.yml index a60884c5b..51ab6a3c7 100644 --- a/config/locales/devise.cy.yml +++ b/config/locales/devise.cy.yml @@ -1,6 +1,64 @@ --- cy: devise: + confirmations: + confirmed: Mae eich cyfeiriad e-bost wedi ei gadarnhau yn llwyddiannus. + send_instructions: Byddwch yn derbyn e-bost a chyfarwyddiadau am sut i gadarnhau eich cyfeiriad e-bost mewn rhai munudau. Os na dderbynioch chi'r e-bost hwn, edrychwch yn eich ffolder sbam os gwelwch yn dda. + send_paranoid_instructions: Os yw eich cyfeiriad e-bost yn bodoli yn ein bas data, byddwch yn derbyn e-bost a chyfarwyddiadau am sut i gadarnhau eich cyfeiriad ebost mewn rhai munudau. Os na dderbynioch chi'r e-bost hwn, edrychwch yn eich ffolder sbam os gwelwch yn dda. + failure: + already_authenticated: Yr ydych yn barod wedi mewngofnodi. + inactive: Nid yw eich cyfrif yn weithredol eto. + invalid: "%{authentication_keys} neu gyfrinair annilys." + last_attempt: Mae gennych un gyfle arall cyn i'ch cyfrif gael ei gloi. + locked: Mae eich cyfrif wedi ei gloi. + not_found_in_database: "%{authentication_keys} neu gyfrinair annilys." + timeout: Mae eich sesiwn wedi dod i ben. Mewngofnodwch eto i barhau. + unauthenticated: Mae angen i chi fewngofnodi neu gofrestru cyn parhau. + unconfirmed: Mae rhaid i chi gadarnhau eich cyfeiriad e-bost cyn parhau. mailer: + confirmation_instructions: + action: Gwiriwch eich cyfeiriad e-bost + explanation: Yr ydych wedi creu cyfrif ar %{host} gyda'r cyfrif e-bost hwn. Dim ond un clic sydd angen i'w wneud yn weithredol. Os nad chi oedd hyn, anwybyddwch yr e-bost hwn os gwelwch yn dda. + extra_html: Gwnewch yn siŵr i edrych ar <a href="%{terms_path}">reolau'r INSTANCE</a> a <a href="%{policy_path}">ein telerau gwasanaeth</a>. + subject: 'Mastodon: Canllawiau cadarnhau i %{instance}' + title: Gwiriwch cyfeiriad e-bost + email_changed: + explanation: 'Mae''r cyfeiriad e-bost ar gyfer eich cyfrif yn cael ei newid i:' + extra: Os na wnaethoch chi newid eich e-bost, mae'n debygol fod rhywun wedi cael mynediad i'ch cyfrif. Newidwch eich cyfrinair yn syth os gwelwch yn dda neu cysylltwch a gweinydd yr INSTANCE os ydych wedi'ch cloi allan o'ch cyfrif. + subject: 'Mastodon: Newidwyd e-bost' + title: Cyfeiriad e-bost newydd + password_change: + explanation: Newidwyd cyfrinair eich cyfrif. + extra: Os na wnaethoch chi newid eich e-bost, mae'n debygol fod rhywun wedi cael mynediad i'ch cyfrif. Newidwch eich cyfrinair yn syth os gwelwch yn dda neu cysylltwch a gweinydd yr INSTANCE os ydych wedi'ch cloi allan o'ch cyfrif. + subject: 'Mastodon: Newidwyd Cyfrinair' + title: Newidwyd cyfrinair + reconfirmation_instructions: + explanation: Cadarnhewch y cyferiad newydd i newid eich e-bost. + subject: 'Mastodon: Cadarnhewch e-bost i %{instance}' + title: Gwiriwch cyfeiriad e-bost reset_password_instructions: action: Newid cyfrinair + explanation: Gofynnoch am gyfrinair newydd i'ch cyfrif. + subject: 'Mastodon: Ailosodwch cyfarwyddiadau cyfrinair' + title: Ailosod cyfrinair + unlock_instructions: + subject: 'Mastodon: Cyfarwyddiadau datgloi' + omniauth_callbacks: + failure: Methu eich dilysu o %{kind} oherwydd "%{reason}". + registrations: + signed_up: Croeso! Rydych wedi llwyddo i ymuno. + update_needs_confirmation: Rydych wedi diweddaru eich cyfrif yn llwyddiannus, ond mae angen i ni wirio eich cyfeiriad e-bost newydd. Edrychwch ar eich e-byst a dilynwch y ddolen gadarnhau er mwyn cadarnhau eich cyfeiriad e-bost newydd. Edrychwch ar eich ffolder sbam os na dderbynioch chi yr e-bost hwn. + updated: Mae eich cyfrif wedi ei ddiweddaru yn llwyddiannus. + sessions: + already_signed_out: Allgofnodwyd yn llwyddiannus. + signed_in: Mewngofnodwyd yn llwyddiannus. + signed_out: Allgofnodwyd yn llwyddiannus. + unlocks: + unlocked: Mae eich cyfrif wedi ei ddatgloi'n llwyddiannus. Mewngofnodwch i barhau. + errors: + messages: + already_confirmed: wedi ei gadarnhau yn baros, ymgeisiwch fewngofnodi + confirmation_period_expired: angen ei gadarnhau o fewn %{period}, gwnewch gais am un newydd os gwelwch yn dda + expired: wedi dod i ben, gwnewch gais am un newydd os gwelwch yn dda + not_found: heb ei ganfod + not_locked: heb ei gloi diff --git a/config/locales/doorkeeper.ast.yml b/config/locales/doorkeeper.ast.yml index 0b77eecf2..0d161faf2 100644 --- a/config/locales/doorkeeper.ast.yml +++ b/config/locales/doorkeeper.ast.yml @@ -1,2 +1 @@ ---- -ast: +ast: {} diff --git a/config/locales/doorkeeper.cy.yml b/config/locales/doorkeeper.cy.yml index 2fb4902e8..2c0e5d243 100644 --- a/config/locales/doorkeeper.cy.yml +++ b/config/locales/doorkeeper.cy.yml @@ -1,3 +1,91 @@ --- cy: - doorkeeper: {} + activerecord: + attributes: + doorkeeper/application: + name: Enw rhaglen + scopes: Cwmpasau + doorkeeper: + applications: + buttons: + authorize: Awdurdodi + cancel: Diddymu + destroy: Dinistrio + edit: Golygu + submit: Cyflwyno + confirmations: + destroy: Ydych chi'n sicr? + edit: + title: Golygwch rhaglen + form: + error: Wps! Gwiriwch eich ffurflen am gamgymeriadau posib + index: + application: Rhaglen + delete: Dileu + name: Enw + new: Rhaglen newydd + scopes: Cwmpasau + show: Dangoswch + title: Eich rhaglenni + new: + title: Rhaglen newydd + show: + scopes: Cwmpasau + title: 'Rhaglen: %{name}' + authorizations: + buttons: + authorize: Awdurdodi + error: + title: Mae rhywbeth wedi mynd o'i le + new: + able_to: Mi fydd a'r gallu i + title: Angen awdurdodi + show: + title: Copiwch y côd awdurdodi a gludiwch i'r rhaglen + authorized_applications: + confirmations: + revoke: Ydych chi'n sicr? + index: + application: Rhaglen + created_at: Awdurdodedig + scopes: Cwmpasau + title: Eich rhaglenni awdurdodedig + errors: + messages: + access_denied: Mae perchennog yr adnodd neu'r gweinydd awdurdodi wedi atal y cais. + flash: + applications: + create: + notice: Crewyd y rhaglen. + destroy: + notice: Dilewyd y rhaglen. + update: + notice: Diweddarwyd y rhaglen. + authorized_applications: + destroy: + notice: Diddymwyd y cais. + layouts: + admin: + nav: + applications: Rhaglenni + oauth2_provider: Darparwr OAuth2 + application: + title: Mae awdurdodiad OAuth yn ofynnol + scopes: + push: derbyniwch eich hysbysiadau PUSH + read: darllenwch holl ddata eich cyfrif + read:accounts: gwelwch wybodaeth y cyfrif + read:favourites: gwelwch eich ffefrynnau + read:filters: gwelwch eich hidlwyr + read:lists: gwelwch eich rhestrau + read:notifications: gwelwch eich hysbysiadau + read:reports: gwelwch eich adroddiadau + read:statuses: gwelwch pob statws + write: addaswch ddata eich cyfri + write:accounts: addaswch eich proffil + write:blocks: blociwch gyfrifon a parthau + write:filters: crewch hidlwyr + write:follows: dilynwch bobl + write:lists: crëwch restrau + write:media: uwchlwythwch ffeiliau cyfryngau + write:notifications: cliriwch eich hysbysiadau diff --git a/config/locales/el.yml b/config/locales/el.yml index 84119b086..6f7840288 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -322,7 +322,6 @@ el: comment: none: Κανένα created_at: Αναφέρθηκε - id: ID mark_as_resolved: Σημειωμένο ως επιλυμένο mark_as_unresolved: Σημειωμένο ως ανεπίλυτο notes: @@ -333,7 +332,6 @@ el: placeholder: Περιέγραψε τις ενέργειες που έγιναν, ή οποιαδήποτε άλλη ενημέρωση... reopen: Ξανάνοιξε την καταγγελία report: 'Καταγγελία #%{id}' - report_contents: Περιεχόμενα reported_account: Αναφερόμενος λογαριασμός reported_by: Αναφέρθηκε από resolved: Επιλύθηκε @@ -341,12 +339,10 @@ el: silence_account: Αποσιώπηση λογαριασμού status: Κατάσταση suspend_account: Ανέστειλε λογαριασμό - target: Αποδέκτης title: Αναφορές unassign: Αποσύνδεση unresolved: Άλυτη updated_at: Ενημερωμένη - view: Εμφάνιση settings: activity_api_enabled: desc_html: Καταμέτρηση τοπικών δημοσιεύσεων, ενεργών χρηστών και νέων εγγραφών σε εβδομαδιαίες ομαδοποιήσεις diff --git a/config/locales/en.yml b/config/locales/en.yml index 227abf409..d1df0cc2b 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -48,6 +48,7 @@ en: other: Followers following: Following joined: Joined %{date} + link_verified_on: Ownership of this link was checked on %{date} media: Media moved_html: "%{name} has moved to %{new_profile_link}:" network_hidden: This information is not available @@ -120,6 +121,7 @@ en: moderation_notes: Moderation notes most_recent_activity: Most recent activity most_recent_ip: Most recent IP + no_limits_imposed: No limits imposed not_subscribed: Not subscribed order: alphabetic: Alphabetic @@ -155,8 +157,10 @@ en: report: report targeted_reports: Reports made about this account silence: Silence + silenced: Silenced statuses: Statuses subscribe: Subscribe + suspended: Suspended title: Accounts unconfirmed_email: Unconfirmed E-mail undo_silenced: Undo silence @@ -300,8 +304,13 @@ en: title: Invites relays: add_new: Add new relay + delete: Delete description_html: A <strong>federation relay</strong> is an intermediary server that exchanges large volumes of public toots between servers that subscribe and publish to it. <strong>It can help small and medium servers discover content from the fediverse</strong>, which would otherwise require local users manually following other people on remote servers. + disable: Disable + disabled: Disabled + enable: Enable enable_hint: Once enabled, your server will subscribe to all public toots from this relay, and will begin sending this server's public toots to it. + enabled: Enabled inbox_url: Relay URL pending: Waiting for relay's approval save_and_enable: Save and enable @@ -322,7 +331,6 @@ en: comment: none: None created_at: Reported - id: ID mark_as_resolved: Mark as resolved mark_as_unresolved: Mark as unresolved notes: @@ -333,7 +341,6 @@ en: placeholder: Describe what actions have been taken, or any other related updates... reopen: Reopen report report: 'Report #%{id}' - report_contents: Contents reported_account: Reported account reported_by: Reported by resolved: Resolved @@ -341,12 +348,10 @@ en: silence_account: Silence account status: Status suspend_account: Suspend account - target: Target title: Reports unassign: Unassign unresolved: Unresolved updated_at: Updated - view: View settings: activity_api_enabled: desc_html: Counts of locally posted statuses, active users, and new registrations in weekly buckets @@ -456,7 +461,7 @@ en: warning: Be very careful with this data. Never share it with anyone! your_token: Your access token auth: - agreement_html: By signing up you agree to follow <a href="%{rules_path}">the rules of the instance</a> and <a href="%{terms_path}">our terms of service</a>. + agreement_html: By clicking "Sign up" below you agree to follow <a href="%{rules_path}">the rules of the instance</a> and <a href="%{terms_path}">our terms of service</a>. change_password: Password confirm_email: Confirm email delete_account: Delete account @@ -919,3 +924,6 @@ en: otp_lost_help_html: If you lost access to both, you may get in touch with %{email} seamless_external_login: You are logged in via an external service, so password and e-mail settings are not available. signed_in_as: 'Signed in as:' + verification: + explanation_html: 'You can <strong>verify yourself as the owner of the links in your profile metadata</strong>. For that, the linked website must contain a link back to your Mastodon profile. The link back <strong>must</strong> have a <code>rel="me"</code> attribute. The text content of the link does not matter. Here is an example:' + verification: Verification diff --git a/config/locales/en_GB.yml b/config/locales/en_GB.yml new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/config/locales/en_GB.yml @@ -0,0 +1 @@ +{} diff --git a/config/locales/eo.yml b/config/locales/eo.yml index 996287335..9ab128d0c 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -311,7 +311,6 @@ eo: comment: none: Nenio created_at: Signalita - id: ID mark_as_resolved: Marki solvita mark_as_unresolved: Marki nesolvita notes: @@ -322,7 +321,6 @@ eo: placeholder: Priskribu faritajn agojn, aŭ ajnan novan informon pri tiu signalo… reopen: Remalfermi signalon report: 'Signalo #%{id}' - report_contents: Enhavo reported_account: Signalita konto reported_by: Signalita de resolved: Solvita @@ -330,12 +328,10 @@ eo: silence_account: Kaŝi konton status: Mesaĝoj suspend_account: Haltigi konton - target: Celo title: Signaloj unassign: Malasigni unresolved: Nesolvita updated_at: Ĝisdatigita - view: Vidi settings: activity_api_enabled: desc_html: Sumo de lokaj mesaĝoj, aktivaj uzantoj, kaj novaj registriĝoj laŭsemajne diff --git a/config/locales/es.yml b/config/locales/es.yml index e7926b6f7..4501dc28d 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -5,10 +5,13 @@ es: about_mastodon_html: Mastodon es un servidor de red social <em>libre y de código abierto</em>. Una alternativa <em>descentralizada</em> a plataformas comerciales, que evita el riesgo de que una única compañía monopolice tu comunicación. Cualquiera puede ejecutar Mastodon y participar sin problemas en la <em>red social</em>. about_this: Acerca de esta instancia administered_by: 'Administrado por:' + api: API + apps: Aplicaciones móviles closed_registrations: Los registros están actualmente cerrados en esta instancia. contact: Contacto contact_missing: No especificado contact_unavailable: N/A + documentation: Documentación extended_description_html: | <h3>Un buen lugar para las reglas</h3> <p>La descripción extendida no se ha colocado aún.</p> @@ -25,26 +28,43 @@ es: hosted_on: Mastodon hosteado en %{domain} learn_more: Aprende más other_instances: Otras instancias + privacy_policy: Política de privacidad source_code: Código fuente - status_count_after: estados + status_count_after: + one: estado + other: estados status_count_before: Qué han escrito - user_count_after: usuarios registrados + terms: Condiciones de servicio + user_count_after: + one: usuario + other: usuarios user_count_before: Tenemos what_is_mastodon: "¿Qué es Mastodon?" accounts: + choices_html: 'Elecciones de %{nombre}:' follow: Seguir - followers: Seguidores + followers: + one: Seguidor + other: Seguidores following: Siguiendo + joined: Se unió el %{date} media: Media moved_html: "%{name} se ha trasladado a %{new_profile_link}:" + network_hidden: Esta información no está disponible nothing_here: "¡No hay nada aquí!" people_followed_by: Usuarios a quien %{name} sigue people_who_follow: Usuarios que siguen a %{name} - posts: Toots + pin_errors: + following: Debes estar siguiendo a la persona a la que quieres aprobar + posts: + one: Toot + other: Toots + posts_tab_heading: Toots posts_with_replies: Toots con respuestas reserved_username: El nombre de usuario está reservado roles: admin: Administrador + bot: Bot moderator: Moderador unfollow: Dejar de seguir admin: @@ -117,7 +137,7 @@ es: resend_confirmation: already_confirmed: Este usuario ya está confirmado send: Reenviar el correo electrónico de confirmación - success: "¡Correo electrónico de confirmación enviado con éxito" + success: "¡Correo electrónico de confirmación enviado con éxito!" reset: Reiniciar reset_password: Reiniciar contraseña resubscribe: Re-suscribir @@ -174,6 +194,7 @@ es: unsuspend_account: "%{name} desactivó la suspensión de la cuenta de %{target}" update_custom_emoji: "%{name} actualizó el emoji %{target}" update_status: "%{name} actualizó el estado de %{target}" + deleted_status: "(estado borrado)" title: Log de auditoría custom_emojis: by_domain: Dominio @@ -200,6 +221,27 @@ es: update_failed_msg: No se pudo actualizar ese emoji updated_msg: "¡Emoji actualizado con éxito!" upload: Subir + dashboard: + backlog: trabajos de backlog + config: Configuración + feature_deletions: Borrados de cuenta + feature_invites: Enlaces de invitación + feature_registrations: Registros + feature_relay: Relés de federación + features: Características + hidden_service: Federación con servicios ocultos + open_reports: informes abiertos + recent_users: Usuarios recientes + search: Búsqueda por texto completo + single_user_mode: Modo único usuario + software: Software + space: Uso de almacenamiento + title: Tablero + total_users: usuarios en total + trends: Tendencias + week_interactions: interacciones esta semana + week_users_active: activo esta semana + week_users_new: usuarios esta semana domain_blocks: add_new: Añadir nuevo created_msg: El bloque de dominio está siendo procesado @@ -249,12 +291,23 @@ es: search: Buscar title: Instancias conocidas invites: + deactivate_all: Desactivar todos filter: all: Todas available: Disponibles expired: Expiradas title: Filtrar title: Invitaciones + relays: + add_new: Añadir un nuevo relés + description_html: Un <strong>relés de federation</strong> es un servidor intermedio que intercambia grandes volúmenes de toots públicos entre servidores que se suscriben y publican en él. <strong>Puede ayudar a servidores pequeños y medianos a descubir contenido del fediverso</strong>, que de otra manera requeriría que los usuarios locales siguiesen manialmente a personas de servidores remotos. + enable_hint: Una vez conectado, tu servidor se suscribirá a todos los toots públicos de este relés, y comenzará a enviar los toots públicos de este servidor hacia él. + inbox_url: URL del relés + pending: Esperando la aprobación del relés + save_and_enable: Guardar y conectar + setup: Preparar una conexión de relés + status: Estado + title: Releses report_notes: created_msg: "¡El registro de la denuncia se ha creado correctamente!" destroyed_msg: "¡El registro de la denuncia se ha borrado correctamente!" @@ -269,7 +322,6 @@ es: comment: none: Ninguno created_at: Denunciado - id: ID mark_as_resolved: Marcar como resuelto mark_as_unresolved: Marcar como no resuelto notes: @@ -280,7 +332,6 @@ es: placeholder: Especificar qué acciones se han tomado o cualquier otra novedad respecto a esta denuncia… reopen: Reabrir denuncia report: 'Reportar #%{id}' - report_contents: Contenido reported_account: Cuenta reportada reported_by: Reportado por resolved: Resuelto @@ -288,12 +339,10 @@ es: silence_account: Silenciar cuenta status: Estado suspend_account: Suspender cuenta - target: Objetivo title: Reportes unassign: Desasignar unresolved: No resuelto updated_at: Actualizado - view: Ver settings: activity_api_enabled: desc_html: Conteo de estados publicados localmente, usuarios activos, y nuevos registros en periodos semanales @@ -304,12 +353,18 @@ es: contact_information: email: Correo de trabajo username: Nombre de usuario + custom_css: + desc_html: Modificar el aspecto con CSS cargado en cada página + title: CSS personalizado hero: desc_html: Mostrado en la página principal. Recomendable al menos 600x100px. Por defecto se establece a la miniatura de la instancia title: Imagen de portada peers_api_enabled: desc_html: Nombres de dominio que esta instancia ha encontrado en el fediverso title: Publicar lista de instancias descubiertas + preview_sensitive_media: + desc_html: Los enlaces de vistas previas en otras web mostrarán una miniatura incluso si el medio está marcado como contenido sensible + title: Mostrar contenido sensible en previews de OpenGraph registrations: closed_message: desc_html: Se muestra en la portada cuando los registros están cerrados. Puedes usar tags HTML @@ -335,6 +390,9 @@ es: site_description_extended: desc_html: Un buen lugar para tu código de conducta, reglas, guías y otras cosas que estén impuestas aparte en tu instancia. Puedes usar tags HTML title: Información extendida personalizada + site_short_description: + desc_html: Mostrado en la barra lateral y las etiquetas de metadatos. Describe lo que es Mastodon y qué hace especial a este servidor en un solo párrafo. si está vacío, pone por defecto la descripción de la instancia. + title: Descripción corta de la instancia site_terms: desc_html: Puedes escribir tus propias políticas de privacidad, términos de servicio u otras legalidades. Puedes usar tags HTML title: Términos de servicio personalizados @@ -356,6 +414,7 @@ es: media: title: Multimedia no_media: No hay multimedia + no_status_selected: No se cambió ningún estado al no seleccionar ninguno title: Estado de las cuentas with_media: Con multimedia subscriptions: @@ -365,6 +424,12 @@ es: last_delivery: Última entrega title: WebSub topic: Tópico + suspensions: + bad_acct_msg: El valor de confirmación no cuadra. ¿Estás suspendiendo la cuenta correcta? + hint_html: 'Para confirmar las suspensión de la cuenta, por favor introduce %{value} en el campo de abajo:' + proceed: Proceder + title: Suspender %{acct} + warning_html: 'Suspender esta cuenta borrará <strong>irreversiblemente</strong> los datos de stra cuenta que incluyen:' title: Administración admin_mailer: new_report: @@ -468,6 +533,22 @@ es: follows: Personas que sigues mutes: Tienes en silencio storage: Almacenamiento + filters: + contexts: + home: Timeline propio + notifications: Notificaciones + public: Timeline público + thread: Conversaciones + edit: + title: Editar filtro + errors: + invalid_context: Se suminstró un contexto inválido o vacío + invalid_irreversible: El filtrado irreversible solo funciona con los contextos propios o de notificaciones + index: + delete: Borrar + title: Filtros + new: + title: Añadir un nuevo filtro followers: domain: Dominio explanation_html: Si deseas asegurar la privacidad de tus estados, tienes que cuidarte de quién te sigue. <strong>Tus estados privados son enviados a todas las instancias de tus seguidores</strong>. Puede que desees revisarlas, y remover seguidores si no confías en tu privacidad para ser respetado por el staff o software de esas instancias. @@ -480,6 +561,10 @@ es: true_privacy_html: Por favor ten en cuenta que <strong>la verdadera privacidad se consigue con encriptación de punto a punto</strong>. unlocked_warning_html: Todos pueden seguirte para ver tus estados privados inmediatamente. %{lock_link} para poder chequear y rechazar seguidores. unlocked_warning_title: Tu cuenta no está bloqueada + footer: + developers: Desarrolladores + more: Mas… + resources: Recursos generic: changes_saved_msg: "¡Cambios guardados con éxito!" save_changes: Guardar cambios @@ -494,7 +579,7 @@ es: following: Lista de seguidos muting: Lista de silenciados upload: Cargar - in_memoriam_html: In Memoriam. + in_memoriam_html: En memoria. invites: delete: Desactivar expired: Expiradas @@ -507,6 +592,7 @@ es: '86400': 1 día expires_in_prompt: Nunca generate: Generar + invited_by: 'Fuiste invitado por:' max_uses: one: 1 uso other: "%{count} usos" @@ -589,8 +675,12 @@ es: remote_follow: acct: Ingesa tu usuario@dominio desde el que quieres seguir missing_resource: No se pudo encontrar la URL de redirección requerida para tu cuenta + no_account_html: "¿No tienes una cuenta? Puedes <a href='%{sign_up_path}' target='_blank'>registrarte aqui</a>" proceed: Proceder a seguir prompt: 'Vas a seguir a:' + remote_interaction: + proceed: Proceder para interactuar + prompt: 'Quieres interactuar con este toot:' remote_unfollow: error: Error title: Título @@ -660,10 +750,12 @@ es: video: one: "%{count} vídeo" other: "%{count} vídeos" + boosted_from_html: Impulsado desde %{acct_link} content_warning: 'Alerta de contenido: %{warning}' disallowed_hashtags: one: 'contenía un hashtag no permitido: %{tags}' other: 'contenía los hashtags no permitidos: %{tags}' + language_detection: Detección automática de idioma open_in_web: Abrir en web over_character_limit: Límite de caracteres de %{max} superado pin_errors: @@ -672,6 +764,7 @@ es: private: Los toots no-públicos no pueden fijarse reblog: Un boost no puede fijarse show_more: Mostrar más + sign_in_to_participate: Regístrate para participar en la conversación title: '%{name}: "%{quote}"' visibilities: private: Sólo mostrar a seguidores @@ -689,6 +782,7 @@ es: time: formats: default: "%d de %b del %Y, %H:%M" + month: "%b %Y" two_factor_authentication: code_hint: Ingresa el código generado por tu aplicación de autenticación para confirmar description_html: Si habilitas la <strong>autenticación de dos factores</strong>, se requerirá estar en posesión de su teléfono, lo que generará tokens para que usted pueda iniciar sesión. @@ -731,5 +825,6 @@ es: users: invalid_email: La dirección de correo es incorrecta invalid_otp_token: Código de dos factores incorrecto + otp_lost_help_html: Si perdiste al acceso a ambos, puedes ponerte en contancto con %{email} seamless_external_login: Has iniciado sesión desde un servicio externo, así que los ajustes de contraseña y correo no están disponibles. signed_in_as: 'Sesión iniciada como:' diff --git a/config/locales/eu.yml b/config/locales/eu.yml index e767d9ad9..ebb7bf84f 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -300,7 +300,14 @@ eu: title: Gonbidapenak relays: add_new: Gehitu hari berria + description_html: "<strong>Federazio errele</strong> bat zerbitzari tartekari bat da, bertara harpidetutako eta bertan argitaratzen duten zerbitzarien artean toot publiko kopuru handiak banatzen ditu. <strong>Zerbitzari txiki eta ertainei Fedibertsoko edukia aurkitzen laguntzen die</strong>, bestela erabiltzaile lokalek eskuz jarraitu beharko lituzkete urruneko zerbitzarietako erabiltzaileak." + enable_hint: Behin gaituta, zure zerbitzaria errele honetako toot publiko guztietara harpidetuko da, eta zerbitzari honetako toot publikoak errelera bidaltzen hasiko da. + inbox_url: Errelearen URLa + pending: Erreleak onartzearen zain + save_and_enable: Gorde eta gaitu + setup: Ezarri errele konexio bat status: Mezuak + title: Erreleak report_notes: created_msg: Salaketa oharra ongi sortu da! destroyed_msg: Salaketa oharra ongi ezabatu da! @@ -315,7 +322,6 @@ eu: comment: none: Bat ere ez created_at: Salatua - id: ID mark_as_resolved: Markatu konpondutako gisa mark_as_unresolved: Markatu konpondu gabeko gisa notes: @@ -326,7 +332,6 @@ eu: placeholder: Azaldu hartutako neurriak, edo erlazioa duten bestelako berriak... reopen: Berrireki salaketa report: 'Salaketa #%{id}' - report_contents: Edukiak reported_account: Salatutako kontua reported_by: Salatzailea resolved: Konponduta @@ -334,12 +339,10 @@ eu: silence_account: Isilarazi kontua status: Mezua suspend_account: Kanporatu kontua - target: Helburua title: Salaketak unassign: Kendu esleipena unresolved: Konpondu gabea updated_at: Eguneratua - view: Ikusi settings: activity_api_enabled: desc_html: Lokalki bidalitako mezu kopurua, erabiltzaile aktiboak, eta izen emate berriak asteko @@ -424,6 +427,7 @@ eu: suspensions: bad_acct_msg: Berrespen balioa ez dator bat. Dagokion kontua kanporatzen ari zara? hint_html: 'Kontuaren kanporatzea berresteko, sartu %{value} beheko eremuan:' + proceed: Jarraitu title: Kanporatu %{acct} warning_html: 'Kontu hau kanporatzeak <strong>behin betiko</strong> ezabatuko ditu kontu honetako datuak, hauek barne:' title: Administrazioa @@ -674,6 +678,9 @@ eu: no_account_html: Ez duzu konturik? <a href='%{sign_up_path}' target='_blank'>Izena eman</a> dezakezu proceed: Ekin jarraitzeari prompt: 'Hau jarraituko duzu:' + remote_interaction: + proceed: Jarraitu interakziora + prompt: 'Toot honekin interakzioa nahi duzu:' remote_unfollow: error: Errorea title: Izenburua @@ -757,6 +764,7 @@ eu: private: Ezin dira publikoak ez diren toot-ak finkatu reblog: Bultzada bat ezin da finkatu show_more: Erakutsi gehiago + sign_in_to_participate: Eman izena elkarrizketan parte hartzeko title: '%{name}: "%{quote}"' visibilities: private: Jarraitzaileak besterik ez diff --git a/config/locales/fa.yml b/config/locales/fa.yml index b0d230634..e2bcf7176 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -322,7 +322,6 @@ fa: comment: none: خالی created_at: گزارششده - id: شناسه mark_as_resolved: علامتگذاری به عنوان حلشده mark_as_unresolved: علامتگذاری به عنوان حلنشده notes: @@ -333,7 +332,6 @@ fa: placeholder: کارهایی را که در این باره انجام شده، یا هر بهروزرسانی دیگری را بنویسید... reopen: دوباره به جریان بیندازید report: 'گزارش #%{id}' - report_contents: محتوا reported_account: حساب گزارششده reported_by: گزارش از طرف resolved: حلشده @@ -341,12 +339,10 @@ fa: silence_account: بیصدا کردن حساب status: نوشته suspend_account: معلقکردن حساب - target: هدف title: گزارشها unassign: پسگرفتن مسئولیت unresolved: حلنشده updated_at: بهروز شد - view: نمایش settings: activity_api_enabled: desc_html: تعداد بوقهای محلی، کاربران فعال، و کاربران تازه در هر هفته diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 96339e35e..e6a323da6 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -268,7 +268,6 @@ fi: comment: none: Ei mitään created_at: Raportoitu - id: Tunniste mark_as_resolved: Merkitse ratkaistuksi mark_as_unresolved: Merkitse ratkaisemattomaksi notes: @@ -279,7 +278,6 @@ fi: placeholder: Kuvaile mitä toimia on tehty tai muita päivityksiä tähän raporttiin… reopen: Avaa raportti uudestaan report: Raportti nro %{id} - report_contents: Sisältö reported_account: Raportoitu tili reported_by: Raportoija resolved: Ratkaistut @@ -287,11 +285,9 @@ fi: silence_account: Hiljennä tili status: Tila suspend_account: Siirrä tili jäähylle - target: Kohde title: Raportit unresolved: Ratkaisemattomat updated_at: Päivitetty - view: Näytä settings: activity_api_enabled: desc_html: Paikallisesti julkaistujen tilojen, aktiivisten käyttäjien ja uusien rekisteröintien määrät viikoittain diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 1e08e9bbe..a9b9e7b55 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -322,7 +322,6 @@ fr: comment: none: Aucun created_at: Signalé - id: ID mark_as_resolved: Marquer comme résolu mark_as_unresolved: Marquer comme non-résolu notes: @@ -333,7 +332,6 @@ fr: placeholder: Décrivez quelles actions ont été prises, ou toute autre mise à jour… reopen: Ré-ouvrir le signalement report: 'Signalement #%{id}' - report_contents: Contenu reported_account: Compte signalé reported_by: Signalé par resolved: Résolus @@ -341,12 +339,10 @@ fr: silence_account: Masquer le compte status: Statut suspend_account: Suspendre le compte - target: Cible title: Signalements unassign: Dés-assigner unresolved: Non résolus updated_at: Mis à jour - view: Voir settings: activity_api_enabled: desc_html: Nombre de statuts affichés localement, d’utilisateur·ice·s actif·ve·s et de nouveaux enregistrements dans les registres hebdomadaires diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 42794c67f..77ddf15f4 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -304,6 +304,7 @@ gl: enable_hint: Unha vez activado, o seu servidor suscribirase a todos os toots públicos de este servidor, e tamén comezará a eviar a el os toots públicos do servidor. inbox_url: URL do repetidor pending: Agardando polo permiso do repetidor + save_and_enable: Gardar e activar setup: Configurar a conexión ao repetidor status: Estado title: Repetidores @@ -321,7 +322,6 @@ gl: comment: none: Nada created_at: Reportado - id: ID mark_as_resolved: Marcar como resolto mark_as_unresolved: Marcar como non resolto notes: @@ -332,7 +332,6 @@ gl: placeholder: Describe qué medidas foron tomadas, ou calquer outra información relacionada... reopen: Voltar a abrir o informe report: 'Informe #%{id}' - report_contents: Contidos reported_account: Conta reportada reported_by: Reportada por resolved: Resolto @@ -340,12 +339,10 @@ gl: silence_account: Acalar conta status: Estado suspend_account: Suspender conta - target: Obxetivo title: Informes unassign: Non asignar unresolved: Non resolto updated_at: Actualizado - view: Vista settings: activity_api_enabled: desc_html: Conta de estados publicados localmente, usuarias activas, e novos rexistros por semana diff --git a/config/locales/he.yml b/config/locales/he.yml index ccf53e14a..3d24f22d2 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -184,20 +184,16 @@ he: are_you_sure: 100% על בטוח? comment: none: ללא - id: ID mark_as_resolved: סימון כפתור report: 'דווח על #%{id}' - report_contents: תוכן reported_account: חשבון מדווח reported_by: דווח על ידי resolved: פתור silence_account: השתקת חשבון status: הודעה suspend_account: השעיית חשבון - target: מטרה title: דיווחים unresolved: לא פתור - view: תצוגה settings: contact_information: email: נא להקליד כתובת דוא"ל פומבית diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 824a46066..5d89b44cc 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -244,20 +244,16 @@ hu: are_you_sure: Biztos vagy benne? comment: none: Egyik sem - id: ID mark_as_resolved: Megjelölés megoldottként report: "#%{id} számú jelentés" - report_contents: Tartalom reported_account: Bejelentett fiók reported_by: 'Jelentette:' resolved: Megoldott silence_account: Felhasználó némítása status: Állapot suspend_account: Felhasználó felfüggesztése - target: Cél title: Jelentések unresolved: Megoldatlan - view: Megtekintés settings: activity_api_enabled: desc_html: Helyi tülkök, aktív felhasználók és új regisztrációk száma heti bontásban diff --git a/config/locales/id.yml b/config/locales/id.yml index 33a764a28..b186b7652 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -109,20 +109,16 @@ id: reports: comment: none: Tidak ada - id: ID mark_as_resolved: Tandai telah diseleseikan report: 'Laporkan #%{id}' - report_contents: Konten reported_account: Akun yang dilaporkan reported_by: Dilaporkan oleh resolved: Terseleseikan silence_account: Akun yang didiamkan status: Status suspend_account: Akun yang disuspen - target: Target title: Laporan unresolved: Belum Terseleseikan - view: Tampilan settings: contact_information: email: Masukkan alamat email diff --git a/config/locales/io.yml b/config/locales/io.yml index 287c1d0e6..be8a87acd 100644 --- a/config/locales/io.yml +++ b/config/locales/io.yml @@ -102,7 +102,6 @@ io: reports: comment: none: None - id: ID mark_as_resolved: Mark as resolved report: 'Report #%{id}' reported_account: Reported account @@ -111,10 +110,8 @@ io: silence_account: Silence account status: Status suspend_account: Suspend account - target: Target title: Reports unresolved: Unresolved - view: View settings: contact_information: email: Enter a public e-mail address diff --git a/config/locales/it.yml b/config/locales/it.yml index c947e3107..8222cedbb 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -33,13 +33,17 @@ it: status_count_after: stati status_count_before: Che hanno pubblicato terms: Termini di Servizio - user_count_after: utenti + user_count_after: + one: utente + other: utenti user_count_before: Home di what_is_mastodon: Che cos'è Mastodon? accounts: choices_html: 'Suggerimenti da %{name}:' follow: Segui - followers: Seguaci + followers: + one: Seguace + other: Seguaci following: Segui joined: Dal %{date} media: Media @@ -50,7 +54,10 @@ it: people_who_follow: Persone che seguono %{name} pin_errors: following: Devi gia seguire la persona che vuoi promuovere - posts: Posts + posts: + one: Toot + other: Toot + posts_tab_heading: Toot posts_with_replies: Toot e risposte reserved_username: Il nome utente è gia stato preso roles: @@ -215,8 +222,10 @@ it: dashboard: backlog: backlogged jobs config: Configurazione + feature_deletions: Cancellazioni di account feature_invites: Link di invito feature_registrations: Registrazioni + feature_relay: Ripetitore di federazione features: Funzionalità hidden_service: Federazione con servizi nascosti open_reports: apri report @@ -227,7 +236,7 @@ it: space: Utilizzo dello spazio title: Dashboard total_users: utenti totali - trends: Trends + trends: Tendenze week_interactions: interazioni per questa settimana week_users_active: attivi questa settimana week_users_new: utenti questa settimana @@ -286,17 +295,24 @@ it: title: Filtro title: Inviti relays: + add_new: Aggiungi ripetitore + description_html: Un <strong>ripetitore di federazione</strong> è un server che fa da intermediario e scambia grandi quantità di toot pubblici tra server che si collegano e pubblicano su di esso. <strong>Può aiutare server piccoli e medi a ottenere contenuti dal fediverse</strong>, che altrimenti riceverebbero solo se i loro utenti locali seguissero altre persone su server remoti. + enable_hint: Dopo l'attivazione, il vostro server riceverà tutti i toot pubblici da questo ripetitore, e inizierà a inviargli i suoi toot pubblici. inbox_url: Url Relay + pending: In attesa dell'approvazione del ripetitore + save_and_enable: Salva e attiva + setup: Crea una connessione con un ripetitore + title: Ripetitori reports: account: note: note + report: rapporto action_taken_by: Azione intrapresa da are_you_sure: Sei sicuro? assign_to_self: Assegna a me assigned: Moderatore assegnato comment: none: Nessuno - id: ID mark_as_resolved: Segna come risolto mark_as_unresolved: Segna come non risolto notes: @@ -306,17 +322,15 @@ it: delete: Elimina reopen: Riapri rapporto report: 'Rapporto #%{id}' - report_contents: Contenuti reported_by: Inviato da resolved: Risolto silence_account: Silenzia account status: Stato suspend_account: Sospendi account - target: Obbiettivo + title: Rapporti unassign: Non assegnare unresolved: Non risolto updated_at: Aggiornato - view: Mostra settings: activity_api_enabled: desc_html: Conteggi degli status pubblicati localmente, degli utenti attivi e delle nuove registrazioni in gruppi settimanali @@ -325,6 +339,9 @@ it: title: Seguiti predefiniti per i nuovi utenti contact_information: username: Nome utente del contatto + custom_css: + desc_html: Modifica l'aspetto con il CSS caricato in ogni pagina + title: CSS personalizzato peers_api_enabled: desc_html: Nomi di dominio che questa istanza ha incontrato nella fediverse title: Pubblica elenco di istanze scoperte @@ -348,10 +365,13 @@ it: title: Mostra badge staff site_description: title: Descrizione istanza + site_short_description: + title: Breve descrizione dell'istanza site_terms: title: Termini di servizio personalizzati site_title: Nome istanza timeline_preview: + desc_html: Mostra la timeline pubblica sulla pagina iniziale title: Anteprima timeline title: Impostazioni sito statuses: @@ -458,6 +478,17 @@ it: follows: Stai seguendo mutes: Stai silenziando storage: Archiviazione media + filters: + contexts: + home: Timeline home + notifications: Notifiche + public: Timeline pubbliche + thread: Conversazioni + index: + delete: Cancella + title: Filtri + new: + title: Aggiungi filtro followers: domain: Dominio explanation_html: Se vuoi garantire la privacy dei tuoi status, devi sapere chi ti sta seguendo. <strong>I tuoi status privati vengono inviati a tutte le istanze su cui hai dei seguaci</strong>. Puoi controllare chi sono i tuoi seguaci, ed eliminarli se non hai fiducia che la tua privacy venga rispettata dallo staff o dal software di quelle istanze. @@ -465,6 +496,9 @@ it: purge: Elimina dai seguaci true_privacy_html: Tieni presente che <strong>l'effettiva riservatezza si può ottenere solo con la crittografia end-to-end</strong>. unlocked_warning_html: Chiunque può seguirti per vedere immediatamente i tuoi status privati. %{lock_link} per poter esaminare e respingere gli utenti che vogliono seguirti. + footer: + developers: Sviluppatori + more: Altro… generic: changes_saved_msg: Modifiche effettuate con successo! save_changes: Salva modifiche @@ -492,6 +526,7 @@ it: '86400': 1 giorno expires_in_prompt: Mai generate: Genera + invited_by: 'Sei stato invitato da:' max_uses: other: "%{count} utilizzi" max_uses_prompt: Nessun limite @@ -661,7 +696,7 @@ it: recovery_codes_regenerated: I codici di recupero sono stati rigenerati recovery_instructions_html: Se perdi il telefono, puoi usare uno dei codici di recupero qui sotto per riottenere l'accesso al tuo account. <strong>Conserva i codici di recupero in un posto sicuro</strong>. Ad esempio puoi stamparli e conservarli insieme ad altri documenti importanti. setup: Configura - wrong_code: Il codice inserito non è corretto! Assicurati che l'orario del server e l'orario del dispotivo siano corretti. + wrong_code: Il codice inserito non è corretto! Assicurati che l'orario del server e l'orario del dispositivo siano corretti. user_mailer: backup_ready: explanation: Hai richiesto un backup completo del tuo account Mastodon. È pronto per essere scaricato! diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 024443d5f..2a23b7acf 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -120,6 +120,7 @@ ja: moderation_notes: モデレーションメモ most_recent_activity: 直近の活動 most_recent_ip: 直近のIP + no_limits_imposed: 制限なし not_subscribed: 購読していない order: alphabetic: アルファベット順 @@ -155,8 +156,10 @@ ja: report: レポート targeted_reports: このアカウントについてのレポート silence: サイレンス + silenced: サイレンス済み statuses: トゥート数 subscribe: 購読する + suspended: 停止済み title: アカウント unconfirmed_email: 確認待ちのメールアドレス undo_silenced: サイレンスから戻す @@ -300,8 +303,13 @@ ja: title: 招待 relays: add_new: リレーを追加 + delete: 削除 description_html: "<strong>連合リレー</strong>とは、登録しているサーバー間の公開トゥートを仲介するサーバーです。<strong>中小規模のサーバーが連合のコンテンツを見つけるのを助けます。</strong>これを使用しない場合、ローカルユーザーがリモートユーザーを手動でフォローする必要があります。" + disable: 無効化 + disabled: 無効 + enable: 有効化 enable_hint: 有効にすると、リレーから全ての公開トゥートを受信するようになり、またこのサーバーの全ての公開トゥートをリレーに送信するようになります。 + enabled: 有効 inbox_url: リレーURL pending: リレーサーバーの承認待ちです save_and_enable: 保存して有効にする @@ -322,7 +330,6 @@ ja: comment: none: なし created_at: レポート日時 - id: ID mark_as_resolved: 解決済みとしてマーク mark_as_unresolved: 未解決として再び開く notes: @@ -333,7 +340,6 @@ ja: placeholder: どのような措置が取られたか、または関連する更新を記述してください… reopen: 再び開く report: レポート#%{id} - report_contents: 内容 reported_account: 報告対象アカウント reported_by: 報告者 resolved: 解決済み @@ -341,12 +347,10 @@ ja: silence_account: アカウントをサイレンス status: ステータス suspend_account: アカウントを停止 - target: ターゲット title: レポート unassign: 担当を外す unresolved: 未解決 updated_at: 更新日時 - view: 表示 settings: activity_api_enabled: desc_html: 週ごとのローカルに投稿されたトゥート数、アクティブなユーザー数、新規登録者数 diff --git a/config/locales/ka.yml b/config/locales/ka.yml index c1105b017..e22836148 100644 --- a/config/locales/ka.yml +++ b/config/locales/ka.yml @@ -311,7 +311,6 @@ ka: comment: none: არაფერი created_at: რეპორტის დრო - id: იდ mark_as_resolved: მონიშნე გადაწყვეტილად mark_as_unresolved: მონიშნე გადაუწყვეტლად notes: @@ -322,7 +321,6 @@ ka: placeholder: აღწერეთ თუ რა ნაბიჯები უნდა გადაიდგას, ან სხვა დაკავშირებული განახლებები... reopen: რეპორტის ხელახალი გახსნა report: 'რეპორტი #%{id}' - report_contents: მოცულობები reported_account: დარეპორტებული ანგარიში reported_by: დაარეპორტა resolved: გადაწყვეტილი @@ -330,12 +328,10 @@ ka: silence_account: ანგარიშის გაჩუმება status: სტატუსი suspend_account: ანგარიშის შეჩერება - target: მიზანი title: რეპორტები unassign: გადაყენება unresolved: გადაუწყვეტელი updated_at: განახების დრო - view: ჩვენება settings: activity_api_enabled: desc_html: ლოკალურად გამოქვეყნებული სტატუსების, აქტიური მომხმარებლების და ყოველკვირეული რეგისტრაციების მთვლელი diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 737ab5be1..7250f244a 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -324,7 +324,6 @@ ko: comment: none: 없음 created_at: 리포트 시각 - id: ID mark_as_resolved: 해결 완료 처리 mark_as_unresolved: 미해결로 표시 notes: @@ -335,7 +334,6 @@ ko: placeholder: 이 리포트에 대한 조치, 기타 관련 된 사항에 대해 설명합니다… reopen: 리포트 다시 열기 report: '신고 #%{id}' - report_contents: 내용 reported_account: 신고 대상 계정 reported_by: 신고자 resolved: 해결됨 @@ -343,12 +341,10 @@ ko: silence_account: 계정을 침묵 처리 status: 상태 suspend_account: 계정을 정지 - target: 대상 title: 신고 unassign: 할당 해제 unresolved: 미해결 updated_at: 업데이트 시각 - view: 표시 settings: activity_api_enabled: desc_html: 주별 로컬에 게시 된 글, 활성 사용자 및 새로운 가입자 수 @@ -433,7 +429,7 @@ ko: suspensions: bad_acct_msg: 확인값이 일치하지 않습니다. 정지하려는 계정이 맞습니까? hint_html: '이 계정을 정지하려면 %{value}를 아래 입력칸에 입력하세요:' - proceed: 처리됨 + proceed: 완전히 정지시키기 title: "%{acct} 정지하기" warning_html: '이 계정을 정지하면 계정의 데이터를 모두 삭제하며 <strong>되돌릴 수 없습니다</strong>. 이것은 다음을 포함합니다:' title: 관리 diff --git a/config/locales/nl.yml b/config/locales/nl.yml index baad9b507..d826b848a 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -322,7 +322,6 @@ nl: comment: none: Geen created_at: Gerapporteerd op - id: ID mark_as_resolved: Markeer als opgelost mark_as_unresolved: Markeer als onopgelost notes: @@ -333,7 +332,6 @@ nl: placeholder: Beschrijf welke acties zijn ondernomen of andere gerelateerde opmerkingen… reopen: Rapportage heropenen report: 'Rapportage #%{id}' - report_contents: Inhoud reported_account: Gerapporteerde account reported_by: Gerapporteerd door resolved: Opgelost @@ -341,12 +339,10 @@ nl: silence_account: Account negeren status: Toot suspend_account: Account opschorten - target: Gerapporteerde account title: Rapportages unassign: Niet langer toewijzen unresolved: Onopgelost updated_at: Bijgewerkt - view: Weergeven settings: activity_api_enabled: desc_html: Wekelijks overzicht van de hoeveelheid lokale toots, actieve gebruikers en nieuwe registraties diff --git a/config/locales/no.yml b/config/locales/no.yml index bcf3966d4..57182b556 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -244,20 +244,16 @@ are_you_sure: Er du sikker? comment: none: Ingen - id: ID mark_as_resolved: Merk som løst report: 'Rapportér #%{id}' - report_contents: Innhold reported_account: Rapportert konto reported_by: Rapportert av resolved: Løst silence_account: Målbind konto status: Status suspend_account: Utvis konto - target: Mål title: Rapporter unresolved: Uløst - view: Vis settings: activity_api_enabled: desc_html: Antall lokale statusposter, aktive brukere og nye registreringer i ukentlige oppdelinger diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 5a3d339d6..89f809654 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -41,13 +41,13 @@ oc: user_count_before: Ostal de what_is_mastodon: Qu’es Mastodon ? accounts: - choices_html: 'Recomandacion de %{name} :' + choices_html: 'Recomandacions de %{name} :' follow: Sègre followers: one: Seguidor other: Seguidors following: Abonaments - joined: Arribèt lo %{date} + joined: Arribèt en %{date} media: Mèdias moved_html: "%{name} a mudat a %{new_profile_link} :" network_hidden: Aquesta informacion es pas disponibla @@ -323,7 +323,6 @@ oc: comment: none: Pas cap created_at: Creacion - id: ID mark_as_resolved: Marcar coma resolgut mark_as_unresolved: Marcar coma pas resolgut notes: @@ -334,7 +333,6 @@ oc: placeholder: Explicatz las accions que son estadas menadas o quicòm de ligat al senhalament… reopen: Tornar dobrir lo rapòrt report: 'Senhalament #%{id}' - report_contents: Contengut reported_account: Compte senhalat reported_by: Senhalat per resolved: Resolgut @@ -342,12 +340,10 @@ oc: silence_account: Metre lo compte en silenci status: Estatut suspend_account: Suspendre lo compte - target: Cibla title: Senhalament unassign: Levar unresolved: Pas resolgut updated_at: Actualizat - view: Veire settings: activity_api_enabled: desc_html: Nombre d’estatuts publicats, d’utilizaires actius e de novèlas inscripcions en rapòrt setmanièr diff --git a/config/locales/pl.yml b/config/locales/pl.yml index b0b592bbe..9afc666d1 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -34,12 +34,14 @@ pl: few: wpisów many: wpisów one: wpisu + other: wpisów status_count_before: Są autorami terms: Zasady użytkowania user_count_after: few: użytkowników many: użytkowników one: użytkownik + other: użytkowników user_count_before: Z serwera korzysta what_is_mastodon: Czym jest Mastodon? accounts: @@ -49,11 +51,10 @@ pl: few: śledzących many: śledzących one: śledzący - following: - few: śledzonych - many: śledzonych - one: śledzony + other: Śledzących + following: Śledzonych joined: Dołączył(a) %{date} + link_verified_on: Własność tego odnośnika została potwierdzona %{date} media: Zawartość multimedialna moved_html: "%{name} korzysta teraz z konta %{new_profile_link}:" network_hidden: Ta informacja nie jest dostępna @@ -66,6 +67,8 @@ pl: few: wpisy many: wpisów one: wpis + other: Wpisów + posts_tab_heading: Wpisy posts_with_replies: Wpisy z odpowiedziami reserved_username: Ta nazwa użytkownika jest zarezerwowana roles: @@ -126,6 +129,7 @@ pl: moderation_notes: Notatki moderacyjne most_recent_activity: Najnowsza aktywność most_recent_ip: Ostatnie IP + no_limits_imposed: Nie nałożono ograniczeń not_subscribed: Nie zasubskrybowano order: alphabetic: Alfabetycznie @@ -161,8 +165,10 @@ pl: report: zgłoszeń targeted_reports: Zgłoszenia dotyczące tego użytkownika silence: Wycisz + silenced: Wyciszono statuses: Wpisy subscribe: Subskrybuj + suspended: Wywieszono title: Konta unconfirmed_email: Niepotwierdzony adres e-mail undo_silenced: Cofnij wyciszenie @@ -200,6 +206,7 @@ pl: unsuspend_account: "%{name} cofnął(-ęła) zawieszenie konta %{target}" update_custom_emoji: "%{name} zaktualizował(a) emoji %{target}" update_status: "%{name} zaktualizował(a) wpis użytkownika %{target}" + deleted_status: "(usunięty wpis)" title: Dziennik działań administracyjnych custom_emojis: by_domain: Domeny @@ -306,8 +313,13 @@ pl: title: Zaproszenia relays: add_new: Dodaj nowy + delete: Usuń description_html: "<strong>Przekaźnik federacji</strong> jest pośredniczącym serwerem wymieniającym duże ilości publicznych wpisów pomiędzy serwerami które subskrybują je i publikują na nich. <strong>Pomaga to małym i średnim instancją poznawać nową zawartość z Fediwersum</strong>, co w innym przypadku wymagałoby od użytkowników ręcznego śledzenia osób z innych serwerów." + disable: Dezaktuwuj + disabled: Nieaktywny + enable: Aktywuj enable_hint: Jeżeli włączone, Twój serwer zasubskrybuje wszystkie publiczne wpisy z tego przekaźnika i zacznie wysyłać tam publiczne wpisy z tego serwera. + enabled: Aktywny inbox_url: Adres przekaźnika pending: Oczekiwanie na przyjęcie przez przekaźnik save_and_enable: Zapisz i aktywuj @@ -328,7 +340,6 @@ pl: comment: none: Brak created_at: Zgłoszono - id: ID mark_as_resolved: Oznacz jako rozwiązane mark_as_unresolved: Oznacz jako nierozwiązane notes: @@ -339,7 +350,6 @@ pl: placeholder: Opisz wykonane akcje i inne szczegóły dotyczące tego zgłoszenia… reopen: Otwórz ponownie report: 'Zgłoszenie #%{id}' - report_contents: Zawartość reported_account: Zgłoszone konto reported_by: Zgłaszający resolved: Rozwiązane @@ -347,12 +357,10 @@ pl: silence_account: Wycisz konto status: Stan suspend_account: Zawieś konto - target: Cel title: Zgłoszenia unassign: Cofnij przypisanie unresolved: Nierozwiązane updated_at: Zaktualizowano - view: Wyświetl settings: activity_api_enabled: desc_html: Liczy publikowane lokalnie wpisy, aktywnych użytkowników i nowe rejestracje w ciągu danego tygodnia @@ -363,6 +371,9 @@ pl: contact_information: email: Służbowy adres e-mail username: Nazwa użytkownika do kontaktu + custom_css: + desc_html: Modyfikuj wygląd pliku CSS ładowanego na każdej stronie + title: Niestandardowy CSS hero: desc_html: Wyświetlany na stronie głównej. Zalecany jest rozmiar przynajmniej 600x100 pikseli. Jeżeli nie ustawiony, zostanie użyta miniatura instancji. title: Obraz bohatera @@ -459,7 +470,7 @@ pl: warning: Przechowuj te dane ostrożnie. Nie udostępniaj ich nikomu! your_token: Twój token dostępu auth: - agreement_html: Rejestrując się, oświadczasz, że zapoznałeś(-aś) się z <a href="%{rules_path}">informacjami o instancji</a> i <a href="%{terms_path}">zasadami korzystania z usługi</a>. + agreement_html: Klikając „Rejestracja”, oświadczasz, że zapoznałeś(-aś) się z <a href="%{rules_path}">informacjami o instancji</a> i <a href="%{terms_path}">zasadami korzystania z usługi</a>. change_password: Hasło confirm_email: Potwierdź adres e-mail delete_account: Usunięcie konta @@ -884,6 +895,7 @@ pl: time: formats: default: "%b %d, %Y, %H:%M" + month: "%b %Y" two_factor_authentication: code_hint: Aby kontynuować, wprowadź kod wyświetlany przez aplikację uwierzytelniającą description_html: Jeśli włączysz <strong>uwierzytelnianie dwuetapowe</strong>, logowanie się będzie wymagało podania tokenu wyświetlonego na Twoim telefonie. @@ -929,3 +941,6 @@ pl: otp_lost_help_html: Jeżeli utracisz dostęp do obu, możesz skontaktować się z %{email} seamless_external_login: Zalogowano z użyciem zewnętrznej usługi, więc ustawienia hasła i adresu e-mail nie są dostępne. signed_in_as: 'Zalogowany jako:' + verification: + explanation_html: 'Możesz <strong>zweryfikować siebie jako właściciela odnośników w metadanych</strong>. Aby to zrobić, strona musi zawierać odnośnik do Twojego profilu na Mastodonie. Odnośnik <strong>musi</strong> zawierać atrybut <code>rel="me"</code>. Treść odnośnika nie ma znaczenia. Przykład:' + verification: Weryfikacja diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 856500ed6..97c58cf7a 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -320,7 +320,6 @@ pt-BR: comment: none: Nenhum created_at: Denunciado - id: ID mark_as_resolved: Marcar como resolvido mark_as_unresolved: Marcar como não resolvido notes: @@ -331,7 +330,6 @@ pt-BR: placeholder: Descreva que ações foram tomadas, ou quaisquer outras atualizações relacionadas… reopen: Reabrir denúncia report: 'Denúncia #%{id}' - report_contents: Conteúdos reported_account: Conta denunciada reported_by: Denunciada por resolved: Resolvido @@ -339,12 +337,10 @@ pt-BR: silence_account: Silenciar conta status: Status suspend_account: Suspender conta - target: Alvo title: Denúncias unassign: Desatribuir unresolved: Não resolvido updated_at: Atualizado - view: Visualizar settings: activity_api_enabled: desc_html: Contagem de status postados localmente, usuários ativos e novos cadastros filtrados semanalmente diff --git a/config/locales/pt.yml b/config/locales/pt.yml index eebeb498e..a1efd6c65 100644 --- a/config/locales/pt.yml +++ b/config/locales/pt.yml @@ -244,20 +244,16 @@ pt: are_you_sure: Tens a certeza? comment: none: Nenhum - id: ID mark_as_resolved: Marcar como resolvido report: 'Denúncia #%{id}' - report_contents: Conteúdos reported_account: Conta denunciada reported_by: Denúnciada por resolved: Resolvido silence_account: Conta silenciada status: Estado suspend_account: Conta suspensa - target: Alvo title: Denúncias unresolved: Por resolver - view: Ver settings: activity_api_enabled: desc_html: Contagem semanais de publicações locais, utilizadores activos e novos registos diff --git a/config/locales/ru.yml b/config/locales/ru.yml index f1b26236a..121652b73 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -6,7 +6,7 @@ ru: about_this: Об этом узле administered_by: 'Администратор узла:' api: API - apps: Мобильные приложения + apps: Приложения closed_registrations: В данный момент регистрация на этом узле закрыта. Но вы можете найти другой узел, создать на нём учётную запись и получить доступ к той же сети оттуда. contact: Связаться contact_missing: Не установлено @@ -51,7 +51,7 @@ ru: many: подписчиков one: подписчик other: подписчиков - following: Подписан(а) + following: подписки joined: 'Дата регистрации: %{date}' media: Медиа moved_html: "%{name} переехал(а) на %{new_profile_link}:" @@ -206,7 +206,7 @@ ru: custom_emojis: by_domain: Домен copied_msg: Локальная копия эмодзи успешно создана - copy: Скопироват + copy: Копировать copy_failed_msg: Не удалось создать локальную копию эмодзи created_msg: Эмодзи успешно создано! delete: Удалить @@ -231,11 +231,11 @@ ru: dashboard: backlog: задачи config: Конфигурация - feature_deletions: Аккаунтов удалено + feature_deletions: Удаление аккаунтов feature_invites: Пригласительные ссылки - feature_registrations: Регистрации - feature_relay: Ретрансляторов сети - features: Нововведения + feature_registrations: Регистрация + feature_relay: Ретрансляторы + features: Возможности hidden_service: Федерация со скрытыми сервисами open_reports: открытых жалоб recent_users: Недавние пользователи @@ -300,7 +300,7 @@ ru: search: Поиск title: Известные узлы invites: - deactivate_all: Удалить все + deactivate_all: Отключить все filter: all: Все available: Актуальные @@ -314,7 +314,7 @@ ru: inbox_url: URL ретранслятора pending: Ожидание подтверждения ретранслятора save_and_enable: Сохранить и включить - setup: Настроте соединение с ретранслятором + setup: Настроить соединение с ретранслятором status: Состояние title: Ретрансляторы report_notes: @@ -331,7 +331,6 @@ ru: comment: none: Нет created_at: Создано - id: ID mark_as_resolved: Отметить как разрешенную mark_as_unresolved: Отметить как неразрешённую notes: @@ -342,7 +341,6 @@ ru: placeholder: Опишите, какие действия были приняты, или любые другие подробности… reopen: Переоткрыть жалобу report: 'Жалоба #%{id}' - report_contents: Содержимое reported_account: Аккаунт нарушителя reported_by: Отправитель жалобы resolved: Разрешено @@ -350,12 +348,10 @@ ru: silence_account: Заглушить аккаунт status: Статус suspend_account: Блокировать аккаунт - target: Цель title: Жалобы unassign: Снять назначение unresolved: Неразрешенные updated_at: Обновлена - view: Просмотреть settings: activity_api_enabled: desc_html: Подсчёт количества локальных статусов, активных пользователей и новых регистраций на еженедельной основе @@ -405,7 +401,7 @@ ru: title: Расширенное описание узла site_short_description: desc_html: Отображается в боковой панели и в тегах. Опишите, что такое Mastodon и что делает именно этот узел особенным. Если пусто, используется описание узла по умолчанию. - title: Короткое описание узла + title: Краткое описание узла site_terms: desc_html: Вы можете добавить сюда собственную политику конфиденциальности, пользовательское соглашение и другие документы. Можно использовать теги HTML. title: Условия использования @@ -791,7 +787,7 @@ ru: ownership: Нельзя закрепить чужой статус private: Нельзя закрепить непубличный статус reblog: Нельзя закрепить продвинутый статус - show_more: Подробнее + show_more: Ещё sign_in_to_participate: Войдите, чтобы принять участие в дискуссии title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml index 3ee4a92a4..3e0c671cb 100644 --- a/config/locales/simple_form.ar.yml +++ b/config/locales/simple_form.ar.yml @@ -46,7 +46,7 @@ ar: display_name: الإسم المعروض email: عنوان البريد الإلكتروني expires_in: تنتهي مدة صلاحيته بعد - fields: واصفات بيانات الملف الشخصي + fields: البيانات الوصفية للصفحة الشخصية header: الرأسية inbox_url: عنوان رابط صندوق المُرَحِّل irreversible: إسقاط بدلا من إخفائها @@ -87,6 +87,7 @@ ar: follow_request: إبعث بريدا إلكترونيا عندما يقوم أحدهم بإرسال طلب بالمتابعة mention: إبعث بريداً إلكترونيًا عندما يُشير إليك أو يذكُرك أحدهم reblog: إبعث بريداً إلكترونيًا عندما يقوم أحدهم بترقية منشورك + report: إرسال رسالة إلكترونية عند تلقّي إبلاغ جديد 'no': لا required: mark: "*" diff --git a/config/locales/simple_form.ast.yml b/config/locales/simple_form.ast.yml index 0b77eecf2..a6b3e0733 100644 --- a/config/locales/simple_form.ast.yml +++ b/config/locales/simple_form.ast.yml @@ -1,2 +1,58 @@ --- ast: + simple_form: + hints: + defaults: + autofollow: La xente que se rexistre pente la invitación va siguite automáticamente + bot: Esta cuenta fai principalmente aiciones automatizaes y podría nun supervisase + digest: Namái s'unvia tres un periodu llargu d'inactividá y namái si recibiesti cualesquier mensaxe personal na to ausencia + display_name: + one: Queda <span class="name-counter">1</span> caráuter + other: Queden <span class="name-counter">%{count}</span> caráuteres + irreversible: Los toots peñeraos van desapaecer de mou irreversible, magar que se desanicie la peñera dempués + note: + one: Queda <span class="note-counter">1</span> caráuter + other: Queden <span class="note-counter">%{count}</span> caráuteres + setting_hide_network: La xente que sigas y teas siguiendo nun va amosase nel perfil + setting_theme: Afeuta al aspeutu de Mastodon cuando anicies sesión dende cualesquier preséu. + labels: + account: + fields: + name: Etiqueta + value: Conteníu + defaults: + avatar: Avatar + bot: Esta cuenta ye d'un robó + chosen_languages: Peñera de llingües + confirm_new_password: Confirmación de la contraseña nueva + current_password: Contraseña actual + data: Datos + display_name: Nome a amosar + fields: Datos meta del perfil + header: Testera + locale: Llingua de la interfaz + locked: Bloquiar cuenta + new_password: Contraseña nueva + note: Bio + otp_attempt: Códigu de verificación en dos pasos + password: Contraseña + setting_auto_play_gif: Reproducir GIFs automáticamente + setting_default_language: Llingua d'espublización + setting_default_privacy: Privacidá d'espublizaciones + severity: Severidá + username: Nome d'usuariu + username_or_email: Nome d'usuariu o corréu + interactions: + must_be_follower: Bloquiar avisos de persones que nun son siguidores + must_be_following: Bloquiar avisos de persones que nun sigues + must_be_following_dm: Bloquiar mensaxes direutos de persones que nun sigues + notification_emails: + favourite: Unviar un corréu cuando daquién conseñe como favoritu los tos estaos + follow: Unviar un corréu cuando daquién te siga + follow_request: Unviar un corréu cuando daquién solicite siguite + mention: Unviar un corréu cuando daquién te mente + 'no': Non + required: + mark: "*" + text: ríquese + 'yes': Sí diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml index 4b1721b77..bc8f7e0e9 100644 --- a/config/locales/simple_form.cy.yml +++ b/config/locales/simple_form.cy.yml @@ -6,6 +6,32 @@ cy: confirm_password: Cadarnhau cyfrinair email: Cyfeiriad e-bost header: Pennyn + locale: Iaith y rhyngwyneb + max_uses: Uchafswm y nifer o ddefnyddiau new_password: Cyfrinair newydd password: Cyfrinair + phrase: Allweddair neu ymadrodd + setting_default_language: Cyhoeddi iaith + setting_hide_network: Cuddiwch eich rhwydwaith + setting_reduce_motion: '' + setting_system_font_ui: Defnyddiwch ffont rhagosodedig y system + setting_theme: Thema'r wefan + severity: Difrifoldeb + type: Modd mewnforio username: Enw defnyddiwr + username_or_email: Enw defnyddiwr neu e-bost + whole_word: Gair cyfan + interactions: + must_be_follower: Blociwch hysbysiadau o bobl nad ydynt yn eich dilyn + must_be_following: Blociwch hysbysiadau o bobl nad ydych yn eu dilyn + must_be_following_dm: Blociwch negeseuon uniongyrchol o bobl nad ydych yn eu dilyn + notification_emails: + favourite: Anfonwch e-bost pan mae rhywun yn ffefrynnu eich statws + follow: Anfonwch e-bost pan mae rhywun yn eich dilyn chi + follow_request: Anfonwch e-bost pan mae rhywun yn gofyn i chi i'w dilyn + mention: Anfonwch e-bost pan mae rhywun yn eich crybwyll + 'no': Na + required: + mark: "*" + text: gofynnol + 'yes': Ie diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml index a5697220e..dfa440aae 100644 --- a/config/locales/simple_form.da.yml +++ b/config/locales/simple_form.da.yml @@ -67,7 +67,7 @@ da: setting_boost_modal: Vis bekræftelses dialog før du fremhæver setting_default_language: Sprog for opslag setting_default_privacy: Privatliv - setting_default_sensitive: Marker altid multimedia som værende følsomt + setting_default_sensitive: Marker altid medier som værende følsomt setting_delete_modal: Vis bekræftelses dialog før du sletter et trut setting_display_sensitive_media: Vis altid multimedier markeret som værende følsomt setting_hide_network: Skjul dit netværk @@ -92,6 +92,7 @@ da: follow_request: Send email når nogen anmoder om at følge dig mention: Send e-mail når nogen nævner dig reblog: Send email når nogen fremhæver din status + report: Send email når en ny anmeldelse bliver indsendt 'no': Nej required: mark: "*" diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml index 38e276d52..69e707c4c 100644 --- a/config/locales/simple_form.de.yml +++ b/config/locales/simple_form.de.yml @@ -92,6 +92,7 @@ de: follow_request: E-Mail senden, wenn mir jemand folgen möchte mention: E-Mail senden, wenn mich jemand erwähnt reblog: E-Mail senden, wenn jemand meinen Beitrag teilt + report: E-Mail senden, wenn ein neuer Bericht vorliegt 'no': Nein required: mark: "*" diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index c9ac42f5d..3ef992ef0 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -11,6 +11,7 @@ en: display_name: one: <span class="name-counter">1</span> character left other: <span class="name-counter">%{count}</span> characters left + email: You will be sent a confirmation e-mail fields: You can have up to 4 items displayed as a table on your profile header: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px inbox_url: Copy the URL from the frontpage of the relay you want to use @@ -20,12 +21,14 @@ en: note: one: <span class="note-counter">1</span> character left other: <span class="note-counter">%{count}</span> characters left + password: Use at least 8 characters phrase: Will be matched regardless of casing in text or content warning of a toot scopes: Which APIs the application will be allowed to access. If you select a top-level scope, you don't need to select individual ones. setting_default_language: The language of your toots can be detected automatically, but it's not always accurate setting_hide_network: Who you follow and who follows you will not be shown on your profile setting_noindex: Affects your public profile and status pages setting_skin: Reskins the selected Mastodon flavour + username: Your username will be unique on %{domain} whole_word: When the keyword or phrase is alphanumeric only, it will only be applied if it matches the whole word imports: data: CSV file exported from another Mastodon instance diff --git a/config/locales/simple_form.en_GB.yml b/config/locales/simple_form.en_GB.yml new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/config/locales/simple_form.en_GB.yml @@ -0,0 +1 @@ +{} diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml index 483f79058..0a39e01b8 100644 --- a/config/locales/simple_form.es.yml +++ b/config/locales/simple_form.es.yml @@ -3,33 +3,58 @@ es: simple_form: hints: defaults: + autofollow: Los usuarios que se registren mediante la invitación te seguirán automáticamente avatar: PNG, GIF o JPG. Máximo %{size}. Será escalado a %{dimensions}px + bot: Esta cuenta ejecuta principalmente acciones automatizadas y podría no ser monitorizada + context: Uno o múltiples contextos en los que debe aplicarse el filtro digest: Solo enviado tras un largo periodo de inactividad y solo si has recibido mensajes personales durante tu ausencia display_name: one: <span class="name-counter">1</span> caracter restante other: <span class="name-counter">%{count}</span> caracteres restantes + fields: Puedes tener hasta 4 elementos mostrándose como una tabla en tu perfil header: PNG, GIF o JPG. Máximo %{size}. Será escalado a %{dimensions}px + inbox_url: Copia la URL de la página principal del relés que quieres utilizar + irreversible: Los toots filtrados desaparecerán irreversiblemente, incluso si este filtro es eliminado más adelante + locale: El idioma de la interfaz de usuario, correos y notificaciones push locked: Requiere que manualmente apruebes seguidores y las publicaciones serán mostradas solamente a tus seguidores note: one: <span class="name-counter">1</span> carácter restante other: <span class="name-counter">%{count}</span> caracteres restantes + phrase: Se aplicará sin importar las mayúsculas o los avisos de contenido de un toot + scopes: Qué APIs de la aplicación tendrán acceso. Si seleccionas el alcance de nivel mas alto, no necesitas seleccionar las individuales. + setting_default_language: El idioma de tus toots podrá detectarse automáticamente, pero no siempre es preciso + setting_hide_network: A quién sigues y quién te sigue no será mostrado en tu perfil setting_noindex: Afecta a tu perfil público y páginas de estado setting_theme: Afecta al aspecto de Mastodon cuando te identificas desde cualquier dispositivo. + whole_word: Cuando la palabra clave o frase es solo alfanumérica, solo será aplicado si concuerda con toda la palabra imports: data: Archivo CSV exportado desde otra instancia de Mastodon sessions: - otp: Introduce el código de autenticación de dos factores de tu teléfono o usa uno de tus códigos de recuperación. + otp: 'Introduce el código de autenticación de dos factores geberado por tu aplicación de teléfono o usa uno de tus códigos de recuperación:' + user: + chosen_languages: Cuando se marca, solo se mostrarán los toots en los idiomas seleccionados en los timelines públicos labels: + account: + fields: + name: Etiqueta + value: Contenido defaults: + autofollow: Invitar a seguir tu cuenta avatar: Avatar + bot: Esta es una cuenta bot + chosen_languages: Filtrar idiomas confirm_new_password: Confirmar nueva contraseña confirm_password: Confirmar contraseña + context: Filtrar contextos current_password: Contraseña actual data: Información display_name: Nombre para mostrar email: Dirección de correo electrónico expires_in: Expirar tras + fields: Metadatos de perfil header: Img. cabecera + inbox_url: URL de la entrada de relés + irreversible: Dejar en lugar de ocultar locale: Idioma locked: Hacer privada esta cuenta max_uses: Máx. número de usos @@ -37,12 +62,15 @@ es: note: Biografía otp_attempt: Código de dos factores password: Contraseña + phrase: Palabra clave o frase setting_auto_play_gif: Reproducir automáticamente los GIFs animados setting_boost_modal: Mostrar ventana de confirmación antes de un Retoot + setting_default_language: Idioma de publicación setting_default_privacy: Privacidad de publicaciones setting_default_sensitive: Marcar siempre imágenes como sensibles setting_delete_modal: Mostrar diálogo de confirmación antes de borrar un toot setting_display_sensitive_media: Mostrar siempre material marcado como sensible + setting_hide_network: Ocultar tu red setting_noindex: Excluirse del indexado de motores de búsqueda setting_reduce_motion: Reducir el movimiento de las animaciones setting_system_font_ui: Utilizar la tipografía por defecto del sistema @@ -52,6 +80,7 @@ es: type: Importar tipo username: Nombre de usuario username_or_email: Usuario o Email + whole_word: Toda la palabra interactions: must_be_follower: Bloquear notificaciones de personas que no te siguen must_be_following: Bloquear notificaciones de personas que no sigues @@ -63,6 +92,7 @@ es: follow_request: Enviar correo electrónico cuando alguien solicita seguirte mention: Enviar correo electrónico cuando alguien te mencione reblog: Enviar correo electrónico cuando alguien comparta su publicación + report: Enviar un correo cuando se envía un nuevo informe 'no': 'No' required: mark: "*" diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml index 09a338200..1e3b2d4f0 100644 --- a/config/locales/simple_form.eu.yml +++ b/config/locales/simple_form.eu.yml @@ -13,6 +13,7 @@ eu: other: <span class="name-counter">%{count}</span> karaktere geratzen dira fields: 4 elementu bistaratu ditzakezu taula batean zure profilean header: PNG, GIF edo JPG. Gehienez %{size}. %{dimensions}px eskalara txikituko da + inbox_url: Kopiatu erabili nahi duzun errelearen hasiera orriaren URLa irreversible: Iragazitako toot-ak betirako galduko dira, geroago iragazkia kentzen baduzu ere locale: Erabiltzaile-interfazea, e-mail mezuen eta jakinarazpenen hizkuntza locked: Jarraitzaileak eskuz onartu behar dituzu @@ -52,6 +53,7 @@ eu: expires_in: Iraungitzea fields: Profilaren metadatuak header: Goiburua + inbox_url: Errelearen sarrera ontziaren URLa irreversible: Baztertu ezkutatu ordez locale: Interfazearen hizkuntza locked: Giltzapetu kontua @@ -90,6 +92,7 @@ eu: follow_request: Bidali e-mail bat norbaitek zu jarraitzea eskatzen duenean mention: Bidali e-mail bat norbaitek zu aipatzean reblog: Bidali e-mail bat norbaitek zure mezuari bultzada ematen badio + report: Bidali e-maila txosten berri bat aurkezten denean 'no': Ez required: mark: "*" diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index c13cfa50d..7495a9425 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -92,6 +92,7 @@ fr: follow_request: Envoyer un courriel lorsque quelqu’un demande à me suivre mention: Envoyer un courriel lorsque quelqu’un me mentionne reblog: Envoyer un courriel lorsque quelqu’un partage mes statuts + report: Envoyer un courriel lorsqu'un nouveau rapport est soumis 'no': Non required: mark: "*" diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml index b84a95826..8df441c36 100644 --- a/config/locales/simple_form.gl.yml +++ b/config/locales/simple_form.gl.yml @@ -92,6 +92,7 @@ gl: follow_request: Enviar un correo cando alguén solicita seguila mention: Enviar un correo cando alguén a menciona reblog: Enviar un correo cando alguén promociona a súa mensaxe + report: Enviar un correo cando se envíe un novo informe 'no': Non required: mark: "*" diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml index 810ac813e..2eaf04a70 100644 --- a/config/locales/simple_form.it.yml +++ b/config/locales/simple_form.it.yml @@ -52,14 +52,14 @@ it: email: Indirizzo email expires_in: Scade dopo fields: Metadati del profilo - header: Header + header: Intestazione inbox_url: URL della inbox del ripetitore irreversible: Elimina invece di nascondere locale: Lingua dell'interfaccia locked: Blocca account max_uses: Numero massimo di utilizzi new_password: Nuova password - note: Bio + note: Biografia otp_attempt: Codice due-fattori password: Password phrase: Parola chiave o frase @@ -92,6 +92,7 @@ it: follow_request: Invia email quando qualcuno richiede di seguirti mention: Invia email quando qualcuno ti menziona reblog: Invia email quando qualcuno da un boost al tuo stato + report: Manda una mail quando viene inviato un nuovo rapporto 'no': 'No' required: mark: "*" diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index 99c7b7cf9..d79dd75d1 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -89,6 +89,7 @@ ja: follow_request: フォローリクエストを受けた時にメールで通知する mention: 返信が来た時にメールで通知する reblog: トゥートがブーストされた時にメールで通知する + report: 通報を受けた時にメールで通知する 'no': いいえ required: mark: "*" diff --git a/config/locales/simple_form.ro.yml b/config/locales/simple_form.ro.yml index 31eb21a77..8cac6d606 100644 --- a/config/locales/simple_form.ro.yml +++ b/config/locales/simple_form.ro.yml @@ -1,3 +1,94 @@ --- ro: - simple_form: {} + simple_form: + hints: + defaults: + autofollow: Persoanele care se înregistrează datorită invitației tale te vor urmări automat + avatar: PNG, GIF sau JPG. Cel mult %{size}. Va fi redimensionată la %{dimensions}px + bot: Acest cont performează în cea mai mare parte acțiuni automate și nu poate fi monitorizat + context: Contextele în care filtrul trebuie aplicat + digest: Este trimis doar după o lungă perioadă de inactivitate și numai dacă primești mesaje personale în perioada de absență + fields: Poti afișa pană la maxim 4 adrese sub formă de tabel pe pofilul tău + header: PNG, GIF sau JPG. Cel mult %{size}. Vor fi redimensionate la %{dimensions}px + inbox_url: Copiază adresa URL de pe prima pagină a reului pe care vrei să îl utilizezi + irreversible: Postările sortate vor dispărea ireversibil, chiar dacă filtrul este ulterior șters + locale: Limba interfaței de utilizator, e-mailurile si notificările push + locked: Necesită aprobare manuală a urmăritorilor + phrase: Vor fi potrivite indiferent de textul din casetă sau advertismentul unei postări + scopes: La care API-uri aplicația are nevoie de acces. Dacă selectezi un scop principal nu mai e nevoie să selectezi fiecare sub-scop al acestuia. + setting_default_language: Limba postărilor tale poate fi detectată automat, dar nu este întotdeauna precisă + setting_hide_network: Pe cine urmărești și cine te urmărește nu vor fi afișați pe profilul tău + setting_noindex: Afecteazâ profilul tău public și statusurile tale + setting_theme: Afecteazâ modul în care arată interfața pe toate dispozitivele pe care ești conectat. + whole_word: Când fraza sau cuvântul este doar alfanumeric, acesta se aplică doar dacă există o potrivire completă + imports: + data: Fișierul CSV exportat de la o altă instanță + sessions: + otp: 'Introdu codul pentru dubla protecție generat de telefonul mobil sau unul din codurile de rezervă:' + user: + chosen_languages: Doar postările în limbile selectate vor fi afișate în fluxurile publice + labels: + account: + fields: + name: Etichetă + value: Conținut + defaults: + autofollow: Invită să te urmărească + avatar: Fotografie de profil + bot: Acesta este un cont automat (bot) + chosen_languages: Limbile filtrului + confirm_new_password: Confirmă noua parolă + confirm_password: Confirmă parola + context: Contextele filtrului + current_password: Parola actuală + data: Data + display_name: Numele afișat + email: Adresa de e-mail + expires_in: Expiră după + fields: Rețele externe - Unde mai poți fi găsit + header: Antet + inbox_url: Adresa URL a inbox-ului + irreversible: Lasă înloc să ascunzi + locale: Limbă + locked: Cont Privat + max_uses: Numărul maxim de utilizatori + new_password: Parola nouă + note: Descriere + otp_attempt: Cod dublă protecție + password: Parolă + phrase: Cuvânt sau frază + setting_auto_play_gif: Redă automat animațiile GIF + setting_boost_modal: Arată dialogul de confirmare înainte de a redistribui + setting_default_language: În ce limbă postezi + setting_default_privacy: Cine vede postările tale + setting_default_sensitive: Întotdeauna marchează conținutul media ca sensibil + setting_delete_modal: Arată dialogul de confirmare înainte de a șterge o postare + setting_display_sensitive_media: Întotdeauna arată conținutul media sensibil + setting_hide_network: Ascunde rețeaua + setting_noindex: Nu permite motoarelor de căutare să indexeze rețeaua ta + setting_reduce_motion: Redu mișcarea în animații + setting_system_font_ui: Utilizează fontul standard as sistemului + setting_theme: Tema siteului + setting_unfollow_modal: Arată dialogul de confirmare înainte de a nu mai urmări pe cineva + severity: Severitate + type: Ce importați + username: Nume de utilizator + username_or_email: Numele de utilizator sau adresa de E-mail + whole_word: Cuvânt întreg + interactions: + must_be_follower: Blochează notificările de la persoane care nu te urmăresc + must_be_following: Blochează notificările de la persoane pe care nu le urmărești + must_be_following_dm: Blochează mesajele directe de la persoane pe care nu le urmărești + notification_emails: + digest: Trimite rezumate + favourite: Trimite e-mail când cineva favorizează unul din statusurile tale + follow: Trimite e-mail când cineva te urmărește + follow_request: Trimite e-mail când cineva trimite o cerere de urmărire + mention: Trimite e-mail când cineva te menționează + reblog: Trimite e-mail când cineva redistribuie unul din statusurile tale + report: Trimite e-mail când un raport nou este trimis + 'no': Nu + required: + mark: "*" + text: obligatoriu + 'yes': Da diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml index 3ca176a1f..d1066b054 100644 --- a/config/locales/simple_form.ru.yml +++ b/config/locales/simple_form.ru.yml @@ -35,6 +35,8 @@ ru: data: Файл CSV, экспортированный с другого узла Mastodon sessions: otp: 'Введите код двухфакторной аутентификации, сгенерированный в мобильном приложении, или используйте один из Ваших кодов восстановления:' + user: + chosen_languages: Если выбрано, то в публичных лентах будут показаны только посты на выбранных языках labels: account: fields: diff --git a/config/locales/simple_form.sk.yml b/config/locales/simple_form.sk.yml index c9ec7fb20..d92e2dd83 100644 --- a/config/locales/simple_form.sk.yml +++ b/config/locales/simple_form.sk.yml @@ -94,6 +94,7 @@ sk: follow_request: Zaslať email ak ti niekto pošle žiadosť o sledovanie mention: Poslať email ak ťa niekto spomenie v svojom príspevku reblog: Poslať email ak niekto re-tootne tvoj príspevok + report: Poslať e-mail ak niekto dodá nové hlásenie 'no': Nie required: mark: "*" diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml index 3763fc747..7b3101239 100644 --- a/config/locales/simple_form.zh-TW.yml +++ b/config/locales/simple_form.zh-TW.yml @@ -6,21 +6,27 @@ zh-TW: autofollow: 通過邀請網址註冊的使用者將會自動關注你 avatar: 支援 PNG, GIF 或 JPG 圖片,檔案最大為 %{size},會縮裁成 %{dimensions}px bot: 這個帳號由程式進行自動式操作 + context: 應該套用過濾器的一項或多項內容 digest: 僅在你長時間未登入,並且收到了私訊時發送 display_name: one: 尚餘 <span class="name-counter">1</span> 個字 other: 尚餘 <span class="name-counter">%{count}</span> 個字 fields: 個人資訊頁至多可顯示 4 個項目 header: 支援 PNG, GIF 或 JPG 圖片,檔案最大為 %{size},會縮裁成 %{dimensions}px + inbox_url: 從您想要使用的中繼首頁複製 URL + irreversible: 已過濾的嘟文將會不可逆的消失,即便過濾器之後也一樣 locale: 使用者介面、 E-mail 與通知的語言 locked: 你必須手動核准每個使用者對你的關注請求,而你的貼文隱私將會被設定為「只有關注你的人能看」 note: one: 尚餘 <span class="note-counter">1</span> 個字 other: 尚餘 <span class="note-counter">%{count}</span> 個字 + phrase: 無論是嘟文的本文或是內容警告都會被過濾 + scopes: 應用程式將會被允許存取哪些 API。若您選取了最高階的範圍,您就不需要再選取單獨的了。 setting_default_language: 你嘟文的語言會被自動偵測,但不一定完全準確 setting_hide_network: 你關注的人與關注你的人將不會在你的個人資料頁上顯示 setting_noindex: 此設定會影響到你的公開個人資料與嘟文頁面 setting_theme: 此設定會影響到你從任意設備登入 Mastodon 時的顯示樣式。 + whole_word: 如果關鍵字或詞組僅有字母與數字,它將只會在符合整個單字的時候才會套用 imports: data: 自其他站點匯出的 CSV 檔案 sessions: @@ -39,6 +45,7 @@ zh-TW: chosen_languages: 語言篩選 confirm_new_password: 確認新密碼 confirm_password: 確認密碼 + context: 過濾範圍 current_password: 目前密碼 data: 資料 display_name: 顯示名稱 @@ -46,6 +53,8 @@ zh-TW: expires_in: 失效時間 fields: 資料 header: 個人頁面圖片 + inbox_url: 中繼收件匣的 URL + irreversible: 放棄而非隱藏 locale: 介面語言 locked: 將帳號轉為「私密」 max_uses: 最大使用次數 @@ -53,13 +62,14 @@ zh-TW: note: 簡介 otp_attempt: 兩階段認證碼 password: 密碼 + phrase: 關鍵字或片語 setting_auto_play_gif: 自動播放 GIF setting_boost_modal: 在轉嘟前先詢問我 setting_default_language: 嘟文語言 setting_default_privacy: 嘟文預設為 - setting_default_sensitive: 預設我的媒體檔案為敏感內容 + setting_default_sensitive: 總是將媒體標記為敏感內容 setting_delete_modal: 刪除嘟文前先詢問我 - setting_display_sensitive_media: 預設我的媒體為敏感內容 + setting_display_sensitive_media: 總是顯示標記為敏感內容的媒體 setting_hide_network: 隱藏你的社交網路 setting_noindex: 阻止搜尋引擎收錄 setting_reduce_motion: 減低動畫效果 @@ -70,6 +80,7 @@ zh-TW: type: 匯入資料類型 username: 使用者名稱 username_or_email: 使用者名稱或 E-mail + whole_word: 整個詞 interactions: must_be_follower: 隱藏沒有關注你的使用者通知 must_be_following: 隱藏你沒關注的使用者通知 @@ -81,6 +92,7 @@ zh-TW: follow_request: 當有使用者要求關注你時,發送 E-mail 通知 mention: 當有使用者在嘟文提及你時,發送 E-mail 通知 reblog: 都有使用者轉嘟你的嘟文時,發送 E-mail 通知 + report: 當遞交新報告時傳送電子郵件 'no': 否 required: mark: "*" diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 2e9761d12..8e6e128d8 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -4,11 +4,14 @@ sk: about_hashtag_html: Toto sú verejné toot príspevky otagované <strong>#%{hashtag}</strong>. Ak máš účet niekde vo fediverse, môžeš ich používať. about_mastodon_html: Mastodon je sociálna sieť založená na otvorených webových protokoloch. Jej zrojový kód je otvorený a je decentralizovaná podobne ako email. about_this: O tejto instancii - administered_by: 'Správca je:' - closed_registrations: Registrácie sú momentálne uzatvorené. Avšak, môžeš nájsť nejaký iný Mastodon server kde si založ účet a získaj tak prístup do presne tej istej siete, odtiaľ. + administered_by: 'Správcom je:' + api: API + apps: Mobilné aplikácie + closed_registrations: Registrácie sú na tomto serveri momentálne uzatvorené. Avšak, môžeš nájsť nejaký iný Mastodon server kde si založ účet a získaj tak prístup do presne tej istej siete, odtiaľ. contact: Kontakt contact_missing: Nezadané contact_unavailable: Neuvedené + documentation: Dokumentácia extended_description_html: | <h3>Pravidlá</h3> <p>Žiadne zatiaľ nie sú</p> @@ -25,23 +28,38 @@ sk: hosted_on: Mastodon hostovaný na %{domain} learn_more: Zisti viac other_instances: Zoznam ďalších inštancií + privacy_policy: Ustanovenia o súkromí source_code: Zdrojový kód - status_count_after: príspevkov + status_count_after: + one: status + other: statusy status_count_before: Ktorí napísali - user_count_after: užívateľov + terms: Podmienky užívania + user_count_after: + one: užívateľ + other: užívatelia user_count_before: Domov pre what_is_mastodon: Čo je Mastodon? accounts: + choices_html: "%{name}vé voľby:" follow: Sledovať - followers: Sledujúci + followers: + one: Následovateľ + other: Následovatelia following: Sleduje + joined: Pridal/a sa %{date} media: Médiá moved_html: "%{name} účet bol presunutý na %{new_profile_link}:" network_hidden: Táto informácia nieje k dispozícii nothing_here: Nič tu nie je! people_followed_by: Ľudia, ktorých %{name} sleduje people_who_follow: Ľudia sledujúci %{name} - posts: Príspevky + pin_errors: + following: Musíš už následovať toho človeka, ktorého si praješ zviditeľniť + posts: + one: Príspevok + other: Príspevky + posts_tab_heading: Príspevky posts_with_replies: Príspevky s odpoveďami reserved_username: Prihlasovacie meno je rezervované roles: @@ -83,12 +101,12 @@ sk: feed_url: URL časovej osi followers: Sledujúci followers_url: URL sledujúcich - follows: Sledovaní + follows: Sledovania inbox_url: URL prijatých správ ip: IP location: all: Všetko - local: Lokálne + local: Miestne remote: Federované title: Lokácia login_status: Status prihlásenia @@ -176,6 +194,7 @@ sk: unsuspend_account: "%{name} zrušil/a blokovanie účtu používateľa %{target}" update_custom_emoji: "%{name} aktualizoval/a emoji %{target}" update_status: "%{name} aktualizoval/a status pre %{target}" + deleted_status: "(zmazaný príspevok)" title: Kontrólny záznam custom_emojis: by_domain: Doména @@ -203,6 +222,7 @@ sk: updated_msg: Emoji bolo úspešne aktualizované! upload: Nahrať dashboard: + backlog: odložené aktivity config: Nastavenia feature_deletions: Vymazanie účtov feature_invites: Pozvánky @@ -212,9 +232,16 @@ sk: hidden_service: Federácia so skritými službami open_reports: otvorené hlásenia recent_users: Nedávny užívatelia + search: Celofrázové vyhľadávanie + single_user_mode: Jednouživateľské rozhranie software: Softvér space: Využitie miesta + title: Spravovacie rozhranie total_users: užívateľov celkovo + trends: Trendy + week_interactions: Tohto týždňové interakcie + week_users_active: aktívni tento týždeň + week_users_new: užívateľov počas tohto týždňa domain_blocks: add_new: Pridať nový created_msg: Doména je v procese blokovania @@ -265,6 +292,7 @@ sk: search: Hľadať title: Známe instancie invites: + deactivate_all: Pozastaviť všetky filter: all: Všetky available: Dostupné @@ -274,7 +302,13 @@ sk: relays: add_new: Pridaj novú priechodnú oporu description_html: "<strong>Federovací mostík</strong> je prechodný server ktorý obmieňa veľké množstvá verejných príspevkov medzi tými servermi ktoré na od neho odoberajú, aj doňho prispievajú. <strong>Môže to pomôcť malým a stredným instanciám objavovať federovaný obsah</strong>, čo inak vyžaduje aby miestni užívatelia ručne následovali iných ľudí zo vzdialených instancií." + enable_hint: Ak povolíš, tvoj server bude odoberať všetky verejné príspevky z tohto mostu, a začne posielať verejné príspevky tvojho servera na tento most. + inbox_url: URL mostu + pending: Čakám na povolenie od prechodného mostu + save_and_enable: Uložiť a povoliť + setup: Nastav prepojenie s mostom status: Stav + title: Mosty report_notes: created_msg: Poznámka o nahlásení úspešne vytvorená! destroyed_msg: Poznámka o nahlásení úspešne vymazaná! @@ -289,7 +323,6 @@ sk: comment: none: Žiadne created_at: Nahlásené - id: Identifikácia mark_as_resolved: Označiť ako vyriešené mark_as_unresolved: Označ ako nevyriešené notes: @@ -300,7 +333,6 @@ sk: placeholder: Opíš aké opatrenia boli urobené, alebo akékoľvek iné súvisiace aktualizácie… reopen: Znovu otvor report report: Nahlásiť - report_contents: Obsah reported_account: Nahlásený účet reported_by: Nahlásené užívateľom resolved: Vyriešené @@ -308,12 +340,10 @@ sk: silence_account: Zamĺčať účet status: Stav suspend_account: Pozastaviť účet - target: Cieľ title: Reporty unassign: Odobrať unresolved: Nevyriešené updated_at: Aktualizované - view: Zobraziť settings: activity_api_enabled: desc_html: Sčítanie lokálne publikovaných príspevkov, aktívnych užívateľov, a nových registrácii, v týždenných intervaloch @@ -324,6 +354,9 @@ sk: contact_information: email: Pracovný e-mail username: Kontaktné užívateľské meno + custom_css: + desc_html: Uprav vzhľad pomocou CSS, ktoré je načítané na každej stránke + title: Vlastné CSS hero: desc_html: Zobrazuje sa na hlavnej stránke. Doporučuje sa rozlišenie aspoň 600x100px Pokiaľ tu nieje nič dodané, bude nastavený základný orázok tohoto serveru title: Obrázok hrdinu @@ -358,6 +391,9 @@ sk: site_description_extended: desc_html: Toto je vhodné miesto pre vaše pravidlá, oboznámenia a iné veci, ktorými je vaša instancia špecifická. Je možné tu používať HTML kód title: Vlastné doplňujúce informácie + site_short_description: + desc_html: Zobrazené na bočnom paneli a pri meta tagoch. Popíš čo je Mastodon, a čo robí tento server iným, v jednom paragrafe. Pokiaľ toto necháš prázdne, bude tu zobrazený základný popis instancie. + title: Krátky popis instancie site_terms: desc_html: Môžete si napísať vaše vlastné pravidla o súkromí, prevádzke, alebo aj iné legality. Môžete tu používať HTML kód title: Vlastné pravidlá prevádzky @@ -379,6 +415,7 @@ sk: media: title: Médiá no_media: Žiadné médiá + no_status_selected: Žiadne príspevky neboli zmenené, keďže si žiadne nemal/a zvolené title: Statusy na účte with_media: S médiami subscriptions: @@ -388,12 +425,18 @@ sk: last_delivery: Posledné doručenie title: WebSub topic: Téma - title: Administrácia + suspensions: + bad_acct_msg: Hodnota pre potvrdenie sa nezhoduje. Si si istý/á že zamrazuješ ten správny účet? + hint_html: 'Pre potvrdenie zamrazenia účtu, prosím napíš %{value} do následujúceho políčka:' + proceed: Pokračuj + title: Zamraziť %{acct} + warning_html: 'Zamrazením tohto účtu budú dáta na tomto účte <strong>nenávratne</strong> zmazané, zahŕňajúc:' + title: Spravovanie admin_mailer: new_report: - body: "%{reporter} nahlásil %{target}" - body_remote: Niekto z %{domain} nahlásil %{target} - subject: Nový report pre %{instance} (#%{id}) + body: "%{reporter} nahlásil/a %{target}" + body_remote: Niekto z %{domain} nahlásil/a %{target} + subject: Nové hlásenie pre %{instance} (#%{id}) application_mailer: notification_preferences: Zmeniť e-mailové voľby salutation: "%{name}," @@ -410,7 +453,7 @@ sk: warning: Na tieto údaje dávajte ohromný pozor. Nikdy ich s nikým nezďieľajte! your_token: Váš prístupový token auth: - agreement_html: V rámci registrácie súhlasíš, že sa budeš riadiť <a href="%{rules_path}"> pravidlami tejto instancie</a>, a taktiež <a href="%{terms_path}"> našími servisnými podmienkami </a>. + agreement_html: V rámci registrácie súhlasíš, že sa budeš riadiť <a href="%{rules_path}"> pravidlami tejto instancie</a>, a taktiež <a href="%{terms_path}"> našími prevoznými podmienkami</a>. change_password: Heslo confirm_email: Potvrdiť email delete_account: Vymazať účet @@ -520,6 +563,10 @@ sk: true_privacy_html: Prosím ber na vedomie, <strong> že ozajstné súkromie sa dá dosiahnúť iba za pomoci end-to-end enkrypcie</strong>. unlocked_warning_html: Hocikto ťa môže následovať aby mohol/a ihneď vidieť tvoje súkromné príspevky. %{lock_link} aby si mohla skontrolovať a odmietať sledovateľov. unlocked_warning_title: Tvoj účet nieje zamknutý + footer: + developers: Vývojári + more: Viac… + resources: Podklady generic: changes_saved_msg: Zmeny boli úspešne uložené! save_changes: Uložiť zmeny @@ -636,6 +683,9 @@ sk: no_account_html: Nemáš ešte účet? Môžeš sa <a href='%{sign_up_path}' target='_blank'>zaregistrovať tu</a> proceed: Začni následovať prompt: 'Budeš sledovať:' + remote_interaction: + proceed: Pokračuj k interakcii + prompt: 'Chceš narábať s týmto príspevkom:' remote_unfollow: error: Chyba title: Názov @@ -669,18 +719,18 @@ sk: windows: Microsoft Windows revoke: Zamietni revoke_success: Sezóna úspešne zamietnutá - title: Sezóna + title: Sezóny settings: - authorized_apps: Autorizované aplikácie + authorized_apps: Povolené aplikácie back: Späť na Mastodon delete: Vymazanie účtu development: Vývoj edit_profile: Uprav profil export: Exportovať dáta - followers: Povolení sledovatelia + followers: Povolení následovatelia import: Importovať migrate: Presunúť účet - notifications: Oznámenia + notifications: Oboznámenia preferences: Voľby settings: Nastavenia two_factor_authentication: Dvoj-faktorové overenie @@ -710,6 +760,7 @@ sk: private: Neverejné príspevky nemôžu byť pripnuté reblog: Pozdvihnutie sa nedá pripnúť show_more: Ukáž viac + sign_in_to_participate: Prihlás sa pre zapojenie do diskusie visibilities: private: Iba pre sledovateľov private_long: Ukáž iba následovateľom @@ -764,7 +815,7 @@ sk: tip_bridge_html: Ak prichádzaš z Twitteru, môžeš svojích priateľov nájsť na Mastodone pomocou tzv. <a href="%{bridge_url}">mostíkovej aplikácie</a>. Ale tá funguje iba ak ju aj oni niekedy použili! tip_federated_timeline: Federovaná os zobrazuje sieť Mastodonu až po jej hranice. Ale zahŕňa iba ľúdí ktorých ostatní okolo teba sledujú, takže predsa nieje úplne celistvá. tip_following: Správcu servera následuješ automaticky. Môžeš ale nájsť mnoho iných zaujímavých ľudí ak prezrieš tak lokálnu, ako aj globálne federovanú os. - tip_local_timeline: Lokálna os je celkový pohľad na aktivitu užívateľov %{instance}. Toto sú tvoji najbližší susedia! + tip_local_timeline: Miestna časová os je celkový pohľad na aktivitu užívateľov %{instance}. Toto sú tvoji najbližší susedia! tip_mobile_webapp: Pokiaľ ti prehliadač ponúkne možnosť pridať Mastodon na tvoju obrazovku, môžeš potom dostávať notifikácie skoro ako z natívnej aplikácie! tips: Tipy title: Vitaj na palube, %{name}! diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml index d9813db47..800fe5414 100644 --- a/config/locales/sr-Latn.yml +++ b/config/locales/sr-Latn.yml @@ -246,20 +246,16 @@ sr-Latn: are_you_sure: Da li ste sigurni? comment: none: Ništa - id: ID mark_as_resolved: Označi kao rešen report: 'Prijava #%{id}' - report_contents: Sadržaj reported_account: Prijavljeni nalog reported_by: Prijavio resolved: Rešeni silence_account: Ućutkaj nalog status: Status suspend_account: Suspenduj nalog - target: Cilj title: Prijave unresolved: Nerešeni - view: Pogledaj settings: bootstrap_timeline_accounts: desc_html: Odvojite više korisničkih imena zarezom. Radi samo za lokalne i otključane naloge. Ako je prazno, onda se odnosi na sve lokalne administratore. diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 516908415..b40acd783 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -2,12 +2,12 @@ sr: about: about_hashtag_html: Ово су јавни статуси таговани са <strong>#%{hashtag}</strong>. Можете одговарати на њих ако имате налог било где у федиверсу. - about_mastodon_html: Мастодонт је друштвена мрежа базирана на отвореним протоколима и слободном софтверу отвореног кода. Децентрализована је као што је децентрализована е-пошта. + about_mastodon_html: Мастодон је друштвена мрежа базирана на отвореним протоколима и слободном софтверу отвореног кода. Децентрализована је као што је децентрализована е-пошта. about_this: О инстанци administered_by: 'Администрирано од стране:' api: API apps: Мобилне апликације - closed_registrations: Регистрације су тренутно затворене на овој инстанци. Ипак! Можете наћи другу инстанцу на којој ћете направити налог и одатле добити приступ истој овој мрежи. + closed_registrations: Регистрације су тренутно затворене на овој инстанци. Међутим! Можете наћи другу инстанцу на којој ћете направити налог и одатле добити приступ на истој овој мрежи. contact: Контакт contact_missing: Није постављено contact_unavailable: N/A @@ -39,37 +39,51 @@ sr: one: корисник other: корисници user_count_before: Дом за - what_is_mastodon: Шта је Мастодонт? + what_is_mastodon: Шта је Мастодон? accounts: choices_html: "%{name}'s избори:" - follow: Follow + follow: Запрати followers: one: Пратилац other: Пратиоци - following: Following + following: Пратим joined: Придружио/ла се %{date} - media: Мултимедија - moved_html: "%{name} је померен на %{new_profile_link}:" + media: Медији + moved_html: "%{name} је прешао на %{new_profile_link}:" network_hidden: Ова информација није доступна nothing_here: Овде нема ништа! people_followed_by: Људи које %{name} прати people_who_follow: Људи који прате %{name} - posts: Тутови - posts_with_replies: Тутови и одговори + pin_errors: + following: Морате пратити ову особу ако хоћете да потврдите + posts: + one: Труба + other: Трубе + posts_tab_heading: Трубе + posts_with_replies: Трубе и одговори reserved_username: Корисничко име је резервисано roles: admin: Администратор + bot: Бот moderator: Модератор unfollow: Отпрати admin: account_moderation_notes: - create: Направи + create: Оставите белешку created_msg: Модераторска белешка успешно направљена! delete: Обриши destroyed_msg: Модераторска белешка успешно обрисана! accounts: are_you_sure: Да ли сте сигурни? + avatar: Аватар by_domain: Домен + change_email: + changed_msg: Е-пошта налога успешно промењена! + current_email: Тренутна Е-пошта + label: Промените Е-пошту + new_email: Нова Е-пошта + submit: Промените Е-пошту + title: Промените Е-пошту за %{username} confirm: Потврди confirmed: Потврђено confirming: Потврдување @@ -82,7 +96,7 @@ sr: edit: Измени email: Е-пошта email_status: Е-пошта статус - enable: Укључи + enable: Омогући enabled: Укључено feed_url: Адреса довода followers: Пратиоци @@ -117,8 +131,9 @@ sr: promote: Унапреди protocol: Протокол public: Јавно - push_subscription_expires: PuSH subscription expires + push_subscription_expires: PuSH претплата истиче redownload: Освежи аватар + remove_avatar: Уклони аватар resend_confirmation: already_confirmed: Овој корисник е веќе потврден send: Препрати го е-мајлот за потврда @@ -143,6 +158,7 @@ sr: statuses: Статуси subscribe: Претплати се title: Налози + unconfirmed_email: Непотврђена Е-пошта undo_silenced: Укини ћутање undo_suspension: Укини суспензију unsubscribe: Укини претплату @@ -150,8 +166,10 @@ sr: web: Веб action_logs: actions: + assigned_to_self_report: "%{name} је доделио/ла извештај %{target} себи" + change_email_user: "%{name} је променио/ла адресу Е-поште коисника/це %{target}" confirm_user: "%{name} је потврдио адресу е-поште корисника %{target}" - create_custom_emoji: "%{name} је отпремио нови емотикон %{target}" + create_custom_emoji: "%{name} је отпремио нови емоџи %{target}" create_domain_block: "%{name} је блокирао домен %{target}" create_email_domain_block: "%{name} је ставио на црну листу домен е-поште %{target}" demote_user: "%{name} је ражаловао корисника %{target}" @@ -165,10 +183,13 @@ sr: enable_user: "%{name} је омогућио пријављивање за корисника %{target}" memorialize_account: "%{name} је претворио страну налога %{target} као in memoriam страну" promote_user: "%{name} је унапредио корисника %{target}" + remove_avatar_user: "%{name} је уклонио/ла %{target}'s аватар" + reopen_report: "%{name} је поново отворио/ла извештај %{target}" reset_password_user: "%{name} је ресетовао лозинку кориснику %{target}" resolve_report: "%{name} је одбацио пријаву %{target}" silence_account: "%{name} је ућуткао налог %{target}" suspend_account: "%{name} је суспендовао налог %{target}" + unassigned_report: "%{name} недодељен извештај %{target}" unsilence_account: "%{name} је укинуо ћутање налогу %{target}" unsuspend_account: "%{name} је укинуо суспензију налогу %{target}" update_custom_emoji: "%{name} је изменио емотикон %{target}" @@ -258,7 +279,7 @@ sr: email_domain_blocks: add_new: Додај нови created_msg: Успешно додао домен Е-поште на црну листу - delete: Уклони + delete: Обриши destroyed_msg: Успешно уклоњен домен Е-поште са црне листе domain: Домен new: @@ -281,32 +302,71 @@ sr: title: Позивнице relays: add_new: Додај нови релеј + description_html: "<strong>Федерални релеј</strong> је посреднички сервер који размењује велике количине јавних труба између сервера на који је претплаћен и на који објављује.<strong>Може помоћи малим и средњим серверима да открију садржај из федиверса</strong>, који иначе захтева од локалних корисника да ручно пратити остале људе на удаљеним серверима." + enable_hint: Када се омогући, Ваш сервер ће бити претплаћен на све јавне трубе са овог релеја, и почеће да шаље своје јавне трубу на њега. + inbox_url: URL Релеја + pending: Чека се одобрење релеја + save_and_enable: Сачувај и омогући + setup: Подеси везу релеја + status: Статус + title: Релеји + report_notes: + created_msg: Белешка пријаве успешно направљена! + destroyed_msg: Белешка пријаве успешно избрисана! reports: + account: + note: белешка + report: извештај action_taken_by: Акцију извео are_you_sure: Да ли сте сигурни? + assign_to_self: Додели мени + assigned: Додељени модератор comment: none: Ништа - id: ID - mark_as_resolved: Означи као решен + created_at: Пријављена + mark_as_resolved: Означи као решену + mark_as_unresolved: Означи као нерешену + notes: + create: Додај белешку + create_and_resolve: Реши са белешком + create_and_unresolve: Отвори поново са белешком + delete: Обриши + placeholder: Опишите какве су радње предузете, или било какве повезане новости... + reopen: Отвори пријаву поново report: 'Пријава #%{id}' - report_contents: Садржај reported_account: Пријављени налог reported_by: Пријавио - resolved: Решени + resolved: Решена + resolved_msg: Пријава успешно разрешена! silence_account: Ућуткај налог status: Статус suspend_account: Суспендуј налог - target: Циљ title: Пријаве - unresolved: Нерешени - view: Погледај + unassign: Уклони доделу + unresolved: Нерешене + updated_at: Ажурирана settings: + activity_api_enabled: + desc_html: Бројеви локално објављених статуса, активних корисника и нових регистрација по недељама + title: Објављуј агрегиране статистике о корисничким активностима bootstrap_timeline_accounts: desc_html: Одвојите више корисничких имена зарезом. Ради само за локалне и откључане налоге. Ако је празно, онда се односи на све локалне администраторе. title: Налози за аутоматско запраћивање за нове кориснике contact_information: email: Пословна е-пошта username: Контакт корисничко име + custom_css: + desc_html: Промени изглед на свакој страни када се CSS учита + title: Произвољни CSS + hero: + desc_html: Приказано на почетној страни. Препоручено је бар 600х100рх. Када се не одреди, враћа се на иконицу инстанце + title: Лого слика + peers_api_enabled: + desc_html: Имена домена које је ова инстанца срела у федиверсу + title: Објављуј списак откривених инстанци + preview_sensitive_media: + desc_html: Преглед веза на другим веб страницама ће приказати иконицу чак и ако је медиј означен као осетљиво + title: Покажи осетљив медиј у ОпенГраф прегледу registrations: closed_message: desc_html: Приказује се на главној страни када је инстанца затворена за регистрације. Можете користити HTML тагове @@ -320,6 +380,9 @@ sr: open: desc_html: Дозволи свакоме да креира налог title: Отворена регистрација + show_known_fediverse_at_about_page: + desc_html: Када се упали, показаће трубе из свих знаних федиверса на преглед. У супротном ће само показати локалне трубе. + title: Покажи познате здружене инстанце у прегледнику временске линије show_staff_badge: desc_html: Прикажи беџ особља на корисничкој страни title: Прикажи беџ особља @@ -329,6 +392,9 @@ sr: site_description_extended: desc_html: Добро место за ваш код понашања, правила, смернице и друге ствари по којима се Ваша инстанца разликује. Можете користити HTML тагове title: Произвољне додатне информације + site_short_description: + desc_html: Приказано у изборнику са стране и у мета ознакама. Опиши шта је Мастодон и шта чини овај сервер посебним у једном пасусу. Ако остане празно, вратиће се првобитни опис инстанце. + title: Кратак опис инстанце site_terms: desc_html: Можете писати Вашу политику приватности, услове коришћења и остале легалне ствари. Можете користити HTML тагове title: Произвољни услови коришћења @@ -350,6 +416,7 @@ sr: media: title: Мултимедија no_media: Без мултимедије + no_status_selected: Ниједан статус није промењен јер ниједан није изабран title: Статуси налога with_media: Са мултимедијом subscriptions: @@ -359,15 +426,25 @@ sr: last_delivery: Последња достава title: WebSub topic: Topic + suspensions: + bad_acct_msg: Вредност потврде се не поклапа. Да ли суспендујете прави рачун? + hint_html: 'Да бисте потврдили суспензију налога, унесите %{value} у поље испод:' + proceed: Настави + title: Суспендуј %{acct} + warning_html: 'Суспендовање овог налога ће <strong>неповратно</strong>избрисати све податке са овог налога, који укључују:' title: Администрација admin_mailer: new_report: body: "%{reporter} је пријавио %{target}" + body_remote: Нека са домена %{domain} је пријавио %{target} subject: Нова пријава за %{instance} (#%{id}) application_mailer: + notification_preferences: Промени преференце Е-поште salutation: "%{name}," settings: 'Промени подешавања е-поште: %{link}' view: 'Погледај:' + view_profile: Погледај профил + view_status: Погледај статус applications: created: Апликација успешно направљена destroyed: Апликација успешно обрисана @@ -378,6 +455,8 @@ sr: your_token: Ваш приступни токен auth: agreement_html: Приступањем инстанци се слажете са <a href="%{rules_path}">правилима инстанце</a> и <a href="%{terms_path}">условима коришћења</a>. + change_password: Лозинка + confirm_email: Потврдите адресу е-поште delete_account: Обриши налог delete_account_html: Ако желите да обришете Ваш налог, можете <a href="%{path}">наставити овде</a>. Бићете упитани да потврдите. didnt_get_confirmation: Нисте добили поруку са упутствима за потврду налога? @@ -387,12 +466,19 @@ sr: logout: Одјава migrate_account: Помери у други налог migrate_account_html: Ако желите да преусмерите овај налог на неки други, можете то <a href="%{path}">подесити овде</a>. + or: или + or_log_in_with: Или се пријавите са + providers: + cas: CAS-ом + saml: SAML-ом register: Региструј се + register_elsewhere: Региструјте се на другом серверу resend_confirmation: Пошаљи поруку са упутствима о потврди налога поново reset_password: Ресетуј лозинку security: Безбедност set_new_password: Постави нову лозинку authorize_follow: + already_following: Већ пратите овај налог error: Нажалост, десила се грешка при тражењу удаљеног налога follow: Запрати follow_request: 'Послали сте захтев за праћењен за:' @@ -429,19 +515,42 @@ sr: '404': Страна коју сте тражили не постоји. '410': Страна коју сте тражили више не постоји. '422': - content: Security verification failed. Are you blocking cookies? - title: Security verification failed + content: Безбедоносна провера није успела. Да не блокирате колачиће? + title: Безбедоносна провера није успела '429': Успоред '500': content: Извињавамо се, нешто је пошло по злу са ове стране. title: Страна није исправна noscript_html: Да бисте користили Мастодонт веб апликацију, омогућите JavaScript. У супротном, пробајте неку од <a href="https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md">оригиналних апликација</a> за Мастодонт за Вашу платформу. exports: + archive_takeout: + date: Датум + download: Преузмите Вашу архиву + hint_html: Можете затражити архиву ваших <strong>труба и отпремљених медија</strong>. Извезени подаци ће бити у АктивитиПаб формату, који можете читати са било којим усаглашеним софтвером. Архиву можете затражити сваких 7 дана. + in_progress: Састављање ваше архиве... + request: Затражите Вашу архиву + size: Величина blocks: Блокирали сте csv: CSV follows: Пратите mutes: Ућуткали сте storage: Мултимедијално складиште + filters: + contexts: + home: Временска линија почетне + notifications: Обавештења + public: Јавна временска линија + thread: Разговори + edit: + title: Измени филтер + errors: + invalid_context: Ниједан или неважећи контекст испоручен + invalid_irreversible: Неповратно филтрирање функционише само са почетном или контекстом обавештења + index: + delete: Избриши + title: Филтери + new: + title: Додај нови филтер followers: domain: Домен explanation_html: Ако желите да осигурате приватност Ваших статуса, морате бити свесни ко Вас прати. <strong>Ваши приватни статуси се шаљу на све инстанце на којима имате пратиоце</strong>. Можда желите да их прегледате и да уклоните оне пратиоце на оним инстанцама за које немате поверења да ће поштовати Вашу приватност. @@ -456,6 +565,10 @@ sr: true_privacy_html: Запамтите да се <strong>права приватност може постићи само шифровањем са краја на крај</strong>. unlocked_warning_html: Свако може да Вас запрати да одмах види Ваше приватне статусе. %{lock_link} да бисте прегледали и одбацили пратиоце. unlocked_warning_title: Ваш налог није закључан + footer: + developers: Програмери + more: Више… + resources: Ресурси generic: changes_saved_msg: Измене успешно сачуване! save_changes: Сними измене @@ -481,9 +594,11 @@ sr: '21600': 6 сати '3600': 1 сад '43200': 12 сати + '604800': 1 недеља '86400': 1 дан expires_in_prompt: Никад generate: Генериши + invited_by: 'Позвао Вас је:' max_uses: few: "%{count} коришћења" many: "%{count} коришћења" @@ -494,7 +609,7 @@ sr: table: expires_at: Истиче uses: Коришћења - title: Позови људе + title: Позовите људе lists: errors: limit: Достигли сте лимит броја листи @@ -511,7 +626,8 @@ sr: title: Модерација notification_mailer: digest: - body: 'Ево кратак преглед шта сте пропустили на инстанци %{instance} од последње посете од %{since}:' + action: Погледајте сва обавештења + body: Ево кратак преглед порука које сте пропустили од последње посете од %{since} mention: "%{name} Вас је поменуо у:" new_followers_summary: few: Добили сте %{count} нова пратиоца! Сјајно! @@ -523,21 +639,29 @@ sr: many: "%{count} нових обавештења од последње посете \U0001F418" one: "1 ново обавештење од последње посете \U0001F418" other: "%{count} нових обавештења од последње посете \U0001F418" + title: Док нисте били ту... favourite: body: "%{name} је поставио као омиљен Ваш статус:" subject: "%{name} је поставио као омиљен Ваш статус" + title: Нови омиљени follow: body: "%{name} Вас је запратио!" subject: "%{name} Вас је запратио" + title: Нови пратиоц follow_request: + action: Управљајте захтевима за праћење body: "%{name} је затражио да Вас запрати" subject: 'Пратиоци на чекању: %{name}' + title: Нови захтев за праћење mention: + action: Одговори body: "%{name} Вас је поменуо у:" subject: "%{name} Вас је поменуо" + title: Ново спомињање reblog: - body: "%{name} Вам је подржао(ла) статус:" - subject: "%{name} је подржао(ла) Ваш статус" + body: "%{name} Вам је подржао/ла статус:" + subject: "%{name} је подржао/ла Ваш статус" + title: Нова подршка number: human: decimal_units: @@ -550,51 +674,63 @@ sr: trillion: T unit: '' pagination: - next: Следећи + newer: Новије + next: Следеће + older: Старије prev: Претходни truncate: "…" preferences: languages: Језици - other: Остали + other: Остало publishing: Објављивање web: Веб remote_follow: acct: Унесите Ваш корисник@домен са кога желите да пратите missing_resource: Не могу да нађем захтевану адресу преусмеравања за Ваш налог - proceed: Наставите да запратите - prompt: 'Запратите ће:' + no_account_html: Немате налог? Можете се <a href='%{sign_up_path}' target='_blank'>пријавити овде</a> + proceed: Наставите да би сте запратили + prompt: 'Запратићете:' + remote_interaction: + proceed: Наставите за интеракцију + prompt: 'Желите да интерактирате са овом трубом:' + remote_unfollow: + error: Грешка + title: Наслов + unfollowed: Отпраћени sessions: activity: Последња активност browser: Веб читач browsers: - alipay: Alipay - blackberry: Блекбери + alipay: Алипеј + blackberry: Блекберија chrome: Хром - edge: Microsoft Edge - firefox: Firefox + edge: Мајкрософт Еџ + electron: Електрон + firefox: Фајерфокс generic: Непознати веб читач - ie: Internet Explorer - micro_messenger: MicroMessenger - nokia: Nokia S40 Ovi Browser + ie: Интернет Експлорер + micro_messenger: МајкроМесенџер + nokia: Нокија С40 Ови Претраживач opera: Опера - phantom_js: PhantomJS - qq: QQ Browser + otter: Отер + phantom_js: ФантомЏејЕс + qq: КјуКју Претраживач safari: Сафари - uc_browser: UCBrowser - weibo: Weibo + uc_browser: УЦПретраживач + weibo: Веибо current_session: Тренутна сесија description: "%{browser} са %{platform}" - explanation: Ово су тренутно пријављени веб читачи на Ваш Мастодонт налог. + explanation: Ово су веб претраживачи који су тренутно пријављени на Ваш Мастодон налог. ip: IP platforms: - adobe_air: Adobe Air-а + adobe_air: Адоб Ер-а android: Андроида blackberry: Блекберија chrome_os: Хром ОС-а firefox_os: Фајерфокс ОС-а - ios: iOS + ios: иОС-а linux: Линукса - mac: Mac-а + mac: Мека other: непознате платформе windows: Виндоуза windows_mobile: Виндоуз мобилног @@ -604,7 +740,7 @@ sr: title: Сесије settings: authorized_apps: Ауторизоване апликације - back: Назад на Мастодонта + back: Назад на Мастодон delete: Брисање налога development: Развој edit_profile: Измена профила @@ -618,50 +754,92 @@ sr: two_factor_authentication: Двофакторска идентификација your_apps: Ваше апликације statuses: + attached: + description: 'У прилогу: %{attached}' + image: + one: "%{count} слику" + other: "%{count} слике" + video: + one: "%{count} видео" + other: "%{count} видеа" + boosted_from_html: Подржано од %{acct_link} + content_warning: 'Упозорење на садржај: %{warning}' + disallowed_hashtags: + one: 'садржи забрањену тарабу: %{tags}' + other: 'садржи забрањене тарабе: %{tags}' + language_detection: Аутоматскo откривање језика open_in_web: Отвори у вебу over_character_limit: ограничење од %{max} карактера прекорачено pin_errors: - limit: Већ имате прикачен највећи број тутова - ownership: Туђи тутови не могу да се прикаче - private: Тутови који нису јавни не могу да се прикаче + limit: Већ имате прикачен највећи број труба + ownership: Туђе трубе не могу да се прикаче + private: Трубе које нису јавне не могу бити прикачене reblog: Подршка не може да се прикачи show_more: Прикажи још + sign_in_to_participate: Пријавите се да учествујете у разговору title: '%{name}: "%{quote}"' visibilities: private: Само пратиоци - private_long: Само прикажи пратиоцима + private_long: Прикажи само пратиоцима public: Јавно public_long: Свако може да види unlisted: Неизлистано - unlisted_long: Свако може да види, али није излистано на јавним лајнама + unlisted_long: Свако може да види, али није излистано на јавним временским линијама stream_entries: - pinned: Прикачени тут + pinned: Прикачена труба reblogged: подржано sensitive_content: Осетљив садржај terms: title: Услови коришћења и политика приватности инстанце %{instance} themes: - default: Мастодонт + contrast: Велики контраст + default: Мастодон + mastodon-light: Мастодон (светло) time: formats: default: "%b %d, %Y, %H:%M" + month: "%b %Y" two_factor_authentication: - code_hint: Унесите код са Ваше апликације за проверу идентитета да потврдите + code_hint: Да бисте потврдили, унесите код генерисан од стране ваше апликације за потврду идентитета description_html: Ако укључите <strong>двофакторску идентификацију</strong>, мораћете да имате телефон са собом да бисте могли да се пријавите. Телефон ће онда генерисати токене за Вашу пријаву. disable: Искључи - enable: Укључи + enable: Омогући enabled: Двофакторска идентификација је укључена enabled_success: Двофакторска идентификација је успешно укључена generate_recovery_codes: Генериши кодове за опоравак instructions_html: "<strong>Скенирајте овај QR код у Google Authenticator или некој сличној TOTP апликацији на Вашем телефону</strong>. Од сада, та апликација ће Вам генерисати токене које морате унети да бисте се пријавили." - lost_recovery_codes: Кодови за опоравак Вам омогућавају да повратите приступ налогу ако изгубите телефон. Ако изгубите кодове за опоравак, можете их регенерисати овде. Од тог тренутка, стари кодови за опоравак више не важе. + lost_recovery_codes: Кодови за опоравак Вам омогућавају да повратите приступ налогу ако изгубите телефон. Ако изгубите кодове за опоравак, можете их ре-генерисати овде. Од тог тренутка, стари кодови за опоравак више не важе. manual_instructions: 'Уколико не можете да скенирате QR код и морате га унесете ручно, ево је огољена шифра:' recovery_codes: Направите резерву кодова за опоравак - recovery_codes_regenerated: Кодови за опоравак успешно регенерисани + recovery_codes_regenerated: Кодови за опоравак успешно ре-генерисани recovery_instructions_html: Ако икада изгубите приступ телефону, можете искористити кодове за опоравак дате испод да повратите приступ налогу. <strong>Држите кодове за опоравак на сигурном</strong>. На пример, одштампајте их и чувајте их са осталим важним документима. setup: Намештање wrong_code: Унесени код није исправан! Да ли су времена на серверу и на уређају исправна? + user_mailer: + backup_ready: + explanation: Тражили сте потпуну резервну копију вашег Мастодон рачуна. Спремна за преузимање! + subject: Ваша архива је спремна за преузимање + welcome: + edit_profile_action: Подеси профил + edit_profile_step: Профил можете прилагодити постављањем аватара, заглавља, променом имена и још много тога. Ако желите да прегледате нове пратиоце пре него што буду дозвољени да вас прате, можете закључати свој налог. + explanation: Ево неколико савета за почетак + final_action: Почните објављивати + final_step: 'Почните објављивати! Чак и без пратиоца ваше јавне поруке ће бити виђене од стране других, нпр. на локалној јавног линији и у тараба за означавање. Можда бисте желели да се представите у #увод тараби за означавање.' + full_handle: Ваш пун надимак + full_handle_hint: Ово бисте рекли својим пријатељима како би вам они послали поруку, или запратили са друге инстанце. + review_preferences_action: Промените подешавања + review_preferences_step: Обавезно поставите своја подешавања, као што су какву Е-пошту желите да примите или на који ниво приватности желите да ваше поруке буду постављене. Ако немате морску болест или епилепсију, можете изабрати аутоматско покретање ГИФ-а. + subject: Добродошли на Мастодон + tip_bridge_html: Ако долазите са Твитера, можете пронаћи пријатеље користећи <a href="%{bridge_url}">апликацију за премошћавање</a>. Ово ради само ако и они користе исту апликацију! + tip_federated_timeline: Здружена временска линија је компетан увид у Мастодонову мрежу. Али она само укључује људе на којој су ваше комшије претплаћене, тако да није комплетна. + tip_following: Аутоматски пратите админа/не вашег сервера. Да пронађете занимљиве људе, проверите локалне и здружене временске линије. + tip_local_timeline: Локална временска линија је комплетан увид људи у %{instance}. Ово су вам прве комшије! + tip_mobile_webapp: Ако вам мобилни претраживач предложи да додате Мастодон на Ваш почетни екран, добијаћете мобилна обавештења. Делује као изворна апликација на много начина! + tips: Савети + title: Добродошли, %{name}! users: - invalid_email: Адреса е-поште није исправна + invalid_email: Адреса Е-поште није исправна invalid_otp_token: Неисправни двофакторски код - signed_in_as: 'Пријављен као:' + otp_lost_help_html: Ако изгубите приступ за оба, можете ступити у контакт са %{email} + seamless_external_login: Пријављени сте путем спољашње услуге, тако да лозинка и подешавања Е-поште нису доступни. + signed_in_as: 'Пријављен/а као:' diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 605d9db12..3f157ecd1 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -271,7 +271,6 @@ sv: comment: none: Ingen created_at: Anmäld - id: ID mark_as_resolved: Markera som löst mark_as_unresolved: Markera som olöst notes: @@ -282,7 +281,6 @@ sv: placeholder: Beskriv vilka åtgärder som vidtagits eller andra uppdateringar till den här anmälan. reopen: Återuppta anmälan report: 'Anmäl #%{id}' - report_contents: Innehåll reported_account: Anmält konto reported_by: Anmäld av resolved: Löst @@ -290,12 +288,10 @@ sv: silence_account: Tysta ner konto status: Status suspend_account: Suspendera konto - target: Mål title: Anmälningar unassign: Otilldela unresolved: Olösta updated_at: Uppdaterad - view: Granska settings: activity_api_enabled: desc_html: Räkning av lokalt postade statusar, aktiva användare och nyregistreringar per vecka diff --git a/config/locales/th.yml b/config/locales/th.yml index 88e1eb44c..8c411f252 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -111,20 +111,16 @@ th: reports: comment: none: None - id: ไอดี mark_as_resolved: ทำเครื่องหมายว่าจัดการแล้ว report: 'Report #%{id}' - report_contents: เนื้อหา reported_account: รายงานแอคเคาท์ reported_by: รายงานโดย resolved: จัดการแล้ว silence_account: แอคเค๊าท์ที่ปิดเสียง status: สถานะ suspend_account: แอคเค๊าท์ที่หยุดไว้ - target: เป้าหมาย title: รายงาน unresolved: Unresolved - view: วิว settings: contact_information: email: กรอกที่อยู่อีเมล์สาธารณะ diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 26dd4c1e3..d7ecb480f 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -110,20 +110,16 @@ tr: reports: comment: none: Yok - id: ID mark_as_resolved: Giderildi olarak işaretle report: 'Şikayet #%{id}' - report_contents: İçerik reported_account: Şikayet edilen hesap reported_by: Şikayet eden resolved: Giderildi silence_account: Hesabı sustur status: Durum suspend_account: Hesabı uzaklaştır - target: Hedef title: Şikayetler unresolved: Giderilmedi - view: Görüntüle settings: contact_information: email: Herkese açık e-posta adresiniz diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 6783495bb..9da52d3f5 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -299,7 +299,6 @@ uk: comment: none: Немає created_at: Створено - id: ID mark_as_resolved: Відмітити як вирішену mark_as_unresolved: Відмітити як невирішену notes: @@ -310,7 +309,6 @@ uk: placeholder: Опишіть, які дії були виконані, або інші зміни, що стосуються справи... reopen: Перевідкрити скаргу report: 'Скарга #%{id}' - report_contents: Зміст reported_account: Акаунт порушника reported_by: Відправник скарги resolved: Вирішено @@ -318,12 +316,10 @@ uk: silence_account: Заглушити акаунт status: Статус suspend_account: Заблокувати акаунт - target: Ціль title: Скарги unassign: Зняти призначення unresolved: Невирішені updated_at: Оновлені - view: Подивитися settings: activity_api_enabled: desc_html: Кількість локальних постів, активних та нових користувачів у тижневих розрізах diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index b2f9fd01e..0e8f21821 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -5,10 +5,13 @@ zh-CN: about_mastodon_html: Mastodon(长毛象)是一个建立在开放式网络协议和自由、开源软件之上的社交网络,有着类似于电子邮件的分布式设计。 about_this: 关于本实例 administered_by: 本实例的管理员: + api: API + apps: 移动应用 closed_registrations: 这个实例目前没有开放注册。不过,你可以前往其他实例注册一个帐户,同样可以加入到这个网络中哦! contact: 联系方式 contact_missing: 未设定 contact_unavailable: 未公开 + documentation: 文件 extended_description_html: | <h3>这里可以写一些规定</h3> <p>本站尚未设置详细介绍。</p> @@ -25,23 +28,34 @@ zh-CN: hosted_on: 一个在 %{domain} 上运行的 Mastodon 实例 learn_more: 了解详情 other_instances: 其他实例 + privacy_policy: 隐私条款 source_code: 源代码 - status_count_after: 条嘟文 + status_count_after: + one: 状态 status_count_before: 他们共嘟出了 - user_count_after: 位用户 + terms: 使用条款 + user_count_after: + one: 用户 + other: 用户 user_count_before: 这里共注册有 what_is_mastodon: Mastodon 是什么? accounts: follow: 关注 - followers: 关注者 + followers: + one: 关注者 + other: 关注者 following: 正在关注 + joined: 加入于 %{date} media: 媒体 moved_html: "%{name} 已经迁移到 %{new_profile_link}:" network_hidden: 此信息不可用。 nothing_here: 这里神马都没有! people_followed_by: "%{name} 关注的人" people_who_follow: 关注 %{name} 的人 - posts: 嘟文 + posts: + one: 嘟嘟 + other: 嘟文 + posts_tab_heading: 嘟文 posts_with_replies: 嘟文和回复 reserved_username: 此用户名已被保留 roles: @@ -176,6 +190,7 @@ zh-CN: unsuspend_account: "%{name} 解除了用户 %{target} 的封禁状态" update_custom_emoji: "%{name} 更新了自定义表情 %{target}" update_status: "%{name} 刷新了 %{target} 的嘟文" + deleted_status: "(状态已删除)" title: 运营日志 custom_emojis: by_domain: 域名 @@ -202,6 +217,25 @@ zh-CN: update_failed_msg: 表情更新失败! updated_msg: 表情更新成功! upload: 上传新表情 + dashboard: + config: 设置 + feature_deletions: 帐号删除 + feature_invites: 邀请链接 + feature_registrations: 注册 + features: 特性 + hidden_service: 与暗网互联 + open_reports: 待处理举报 + recent_users: 新用户 + search: 全文搜索 + single_user_mode: 单用户模式 + software: 软件 + space: 空间用量 + title: 大盘 + total_users: 总用户数 + trends: 趋势 + week_interactions: 本周互动 + week_users_active: 本周活跃用户 + week_users_new: 本周新用户 domain_blocks: add_new: 添加新条目 created_msg: 正在进行域名屏蔽 @@ -224,7 +258,9 @@ zh-CN: suspend: 自动封禁 severity: 屏蔽级别 show: - affected_accounts: 将会影响到数据库中的 %{count} 个帐户 + affected_accounts: + one: 影响数据库中 1 位用户 + other: 影响数据库中 %{count} 位用户 retroactive: silence: 对此域名的所有帐户解除隐藏 suspend: 对此域名的所有帐户解除封禁 @@ -249,12 +285,22 @@ zh-CN: search: 搜索 title: 已知实例 invites: + deactivate_all: 全部禁用 filter: all: 全部 available: 可用 expired: 已失效 title: 筛选 title: 邀请用户 + relays: + add_new: 添加中继 + description_html: "<strong>消息中继</strong>是一种中间服务器,用于在订阅它和向它推送消息的服务器之间大量交换嘟文。<strong>它可以帮助中小型实例发现长毛象宇宙中的内容</strong>,而无需本地用户手动关注其他远程实例上的用户。" + enable_hint: 一经启用,你的服务器会订阅此中继的所有嘟文,并向其发送本服务器的公共嘟文。 + inbox_url: 中继 URL + pending: 等待中继确认 + save_and_enable: 保存并启用 + status: 状态 + title: 中继 report_notes: created_msg: 举报记录建立成功! destroyed_msg: 举报记录删除成功! @@ -269,7 +315,6 @@ zh-CN: comment: none: 没有 created_at: 举报时间 - id: ID mark_as_resolved: 标记为“已处理” mark_as_unresolved: 标记为“未处理” notes: @@ -280,7 +325,6 @@ zh-CN: placeholder: 描述已经执行的操作,或其他任何相关的跟进情况 reopen: 重开举报 report: '举报 #%{id}' - report_contents: 内容 reported_account: 举报用户 reported_by: 举报人 resolved: 已处理 @@ -288,12 +332,10 @@ zh-CN: silence_account: 隐藏用户 status: 状态 suspend_account: 封禁用户 - target: 被举报人 title: 举报 unassign: 取消接管 unresolved: 未处理 updated_at: 更新时间 - view: 查看 settings: activity_api_enabled: desc_html: 本站用户发布的嘟文数,以及本站的活跃用户数和一周内新用户数 @@ -304,12 +346,17 @@ zh-CN: contact_information: email: 用于联系的公开电子邮件地址 username: 用于联系的公开用户名 + custom_css: + title: 自定义 CSS hero: desc_html: 用于在首页展示。推荐分辨率 600×100px 以上。未指定的情况下将默认使用本站缩略图 title: 主题图片 peers_api_enabled: desc_html: 截至目前本实例在网络中已发现的域名 title: 公开已知实例的列表 + preview_sensitive_media: + desc_html: 即使媒体文件被标记为敏感内容,其他站点上的链接预览仍会显示其缩略图 + title: 在 OpenGraph 预览中显示敏感内容 registrations: closed_message: desc_html: 本站关闭注册期间的提示信息。可以使用 HTML 标签 @@ -468,6 +515,18 @@ zh-CN: follows: 关注的用户 mutes: 隐藏的用户 storage: 媒体文件存储 + filters: + contexts: + notifications: 通知 + public: 公共时间线 + thread: 对话 + edit: + title: 编辑过滤器 + index: + delete: 删除 + title: 过滤器 + new: + title: 添加过滤器 followers: domain: 域名 explanation_html: 为保证你的嘟文的隐私安全,你应当经常检查你的关注者列表。<strong>受保护的嘟文将会发送到所有关注者所在的实例上</strong>。有些实例使用的软件代码或其管理员可能不会尊重你的隐私设置,因此你应当复查一下关注者列表,并移除那些你无法信任的关注者。 @@ -506,7 +565,9 @@ zh-CN: expires_in_prompt: 永不过期 generate: 生成邀请链接 invited_by: 你的邀请人是: - max_uses: "%{count} 次" + max_uses: + one: 1 次 + other: "%{count} 次" max_uses_prompt: 无限制 prompt: 生成分享链接,邀请他人在本实例注册 table: @@ -584,6 +645,7 @@ zh-CN: remote_follow: acct: 请输入你的“用户名@实例域名” missing_resource: 无法确定你的帐户的跳转 URL + no_account_html: 还没有帐号?你可以<a href='%{sign_up_path}' target='_blank'>注册一个</a> proceed: 确认关注 prompt: 你正准备关注: remote_unfollow: @@ -649,8 +711,12 @@ zh-CN: statuses: attached: description: 附加媒体:%{attached} - image: "%{count} 张图片" - video: "%{count} 个视频" + image: + one: "%{count} 张图片" + other: "%{count} 张图片" + video: + one: "%{count} 段视频" + other: "%{count} 段视频" boosted_from_html: 转嘟自 %{acct_link} content_warning: 内容警告:%{warning} disallowed_hashtags: diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index ee7ca4443..b1f9922fa 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -271,7 +271,6 @@ zh-HK: comment: none: 沒有 created_at: 日期 - id: ID mark_as_resolved: 標示為「已處理」 mark_as_unresolved: 標示為「未處理」 notes: @@ -282,7 +281,6 @@ zh-HK: placeholder: 記錄已執行的動作,或其他相關的更新…… reopen: 重開舉報 report: '舉報 #%{id}' - report_contents: 舉報內容 reported_account: 舉報用戶 reported_by: 舉報者 resolved: 已處理 @@ -290,12 +288,10 @@ zh-HK: silence_account: 將用戶靜音 status: 狀態 suspend_account: 將用戶停權 - target: 對象 title: 舉報 unassign: 取消指派 unresolved: 未處理 updated_at: 更新 - view: 檢視 settings: activity_api_enabled: desc_html: 本站用戶發佈的文章,以及本站的活躍用戶和一週內新用戶數 diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 0a18dc990..ad73c5583 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -5,13 +5,14 @@ zh-TW: about_mastodon_html: Mastodon (長毛象)是一個<em>自由、開放原始碼</em>的社群網站。它是一個分散式的服務,避免您的通訊被單一商業機構壟斷操控。請您選擇一家您信任的 Mastodon 站點,在上面建立帳號,然後您就可以和任一 Mastodon 站點上的使用者互通,享受無縫的<em>社群網路</em>交流。 about_this: 關於本站 administered_by: 管理者: + api: API + apps: Mobile apps closed_registrations: 本站暫時停止接受註冊。 contact: 聯絡我們 contact_missing: 未設定 contact_unavailable: 未公開 - extended_description_html: | - <h3>這裡可以寫一些網站規則</h3> - <p>本站點未有詳細介紹</p> + documentation: 文件 + extended_description_html: "<h3>這裡可以寫一些網站規則</h3> <p>本站點未有詳細介紹</p>\n" features: humane_approach_body: Mastodon 從其他網路的失敗經驗中汲取教訓,以合乎道德的設計對抗社交媒體的濫用問題。 humane_approach_title: 以人為本 @@ -26,14 +27,18 @@ zh-TW: learn_more: 了解詳細 other_instances: 其他站點 source_code: 原始碼 - status_count_after: 條嘟嘟 + status_count_after: + one: 狀態 status_count_before: 他們共嘟出了 - user_count_after: 位使用者 + terms: 使用條款 + user_count_after: + one: 使用者 user_count_before: 這裡共註冊有 what_is_mastodon: 什麼是 Mastodon? accounts: follow: 關注 - followers: 關注者 + followers: + other: 關注者 following: 正在關注 media: 媒體 moved_html: "%{name} 已經搬遷到 %{new_profile_link}:" @@ -41,7 +46,10 @@ zh-TW: nothing_here: 暫時沒有內容可供顯示! people_followed_by: "%{name} 關注的人" people_who_follow: 關注 %{name} 的人 - posts: 嘟文 + posts: + one: 嘟掉 + other: 嘟文 + posts_tab_heading: 嘟文 posts_with_replies: 嘟文與回覆 reserved_username: 此用戶名已被保留 roles: @@ -271,7 +279,6 @@ zh-TW: comment: none: 無 created_at: 日期 - id: ID mark_as_resolved: 標記為「已解決」 mark_as_unresolved: 標記為「未解決」 notes: @@ -282,7 +289,6 @@ zh-TW: placeholder: 記錄已執行的動作,或其他相關的更新... reopen: 重開檢舉 report: '檢舉 #%{id}' - report_contents: 檢舉內容 reported_account: 被檢舉使用者 reported_by: 檢舉人 resolved: 已解決 @@ -290,12 +296,10 @@ zh-TW: silence_account: 靜音使用者 status: 狀態 suspend_account: 停權使用者 - target: 對象 title: 檢舉 unassign: 取消指派 unresolved: 未解決 updated_at: 更新 - view: 檢視 settings: activity_api_enabled: desc_html: 本站使用者發佈的嘟文數量,以及本站的活躍使用者與一週內新使用者數量 diff --git a/config/webpack/configuration.js b/config/webpack/configuration.js index 4d0d28582..f81d23dd4 100644 --- a/config/webpack/configuration.js +++ b/config/webpack/configuration.js @@ -8,7 +8,7 @@ const glob = require('glob'); const configPath = resolve('config', 'webpacker.yml'); const loadersDir = join(__dirname, 'loaders'); -const settings = safeLoad(readFileSync(configPath), 'utf8')[env.NODE_ENV]; +const settings = safeLoad(readFileSync(configPath), 'utf8')[env.RAILS_ENV || env.NODE_ENV]; const flavourFiles = glob.sync('app/javascript/flavours/*/theme.yml'); const skinFiles = glob.sync('app/javascript/skins/*/*'); const flavours = {}; diff --git a/config/webpack/loaders/babel.js b/config/webpack/loaders/babel.js index 770c89aa7..d8d785b98 100644 --- a/config/webpack/loaders/babel.js +++ b/config/webpack/loaders/babel.js @@ -7,7 +7,6 @@ module.exports = { exclude: /node_modules/, loader: 'babel-loader', options: { - forceEnv: process.env.NODE_ENV || 'development', sourceRoot: 'app/javascript', cacheDirectory: env === 'development' ? false : resolve(__dirname, '..', '..', '..', 'tmp', 'cache', 'babel-loader'), }, diff --git a/config/webpack/production.js b/config/webpack/production.js index 27a78108b..aca37059e 100644 --- a/config/webpack/production.js +++ b/config/webpack/production.js @@ -69,7 +69,6 @@ module.exports = merge(sharedConfig, { plugins: [ new CompressionPlugin({ - asset: '[path].gz[query]', algorithm: compressionAlgorithm, test: /\.(js|css|html|json|ico|svg|eot|otf|ttf)$/, }), diff --git a/config/webpacker.yml b/config/webpacker.yml index 50d95813a..c0f91c4e4 100644 --- a/config/webpacker.yml +++ b/config/webpacker.yml @@ -28,6 +28,10 @@ test: # Compile test packs to a separate directory public_output_path: packs-test + # CircleCI precompiles packs prior to running the tests. + # Also avoids race conditions in parallel_tests. + compile: false + production: <<: *default diff --git a/docker-compose.yml b/docker-compose.yml index 070a95384..064d5a260 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,7 +6,7 @@ services: image: postgres:9.6-alpine networks: - internal_network -### Uncomment to enable DB persistance +### Uncomment to enable DB persistence # volumes: # - ./postgres:/var/lib/postgresql/data @@ -15,7 +15,7 @@ services: image: redis:4.0-alpine networks: - internal_network -### Uncomment to enable REDIS persistance +### Uncomment to enable REDIS persistence # volumes: # - ./redis:/data @@ -26,7 +26,7 @@ services: # - "ES_JAVA_OPTS=-Xms512m -Xmx512m" # networks: # - internal_network -#### Uncomment to enable ES persistance +#### Uncomment to enable ES persistence ## volumes: ## - ./elasticsearch:/usr/share/elasticsearch/data diff --git a/lib/cli.rb b/lib/cli.rb index 60bff4147..14a91c2db 100644 --- a/lib/cli.rb +++ b/lib/cli.rb @@ -4,6 +4,8 @@ require 'thor' require_relative 'mastodon/media_cli' require_relative 'mastodon/emoji_cli' require_relative 'mastodon/accounts_cli' +require_relative 'mastodon/feeds_cli' + module Mastodon class CLI < Thor desc 'media SUBCOMMAND ...ARGS', 'Manage media files' @@ -14,5 +16,8 @@ module Mastodon desc 'accounts SUBCOMMAND ...ARGS', 'Manage accounts' subcommand 'accounts', Mastodon::AccountsCLI + + desc 'feeds SUBCOMMAND ...ARGS', 'Manage feeds' + subcommand 'feeds', Mastodon::FeedsCLI end end diff --git a/lib/mastodon/accounts_cli.rb b/lib/mastodon/accounts_cli.rb index 83b69549d..65c1b395a 100644 --- a/lib/mastodon/accounts_cli.rb +++ b/lib/mastodon/accounts_cli.rb @@ -40,12 +40,255 @@ module Mastodon say('OK', :green) else say('No account(s) given', :red) + exit(1) + end + end + + option :email, required: true + option :confirmed, type: :boolean + option :role, default: 'user' + option :reattach, type: :boolean + option :force, type: :boolean + desc 'create USERNAME', 'Create a new user' + long_desc <<-LONG_DESC + Create a new user account with a given USERNAME and an + e-mail address provided with --email. + + With the --confirmed option, the confirmation e-mail will + be skipped and the account will be active straight away. + + With the --role option one of "user", "admin" or "moderator" + can be supplied. Defaults to "user" + + With the --reattach option, the new user will be reattached + to a given existing username of an old account. If the old + account is still in use by someone else, you can supply + the --force option to delete the old record and reattach the + username to the new account anyway. + LONG_DESC + def create(username) + account = Account.new(username: username) + password = SecureRandom.hex + user = User.new(email: options[:email], password: password, admin: options[:role] == 'admin', moderator: options[:role] == 'moderator', confirmed_at: Time.now.utc) + + if options[:reattach] + account = Account.find_local(username) || Account.new(username: username) + + if account.user.present? && !options[:force] + say('The chosen username is currently in use', :red) + say('Use --force to reattach it anyway and delete the other user') + return + elsif account.user.present? + account.user.destroy! + end + end + + user.account = account + + if user.save + if options[:confirmed] + user.confirmed_at = nil + user.confirm! + end + + say('OK', :green) + say("New password: #{password}") + else + user.errors.to_h.each do |key, error| + say('Failure/Error: ', :red) + say(key) + say(' ' + error, :red) + end + + exit(1) + end + end + + option :role + option :email + option :confirm, type: :boolean + option :enable, type: :boolean + option :disable, type: :boolean + option :disable_2fa, type: :boolean + desc 'modify USERNAME', 'Modify a user' + long_desc <<-LONG_DESC + Modify a user account. + + With the --role option, update the user's role to one of "user", + "moderator" or "admin". + + With the --email option, update the user's e-mail address. With + the --confirm option, mark the user's e-mail as confirmed. + + With the --disable option, lock the user out of their account. The + --enable option is the opposite. + + With the --disable-2fa option, the two-factor authentication + requirement for the user can be removed. + LONG_DESC + def modify(username) + user = Account.find_local(username)&.user + + if user.nil? + say('No user with such username', :red) + exit(1) + end + + if options[:role] + user.admin = options[:role] == 'admin' + user.moderator = options[:role] == 'moderator' + end + + user.email = options[:email] if options[:email] + user.disabled = false if options[:enable] + user.disabled = true if options[:disable] + user.otp_required_for_login = false if options[:disable_2fa] + user.confirm if options[:confirm] + + if user.save + say('OK', :green) + else + user.errors.to_h.each do |key, error| + say('Failure/Error: ', :red) + say(key) + say(' ' + error, :red) + end + + exit(1) + end + end + + desc 'delete USERNAME', 'Delete a user' + long_desc <<-LONG_DESC + Remove a user account with a given USERNAME. + LONG_DESC + def delete(username) + account = Account.find_local(username) + + if account.nil? + say('No user with such username', :red) + exit(1) + end + + say("Deleting user with #{account.statuses_count}, this might take a while...") + SuspendAccountService.new.call(account, remove_user: true) + say('OK', :green) + end + + option :dry_run, type: :boolean + desc 'cull', 'Remove remote accounts that no longer exist' + long_desc <<-LONG_DESC + Query every single remote account in the database to determine + if it still exists on the origin server, and if it doesn't, + remove it from the database. + + Accounts that have had confirmed activity within the last week + are excluded from the checks. + + If 10 or more accounts from the same domain cannot be queried + due to a connection error (such as missing DNS records) then + the domain is considered dead, and all other accounts from it + are deleted without further querying. + + With the --dry-run option, no deletes will actually be carried + out. + LONG_DESC + def cull + domain_thresholds = Hash.new { |hash, key| hash[key] = 0 } + skip_threshold = 7.days.ago + culled = 0 + dead_servers = [] + dry_run = options[:dry_run] ? ' (DRY RUN)' : '' + + Account.remote.where(protocol: :activitypub).partitioned.find_each do |account| + next if account.updated_at >= skip_threshold || account.last_webfingered_at >= skip_threshold + + unless dead_servers.include?(account.domain) + begin + code = Request.new(:head, account.uri).perform(&:code) + rescue HTTP::ConnectionError + domain_thresholds[account.domain] += 1 + + if domain_thresholds[account.domain] >= 10 + dead_servers << account.domain + end + rescue StandardError + next + end + end + + if [404, 410].include?(code) || dead_servers.include?(account.domain) + unless options[:dry_run] + SuspendAccountService.new.call(account) + account.destroy + end + + culled += 1 + say('.', :green, false) + else + say('.', nil, false) + end + end + + say + say("Removed #{culled} accounts (#{dead_servers.size} dead servers)#{dry_run}", :green) + + unless dead_servers.empty? + say('R.I.P.:', :yellow) + dead_servers.each { |domain| say(' ' + domain) } + end + end + + option :all, type: :boolean + option :domain + desc 'refresh [USERNAME]', 'Fetch remote user data and files' + long_desc <<-LONG_DESC + Fetch remote user data and files for one or multiple accounts. + + With the --all option, all remote accounts will be processed. + Through the --domain option, this can be narrowed down to a + specific domain only. Otherwise, a single remote account must + be specified with USERNAME. + + All processing is done in the background through Sidekiq. + LONG_DESC + def refresh(username = nil) + if options[:domain] || options[:all] + queued = 0 + scope = Account.remote + scope = scope.where(domain: options[:domain]) if options[:domain] + + scope.select(:id).reorder(nil).find_in_batches do |accounts| + Maintenance::RedownloadAccountMediaWorker.push_bulk(accounts.map(&:id)) + queued += accounts.size + end + + say("Scheduled refreshment of #{queued} accounts", :green, true) + elsif username.present? + username, domain = username.split('@') + account = Account.find_remote(username, domain) + + if account.nil? + say('No such account', :red) + exit(1) + end + + Maintenance::RedownloadAccountMediaWorker.perform_async(account.id) + say('OK', :green) + else + say('No account(s) given', :red) + exit(1) end end private def rotate_keys_for_account(account, delay = 0) + if account.nil? + say('No such account', :red) + exit(1) + end + old_key = account.private_key new_key = OpenSSL::PKey::RSA.new(2048).to_pem account.update(private_key: new_key) diff --git a/lib/mastodon/cli_helper.rb b/lib/mastodon/cli_helper.rb index 8c4d9731c..2f807d08c 100644 --- a/lib/mastodon/cli_helper.rb +++ b/lib/mastodon/cli_helper.rb @@ -4,5 +4,6 @@ dev_null = Logger.new('/dev/null') Rails.logger = dev_null ActiveRecord::Base.logger = dev_null +ActiveJob::Base.logger = dev_null HttpLog.configuration.logger = dev_null Paperclip.options[:log] = false diff --git a/lib/mastodon/emoji_cli.rb b/lib/mastodon/emoji_cli.rb index 0a773c771..5bc51d034 100644 --- a/lib/mastodon/emoji_cli.rb +++ b/lib/mastodon/emoji_cli.rb @@ -5,8 +5,6 @@ require_relative '../../config/boot' require_relative '../../config/environment' require_relative 'cli_helper' -# rubocop:disable Rails/Output - module Mastodon class EmojiCLI < Thor option :prefix @@ -77,5 +75,3 @@ module Mastodon end end end - -# rubocop:enable Rails/Output diff --git a/lib/mastodon/feeds_cli.rb b/lib/mastodon/feeds_cli.rb new file mode 100644 index 000000000..c3fca723e --- /dev/null +++ b/lib/mastodon/feeds_cli.rb @@ -0,0 +1,81 @@ +# frozen_string_literal: true + +require_relative '../../config/boot' +require_relative '../../config/environment' +require_relative 'cli_helper' + +module Mastodon + class FeedsCLI < Thor + option :all, type: :boolean, default: false + option :background, type: :boolean, default: false + option :dry_run, type: :boolean, default: false + option :verbose, type: :boolean, default: false + desc 'build [USERNAME]', 'Build home and list feeds for one or all users' + long_desc <<-LONG_DESC + Build home and list feeds that are stored in Redis from the database. + + With the --all option, all active users will be processed. + Otherwise, a single user specified by USERNAME. + + With the --background option, regeneration will be queued into Sidekiq, + and the command will exit as soon as possible. + + With the --dry-run option, no work will be done. + + With the --verbose option, when accounts are processed sequentially in the + foreground, the IDs of the accounts will be printed. + LONG_DESC + def build(username = nil) + dry_run = options[:dry_run] ? '(DRY RUN)' : '' + + if options[:all] || username.nil? + processed = 0 + queued = 0 + + User.active.select(:id, :account_id).reorder(nil).find_in_batches do |users| + if options[:background] + RegenerationWorker.push_bulk(users.map(&:account_id)) unless options[:dry_run] + queued += users.size + else + users.each do |user| + RegenerationWorker.new.perform(user.account_id) unless options[:dry_run] + options[:verbose] ? say(user.account_id) : say('.', :green, false) + processed += 1 + end + end + end + + if options[:background] + say("Scheduled feed regeneration for #{queued} accounts #{dry_run}", :green, true) + else + say + say("Regenerated feeds for #{processed} accounts #{dry_run}", :green, true) + end + elsif username.present? + account = Account.find_local(username) + + if options[:background] + RegenerationWorker.perform_async(account.id) unless options[:dry_run] + else + RegenerationWorker.new.perform(account.id) unless options[:dry_run] + end + + say("OK #{dry_run}", :green, true) + else + say('No account(s) given', :red) + exit(1) + end + end + + desc 'clear', 'Remove all home and list feeds from Redis' + def clear + keys = Redis.current.keys('feed:*') + + Redis.current.pipelined do + keys.each { |key| Redis.current.del(key) } + end + + say('OK', :green) + end + end +end diff --git a/lib/mastodon/media_cli.rb b/lib/mastodon/media_cli.rb index 12ebdb774..8aa9f7903 100644 --- a/lib/mastodon/media_cli.rb +++ b/lib/mastodon/media_cli.rb @@ -4,8 +4,6 @@ require_relative '../../config/boot' require_relative '../../config/environment' require_relative 'cli_helper' -# rubocop:disable Rails/Output - module Mastodon class MediaCLI < Thor option :days, type: :numeric, default: 7 @@ -25,9 +23,10 @@ module Mastodon it may impact other operations of the Mastodon server, and it may overload the underlying file storage. - With the --verbose option, output deleting file ID to console (only when --background false). + With the --dry-run option, no work will be done. - With the --dry-run option, output the number of files to delete without deleting. + With the --verbose option, when media attachments are processed sequentially in the + foreground, the IDs of the media attachments will be printed. DESC def remove time_ago = options[:days].days.ago @@ -53,12 +52,10 @@ module Mastodon say if options[:background] - say("Scheduled the deletion of #{queued} media attachments #{dry_run}.", :green) + say("Scheduled the deletion of #{queued} media attachments #{dry_run}", :green, true) else - say("Removed #{processed} media attachments #{dry_run}.", :green) + say("Removed #{processed} media attachments #{dry_run}", :green, true) end end end end - -# rubocop:enable Rails/Output diff --git a/lib/mastodon/migration_helpers.rb b/lib/mastodon/migration_helpers.rb index e154b5a2c..5c135685f 100644 --- a/lib/mastodon/migration_helpers.rb +++ b/lib/mastodon/migration_helpers.rb @@ -835,7 +835,7 @@ module Mastodon columns(table).find { |column| column.name == name } end - # This will replace the first occurance of a string in a column with + # This will replace the first occurrence of a string in a column with # the replacement # On postgresql we can use `regexp_replace` for that. # On mysql we find the location of the pattern, and overwrite it diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 0442a156d..fc7fa5aca 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -28,8 +28,12 @@ module Mastodon [major, minor, patch, pre].compact end + def suffix + '+glitch' + end + def to_s - [to_a.join('.'), flags].join + [to_a.join('.'), flags, suffix].join end def repository diff --git a/lib/paperclip/lazy_thumbnail.rb b/lib/paperclip/lazy_thumbnail.rb index ea675a5bf..542c17fb2 100644 --- a/lib/paperclip/lazy_thumbnail.rb +++ b/lib/paperclip/lazy_thumbnail.rb @@ -20,7 +20,7 @@ module Paperclip private def needs_convert? - needs_different_geometry? || needs_different_format? + needs_different_geometry? || needs_different_format? || needs_metadata_stripping? end def needs_different_geometry? @@ -31,5 +31,9 @@ module Paperclip def needs_different_format? @format.present? && @current_format != @format end + + def needs_metadata_stripping? + @attachment.instance.respond_to?(:local?) && @attachment.instance.local? + end end end diff --git a/lib/tasks/mastodon.rake b/lib/tasks/mastodon.rake index 649a22a0b..ec8800819 100644 --- a/lib/tasks/mastodon.rake +++ b/lib/tasks/mastodon.rake @@ -390,139 +390,6 @@ namespace :mastodon do end end - desc 'Turn a user into an admin, identified by the USERNAME environment variable' - task make_admin: :environment do - include RoutingHelper - - account_username = ENV.fetch('USERNAME') - user = User.joins(:account).where(accounts: { username: account_username }) - - if user.present? - user.update(admin: true) - puts "Congrats! #{account_username} is now an admin. \\o/\nNavigate to #{edit_admin_settings_url} to get started" - else - puts "User could not be found; please make sure an account with the `#{account_username}` username exists." - end - end - - desc 'Turn a user into a moderator, identified by the USERNAME environment variable' - task make_mod: :environment do - account_username = ENV.fetch('USERNAME') - user = User.joins(:account).where(accounts: { username: account_username }) - - if user.present? - user.update(moderator: true) - puts "Congrats! #{account_username} is now a moderator \\o/" - else - puts "User could not be found; please make sure an account with the `#{account_username}` username exists." - end - end - - desc 'Remove admin and moderator privileges from user identified by the USERNAME environment variable' - task revoke_staff: :environment do - account_username = ENV.fetch('USERNAME') - user = User.joins(:account).where(accounts: { username: account_username }) - - if user.present? - user.update(moderator: false, admin: false) - puts "#{account_username} is no longer admin or moderator." - else - puts "User could not be found; please make sure an account with the `#{account_username}` username exists." - end - end - - desc 'Manually confirms a user with associated user email address stored in USER_EMAIL environment variable.' - task confirm_email: :environment do - email = ENV.fetch('USER_EMAIL') - user = User.find_by(email: email) - - if user - user.update(confirmed_at: Time.now.utc) - puts "#{email} confirmed" - else - abort "#{email} not found" - end - end - - desc 'Add a user by providing their email, username and initial password.' \ - 'The user will receive a confirmation email, then they must reset their password before logging in.' - task add_user: :environment do - disable_log_stdout! - - prompt = TTY::Prompt.new - - begin - email = prompt.ask('E-mail:', required: true) do |q| - q.modify :strip - end - - username = prompt.ask('Username:', required: true) do |q| - q.modify :strip - end - - role = prompt.select('Role:', %w(user moderator admin)) - - if prompt.yes?('Proceed to create the user?') - user = User.new(email: email, password: SecureRandom.hex, admin: role == 'admin', moderator: role == 'moderator', account_attributes: { username: username }) - - if user.save - prompt.ok 'User created and confirmation mail sent to the user\'s email address.' - prompt.ok "Here is the random password generated for the user: #{user.password}" - else - prompt.warn 'User was not created because of the following errors:' - - user.errors.each do |key, val| - prompt.error "#{key}: #{val}" - end - end - else - prompt.ok 'Aborting. Bye!' - end - rescue TTY::Reader::InputInterrupt - prompt.ok 'Aborting. Bye!' - end - end - - namespace :media do - desc 'Remove media attachments attributed to silenced accounts' - task remove_silenced: :environment do - nb_media_attachments = 0 - MediaAttachment.where(account: Account.silenced).select(:id).reorder(nil).find_in_batches do |media_attachments| - nb_media_attachments += media_attachments.length - Maintenance::DestroyMediaWorker.push_bulk(media_attachments.map(&:id)) - end - puts "Scheduled the deletion of #{nb_media_attachments} media attachments" - end - - desc 'Remove cached remote media attachments that are older than NUM_DAYS. By default 7 (week)' - task remove_remote: :environment do - puts 'Please use `./bin/tootctl media remove --help` directly'.colorize(:yellow) - require_relative '../mastodon/media_cli' - cli = Mastodon::MediaCLI.new([], days: (ENV['NUM_DAYS'] || 7).to_i) - cli.invoke(:remove) - end - - desc 'Set unknown attachment type for remote-only attachments' - task set_unknown: :environment do - puts 'Setting unknown attachment type for remote-only attachments...' - MediaAttachment.where(file_file_name: nil).where.not(type: :unknown).in_batches.update_all(type: :unknown) - puts 'Done!' - end - - desc 'Redownload avatars/headers of remote users. Optionally limit to a particular domain with DOMAIN' - task redownload_avatars: :environment do - accounts = Account.remote - accounts = accounts.where(domain: ENV['DOMAIN']) if ENV['DOMAIN'].present? - nb_accounts = 0 - - accounts.select(:id).reorder(nil).find_in_batches do |accounts_batch| - nb_accounts += accounts_batch.length - Maintenance::RedownloadAccountMediaWorker.push_bulk(accounts_batch.map(&:id)) - end - puts "Scheduled the download of avatars/headers for #{nb_accounts} remote users" - end - end - namespace :push do desc 'Unsubscribes from PuSH updates of feeds nobody follows locally' task clear: :environment do @@ -530,28 +397,6 @@ namespace :mastodon do end end - namespace :feeds do - desc 'Clear all timelines without regenerating them' - task clear_all: :environment do - Redis.current.keys('feed:*').each { |key| Redis.current.del(key) } - end - - desc 'Generates home timelines for users who logged in in the past two weeks' - task build: :environment do - User.active.select(:id, :account_id).reorder(nil).find_in_batches do |users| - RegenerationWorker.push_bulk(users.map(&:account_id)) - end - end - end - - namespace :users do - desc 'List e-mails of all admin users' - task admins: :environment do - puts 'Admin user emails:' - puts User.admins.map(&:email).join("\n") - end - end - namespace :settings do desc 'Open registrations on this instance' task open_registrations: :environment do @@ -572,221 +417,6 @@ namespace :mastodon do puts "VAPID_PUBLIC_KEY=#{vapid_key.public_key}" end end - - namespace :maintenance do - desc 'Update counter caches' - task update_counter_caches: :environment do - puts 'Updating counter caches for accounts...' - - Account.unscoped.where.not(protocol: :activitypub).select('id').find_in_batches do |batch| - Account.where(id: batch.map(&:id)).update_all('statuses_count = (select count(*) from statuses where account_id = accounts.id), followers_count = (select count(*) from follows where target_account_id = accounts.id), following_count = (select count(*) from follows where account_id = accounts.id)') - end - - puts 'Updating counter caches for statuses...' - - Status.unscoped.select('id').find_in_batches do |batch| - Status.where(id: batch.map(&:id)).update_all('favourites_count = (select count(*) from favourites where favourites.status_id = statuses.id), reblogs_count = (select count(*) from statuses as reblogs where reblogs.reblog_of_id = statuses.id)') - end - - puts 'Done!' - end - - desc 'Generate static versions of GIF avatars/headers' - task add_static_avatars: :environment do - puts 'Generating static avatars/headers for GIF ones...' - - Account.unscoped.where(avatar_content_type: 'image/gif').or(Account.unscoped.where(header_content_type: 'image/gif')).find_each do |account| - begin - account.avatar.reprocess! if account.avatar_content_type == 'image/gif' && !account.avatar.exists?(:static) - account.header.reprocess! if account.header_content_type == 'image/gif' && !account.header.exists?(:static) - rescue StandardError => e - Rails.logger.error "Error while generating static avatars/headers for account #{account.id}: #{e}" - next - end - end - - puts 'Done!' - end - - desc 'Ensure referencial integrity' - task prepare_for_foreign_keys: :environment do - # All the deletes: - ActiveRecord::Base.connection.execute('DELETE FROM statuses USING statuses s LEFT JOIN accounts a ON a.id = s.account_id WHERE statuses.id = s.id AND a.id IS NULL') - - if ActiveRecord::Base.connection.table_exists? :account_domain_blocks - ActiveRecord::Base.connection.execute('DELETE FROM account_domain_blocks USING account_domain_blocks adb LEFT JOIN accounts a ON a.id = adb.account_id WHERE account_domain_blocks.id = adb.id AND a.id IS NULL') - end - - if ActiveRecord::Base.connection.table_exists? :conversation_mutes - ActiveRecord::Base.connection.execute('DELETE FROM conversation_mutes USING conversation_mutes cm LEFT JOIN accounts a ON a.id = cm.account_id WHERE conversation_mutes.id = cm.id AND a.id IS NULL') - ActiveRecord::Base.connection.execute('DELETE FROM conversation_mutes USING conversation_mutes cm LEFT JOIN conversations c ON c.id = cm.conversation_id WHERE conversation_mutes.id = cm.id AND c.id IS NULL') - end - - ActiveRecord::Base.connection.execute('DELETE FROM favourites USING favourites f LEFT JOIN accounts a ON a.id = f.account_id WHERE favourites.id = f.id AND a.id IS NULL') - ActiveRecord::Base.connection.execute('DELETE FROM favourites USING favourites f LEFT JOIN statuses s ON s.id = f.status_id WHERE favourites.id = f.id AND s.id IS NULL') - ActiveRecord::Base.connection.execute('DELETE FROM blocks USING blocks b LEFT JOIN accounts a ON a.id = b.account_id WHERE blocks.id = b.id AND a.id IS NULL') - ActiveRecord::Base.connection.execute('DELETE FROM blocks USING blocks b LEFT JOIN accounts a ON a.id = b.target_account_id WHERE blocks.id = b.id AND a.id IS NULL') - ActiveRecord::Base.connection.execute('DELETE FROM follow_requests USING follow_requests fr LEFT JOIN accounts a ON a.id = fr.account_id WHERE follow_requests.id = fr.id AND a.id IS NULL') - ActiveRecord::Base.connection.execute('DELETE FROM follow_requests USING follow_requests fr LEFT JOIN accounts a ON a.id = fr.target_account_id WHERE follow_requests.id = fr.id AND a.id IS NULL') - ActiveRecord::Base.connection.execute('DELETE FROM follows USING follows f LEFT JOIN accounts a ON a.id = f.account_id WHERE follows.id = f.id AND a.id IS NULL') - ActiveRecord::Base.connection.execute('DELETE FROM follows USING follows f LEFT JOIN accounts a ON a.id = f.target_account_id WHERE follows.id = f.id AND a.id IS NULL') - ActiveRecord::Base.connection.execute('DELETE FROM mutes USING mutes m LEFT JOIN accounts a ON a.id = m.account_id WHERE mutes.id = m.id AND a.id IS NULL') - ActiveRecord::Base.connection.execute('DELETE FROM mutes USING mutes m LEFT JOIN accounts a ON a.id = m.target_account_id WHERE mutes.id = m.id AND a.id IS NULL') - ActiveRecord::Base.connection.execute('DELETE FROM imports USING imports i LEFT JOIN accounts a ON a.id = i.account_id WHERE imports.id = i.id AND a.id IS NULL') - ActiveRecord::Base.connection.execute('DELETE FROM mentions USING mentions m LEFT JOIN accounts a ON a.id = m.account_id WHERE mentions.id = m.id AND a.id IS NULL') - ActiveRecord::Base.connection.execute('DELETE FROM mentions USING mentions m LEFT JOIN statuses s ON s.id = m.status_id WHERE mentions.id = m.id AND s.id IS NULL') - ActiveRecord::Base.connection.execute('DELETE FROM notifications USING notifications n LEFT JOIN accounts a ON a.id = n.account_id WHERE notifications.id = n.id AND a.id IS NULL') - ActiveRecord::Base.connection.execute('DELETE FROM notifications USING notifications n LEFT JOIN accounts a ON a.id = n.from_account_id WHERE notifications.id = n.id AND a.id IS NULL') - ActiveRecord::Base.connection.execute('DELETE FROM preview_cards USING preview_cards pc LEFT JOIN statuses s ON s.id = pc.status_id WHERE preview_cards.id = pc.id AND s.id IS NULL') - ActiveRecord::Base.connection.execute('DELETE FROM reports USING reports r LEFT JOIN accounts a ON a.id = r.account_id WHERE reports.id = r.id AND a.id IS NULL') - ActiveRecord::Base.connection.execute('DELETE FROM reports USING reports r LEFT JOIN accounts a ON a.id = r.target_account_id WHERE reports.id = r.id AND a.id IS NULL') - ActiveRecord::Base.connection.execute('DELETE FROM statuses_tags USING statuses_tags st LEFT JOIN statuses s ON s.id = st.status_id WHERE statuses_tags.tag_id = st.tag_id AND statuses_tags.status_id = st.status_id AND s.id IS NULL') - ActiveRecord::Base.connection.execute('DELETE FROM statuses_tags USING statuses_tags st LEFT JOIN tags t ON t.id = st.tag_id WHERE statuses_tags.tag_id = st.tag_id AND statuses_tags.status_id = st.status_id AND t.id IS NULL') - ActiveRecord::Base.connection.execute('DELETE FROM stream_entries USING stream_entries se LEFT JOIN accounts a ON a.id = se.account_id WHERE stream_entries.id = se.id AND a.id IS NULL') - ActiveRecord::Base.connection.execute('DELETE FROM subscriptions USING subscriptions s LEFT JOIN accounts a ON a.id = s.account_id WHERE subscriptions.id = s.id AND a.id IS NULL') - ActiveRecord::Base.connection.execute('DELETE FROM users USING users u LEFT JOIN accounts a ON a.id = u.account_id WHERE users.id = u.id AND a.id IS NULL') - ActiveRecord::Base.connection.execute('DELETE FROM web_settings USING web_settings ws LEFT JOIN users u ON u.id = ws.user_id WHERE web_settings.id = ws.id AND u.id IS NULL') - ActiveRecord::Base.connection.execute('DELETE FROM oauth_access_grants USING oauth_access_grants oag LEFT JOIN users u ON u.id = oag.resource_owner_id WHERE oauth_access_grants.id = oag.id AND oag.resource_owner_id IS NOT NULL AND u.id IS NULL') - ActiveRecord::Base.connection.execute('DELETE FROM oauth_access_grants USING oauth_access_grants oag LEFT JOIN oauth_applications a ON a.id = oag.application_id WHERE oauth_access_grants.id = oag.id AND oag.application_id IS NOT NULL AND a.id IS NULL') - ActiveRecord::Base.connection.execute('DELETE FROM oauth_access_tokens USING oauth_access_tokens oat LEFT JOIN users u ON u.id = oat.resource_owner_id WHERE oauth_access_tokens.id = oat.id AND oat.resource_owner_id IS NOT NULL AND u.id IS NULL') - ActiveRecord::Base.connection.execute('DELETE FROM oauth_access_tokens USING oauth_access_tokens oat LEFT JOIN oauth_applications a ON a.id = oat.application_id WHERE oauth_access_tokens.id = oat.id AND oat.application_id IS NOT NULL AND a.id IS NULL') - - # All the nullifies: - ActiveRecord::Base.connection.execute('UPDATE statuses SET in_reply_to_id = NULL FROM statuses s LEFT JOIN statuses rs ON rs.id = s.in_reply_to_id WHERE statuses.id = s.id AND s.in_reply_to_id IS NOT NULL AND rs.id IS NULL') - ActiveRecord::Base.connection.execute('UPDATE statuses SET in_reply_to_account_id = NULL FROM statuses s LEFT JOIN accounts a ON a.id = s.in_reply_to_account_id WHERE statuses.id = s.id AND s.in_reply_to_account_id IS NOT NULL AND a.id IS NULL') - ActiveRecord::Base.connection.execute('UPDATE media_attachments SET status_id = NULL FROM media_attachments ma LEFT JOIN statuses s ON s.id = ma.status_id WHERE media_attachments.id = ma.id AND ma.status_id IS NOT NULL AND s.id IS NULL') - ActiveRecord::Base.connection.execute('UPDATE media_attachments SET account_id = NULL FROM media_attachments ma LEFT JOIN accounts a ON a.id = ma.account_id WHERE media_attachments.id = ma.id AND ma.account_id IS NOT NULL AND a.id IS NULL') - ActiveRecord::Base.connection.execute('UPDATE reports SET action_taken_by_account_id = NULL FROM reports r LEFT JOIN accounts a ON a.id = r.action_taken_by_account_id WHERE reports.id = r.id AND r.action_taken_by_account_id IS NOT NULL AND a.id IS NULL') - end - - desc 'Remove deprecated preview cards' - task remove_deprecated_preview_cards: :environment do - next unless ActiveRecord::Base.connection.table_exists? 'deprecated_preview_cards' - - class DeprecatedPreviewCard < ActiveRecord::Base - self.inheritance_column = false - - path = '/preview_cards/:attachment/:id_partition/:style/:filename' - if ENV['S3_ENABLED'] != 'true' - path = (ENV['PAPERCLIP_ROOT_PATH'] || ':rails_root/public/system') + path - end - - has_attached_file :image, styles: { original: '280x120>' }, convert_options: { all: '-quality 80 -strip' }, path: path - end - - puts 'Delete records and associated files from deprecated preview cards? [y/N]: ' - confirm = STDIN.gets.chomp - - if confirm.casecmp('y').zero? - DeprecatedPreviewCard.in_batches.destroy_all - - puts 'Drop deprecated preview cards table? [y/N]: ' - confirm = STDIN.gets.chomp - - if confirm.casecmp('y').zero? - ActiveRecord::Migration.drop_table :deprecated_preview_cards - end - end - end - - desc 'Migrate photo preview cards made before 2.1' - task migrate_photo_preview_cards: :environment do - status_ids = Status.joins(:preview_cards) - .where(preview_cards: { embed_url: '', type: :photo }) - .reorder(nil) - .group(:id) - .pluck(:id) - - PreviewCard.where(embed_url: '', type: :photo).delete_all - LinkCrawlWorker.push_bulk status_ids - end - - desc 'Find case-insensitive username duplicates of local users' - task find_duplicate_usernames: :environment do - include RoutingHelper - - disable_log_stdout! - - duplicate_masters = Account.find_by_sql('SELECT * FROM accounts WHERE id IN (SELECT min(id) FROM accounts WHERE domain IS NULL GROUP BY lower(username) HAVING count(*) > 1)') - pastel = Pastel.new - - duplicate_masters.each do |account| - puts pastel.yellow('First of their name: ') + pastel.bold(account.username) + " (#{admin_account_url(account.id)})" - - Account.where('lower(username) = ?', account.username.downcase).where.not(id: account.id).each do |duplicate| - puts ' ' + pastel.red('Duplicate: ') + admin_account_url(duplicate.id) - end - end - end - - desc 'Remove all home feed regeneration markers' - task remove_regeneration_markers: :environment do - keys = Redis.current.keys('account:*:regeneration') - - Redis.current.pipelined do - keys.each { |key| Redis.current.del(key) } - end - end - - desc 'Check every known remote account and delete those that no longer exist in origin' - task purge_removed_accounts: :environment do - prepare_for_options! - - options = {} - - OptionParser.new do |opts| - opts.banner = 'Usage: rails mastodon:maintenance:purge_removed_accounts [options]' - - opts.on('-f', '--force', 'Remove all encountered accounts without asking for confirmation') do - options[:force] = true - end - - opts.on('-h', '--help', 'Display this message') do - puts opts - exit - end - end.parse! - - disable_log_stdout! - - total = Account.remote.where(protocol: :activitypub).count - progress_bar = ProgressBar.create(total: total, format: '%c/%C |%w>%i| %e') - - Account.remote.where(protocol: :activitypub).partitioned.find_each do |account| - progress_bar.increment - - begin - code = Request.new(:head, account.uri).perform(&:code) - rescue StandardError - # This could happen due to network timeout, DNS timeout, wrong SSL cert, etc, - # which should probably not lead to perceiving the account as deleted, so - # just skip till next time - next - end - - if [404, 410].include?(code) - if options[:force] - SuspendAccountService.new.call(account) - account.destroy - else - progress_bar.pause - progress_bar.clear - print "\nIt seems like #{account.acct} no longer exists. Purge the account from the database? [Y/n]: ".colorize(:yellow) - confirm = STDIN.gets.chomp - puts '' - progress_bar.resume - - if confirm.casecmp('n').zero? - next - else - SuspendAccountService.new.call(account) - account.destroy - end - end - end - end - end - end end def disable_log_stdout! diff --git a/lib/tasks/repo.rake b/lib/tasks/repo.rake new file mode 100644 index 000000000..367859e94 --- /dev/null +++ b/lib/tasks/repo.rake @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +namespace :repo do + desc 'Generate the authors.md file' + task :authors do + file = File.open('AUTHORS.md', 'w') + file << <<~HEADER + Mastodon is available on [GitHub](https://github.com/tootsuite/mastodon) + and provided thanks to the work of the following contributors: + + HEADER + + url = 'https://api.github.com/repos/tootsuite/mastodon/contributors?anon=1' + HttpLog.config.compact_log = true + while url.present? + response = HTTP.get(url) + contributors = Oj.load(response.body) + contributors.each do |c| + file << "* [#{c['login']}](#{c['html_url']})\n" if c['login'] + file << "* [#{c['name']}](mailto:#{c['email']})\n" if c['name'] + end + url = LinkHeader.parse(response.headers['Link']).find_link(%w(rel next))&.href + end + + file << <<~FOOTER + + This document is provided for informational purposes only. Since it is only updated once per release, the version you are looking at may be currently out of date. To see the full list of contributors, consider looking at the [git history](https://github.com/tootsuite/mastodon/graphs/contributors) instead. + FOOTER + end +end diff --git a/package.json b/package.json index 3f6f4c7fd..8a79938ae 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,8 @@ }, "scripts": { "postversion": "git push --tags", - "build:development": "cross-env RAILS_ENV=development ./bin/webpack", - "build:production": "cross-env RAILS_ENV=production ./bin/webpack", + "build:development": "cross-env RAILS_ENV=development NODE_ENV=development ./bin/webpack", + "build:production": "cross-env RAILS_ENV=production NODE_ENV=production ./bin/webpack", "manage:translations": "node ./config/webpack/translationRunner.js", "start": "node ./streaming/index.js", "test": "npm-run-all test:lint test:jest", @@ -18,33 +18,39 @@ "type": "git", "url": "https://github.com/tootsuite/mastodon.git" }, + "browserslist": [ + "last 2 versions", + "IE >= 11", + "iOS >= 9" + ], "private": true, "dependencies": { + "@babel/core": "^7.0.1", + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-decorators": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.0.0", + "@babel/plugin-transform-react-inline-elements": "^7.0.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/preset-env": "^7.0.0", + "@babel/preset-react": "^7.0.0", + "@babel/runtime": "^7.0.0", "array-includes": "^3.0.3", "atrament": "^0.2.3", "autoprefixer": "^8.6.5", "axios": "~0.16.2", - "babel-core": "^6.26.3", - "babel-loader": "^7.1.5", + "babel-core": "^7.0.0-bridge.0", + "babel-loader": "^8.0.2", "babel-plugin-lodash": "^3.3.4", - "babel-plugin-preval": "^1.6.1", - "babel-plugin-react-intl": "^2.4.0", - "babel-plugin-syntax-dynamic-import": "^6.18.0", - "babel-plugin-transform-class-properties": "^6.24.1", - "babel-plugin-transform-decorators-legacy": "^1.3.5", - "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2", - "babel-plugin-transform-object-rest-spread": "^6.23.0", - "babel-plugin-transform-react-inline-elements": "^6.22.0", - "babel-plugin-transform-react-jsx-self": "^6.22.0", - "babel-plugin-transform-react-jsx-source": "^6.22.0", - "babel-plugin-transform-react-remove-prop-types": "^0.4.13", - "babel-plugin-transform-runtime": "^6.23.0", - "babel-preset-env": "^1.7.0", - "babel-preset-react": "^6.24.1", + "babel-plugin-preval": "^3.0.1", + "babel-plugin-react-intl": "^3.0.0", + "babel-plugin-transform-react-remove-prop-types": "^0.4.15", "classnames": "^2.2.5", - "compression-webpack-plugin": "^1.1.11", + "compression-webpack-plugin": "^2.0.0", "cross-env": "^5.1.4", - "css-loader": "^0.28.11", + "css-loader": "^1.0.0", "detect-passive-events": "^1.0.2", "dotenv": "^4.0.0", "emoji-mart": "Gargron/emoji-mart#build", @@ -52,9 +58,11 @@ "escape-html": "^1.0.3", "exif-js": "^2.3.0", "express": "^4.16.2", - "file-loader": "^1.1.11", + "favico.js": "^0.3.10", + "file-loader": "^2.0.0", "font-awesome": "^4.7.0", "glob": "^7.1.1", + "history": "^4.7.2", "http-link-header": "^0.8.0", "immutable": "^3.8.2", "imports-loader": "^0.8.0", @@ -67,7 +75,7 @@ "lodash": "^4.17.5", "mark-loader": "^0.1.6", "marky": "^1.2.0", - "mini-css-extract-plugin": "^0.4.1", + "mini-css-extract-plugin": "^0.4.2", "mkdirp": "^0.5.1", "node-sass": "^4.9.2", "npm-run-all": "^4.1.2", @@ -78,28 +86,28 @@ "offline-plugin": "^5.0.5", "path-complete-extname": "^1.0.0", "pg": "^6.4.0", - "postcss-loader": "^2.1.6", + "postcss-loader": "^3.0.0", "postcss-object-fit-images": "^1.1.2", "postcss-smart-import": "^0.7.6", "precss": "^3.1.2", "prop-types": "^15.5.10", "punycode": "^2.1.0", "rails-ujs": "^5.2.0", - "react": "^16.3.0", - "react-dom": "^16.3.0", + "react": "^16.5.0", + "react-dom": "^16.5.0", "react-hotkeys": "^0.10.0", "react-immutable-proptypes": "^2.1.0", "react-immutable-pure-component": "^1.1.1", "react-intl": "^2.4.0", "react-motion": "^0.5.2", - "react-notification": "^6.8.2", + "react-notification": "^6.8.4", "react-overlays": "^0.8.3", "react-redux": "^5.0.4", "react-redux-loading-bar": "^2.9.3", "react-router-dom": "^4.1.1", "react-router-scroll-4": "^1.0.0-beta.1", "react-sparklines": "^1.7.0", - "react-swipeable-views": "0.12.13", + "react-swipeable-views": "^0.12.17", "react-textarea-autosize": "^5.2.1", "react-toggle": "^4.0.1", "redis": "^2.7.1", @@ -112,34 +120,35 @@ "rimraf": "^2.6.1", "sass-loader": "^7.0.3", "stringz": "^0.3.0", - "style-loader": "^0.21.0", + "style-loader": "^0.23.0", "substring-trie": "^1.0.2", "throng": "^4.0.0", "tiny-queue": "^0.2.1", "uglifyjs-webpack-plugin": "^1.2.7", "uuid": "^3.1.0", "uws": "10.148.0", - "webpack": "^4.16.0", + "webpack": "^4.18.0", "webpack-bundle-analyzer": "^2.13.1", "webpack-cli": "^3.0.8", - "webpack-manifest-plugin": "^2.0.3", + "webpack-manifest-plugin": "^2.0.4", "webpack-merge": "^4.1.3", "websocket.js": "^0.1.12" }, "devDependencies": { - "babel-eslint": "^8.2.6", - "enzyme": "^3.2.0", - "enzyme-adapter-react-16": "^1.1.0", + "babel-eslint": "^9.0.0", + "babel-jest": "^23.6.0", + "enzyme": "^3.6.0", + "enzyme-adapter-react-16": "^1.5.0", "eslint": "^4.19.1", "eslint-plugin-import": "^2.8.0", "eslint-plugin-jsx-a11y": "^6.0.3", "eslint-plugin-promise": "^3.8.0", "eslint-plugin-react": "^7.8.2", - "jest": "^21.2.1", + "jest": "^23.6.0", "raf": "^3.4.0", "react-intl-translations-manager": "^5.0.3", - "react-test-renderer": "^16.2.0", - "webpack-dev-server": "^3.1.4", + "react-test-renderer": "^16.5.0", + "webpack-dev-server": "^3.1.8", "yargs": "^8.0.2" }, "optionalDependencies": { diff --git a/spec/controllers/auth/sessions_controller_spec.rb b/spec/controllers/auth/sessions_controller_spec.rb index 97719a606..b4f912717 100644 --- a/spec/controllers/auth/sessions_controller_spec.rb +++ b/spec/controllers/auth/sessions_controller_spec.rb @@ -30,6 +30,13 @@ RSpec.describe Auth::SessionsController, type: :controller do expect(response).to redirect_to(new_user_session_path) end + + it 'does not delete redirect location with continue=true' do + sign_in(user, scope: :user) + controller.store_location_for(:user, '/authorize') + delete :destroy, params: { continue: 'true' } + expect(controller.stored_location_for(:user)).to eq '/authorize' + end end context 'with a suspended user' do diff --git a/spec/controllers/concerns/localized_spec.rb b/spec/controllers/concerns/localized_spec.rb index 8c80b7d2a..76c3de118 100644 --- a/spec/controllers/concerns/localized_spec.rb +++ b/spec/controllers/concerns/localized_spec.rb @@ -28,7 +28,7 @@ describe ApplicationController, type: :controller do expect(I18n.locale).to eq :fa end - it 'sets available and compatible langauge if none of available languages are preferred' do + it 'sets available and compatible language if none of available languages are preferred' do request.headers['Accept-Language'] = 'fa-IR' get 'success' expect(I18n.locale).to eq :fa diff --git a/spec/controllers/emojis_controller_spec.rb b/spec/controllers/emojis_controller_spec.rb index 68bae256d..fbbd11f64 100644 --- a/spec/controllers/emojis_controller_spec.rb +++ b/spec/controllers/emojis_controller_spec.rb @@ -6,11 +6,11 @@ describe EmojisController do let(:emoji) { Fabricate(:custom_emoji) } describe 'GET #show' do - subject(:responce) { get :show, params: { id: emoji.id, format: :json } } + subject(:response) { get :show, params: { id: emoji.id, format: :json } } subject(:body) { JSON.parse(response.body, symbolize_names: true) } it 'returns the right response' do - expect(responce).to have_http_status 200 + expect(response).to have_http_status 200 expect(body[:name]).to eq ':coolcat:' end end diff --git a/spec/controllers/oauth/authorizations_controller_spec.rb b/spec/controllers/oauth/authorizations_controller_spec.rb index 91c2d03ef..a84260a54 100644 --- a/spec/controllers/oauth/authorizations_controller_spec.rb +++ b/spec/controllers/oauth/authorizations_controller_spec.rb @@ -5,23 +5,25 @@ require 'rails_helper' RSpec.describe Oauth::AuthorizationsController, type: :controller do render_views - let(:app) { Doorkeeper::Application.create!(name: 'test', redirect_uri: 'http://localhost/') } + let(:app) { Doorkeeper::Application.create!(name: 'test', redirect_uri: 'http://localhost/', scopes: 'read') } describe 'GET #new' do subject do - get :new, params: { client_id: app.uid, response_type: 'code', redirect_uri: 'http://localhost/' } + get :new, params: { client_id: app.uid, response_type: 'code', redirect_uri: 'http://localhost/', scope: 'read' } end shared_examples 'stores location for user' do it 'stores location for user' do subject - expect(controller.stored_location_for(:user)).to eq "/oauth/authorize?client_id=#{app.uid}&redirect_uri=http%3A%2F%2Flocalhost%2F&response_type=code" + expect(controller.stored_location_for(:user)).to eq "/oauth/authorize?client_id=#{app.uid}&redirect_uri=http%3A%2F%2Flocalhost%2F&response_type=code&scope=read" end end context 'when signed in' do + let!(:user) { Fabricate(:user) } + before do - sign_in Fabricate(:user), scope: :user + sign_in user, scope: :user end it 'returns http success' do @@ -35,6 +37,28 @@ RSpec.describe Oauth::AuthorizationsController, type: :controller do end include_examples 'stores location for user' + + context 'when app is already authorized' do + before do + Doorkeeper::AccessToken.find_or_create_for( + app, + user.id, + app.scopes, + Doorkeeper.configuration.access_token_expires_in, + Doorkeeper.configuration.refresh_token_enabled? + ) + end + + it 'redirects to callback' do + subject + expect(response).to redirect_to(/\A#{app.redirect_uri}/) + end + + it 'does not redirect to callback with force_login=true' do + get :new, params: { client_id: app.uid, response_type: 'code', redirect_uri: 'http://localhost/', scope: 'read', force_login: 'true' } + expect(response.body).to match(/Authorize/) + end + end end context 'when not signed in' do diff --git a/spec/controllers/stream_entries_controller_spec.rb b/spec/controllers/stream_entries_controller_spec.rb index 534bc393d..eb7fdf9d7 100644 --- a/spec/controllers/stream_entries_controller_spec.rb +++ b/spec/controllers/stream_entries_controller_spec.rb @@ -4,7 +4,7 @@ RSpec.describe StreamEntriesController, type: :controller do render_views shared_examples 'before_action' do |route| - context 'when account is not suspended anbd stream_entry is available' do + context 'when account is not suspended and stream_entry is available' do it 'assigns instance variables' do status = Fabricate(:status) diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb index 8fb5bbddf..6a3f9e6ec 100644 --- a/spec/models/account_spec.rb +++ b/spec/models/account_spec.rb @@ -559,7 +559,7 @@ RSpec.describe Account, type: :model do end context 'when is local' do - it 'is invalid if the username is not unique in case-insensitive comparsion among local accounts' do + it 'is invalid if the username is not unique in case-insensitive comparison among local accounts' do account_1 = Fabricate(:account, username: 'the_doctor') account_2 = Fabricate.build(:account, username: 'the_Doctor') account_2.valid? diff --git a/spec/models/subscription_spec.rb b/spec/models/subscription_spec.rb index 84096e6ae..b83979d13 100644 --- a/spec/models/subscription_spec.rb +++ b/spec/models/subscription_spec.rb @@ -18,7 +18,7 @@ RSpec.describe Subscription, type: :model do end describe 'lease_seconds' do - it 'returns the time remaing until expiration' do + it 'returns the time remaining until expiration' do datetime = 1.day.from_now subscription = Subscription.new(expires_at: datetime) travel_to(datetime - 12.hours) do diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index c575128e4..79e80220c 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -29,6 +29,7 @@ Devise::Test::ControllerHelpers.module_eval do value: resource.activate_session(warden.request), expires: 1.year.from_now, httponly: true, + same_site: :lax, } end end diff --git a/spec/services/process_feed_service_spec.rb b/spec/services/process_feed_service_spec.rb index d8b065063..1f26660ed 100644 --- a/spec/services/process_feed_service_spec.rb +++ b/spec/services/process_feed_service_spec.rb @@ -166,7 +166,7 @@ XML expect(created_statuses.first.reblog.text).to eq 'Overwatch rocks' end - it 'ignores reblogs if it failed to retreive reblogged statuses' do + it 'ignores reblogs if it failed to retrieve reblogged statuses' do stub_request(:get, 'https://overwatch.com/users/tracer/updates/1').to_return(status: 404) actor = Fabricate(:account, username: 'tracer', domain: 'overwatch.com') diff --git a/spec/services/verify_link_service_spec.rb b/spec/services/verify_link_service_spec.rb new file mode 100644 index 000000000..9b04d6136 --- /dev/null +++ b/spec/services/verify_link_service_spec.rb @@ -0,0 +1,82 @@ +require 'rails_helper' + +RSpec.describe VerifyLinkService, type: :service do + subject { described_class.new } + + let(:account) { Fabricate(:account, username: 'alice') } + let(:field) { Account::Field.new(account, 'name' => 'Website', 'value' => 'http://example.com') } + + before do + stub_request(:head, 'https://redirect.me/abc').to_return(status: 301, headers: { 'Location' => ActivityPub::TagManager.instance.url_for(account) }) + stub_request(:get, 'http://example.com').to_return(status: 200, body: html) + subject.call(field) + end + + context 'when a link contains an <a> back' do + let(:html) do + <<-HTML + <!doctype html> + <body> + <a href="#{ActivityPub::TagManager.instance.url_for(account)}" rel="me">Follow me on Mastodon</a> + </body> + HTML + end + + it 'marks the field as verified' do + expect(field.verified?).to be true + end + end + + context 'when a link contains an <a rel="noopener"> back' do + let(:html) do + <<-HTML + <!doctype html> + <body> + <a href="#{ActivityPub::TagManager.instance.url_for(account)}" rel="noopener me" target="_blank">Follow me on Mastodon</a> + </body> + HTML + end + + it 'marks the field as verified' do + expect(field.verified?).to be true + end + end + + context 'when a link contains a <link> back' do + let(:html) do + <<-HTML + <!doctype html> + <head> + <link type="text/html" href="#{ActivityPub::TagManager.instance.url_for(account)}" rel="me" /> + </head> + HTML + end + + it 'marks the field as verified' do + expect(field.verified?).to be true + end + end + + context 'when a link goes through a redirect back' do + let(:html) do + <<-HTML + <!doctype html> + <head> + <link type="text/html" href="https://redirect.me/abc" rel="me" /> + </head> + HTML + end + + it 'marks the field as verified' do + expect(field.verified?).to be true + end + end + + context 'when a link does not contain a link back' do + let(:html) { '' } + + it 'marks the field as verified' do + expect(field.verified?).to be false + end + end +end diff --git a/yarn.lock b/yarn.lock index e8c41786d..14fa07f92 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,273 +2,801 @@ # yarn lockfile v1 -"@babel/code-frame@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" - dependencies: - "@babel/highlight" "7.0.0-beta.44" +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.0.0-beta.35": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/core@^7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.0.1.tgz#406658caed0e9686fa4feb5c2f3cefb6161c0f41" + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.0.0" + "@babel/helpers" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + convert-source-map "^1.1.0" + debug "^3.1.0" + json5 "^0.5.0" + lodash "^4.17.10" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" -"@babel/generator@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42" +"@babel/generator@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0.tgz#1efd58bffa951dc846449e58ce3a1d7f02d393aa" dependencies: - "@babel/types" "7.0.0-beta.44" + "@babel/types" "^7.0.0" jsesc "^2.5.1" - lodash "^4.2.0" + lodash "^4.17.10" source-map "^0.5.0" trim-right "^1.0.1" -"@babel/helper-function-name@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd" +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" dependencies: - "@babel/helper-get-function-arity" "7.0.0-beta.44" - "@babel/template" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" + "@babel/types" "^7.0.0" -"@babel/helper-get-function-arity@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" +"@babel/helper-builder-binary-assignment-operator-visitor@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.0.0.tgz#ba26336beb2abb547d58b6eba5b84d77975a39eb" dependencies: - "@babel/types" "7.0.0-beta.44" + "@babel/helper-explode-assignable-expression" "^7.0.0" + "@babel/types" "^7.0.0" -"@babel/helper-module-imports@^7.0.0-beta.49": - version "7.0.0-beta.53" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0-beta.53.tgz#e735e6aa30a504b0f9d85c38a6d470a9f4aa81d9" +"@babel/helper-builder-react-jsx@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.0.0.tgz#fa154cb53eb918cf2a9a7ce928e29eb649c5acdb" dependencies: - "@babel/types" "7.0.0-beta.53" - lodash "^4.17.5" + "@babel/types" "^7.0.0" + esutils "^2.0.0" + +"@babel/helper-call-delegate@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.0.0.tgz#e036956bb33d76e59c07a04a1fff144e9f62ab78" + dependencies: + "@babel/helper-hoist-variables" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + +"@babel/helper-define-map@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.0.0.tgz#a5684dd2adf30f0137cf9b0bde436f8c2db17225" + dependencies: + "@babel/helper-function-name" "^7.0.0" + "@babel/types" "^7.0.0" + lodash "^4.17.10" + +"@babel/helper-explode-assignable-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.0.0.tgz#fdfa4c88603ae3e954d0fc3244d5ca82fb468497" + dependencies: + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + +"@babel/helper-function-name@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0.tgz#a68cc8d04420ccc663dd258f9cc41b8261efa2d4" + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-hoist-variables@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz#46adc4c5e758645ae7a45deb92bab0918c23bb88" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-member-expression-to-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.0.0-beta.49": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-transforms@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.0.0.tgz#b01ee7d543e81e8c3fc404b19c9f26acb6e4cf4c" + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.0.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/types" "^7.0.0" + lodash "^4.17.10" -"@babel/helper-split-export-declaration@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + +"@babel/helper-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0.tgz#2c1718923b57f9bbe64705ffe5640ac64d9bdb27" + dependencies: + lodash "^4.17.10" + +"@babel/helper-remap-async-to-generator@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.0.0.tgz#6512273c2feb91587822335cf913fdf680c26901" + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.0.0.tgz#b6f21237280e0be54f591f63a464b66627ced707" + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + +"@babel/helper-simple-access@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.0.0.tgz#ff36a27983ae4c27122da2f7f294dced80ecbd08" + dependencies: + "@babel/template" "^7.0.0" + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-wrap-function@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.0.0.tgz#1c8e42a2cfb0808e3140189dfe9490782a6fa740" + dependencies: + "@babel/helper-function-name" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + +"@babel/helpers@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.0.0.tgz#7213388341eeb07417f44710fd7e1d00acfa6ac0" dependencies: - "@babel/types" "7.0.0-beta.44" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" -"@babel/highlight@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" dependencies: chalk "^2.0.0" esutils "^2.0.2" - js-tokens "^3.0.0" + js-tokens "^4.0.0" -"@babel/runtime@^7.0.0-beta.42": - version "7.0.0-beta.53" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0-beta.53.tgz#9df22ae34823ce89f790060594b83ee572e2c5d2" +"@babel/parser@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.0.0.tgz#697655183394facffb063437ddf52c0277698775" + +"@babel/plugin-proposal-async-generator-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.0.0.tgz#5d1eb6b44fd388b97f964350007ab9da090b1d70" dependencies: - core-js "^2.5.7" - regenerator-runtime "^0.12.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.0.0" + "@babel/plugin-syntax-async-generators" "^7.0.0" -"@babel/template@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" - dependencies: - "@babel/code-frame" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - babylon "7.0.0-beta.44" - lodash "^4.2.0" - -"@babel/traverse@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966" - dependencies: - "@babel/code-frame" "7.0.0-beta.44" - "@babel/generator" "7.0.0-beta.44" - "@babel/helper-function-name" "7.0.0-beta.44" - "@babel/helper-split-export-declaration" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - babylon "7.0.0-beta.44" - debug "^3.1.0" +"@babel/plugin-proposal-class-properties@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.0.0.tgz#a16b5c076ba6c3d87df64d2480a380e979543731" + dependencies: + "@babel/helper-function-name" "^7.0.0" + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.0.0" + "@babel/plugin-syntax-class-properties" "^7.0.0" + +"@babel/plugin-proposal-decorators@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.0.0.tgz#33e7e683ca9f8ec3f72104ed11096839d48df502" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-decorators" "^7.0.0" + +"@babel/plugin-proposal-json-strings@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.0.0.tgz#3b4d7b5cf51e1f2e70f52351d28d44fc2970d01e" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.0.0" + +"@babel/plugin-proposal-object-rest-spread@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0.tgz#9a17b547f64d0676b6c9cecd4edf74a82ab85e7e" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.0.0.tgz#b610d928fe551ff7117d42c8bb410eec312a6425" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.0.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.0.0.tgz#498b39cd72536cd7c4b26177d030226eba08cd33" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.2.0" + +"@babel/plugin-syntax-async-generators@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0.tgz#bf0891dcdbf59558359d0c626fdc9490e20bc13c" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-class-properties@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.0.0.tgz#e051af5d300cbfbcec4a7476e37a803489881634" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-decorators@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.0.0.tgz#7e151f744e1de3ec3601f6a4c69c8662cef1b27b" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-dynamic-import@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.0.0.tgz#6dfb7d8b6c3be14ce952962f658f3b7eb54c33ee" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-json-strings@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.0.0.tgz#0d259a68090e15b383ce3710e01d5b23f3770cbd" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-jsx@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.0.0.tgz#034d5e2b4e14ccaea2e4c137af7e4afb39375ffd" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0.tgz#37d8fbcaf216bd658ea1aebbeb8b75e88ebc549b" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.0.0.tgz#886f72008b3a8b185977f7cb70713b45e51ee475" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0.tgz#a6c14875848c68a3b4b3163a486535ef25c7e749" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.0.0.tgz#feaf18f4bfeaf2236eea4b2d4879da83006cc8f5" + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.0.0" + +"@babel/plugin-transform-block-scoped-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0.tgz#482b3f75103927e37288b3b67b65f848e2aa0d07" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0.tgz#1745075edffd7cdaf69fab2fb6f9694424b7e9bc" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.10" + +"@babel/plugin-transform-classes@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.0.0.tgz#9e65ca401747dde99e344baea90ab50dccb4c468" + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.0.0" + "@babel/helper-function-name" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.0.0" + "@babel/helper-split-export-declaration" "^7.0.0" globals "^11.1.0" - invariant "^2.2.0" - lodash "^4.2.0" -"@babel/types@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757" +"@babel/plugin-transform-computed-properties@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0.tgz#2fbb8900cd3e8258f2a2ede909b90e7556185e31" dependencies: - esutils "^2.0.2" - lodash "^4.2.0" - to-fast-properties "^2.0.0" + "@babel/helper-plugin-utils" "^7.0.0" -"@babel/types@7.0.0-beta.53", "@babel/types@^7.0.0-beta.49": - version "7.0.0-beta.53" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.53.tgz#19a461c0da515595dfb6740b4b45dc7bb0e6b375" +"@babel/plugin-transform-destructuring@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.0.0.tgz#68e911e1935dda2f06b6ccbbf184ffb024e9d43a" dependencies: - esutils "^2.0.2" - lodash "^4.17.5" - to-fast-properties "^2.0.0" + "@babel/helper-plugin-utils" "^7.0.0" -"@csstools/convert-colors@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" +"@babel/plugin-transform-dotall-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.0.0.tgz#73a24da69bc3c370251f43a3d048198546115e58" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" -"@csstools/postcss-image-set-function@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-image-set-function/-/postcss-image-set-function-1.0.0.tgz#1ef0913d90a9c4440495eb41624c202e53a703f3" +"@babel/plugin-transform-duplicate-keys@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0.tgz#a0601e580991e7cace080e4cf919cfd58da74e86" dependencies: - postcss "^6.0.20" - postcss-value-parser "^3.3.0" + "@babel/helper-plugin-utils" "^7.0.0" -"@csstools/sass-import-resolve@^1": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@csstools/sass-import-resolve/-/sass-import-resolve-1.0.0.tgz#32c3cdb2f7af3cd8f0dca357b592e7271f3831b5" +"@babel/plugin-transform-exponentiation-operator@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.0.0.tgz#c51b45e090a01876f64d32b5b46c0799c85ea56c" + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" -"@types/node@*": - version "10.5.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.5.2.tgz#f19f05314d5421fe37e74153254201a7bf00a707" +"@babel/plugin-transform-for-of@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0.tgz#f2ba4eadb83bd17dc3c7e9b30f4707365e1c3e39" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" -"@webassemblyjs/ast@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.5.13.tgz#81155a570bd5803a30ec31436bc2c9c0ede38f25" +"@babel/plugin-transform-function-name@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.0.0.tgz#eeda18dc22584e13c3581a68f6be4822bb1d1d81" dependencies: - "@webassemblyjs/helper-module-context" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/wast-parser" "1.5.13" - debug "^3.1.0" - mamacro "^0.0.3" + "@babel/helper-function-name" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" -"@webassemblyjs/floating-point-hex-parser@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.13.tgz#29ce0baa97411f70e8cce68ce9c0f9d819a4e298" +"@babel/plugin-transform-literals@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0.tgz#2aec1d29cdd24c407359c930cdd89e914ee8ff86" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-amd@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.0.0.tgz#2430ab73db9960c4ca89966f425b803f5d0d0468" + dependencies: + "@babel/helper-module-transforms" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" -"@webassemblyjs/helper-api-error@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.13.tgz#e49b051d67ee19a56e29b9aa8bd949b5b4442a59" +"@babel/plugin-transform-modules-commonjs@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.0.0.tgz#20b906e5ab130dd8e456b694a94d9575da0fd41f" + dependencies: + "@babel/helper-module-transforms" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.0.0" -"@webassemblyjs/helper-buffer@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.13.tgz#873bb0a1b46449231137c1262ddfd05695195a1e" +"@babel/plugin-transform-modules-systemjs@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.0.0.tgz#8873d876d4fee23209decc4d1feab8f198cf2df4" dependencies: - debug "^3.1.0" + "@babel/helper-hoist-variables" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-umd@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.0.0.tgz#e7bb4f2a6cd199668964241951a25013450349be" + dependencies: + "@babel/helper-module-transforms" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" -"@webassemblyjs/helper-code-frame@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.13.tgz#1bd2181b6a0be14e004f0fe9f5a660d265362b58" +"@babel/plugin-transform-new-target@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz#ae8fbd89517fa7892d20e6564e641e8770c3aa4a" dependencies: - "@webassemblyjs/wast-printer" "1.5.13" + "@babel/helper-plugin-utils" "^7.0.0" -"@webassemblyjs/helper-fsm@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.13.tgz#cdf3d9d33005d543a5c5e5adaabf679ffa8db924" +"@babel/plugin-transform-object-super@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.0.0.tgz#b8587d511309b3a0e96e9e38169908b3e392041e" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.0.0" -"@webassemblyjs/helper-module-context@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.13.tgz#dc29ddfb51ed657655286f94a5d72d8a489147c5" +"@babel/plugin-transform-parameters@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.0.0.tgz#da864efa111816a6df161d492f33de10e74b1949" dependencies: - debug "^3.1.0" - mamacro "^0.0.3" + "@babel/helper-call-delegate" "^7.0.0" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" -"@webassemblyjs/helper-wasm-bytecode@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.13.tgz#03245817f0a762382e61733146f5773def15a747" +"@babel/plugin-transform-react-display-name@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.0.0.tgz#93759e6c023782e52c2da3b75eca60d4f10533ee" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" -"@webassemblyjs/helper-wasm-section@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.13.tgz#efc76f44a10d3073b584b43c38a179df173d5c7d" +"@babel/plugin-transform-react-inline-elements@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-inline-elements/-/plugin-transform-react-inline-elements-7.0.0.tgz#caec13a7829b34d7eb64dfe9fc310326f74f7b05" dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-buffer" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/wasm-gen" "1.5.13" - debug "^3.1.0" + "@babel/helper-builder-react-jsx" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" -"@webassemblyjs/ieee754@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.5.13.tgz#573e97c8c12e4eebb316ca5fde0203ddd90b0364" +"@babel/plugin-transform-react-jsx-self@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.0.0.tgz#a84bb70fea302d915ea81d9809e628266bb0bc11" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" + +"@babel/plugin-transform-react-jsx-source@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.0.0.tgz#28e00584f9598c0dd279f6280eee213fa0121c3c" dependencies: - ieee754 "^1.1.11" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" -"@webassemblyjs/leb128@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.5.13.tgz#ab52ebab9cec283c1c1897ac1da833a04a3f4cee" +"@babel/plugin-transform-react-jsx@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.0.0.tgz#524379e4eca5363cd10c4446ba163f093da75f3e" dependencies: - long "4.0.0" + "@babel/helper-builder-react-jsx" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" -"@webassemblyjs/utf8@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.5.13.tgz#6b53d2cd861cf94fa99c1f12779dde692fbc2469" +"@babel/plugin-transform-regenerator@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz#5b41686b4ed40bef874d7ed6a84bdd849c13e0c1" + dependencies: + regenerator-transform "^0.13.3" -"@webassemblyjs/wasm-edit@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.13.tgz#c9cef5664c245cf11b3b3a73110c9155831724a8" +"@babel/plugin-transform-runtime@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.0.0.tgz#0f1443c07bac16dba8efa939e0c61d6922740062" dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-buffer" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/helper-wasm-section" "1.5.13" - "@webassemblyjs/wasm-gen" "1.5.13" - "@webassemblyjs/wasm-opt" "1.5.13" - "@webassemblyjs/wasm-parser" "1.5.13" - "@webassemblyjs/wast-printer" "1.5.13" - debug "^3.1.0" + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + resolve "^1.8.1" + +"@babel/plugin-transform-shorthand-properties@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0.tgz#85f8af592dcc07647541a0350e8c95c7bf419d15" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0.tgz#93583ce48dd8c85e53f3a46056c856e4af30b49b" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0.tgz#30a9d64ac2ab46eec087b8530535becd90e73366" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0.tgz#084f1952efe5b153ddae69eb8945f882c7a97c65" + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typeof-symbol@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0.tgz#4dcf1e52e943e5267b7313bff347fdbe0f81cec9" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-unicode-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0.tgz#c6780e5b1863a76fe792d90eded9fcd5b51d68fc" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" + +"@babel/preset-env@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.0.0.tgz#f450f200c14e713f98cb14d113bf0c2cfbb89ca9" + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.0.0" + "@babel/plugin-proposal-json-strings" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.0.0" + "@babel/plugin-syntax-async-generators" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-async-to-generator" "^7.0.0" + "@babel/plugin-transform-block-scoped-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-dotall-regex" "^7.0.0" + "@babel/plugin-transform-duplicate-keys" "^7.0.0" + "@babel/plugin-transform-exponentiation-operator" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-modules-amd" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-modules-systemjs" "^7.0.0" + "@babel/plugin-transform-modules-umd" "^7.0.0" + "@babel/plugin-transform-new-target" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-regenerator" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-sticky-regex" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + "@babel/plugin-transform-typeof-symbol" "^7.0.0" + "@babel/plugin-transform-unicode-regex" "^7.0.0" + browserslist "^4.1.0" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.3.0" + +"@babel/preset-react@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.0.0.tgz#e86b4b3d99433c7b3e9e91747e2653958bc6b3c0" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-self" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" -"@webassemblyjs/wasm-gen@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.13.tgz#8e6ea113c4b432fa66540189e79b16d7a140700e" +"@babel/runtime@7.0.0", "@babel/runtime@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0.tgz#adeb78fedfc855aa05bc041640f3f6f98e85424c" dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/ieee754" "1.5.13" - "@webassemblyjs/leb128" "1.5.13" - "@webassemblyjs/utf8" "1.5.13" + regenerator-runtime "^0.12.0" -"@webassemblyjs/wasm-opt@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.13.tgz#147aad7717a7ee4211c36b21a5f4c30dddf33138" +"@babel/runtime@7.0.0-rc.1": + version "7.0.0-rc.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0-rc.1.tgz#42f36fc5817911c89ea75da2b874054922967616" dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-buffer" "1.5.13" - "@webassemblyjs/wasm-gen" "1.5.13" - "@webassemblyjs/wasm-parser" "1.5.13" + regenerator-runtime "^0.12.0" + +"@babel/template@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0.tgz#c2bc9870405959c89a9c814376a2ecb247838c80" + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/types" "^7.0.0" + +"@babel/traverse@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0.tgz#b1fe9b6567fdf3ab542cfad6f3b31f854d799a61" + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.0.0" + "@babel/helper-function-name" "^7.0.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/types" "^7.0.0" debug "^3.1.0" + globals "^11.1.0" + lodash "^4.17.10" + +"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0.tgz#6e191793d3c854d19c6749989e3bc55f0e962118" + dependencies: + esutils "^2.0.2" + lodash "^4.17.10" + to-fast-properties "^2.0.0" + +"@csstools/convert-colors@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" -"@webassemblyjs/wasm-parser@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.13.tgz#6f46516c5bb23904fbdf58009233c2dd8a54c72f" - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-api-error" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/ieee754" "1.5.13" - "@webassemblyjs/leb128" "1.5.13" - "@webassemblyjs/utf8" "1.5.13" - -"@webassemblyjs/wast-parser@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.5.13.tgz#5727a705d397ae6a3ae99d7f5460acf2ec646eea" - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/floating-point-hex-parser" "1.5.13" - "@webassemblyjs/helper-api-error" "1.5.13" - "@webassemblyjs/helper-code-frame" "1.5.13" - "@webassemblyjs/helper-fsm" "1.5.13" - long "^3.2.0" +"@csstools/postcss-image-set-function@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-image-set-function/-/postcss-image-set-function-1.0.0.tgz#1ef0913d90a9c4440495eb41624c202e53a703f3" + dependencies: + postcss "^6.0.20" + postcss-value-parser "^3.3.0" + +"@csstools/sass-import-resolve@^1": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/sass-import-resolve/-/sass-import-resolve-1.0.0.tgz#32c3cdb2f7af3cd8f0dca357b592e7271f3831b5" + +"@types/node@*": + version "10.9.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.9.4.tgz#0f4cb2dc7c1de6096055357f70179043c33e9897" + +"@types/react@16.4.6": + version "16.4.6" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.4.6.tgz#5024957c6bcef4f02823accf5974faba2e54fada" + dependencies: + csstype "^2.2.0" + +"@webassemblyjs/ast@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.6.tgz#3ef8c45b3e5e943a153a05281317474fef63e21e" + dependencies: + "@webassemblyjs/helper-module-context" "1.7.6" + "@webassemblyjs/helper-wasm-bytecode" "1.7.6" + "@webassemblyjs/wast-parser" "1.7.6" mamacro "^0.0.3" -"@webassemblyjs/wast-printer@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.5.13.tgz#bb34d528c14b4f579e7ec11e793ec50ad7cd7c95" +"@webassemblyjs/floating-point-hex-parser@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.6.tgz#7cb37d51a05c3fe09b464ae7e711d1ab3837801f" + +"@webassemblyjs/helper-api-error@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.6.tgz#99b7e30e66f550a2638299a109dda84a622070ef" + +"@webassemblyjs/helper-buffer@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.6.tgz#ba0648be12bbe560c25c997e175c2018df39ca3e" + +"@webassemblyjs/helper-code-frame@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.6.tgz#5a94d21b0057b69a7403fca0c253c3aaca95b1a5" dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/wast-parser" "1.5.13" - long "^3.2.0" + "@webassemblyjs/wast-printer" "1.7.6" + +"@webassemblyjs/helper-fsm@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.6.tgz#ae1741c6f6121213c7a0b587fb964fac492d3e49" -"@webpack-contrib/schema-utils@^1.0.0-beta.0": - version "1.0.0-beta.0" - resolved "https://registry.yarnpkg.com/@webpack-contrib/schema-utils/-/schema-utils-1.0.0-beta.0.tgz#bf9638c9464d177b48209e84209e23bee2eb4f65" +"@webassemblyjs/helper-module-context@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.6.tgz#116d19a51a6cebc8900ad53ca34ff8269c668c23" dependencies: - ajv "^6.1.0" - ajv-keywords "^3.1.0" - chalk "^2.3.2" - strip-ansi "^4.0.0" - text-table "^0.2.0" - webpack-log "^1.1.2" + mamacro "^0.0.3" -abab@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" +"@webassemblyjs/helper-wasm-bytecode@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.6.tgz#98e515eaee611aa6834eb5f6a7f8f5b29fefb6f1" + +"@webassemblyjs/helper-wasm-section@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.6.tgz#783835867bdd686df7a95377ab64f51a275e8333" + dependencies: + "@webassemblyjs/ast" "1.7.6" + "@webassemblyjs/helper-buffer" "1.7.6" + "@webassemblyjs/helper-wasm-bytecode" "1.7.6" + "@webassemblyjs/wasm-gen" "1.7.6" + +"@webassemblyjs/ieee754@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.6.tgz#c34fc058f2f831fae0632a8bb9803cf2d3462eb1" + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.6.tgz#197f75376a29f6ed6ace15898a310d871d92f03b" + dependencies: + "@xtuc/long" "4.2.1" + +"@webassemblyjs/utf8@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.6.tgz#eb62c66f906af2be70de0302e29055d25188797d" + +"@webassemblyjs/wasm-edit@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.6.tgz#fa41929160cd7d676d4c28ecef420eed5b3733c5" + dependencies: + "@webassemblyjs/ast" "1.7.6" + "@webassemblyjs/helper-buffer" "1.7.6" + "@webassemblyjs/helper-wasm-bytecode" "1.7.6" + "@webassemblyjs/helper-wasm-section" "1.7.6" + "@webassemblyjs/wasm-gen" "1.7.6" + "@webassemblyjs/wasm-opt" "1.7.6" + "@webassemblyjs/wasm-parser" "1.7.6" + "@webassemblyjs/wast-printer" "1.7.6" + +"@webassemblyjs/wasm-gen@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.6.tgz#695ac38861ab3d72bf763c8c75e5f087ffabc322" + dependencies: + "@webassemblyjs/ast" "1.7.6" + "@webassemblyjs/helper-wasm-bytecode" "1.7.6" + "@webassemblyjs/ieee754" "1.7.6" + "@webassemblyjs/leb128" "1.7.6" + "@webassemblyjs/utf8" "1.7.6" + +"@webassemblyjs/wasm-opt@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.6.tgz#fbafa78e27e1a75ab759a4b658ff3d50b4636c21" + dependencies: + "@webassemblyjs/ast" "1.7.6" + "@webassemblyjs/helper-buffer" "1.7.6" + "@webassemblyjs/wasm-gen" "1.7.6" + "@webassemblyjs/wasm-parser" "1.7.6" + +"@webassemblyjs/wasm-parser@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.6.tgz#84eafeeff405ad6f4c4b5777d6a28ae54eed51fe" + dependencies: + "@webassemblyjs/ast" "1.7.6" + "@webassemblyjs/helper-api-error" "1.7.6" + "@webassemblyjs/helper-wasm-bytecode" "1.7.6" + "@webassemblyjs/ieee754" "1.7.6" + "@webassemblyjs/leb128" "1.7.6" + "@webassemblyjs/utf8" "1.7.6" + +"@webassemblyjs/wast-parser@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.6.tgz#ca4d20b1516e017c91981773bd7e819d6bd9c6a7" + dependencies: + "@webassemblyjs/ast" "1.7.6" + "@webassemblyjs/floating-point-hex-parser" "1.7.6" + "@webassemblyjs/helper-api-error" "1.7.6" + "@webassemblyjs/helper-code-frame" "1.7.6" + "@webassemblyjs/helper-fsm" "1.7.6" + "@xtuc/long" "4.2.1" + mamacro "^0.0.3" + +"@webassemblyjs/wast-printer@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.6.tgz#a6002c526ac5fa230fe2c6d2f1bdbf4aead43a5e" + dependencies: + "@webassemblyjs/ast" "1.7.6" + "@webassemblyjs/wast-parser" "1.7.6" + "@xtuc/long" "4.2.1" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + +"@xtuc/long@4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8" + +abab@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" abbrev@1: version "1.1.1" @@ -287,11 +815,11 @@ acorn-dynamic-import@^3.0.0: dependencies: acorn "^5.0.0" -acorn-globals@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" +acorn-globals@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" dependencies: - acorn "^4.0.4" + acorn "^5.0.0" acorn-jsx@^3.0.0: version "3.0.1" @@ -301,15 +829,15 @@ acorn-jsx@^3.0.0: acorn@^3.0.4: version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + resolved "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" -acorn@^4.0.4: - version "4.0.13" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" +acorn@^5.0.0, acorn@^5.3.0, acorn@^5.5.0, acorn@^5.5.3, acorn@^5.6.2: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" -acorn@^5.0.0, acorn@^5.3.0, acorn@^5.5.0, acorn@^5.6.2: - version "5.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" +ajv-errors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.0.tgz#ecf021fa108fd17dfb5e6b383f2dd233e31ffc59" ajv-keywords@^2.1.0: version "2.1.1" @@ -336,30 +864,22 @@ ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: json-schema-traverse "^0.3.0" ajv@^6.1.0: - version "6.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.2.tgz#678495f9b82f7cca6be248dd92f59bff5e1f4360" + version "6.5.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" - uri-js "^4.2.1" - -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - -alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + uri-js "^4.2.2" amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" +ansi-colors@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.0.5.tgz#cb9dc64993b64fd6945485f797fc3853137d9a7b" + ansi-escapes@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" @@ -397,11 +917,11 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -append-transform@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-1.0.0.tgz#046a52ae582a228bd72f58acfbe2967c678759ab" +append-transform@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" dependencies: - default-require-extensions "^2.0.0" + default-require-extensions "^1.0.0" aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" @@ -498,6 +1018,14 @@ array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" +array.prototype.flat@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.1.tgz#812db8f02cad24d3fab65dd67eabe3b8903494a4" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.10.0" + function-bind "^1.1.1" + arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -515,8 +1043,10 @@ asn1.js@^4.0.0: minimalistic-assert "^1.0.0" asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + dependencies: + safer-buffer "~2.1.0" assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" @@ -556,11 +1086,11 @@ async-limiter@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" -async@^1.4.0, async@^1.5.2: +async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" -async@^2.1.4: +async@^2.1.4, async@^2.5.0: version "2.6.1" resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" dependencies: @@ -571,24 +1101,13 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" atob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" atrament@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/atrament/-/atrament-0.2.3.tgz#6ccbc0daa6d3f25e5aeaeb31befeb78e86980348" -autoprefixer@^6.3.1: - version "6.7.7" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" - dependencies: - browserslist "^1.7.6" - caniuse-db "^1.0.30000634" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^5.2.16" - postcss-value-parser "^3.2.3" - autoprefixer@^8.6.5: version "8.6.5" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-8.6.5.tgz#343f3d193ed568b3208e00117a1b96eb691d4ee9" @@ -608,9 +1127,9 @@ aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" -aws4@^1.2.1, aws4@^1.6.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" +aws4@^1.2.1, aws4@^1.6.0, aws4@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" axios@~0.16.2: version "0.16.2" @@ -633,7 +1152,7 @@ babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^6.0.0, babel-core@^6.26.0, babel-core@^6.26.3: +babel-core@^6.0.0, babel-core@^6.26.0: version "6.26.3" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" dependencies: @@ -657,14 +1176,18 @@ babel-core@^6.0.0, babel-core@^6.26.0, babel-core@^6.26.3: slash "^1.0.0" source-map "^0.5.7" -babel-eslint@^8.0.1, babel-eslint@^8.2.6: - version "8.2.6" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.6.tgz#6270d0c73205628067c0f7ae1693a9e797acefd9" +babel-core@^7.0.0-bridge.0: + version "7.0.0-bridge.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" + +babel-eslint@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-9.0.0.tgz#7d9445f81ed9f60aff38115f838970df9f2b6220" dependencies: - "@babel/code-frame" "7.0.0-beta.44" - "@babel/traverse" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - babylon "7.0.0-beta.44" + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" eslint-scope "3.7.1" eslint-visitor-keys "^1.0.0" @@ -681,108 +1204,6 @@ babel-generator@^6.18.0, babel-generator@^6.26.0: source-map "^0.5.7" trim-right "^1.0.1" -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-builder-react-jsx@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0" - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - esutils "^2.0.2" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - babel-helpers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" @@ -790,20 +1211,21 @@ babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-jest@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-21.2.0.tgz#2ce059519a9374a2c46f2455b6fbef5ad75d863e" +babel-jest@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.6.0.tgz#a644232366557a2240a0c083da6b25786185a2f1" dependencies: - babel-plugin-istanbul "^4.0.0" - babel-preset-jest "^21.2.0" + babel-plugin-istanbul "^4.1.6" + babel-preset-jest "^23.2.0" -babel-loader@^7.1.5: - version "7.1.5" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.5.tgz#e3ee0cd7394aa557e013b02d3e492bfd07aa6d68" +babel-loader@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.2.tgz#2079b8ec1628284a929241da3d90f5b3de2a5ae5" dependencies: find-cache-dir "^1.0.0" loader-utils "^1.0.2" mkdirp "^0.5.1" + util.promisify "^1.0.0" babel-messages@^6.23.0: version "6.23.0" @@ -811,24 +1233,18 @@ babel-messages@^6.23.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-istanbul@^4.0.0: +babel-plugin-istanbul@^4.1.6: version "4.1.6" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45" + resolved "http://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45" dependencies: babel-plugin-syntax-object-rest-spread "^6.13.0" find-up "^2.1.0" istanbul-lib-instrument "^1.10.1" test-exclude "^4.2.1" -babel-plugin-jest-hoist@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-21.2.0.tgz#2cef637259bd4b628a6cace039de5fcd14dbb006" +babel-plugin-jest-hoist@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz#e61fae05a1ca8801aadee57a6d66b8cefaf44167" babel-plugin-lodash@^3.3.4: version "3.3.4" @@ -840,396 +1256,42 @@ babel-plugin-lodash@^3.3.4: lodash "^4.17.10" require-package-name "^2.0.1" -babel-plugin-macros@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.3.0.tgz#1538e6339cbcbf093f334dc2f10f5f53043e3fda" +babel-plugin-macros@^2.2.2: + version "2.4.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.4.0.tgz#6c5f9836e1f6c0a9743b3bab4af29f73e437e544" dependencies: - cosmiconfig "^4.0.0" + cosmiconfig "^5.0.5" -babel-plugin-preval@^1.6.1: - version "1.6.4" - resolved "https://registry.yarnpkg.com/babel-plugin-preval/-/babel-plugin-preval-1.6.4.tgz#96febe8172b3ca6c3d03ed96eeb0382ba4b18056" +babel-plugin-preval@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-preval/-/babel-plugin-preval-3.0.1.tgz#a26f9690114a864a54a5cbdf865496ebf541a9c3" dependencies: - babel-plugin-macros "^2.0.0" - babel-register "^6.26.0" - babylon "^6.18.0" - require-from-string "^2.0.1" + babel-plugin-macros "^2.2.2" + require-from-string "^2.0.2" -babel-plugin-react-intl@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/babel-plugin-react-intl/-/babel-plugin-react-intl-2.4.0.tgz#292fca8030603a9e0476973290836aa0c7da17e2" +babel-plugin-react-intl@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-react-intl/-/babel-plugin-react-intl-3.0.0.tgz#ea2152b1fe0a36be33b89f8cc8b961b8fd4cfaf8" dependencies: - babel-runtime "^6.2.0" + "@babel/runtime" "^7.0.0" intl-messageformat-parser "^1.2.0" mkdirp "^0.5.1" -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - -babel-plugin-syntax-class-properties@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" - -babel-plugin-syntax-decorators@^6.1.18: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" - -babel-plugin-syntax-dynamic-import@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" - -babel-plugin-syntax-exponentiation-operator@^6.8.0: +babel-plugin-syntax-object-rest-spread@^6.13.0: version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - -babel-plugin-syntax-flow@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" - -babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" - -babel-plugin-syntax-object-rest-spread@^6.13.0, babel-plugin-syntax-object-rest-spread@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - -babel-plugin-transform-async-to-generator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-class-properties@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" - dependencies: - babel-helper-function-name "^6.24.1" - babel-plugin-syntax-class-properties "^6.8.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-decorators-legacy@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.5.tgz#0e492dffa0edd70529072887f8aa86d4dd8b40a1" - dependencies: - babel-plugin-syntax-decorators "^6.1.18" - babel-runtime "^6.2.0" - babel-template "^6.3.0" - -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.23.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-plugin-transform-es2015-classes@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-computed-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-destructuring@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-for-of@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1, babel-plugin-transform-es2015-modules-commonjs@^6.26.2: - version "6.26.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-umd@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-object-super@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-unicode-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-flow-strip-types@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" - dependencies: - babel-plugin-syntax-flow "^6.18.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-object-rest-spread@^6.23.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" - dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.26.0" - -babel-plugin-transform-react-display-name@^6.23.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-react-inline-elements@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-inline-elements/-/babel-plugin-transform-react-inline-elements-6.22.0.tgz#6687211a32b49a52f22c573a2b5504a25ef17c53" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-react-jsx-self@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e" - dependencies: - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-react-jsx-source@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6" - dependencies: - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-react-jsx@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" - dependencies: - babel-helper-builder-react-jsx "^6.24.1" - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-react-remove-prop-types@^0.4.13: - version "0.4.13" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.13.tgz#331cfc05099a808238311d78319c27460d481189" - -babel-plugin-transform-regenerator@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - dependencies: - regenerator-transform "^0.10.0" + resolved "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" -babel-plugin-transform-runtime@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee" - dependencies: - babel-runtime "^6.22.0" +babel-plugin-transform-react-remove-prop-types@^0.4.15: + version "0.4.15" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.15.tgz#7ba830e77276a0e788cd58ea527b5f70396e12a7" -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" +babel-preset-jest@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz#8ec7a03a138f001a1a8fb1e8113652bf1a55da46" dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-preset-env@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^3.2.6" - invariant "^2.2.2" - semver "^5.3.0" - -babel-preset-flow@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d" - dependencies: - babel-plugin-transform-flow-strip-types "^6.22.0" - -babel-preset-jest@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-21.2.0.tgz#ff9d2bce08abd98e8a36d9a8a5189b9173b85638" - dependencies: - babel-plugin-jest-hoist "^21.2.0" + babel-plugin-jest-hoist "^23.2.0" babel-plugin-syntax-object-rest-spread "^6.13.0" -babel-preset-react@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380" - dependencies: - babel-plugin-syntax-jsx "^6.3.13" - babel-plugin-transform-react-display-name "^6.23.0" - babel-plugin-transform-react-jsx "^6.24.1" - babel-plugin-transform-react-jsx-self "^6.22.0" - babel-plugin-transform-react-jsx-source "^6.22.0" - babel-preset-flow "^6.23.0" - babel-register@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" @@ -1242,14 +1304,14 @@ babel-register@^6.26.0: mkdirp "^0.5.1" source-map-support "^0.4.15" -babel-runtime@^6.18.0, babel-runtime@^6.2.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0: +babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" dependencies: core-js "^2.4.0" regenerator-runtime "^0.11.0" -babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0, babel-template@^6.3.0: +babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" dependencies: @@ -1259,7 +1321,7 @@ babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0, babel-te babylon "^6.18.0" lodash "^4.17.4" -babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: +babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" dependencies: @@ -1273,7 +1335,7 @@ babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: invariant "^2.2.2" lodash "^4.17.4" -babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: +babel-types@^6.0.0, babel-types@^6.18.0, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" dependencies: @@ -1282,10 +1344,6 @@ babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26 lodash "^4.17.4" to-fast-properties "^1.0.3" -babylon@7.0.0-beta.44: - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" - babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" @@ -1353,8 +1411,8 @@ block-stream@*: inherits "~2.0.0" bluebird@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" + version "3.5.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.2.tgz#1be0908e054a751754549c270489c1505d4ab15a" bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" @@ -1430,7 +1488,11 @@ brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" -browser-resolve@^1.11.2: +browser-process-hrtime@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" + +browser-resolve@^1.11.3: version "1.11.3" resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" dependencies: @@ -1438,7 +1500,7 @@ browser-resolve@^1.11.2: browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + resolved "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" dependencies: buffer-xor "^1.0.3" cipher-base "^1.0.0" @@ -1466,7 +1528,7 @@ browserify-des@^1.0.0: browserify-rsa@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + resolved "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" dependencies: bn.js "^4.1.0" randombytes "^2.0.1" @@ -1489,20 +1551,21 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: - version "1.7.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" - dependencies: - caniuse-db "^1.0.30000639" - electron-to-chromium "^1.2.7" - -browserslist@^3.2.4, browserslist@^3.2.6, browserslist@^3.2.8: +browserslist@^3.2.4, browserslist@^3.2.8: version "3.2.8" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" dependencies: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" +browserslist@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.1.1.tgz#328eb4ff1215b12df6589e9ab82f8adaa4fc8cd6" + dependencies: + caniuse-lite "^1.0.30000884" + electron-to-chromium "^1.3.62" + node-releases "^1.0.0-alpha.11" + bser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" @@ -1510,8 +1573,8 @@ bser@^2.0.0: node-int64 "^0.4.0" buffer-from@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" buffer-indexof@^1.0.0: version "1.1.1" @@ -1527,7 +1590,7 @@ buffer-xor@^1.0.3: buffer@^4.3.0: version "4.9.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + resolved "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" @@ -1545,7 +1608,7 @@ bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" -cacache@^10.0.1, cacache@^10.0.4: +cacache@^10.0.4: version "10.0.4" resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" dependencies: @@ -1563,6 +1626,25 @@ cacache@^10.0.1, cacache@^10.0.4: unique-filename "^1.1.0" y18n "^4.0.0" +cacache@^11.2.0: + version "11.2.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.2.0.tgz#617bdc0b02844af56310e411c0878941d5739965" + dependencies: + bluebird "^3.5.1" + chownr "^1.0.1" + figgy-pudding "^3.1.0" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.3" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^6.0.0" + unique-filename "^1.1.0" + y18n "^4.0.0" + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -1598,10 +1680,6 @@ camelcase-keys@^2.0.0: camelcase "^2.0.0" map-obj "^1.0.0" -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - camelcase@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" @@ -1614,22 +1692,9 @@ camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" -caniuse-api@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" - dependencies: - browserslist "^1.3.6" - caniuse-db "^1.0.30000529" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000865" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000865.tgz#82ffb64d40f7567620aac02d3a632079689abc6b" - -caniuse-lite@^1.0.30000823, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000864: - version "1.0.30000865" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz#70026616e8afe6e1442f8bb4e1092987d81a2f25" +caniuse-lite@^1.0.30000823, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000864, caniuse-lite@^1.0.30000884: + version "1.0.30000885" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000885.tgz#e889e9f8e7e50e769f2a49634c932b8aee622984" capture-exit@^1.2.0: version "1.2.0" @@ -1641,16 +1706,9 @@ caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + resolved "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: ansi-styles "^2.2.1" escape-string-regexp "^1.0.2" @@ -1670,9 +1728,9 @@ chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" -chardet@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.5.0.tgz#fe3ac73c00c3d865ffcc02a0682e2c20b6a06029" +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" check-types@^7.3.0: version "7.4.0" @@ -1718,9 +1776,9 @@ chrome-trace-event@^1.0.0: dependencies: tslib "^1.9.0" -ci-info@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.3.tgz#710193264bb05c77b8c90d02f5aaf22216a667b2" +ci-info@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.5.1.tgz#17e8eb5de6f8b2b6038f0cbb714d410bfa9f3030" cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" @@ -1733,12 +1791,6 @@ circular-json@^0.3.1: version "0.3.3" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" -clap@^1.0.9: - version "1.2.3" - resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" - dependencies: - chalk "^1.1.3" - class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -1762,14 +1814,6 @@ cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" @@ -1803,12 +1847,6 @@ co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" -coa@~1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" - dependencies: - q "^1.1.2" - code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" @@ -1820,41 +1858,23 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.3.0, color-convert@^1.8.2, color-convert@^1.9.0: - version "1.9.2" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147" +color-convert@^1.8.2, color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" dependencies: - color-name "1.1.1" - -color-name@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" + color-name "1.1.3" -color-name@^1.0.0: +color-name@1.1.3, color-name@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" -color-string@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" - dependencies: - color-name "^1.0.0" - color-string@^1.4.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.2.tgz#26e45814bc3c9a7cbd6751648a41434514a773a9" + version "1.5.3" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" dependencies: color-name "^1.0.0" simple-swizzle "^0.2.2" -color@^0.11.0: - version "0.11.4" - resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" - dependencies: - clone "^1.0.2" - color-convert "^1.3.0" - color-string "^0.3.0" - color@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/color/-/color-1.0.3.tgz#e48e832d85f14ef694fb468811c2d5cfe729b55d" @@ -1862,74 +1882,63 @@ color@^1.0.3: color-convert "^1.8.2" color-string "^1.4.0" -colormin@^1.0.5: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" - dependencies: - color "^0.11.0" - css-color-names "0.0.4" - has "^1.0.1" - colors@0.5.x: version "0.5.1" resolved "https://registry.yarnpkg.com/colors/-/colors-0.5.1.tgz#7d0023eaeb154e8ee9fce75dcb923d0ed1667774" -colors@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" - -combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5: +combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5, combined-stream@~1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" dependencies: delayed-stream "~1.0.0" commander@^2.11.0, commander@^2.13.0, commander@^2.8.1: - version "2.16.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50" + version "2.18.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970" commander@~2.13.0: version "2.13.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" +commander@~2.17.1: + version "2.17.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" -compare-versions@^3.1.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.3.0.tgz#af93ea705a96943f622ab309578b9b90586f39c3" - component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" -compressible@~2.0.13: +compressible@~2.0.14: version "2.0.14" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.14.tgz#326c5f507fbb055f54116782b969a81b67a29da7" dependencies: mime-db ">= 1.34.0 < 2" -compression-webpack-plugin@^1.1.11: - version "1.1.11" - resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-1.1.11.tgz#8384c7a6ead1d2e2efb190bdfcdcf35878ed8266" +compression-webpack-plugin@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-2.0.0.tgz#46476350c1eb27f783dccc79ac2f709baa2cffbc" dependencies: - cacache "^10.0.1" - find-cache-dir "^1.0.0" + cacache "^11.2.0" + find-cache-dir "^2.0.0" neo-async "^2.5.0" + schema-utils "^1.0.0" serialize-javascript "^1.4.0" webpack-sources "^1.0.1" compression@^1.5.2: - version "1.7.2" - resolved "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz#aaffbcd6aaf854b44ebb280353d5ad1651f59a69" + version "1.7.3" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db" dependencies: - accepts "~1.3.4" + accepts "~1.3.5" bytes "3.0.0" - compressible "~2.0.13" + compressible "~2.0.14" debug "2.6.9" on-headers "~1.0.1" - safe-buffer "5.1.1" + safe-buffer "5.1.2" vary "~1.1.2" concat-map@0.0.1: @@ -1971,17 +1980,15 @@ content-disposition@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" -content-type-parser@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7" - content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" -convert-source-map@^1.4.0, convert-source-map@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" +convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + dependencies: + safe-buffer "~5.1.1" cookie-signature@1.0.6: version "1.0.6" @@ -2010,7 +2017,7 @@ core-js@^1.0.0: version "1.2.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" -core-js@^2.4.0, core-js@^2.5.0, core-js@^2.5.7: +core-js@^2.4.0, core-js@^2.5.0: version "2.5.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" @@ -2027,6 +2034,14 @@ cosmiconfig@^4.0.0: parse-json "^4.0.0" require-from-string "^2.0.1" +cosmiconfig@^5.0.5: + version "5.0.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.6.tgz#dca6cf680a0bd03589aff684700858c81abeeb39" + dependencies: + is-directory "^0.3.1" + js-yaml "^3.9.0" + parse-json "^4.0.0" + create-ecdh@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" @@ -2036,7 +2051,7 @@ create-ecdh@^4.0.0: create-hash@^1.1.0, create-hash@^1.1.2: version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + resolved "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" dependencies: cipher-base "^1.0.1" inherits "^2.0.1" @@ -2046,7 +2061,7 @@ create-hash@^1.1.0, create-hash@^1.1.2: create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + resolved "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" dependencies: cipher-base "^1.0.3" create-hash "^1.1.0" @@ -2085,7 +2100,7 @@ cross-spawn@^5.0.1, cross-spawn@^5.1.0: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^6.0.4, cross-spawn@^6.0.5: +cross-spawn@^6.0.0, cross-spawn@^6.0.4, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" dependencies: @@ -2117,10 +2132,6 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" -css-color-names@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" - css-font-size-keywords@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz#854875ace9aca6a8d2ee0d345a44aae9bb6db6cb" @@ -2147,18 +2158,16 @@ css-list-helpers@^1.0.1: dependencies: tcomb "^2.5.0" -css-loader@^0.28.11: - version "0.28.11" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.11.tgz#c3f9864a700be2711bb5a2462b2389b1a392dab7" +css-loader@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-1.0.0.tgz#9f46aaa5ca41dbe31860e3b62b8e23c42916bf56" dependencies: babel-code-frame "^6.26.0" css-selector-tokenizer "^0.7.0" - cssnano "^3.10.0" icss-utils "^2.1.0" loader-utils "^1.0.2" lodash.camelcase "^4.3.0" - object-assign "^4.1.1" - postcss "^5.0.6" + postcss "^6.0.23" postcss-modules-extract-imports "^1.2.0" postcss-modules-local-by-default "^1.2.0" postcss-modules-scope "^1.1.0" @@ -2193,66 +2202,26 @@ css-what@2.1: cssdb@^1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-1.6.0.tgz#3360c4163e07cf4d1efe58c1bc15170535f4d393" + resolved "http://registry.npmjs.org/cssdb/-/cssdb-1.6.0.tgz#3360c4163e07cf4d1efe58c1bc15170535f4d393" cssesc@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" -cssnano@^3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" - dependencies: - autoprefixer "^6.3.1" - decamelize "^1.1.2" - defined "^1.0.0" - has "^1.0.1" - object-assign "^4.0.1" - postcss "^5.0.14" - postcss-calc "^5.2.0" - postcss-colormin "^2.1.8" - postcss-convert-values "^2.3.4" - postcss-discard-comments "^2.0.4" - postcss-discard-duplicates "^2.0.1" - postcss-discard-empty "^2.0.1" - postcss-discard-overridden "^0.1.1" - postcss-discard-unused "^2.2.1" - postcss-filter-plugins "^2.0.0" - postcss-merge-idents "^2.1.5" - postcss-merge-longhand "^2.0.1" - postcss-merge-rules "^2.0.3" - postcss-minify-font-values "^1.0.2" - postcss-minify-gradients "^1.0.1" - postcss-minify-params "^1.0.4" - postcss-minify-selectors "^2.0.4" - postcss-normalize-charset "^1.1.0" - postcss-normalize-url "^3.0.7" - postcss-ordered-values "^2.1.0" - postcss-reduce-idents "^2.2.2" - postcss-reduce-initial "^1.0.0" - postcss-reduce-transforms "^1.0.3" - postcss-svgo "^2.1.1" - postcss-unique-selectors "^2.0.2" - postcss-value-parser "^3.2.3" - postcss-zindex "^2.0.1" - -csso@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" - dependencies: - clap "^1.0.9" - source-map "^0.5.3" - cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": version "0.3.4" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.4.tgz#8cd52e8a3acfd68d3aed38ee0a640177d2f9d797" -"cssstyle@>= 0.2.37 < 0.3.0": - version "0.2.37" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" +cssstyle@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.1.1.tgz#18b038a9c44d65f7a8e428a653b9f6fe42faf5fb" dependencies: cssom "0.3.x" +csstype@^2.2.0: + version "2.5.6" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.5.6.tgz#2ae1db2319642d8b80a668d2d025c6196071e788" + currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" @@ -2279,6 +2248,14 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +data-urls@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.1.tgz#d416ac3896918f29ca84d81085bc3705834da579" + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.1.0" + whatwg-url "^7.0.0" + date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" @@ -2289,16 +2266,28 @@ debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, debug@^2.6. dependencies: ms "2.0.0" -debug@^3.1.0: +debug@=3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" dependencies: ms "2.0.0" -decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: +debug@^3.1.0: + version "3.2.5" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.5.tgz#c2418fbfd7a29f4d4f70ff4cea604d4b64c46407" + dependencies: + ms "^2.1.1" + +decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" +decamelize@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" + dependencies: + xregexp "4.0.0" + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -2319,11 +2308,18 @@ deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" -default-require-extensions@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-2.0.0.tgz#f5f8fbb18a7d6d50b21f641f649ebb522cfe24f7" +default-gateway@^2.6.0: + version "2.7.2" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-2.7.2.tgz#b7ef339e5e024b045467af403d50348db4642d0f" dependencies: - strip-bom "^3.0.0" + execa "^0.10.0" + ip-regex "^2.1.0" + +default-require-extensions@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" + dependencies: + strip-bom "^2.0.0" defaults@^1.0.2: version "1.0.3" @@ -2332,11 +2328,10 @@ defaults@^1.0.2: clone "^1.0.2" define-properties@^1.1.1, define-properties@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" dependencies: - foreach "^2.0.5" - object-keys "^1.0.8" + object-keys "^1.0.12" define-property@^0.2.5: version "0.2.5" @@ -2357,10 +2352,6 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -defined@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - del@^2.0.2: version "2.2.2" resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" @@ -2421,9 +2412,13 @@ detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + detect-node@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" detect-passive-events@^1.0.2: version "1.0.4" @@ -2435,7 +2430,7 @@ diff@^3.2.0: diffie-hellman@^5.0.0: version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + resolved "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" dependencies: bn.js "^4.1.0" miller-rabin "^4.0.0" @@ -2498,6 +2493,12 @@ domelementtype@~1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + dependencies: + webidl-conversions "^4.0.2" + domhandler@^2.3.0: version "2.4.2" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" @@ -2534,7 +2535,7 @@ double-ended-queue@^2.1.0-0: duplexer@^0.1.1, duplexer@~0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + resolved "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" duplexify@^3.4.2, duplexify@^3.6.0: version "3.6.0" @@ -2546,10 +2547,11 @@ duplexify@^3.4.2, duplexify@^3.6.0: stream-shift "^1.0.0" ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" dependencies: jsbn "~0.1.0" + safer-buffer "^2.1.0" ee-first@1.1.1: version "1.1.1" @@ -2559,13 +2561,13 @@ ejs@^2.3.4, ejs@^2.5.7: version "2.6.1" resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" -electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.47: - version "1.3.52" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz#d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0" +electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.62: + version "1.3.66" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.66.tgz#1410d8f8768a14dcd09d96222990f43c969af270" elliptic@^6.0.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" + version "6.4.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -2615,45 +2617,49 @@ entities@^1.1.1, entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" -enzyme-adapter-react-16@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.1.1.tgz#a8f4278b47e082fbca14f5bfb1ee50ee650717b4" +enzyme-adapter-react-16@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.5.0.tgz#50af8d76a45fe0915de932bd95d34cdca75c0be3" dependencies: - enzyme-adapter-utils "^1.3.0" - lodash "^4.17.4" - object.assign "^4.0.4" + enzyme-adapter-utils "^1.8.0" + function.prototype.name "^1.1.0" + object.assign "^4.1.0" object.values "^1.0.4" - prop-types "^15.6.0" - react-reconciler "^0.7.0" + prop-types "^15.6.2" + react-is "^16.4.2" react-test-renderer "^16.0.0-0" -enzyme-adapter-utils@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.4.0.tgz#c403b81e8eb9953658569e539780964bdc98de62" +enzyme-adapter-utils@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.8.0.tgz#ee9f07250663a985f1f2caaf297720787da559f1" dependencies: + function.prototype.name "^1.1.0" object.assign "^4.1.0" - prop-types "^15.6.0" + prop-types "^15.6.2" -enzyme@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.3.0.tgz#0971abd167f2d4bf3f5bd508229e1c4b6dc50479" +enzyme@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.6.0.tgz#d213f280a258f61e901bc663d4cc2d6fd9a9dec8" dependencies: + array.prototype.flat "^1.2.1" cheerio "^1.0.0-rc.2" - function.prototype.name "^1.0.3" - has "^1.0.1" + function.prototype.name "^1.1.0" + has "^1.0.3" is-boolean-object "^1.0.0" - is-callable "^1.1.3" + is-callable "^1.1.4" is-number-object "^1.0.3" is-string "^1.0.4" is-subset "^0.1.1" - lodash "^4.17.4" - object-inspect "^1.5.0" + lodash.escape "^4.0.1" + lodash.isequal "^4.5.0" + object-inspect "^1.6.0" object-is "^1.0.1" object.assign "^4.1.0" object.entries "^1.0.4" object.values "^1.0.4" raf "^3.4.0" rst-selector-parser "^2.2.3" + string.prototype.trim "^1.1.2" errno@^0.1.3, errno@~0.1.7: version "0.1.7" @@ -2667,7 +2673,7 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.4.3, es-abstract@^1.6.1, es-abstract@^1.7.0: +es-abstract@^1.10.0, es-abstract@^1.4.3, es-abstract@^1.5.0, es-abstract@^1.5.1, es-abstract@^1.6.1, es-abstract@^1.7.0: version "1.12.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" dependencies: @@ -2686,8 +2692,8 @@ es-to-primitive@^1.1.1: is-symbol "^1.0.1" es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: - version "0.10.45" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.45.tgz#0bfdf7b473da5919d5adf3bd25ceb754fccc3653" + version "0.10.46" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.46.tgz#efd99f67c5a7ec789baa3daa7f79870388f7f572" dependencies: es6-iterator "~2.0.3" es6-symbol "~3.1.1" @@ -2716,9 +2722,9 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" -escodegen@^1.6.1: - version "1.10.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.10.0.tgz#f647395de22519fbd0d928ffcf1d17e0dec2603e" +escodegen@^1.9.1: + version "1.11.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" dependencies: esprima "^3.1.3" estraverse "^4.2.0" @@ -2742,8 +2748,8 @@ eslint-module-utils@^2.2.0: pkg-dir "^1.0.0" eslint-plugin-import@^2.8.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.13.0.tgz#df24f241175e312d91662dc91ca84064caec14ed" + version "2.14.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz#6b17626d2e3e6ad52cfce8807a845d15e22111a8" dependencies: contains-path "^0.1.0" debug "^2.6.8" @@ -2774,9 +2780,10 @@ eslint-plugin-promise@^3.8.0: resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-3.8.0.tgz#65ebf27a845e3c1e9d6f6a5622ddd3801694b621" eslint-plugin-react@^7.8.2: - version "7.10.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.10.0.tgz#af5c1fef31c4704db02098f9be18202993828b50" + version "7.11.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz#c01a7af6f17519457d6116aa94fc6d2ccad5443c" dependencies: + array-includes "^3.0.3" doctrine "^2.1.0" has "^1.0.3" jsx-ast-utils "^2.0.1" @@ -2796,13 +2803,20 @@ eslint-scope@^3.7.1: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-scope@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + eslint-visitor-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" eslint@^4.19.1: version "4.19.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" + resolved "http://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" dependencies: ajv "^5.3.0" babel-code-frame "^6.22.0" @@ -2850,10 +2864,6 @@ espree@^3.5.4: acorn "^5.5.0" acorn-jsx "^3.0.0" -esprima@^2.6.0: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - esprima@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" @@ -2878,7 +2888,7 @@ estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" -esutils@^2.0.2: +esutils@^2.0.0, esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" @@ -2887,16 +2897,17 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" event-stream@~3.3.0: - version "3.3.4" - resolved "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + version "3.3.6" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.6.tgz#cac1230890e07e73ec9cacd038f60a5b66173eef" dependencies: - duplexer "~0.1.1" - from "~0" - map-stream "~0.1.0" - pause-stream "0.0.11" - split "0.3" - stream-combiner "~0.0.4" - through "~2.3.1" + duplexer "^0.1.1" + flatmap-stream "^0.1.0" + from "^0.1.7" + map-stream "0.0.7" + pause-stream "^0.0.11" + split "^1.0.1" + stream-combiner "^0.2.2" + through "^2.3.8" eventemitter3@^3.0.0: version "3.1.0" @@ -2925,6 +2936,18 @@ exec-sh@^0.2.0: dependencies: merge "^1.2.0" +execa@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" + dependencies: + cross-spawn "^6.0.0" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" @@ -2941,6 +2964,10 @@ exif-js@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/exif-js/-/exif-js-2.3.0.tgz#9d10819bf571f873813e7640241255ab9ce1a814" +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" @@ -2965,20 +2992,20 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" -expect@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-21.2.1.tgz#003ac2ac7005c3c29e73b38a272d4afadd6d1d7b" +expect@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-23.6.0.tgz#1e0c8d3ba9a581c87bd71fb9bc8862d443425f98" dependencies: ansi-styles "^3.2.0" - jest-diff "^21.2.1" - jest-get-type "^21.2.0" - jest-matcher-utils "^21.2.1" - jest-message-util "^21.2.1" - jest-regex-util "^21.2.0" + jest-diff "^23.6.0" + jest-get-type "^22.1.0" + jest-matcher-utils "^23.6.0" + jest-message-util "^23.4.0" + jest-regex-util "^23.3.0" express@^4.16.2: version "4.16.3" - resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" + resolved "http://registry.npmjs.org/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" dependencies: accepts "~1.3.5" array-flatten "1.1.1" @@ -3024,24 +3051,24 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@~3.0.0, extend@~3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" +extend@~3.0.0, extend@~3.0.1, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" external-editor@^2.0.4: version "2.2.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + resolved "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" dependencies: chardet "^0.4.0" iconv-lite "^0.4.17" tmp "^0.0.33" external-editor@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.0.tgz#dc35c48c6f98a30ca27a20e9687d7f3c77704bb6" + version "3.0.3" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" dependencies: - chardet "^0.5.0" - iconv-lite "^0.4.22" + chardet "^0.7.0" + iconv-lite "^0.4.24" tmp "^0.0.33" extglob@^0.3.1: @@ -3091,6 +3118,10 @@ fastparse@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" +favico.js@^0.3.10: + version "0.3.10" + resolved "https://registry.yarnpkg.com/favico.js/-/favico.js-0.3.10.tgz#80586e27a117f24a8d51c18a99bdc714d4339301" + faye-websocket@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" @@ -3109,7 +3140,7 @@ fb-watchman@^2.0.0: dependencies: bser "^2.0.0" -fbjs@^0.8.16, fbjs@^0.8.4, fbjs@^0.8.9: +fbjs@^0.8.4, fbjs@^0.8.9: version "0.8.17" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" dependencies: @@ -3121,6 +3152,10 @@ fbjs@^0.8.16, fbjs@^0.8.4, fbjs@^0.8.9: setimmediate "^1.0.5" ua-parser-js "^0.7.18" +figgy-pudding@^3.1.0, figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" @@ -3134,12 +3169,12 @@ file-entry-cache@^2.0.0: flat-cache "^1.2.1" object-assign "^4.0.1" -file-loader@^1.1.11: - version "1.1.11" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.11.tgz#6fe886449b0f2a936e43cabaac0cdbfb369506f8" +file-loader@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-2.0.0.tgz#39749c82f020b9e85901dcff98e8004e6401cfde" dependencies: loader-utils "^1.0.2" - schema-utils "^0.4.5" + schema-utils "^1.0.0" filename-regex@^2.0.0: version "2.0.1" @@ -3195,6 +3230,14 @@ find-cache-dir@^1.0.0: make-dir "^1.0.0" pkg-dir "^2.0.0" +find-cache-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.0.0.tgz#4c1faed59f45184530fb9d7fa123a4d04a98472d" + dependencies: + commondir "^1.0.1" + make-dir "^1.0.0" + pkg-dir "^3.0.0" + find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -3208,6 +3251,12 @@ find-up@^2.0.0, find-up@^2.1.0: dependencies: locate-path "^2.0.0" +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + dependencies: + locate-path "^3.0.0" + flat-cache@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" @@ -3217,6 +3266,10 @@ flat-cache@^1.2.1: graceful-fs "^4.1.2" write "^0.2.1" +flatmap-stream@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/flatmap-stream/-/flatmap-stream-0.1.0.tgz#ed54e01422cd29281800914fcb968d58b685d5f1" + flatten@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" @@ -3229,10 +3282,10 @@ flush-write-stream@^1.0.0: readable-stream "^2.0.4" follow-redirects@^1.0.0, follow-redirects@^1.2.3: - version "1.5.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.1.tgz#67a8f14f5a1f67f962c2c46469c79eaec0a90291" + version "1.5.8" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.8.tgz#1dbfe13e45ad969f813e86c00e5296f525c885a1" dependencies: - debug "^3.1.0" + debug "=3.1.0" font-awesome@^4.7.0: version "4.7.0" @@ -3258,10 +3311,6 @@ for-own@^1.0.0: dependencies: for-in "^1.0.1" -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -3274,7 +3323,7 @@ form-data@~2.1.1: combined-stream "^1.0.5" mime-types "^2.1.12" -form-data@~2.3.1: +form-data@~2.3.1, form-data@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" dependencies: @@ -3303,19 +3352,17 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" -from@~0: +from@^0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" -fs-extra@^0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" +fs-extra@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.0.tgz#8cc3f47ce07ef7b3593a11b9fb245f7e34c041d6" dependencies: graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" + jsonfile "^4.0.0" + universalify "^0.1.0" fs-minipass@^1.2.5: version "1.2.5" @@ -3364,7 +3411,7 @@ function-bind@^1.0.2, function-bind@^1.1.0, function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" -function.prototype.name@^1.0.3: +function.prototype.name@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.0.tgz#8bd763cc0af860a859cc5d49384d74b932cd2327" dependencies: @@ -3441,19 +3488,9 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -3463,8 +3500,8 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: path-is-absolute "^1.0.0" global-modules-path@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.1.0.tgz#923ec524e8726bb0c1a4ed4b8e21e1ff80c88bbb" + version "2.3.0" + resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.0.tgz#b0e2bac6beac39745f7db5c59d26a36a0b94f7dc" globals@^11.0.1, globals@^11.1.0: version "11.7.0" @@ -3509,7 +3546,7 @@ gonzales-pe@^4.0.3: dependencies: minimist "1.1.x" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -3529,14 +3566,14 @@ handle-thing@^1.2.5: resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" handlebars@^4.0.3: - version "4.0.11" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" + version "4.0.12" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" dependencies: - async "^1.4.0" + async "^2.5.0" optimist "^0.6.1" - source-map "^0.4.4" + source-map "^0.6.1" optionalDependencies: - uglify-js "^2.6" + uglify-js "^3.1.4" har-schema@^1.0.5: version "1.0.5" @@ -3560,6 +3597,13 @@ har-validator@~5.0.3: ajv "^5.1.0" har-schema "^2.0.0" +har-validator@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29" + dependencies: + ajv "^5.3.0" + har-schema "^2.0.0" + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -3688,11 +3732,7 @@ hpack.js@^2.1.6: readable-stream "^2.0.1" wbuf "^1.1.0" -html-comment-regex@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" - -html-encoding-sniffer@^1.0.1: +html-encoding-sniffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" dependencies: @@ -3728,7 +3768,7 @@ http-errors@1.6.2: http-errors@~1.6.2: version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + resolved "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" dependencies: depd "~1.1.2" inherits "2.0.3" @@ -3745,7 +3785,7 @@ http-parser-js@>=0.4.0: http-proxy-middleware@~0.18.0: version "0.18.0" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz#0987e6bb5a5606e5a69168d8f967a87f15dd8aab" + resolved "http://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz#0987e6bb5a5606e5a69168d8f967a87f15dd8aab" dependencies: http-proxy "^1.16.2" is-glob "^4.0.0" @@ -3784,12 +3824,18 @@ iconv-lite@0.4.19: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" -iconv-lite@^0.4.17, iconv-lite@^0.4.22, iconv-lite@^0.4.4, iconv-lite@~0.4.13: +iconv-lite@0.4.23: version "0.4.23" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.4.17, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + dependencies: + safer-buffer ">= 2.1.2 < 3" + icss-replace-symbols@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" @@ -3800,7 +3846,7 @@ icss-utils@^2.1.0: dependencies: postcss "^6.0.1" -ieee754@^1.1.11, ieee754@^1.1.4: +ieee754@^1.1.4: version "1.1.12" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" @@ -3841,6 +3887,13 @@ import-local@^1.0.0: pkg-dir "^2.0.0" resolve-cwd "^2.0.0" +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + imports-loader@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/imports-loader/-/imports-loader-0.8.0.tgz#030ea51b8ca05977c40a3abfd9b4088fe0be9a69" @@ -3909,8 +3962,8 @@ inquirer@^3.0.6: through "^2.3.6" inquirer@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.0.0.tgz#e8c20303ddc15bbfc2c12a6213710ccd9e1413d8" + version "6.2.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8" dependencies: ansi-escapes "^3.0.0" chalk "^2.0.0" @@ -3918,7 +3971,7 @@ inquirer@^6.0.0: cli-width "^2.0.0" external-editor "^3.0.0" figures "^2.0.0" - lodash "^4.3.0" + lodash "^4.17.10" mute-stream "0.0.7" run-async "^2.2.0" rxjs "^6.1.0" @@ -3926,11 +3979,12 @@ inquirer@^6.0.0: strip-ansi "^4.0.0" through "^2.3.6" -internal-ip@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-1.2.0.tgz#ae9fbf93b984878785d50a8de1b356956058cf5c" +internal-ip@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-3.0.1.tgz#df5c99876e1d2eb2ea2d74f520e3f669a00ece27" dependencies: - meow "^3.3.0" + default-gateway "^2.6.0" + ipaddr.js "^1.5.2" interpret@^1.1.0: version "1.1.0" @@ -3964,7 +4018,7 @@ intl@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/intl/-/intl-1.2.5.tgz#82244a2190c4e419f8371f5aa34daa3420e2abde" -invariant@^2.0.0, invariant@^2.1.1, invariant@^2.2.0, invariant@^2.2.1, invariant@^2.2.2, invariant@^2.2.4: +invariant@^2.0.0, invariant@^2.1.1, invariant@^2.2.1, invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" dependencies: @@ -3974,17 +4028,25 @@ invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + ip@^1.1.0, ip@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" -ipaddr.js@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.6.0.tgz#e3fa357b773da619f26e95f049d055c72796f86b" +ipaddr.js@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" -is-absolute-url@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" +ipaddr.js@^1.5.2: + version "1.8.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.1.tgz#fa4b79fa47fd3def5e3b159825161c0a519c9427" is-accessor-descriptor@^0.1.6: version "0.1.6" @@ -4026,15 +4088,15 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" -is-callable@^1.1.1, is-callable@^1.1.3: +is-callable@^1.1.1, is-callable@^1.1.3, is-callable@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" is-ci@^1.0.10: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5" + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" dependencies: - ci-info "^1.0.0" + ci-info "^1.5.0" is-data-descriptor@^0.1.4: version "0.1.4" @@ -4116,6 +4178,10 @@ is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" +is-generator-fn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a" + is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" @@ -4162,7 +4228,7 @@ is-number@^4.0.0: is-obj@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + resolved "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" is-path-cwd@^1.0.0: version "1.0.0" @@ -4180,10 +4246,6 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" -is-plain-obj@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -4224,12 +4286,6 @@ is-subset@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" -is-svg@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" - dependencies: - html-comment-regex "^1.1.0" - is-symbol@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" @@ -4283,321 +4339,379 @@ isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" -istanbul-api@^1.1.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.1.tgz#4c3b05d18c0016d1022e079b98dc82c40f488954" +istanbul-api@^1.3.1: + version "1.3.7" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.7.tgz#a86c770d2b03e11e3f778cd7aedd82d2722092aa" dependencies: async "^2.1.4" - compare-versions "^3.1.0" fileset "^2.0.2" - istanbul-lib-coverage "^1.2.0" - istanbul-lib-hook "^1.2.0" - istanbul-lib-instrument "^1.10.1" - istanbul-lib-report "^1.1.4" - istanbul-lib-source-maps "^1.2.4" - istanbul-reports "^1.3.0" + istanbul-lib-coverage "^1.2.1" + istanbul-lib-hook "^1.2.2" + istanbul-lib-instrument "^1.10.2" + istanbul-lib-report "^1.1.5" + istanbul-lib-source-maps "^1.2.6" + istanbul-reports "^1.5.1" js-yaml "^3.7.0" mkdirp "^0.5.1" once "^1.4.0" -istanbul-lib-coverage@^1.0.1, istanbul-lib-coverage@^1.1.2, istanbul-lib-coverage@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz#f7d8f2e42b97e37fe796114cb0f9d68b5e3a4341" - -istanbul-lib-hook@^1.2.0: +istanbul-lib-coverage@^1.2.0, istanbul-lib-coverage@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.1.tgz#f614ec45287b2a8fc4f07f5660af787575601805" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0" + +istanbul-lib-hook@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz#bc6bf07f12a641fbf1c85391d0daa8f0aea6bf86" dependencies: - append-transform "^1.0.0" + append-transform "^0.4.0" -istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.4.2: - version "1.10.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz#724b4b6caceba8692d3f1f9d0727e279c401af7b" +istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca" dependencies: babel-generator "^6.18.0" babel-template "^6.16.0" babel-traverse "^6.18.0" babel-types "^6.18.0" babylon "^6.18.0" - istanbul-lib-coverage "^1.2.0" + istanbul-lib-coverage "^1.2.1" semver "^5.3.0" -istanbul-lib-report@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz#e886cdf505c4ebbd8e099e4396a90d0a28e2acb5" +istanbul-lib-report@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz#f2a657fc6282f96170aaf281eb30a458f7f4170c" dependencies: - istanbul-lib-coverage "^1.2.0" + istanbul-lib-coverage "^1.2.1" mkdirp "^0.5.1" path-parse "^1.0.5" supports-color "^3.1.2" -istanbul-lib-source-maps@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz#20fb54b14e14b3fb6edb6aca3571fd2143db44e6" +istanbul-lib-source-maps@^1.2.4, istanbul-lib-source-maps@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz#37b9ff661580f8fca11232752ee42e08c6675d8f" dependencies: debug "^3.1.0" - istanbul-lib-coverage "^1.1.2" + istanbul-lib-coverage "^1.2.1" mkdirp "^0.5.1" rimraf "^2.6.1" source-map "^0.5.3" -istanbul-lib-source-maps@^1.2.4: - version "1.2.5" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.5.tgz#ffe6be4e7ab86d3603e4290d54990b14506fc9b1" - dependencies: - debug "^3.1.0" - istanbul-lib-coverage "^1.2.0" - mkdirp "^0.5.1" - rimraf "^2.6.1" - source-map "^0.5.3" - -istanbul-reports@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.3.0.tgz#2f322e81e1d9520767597dca3c20a0cce89a3554" +istanbul-reports@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.5.1.tgz#97e4dbf3b515e8c484caea15d6524eebd3ff4e1a" dependencies: handlebars "^4.0.3" -jest-changed-files@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-21.2.0.tgz#5dbeecad42f5d88b482334902ce1cba6d9798d29" +jest-changed-files@^23.4.2: + version "23.4.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.4.2.tgz#1eed688370cd5eebafe4ae93d34bb3b64968fe83" dependencies: throat "^4.0.0" -jest-cli@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-21.2.1.tgz#9c528b6629d651911138d228bdb033c157ec8c00" +jest-cli@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.6.0.tgz#61ab917744338f443ef2baa282ddffdd658a5da4" dependencies: ansi-escapes "^3.0.0" chalk "^2.0.1" + exit "^0.1.2" glob "^7.1.2" graceful-fs "^4.1.11" + import-local "^1.0.0" is-ci "^1.0.10" - istanbul-api "^1.1.1" - istanbul-lib-coverage "^1.0.1" - istanbul-lib-instrument "^1.4.2" - istanbul-lib-source-maps "^1.1.0" - jest-changed-files "^21.2.0" - jest-config "^21.2.1" - jest-environment-jsdom "^21.2.1" - jest-haste-map "^21.2.0" - jest-message-util "^21.2.1" - jest-regex-util "^21.2.0" - jest-resolve-dependencies "^21.2.0" - jest-runner "^21.2.1" - jest-runtime "^21.2.1" - jest-snapshot "^21.2.1" - jest-util "^21.2.1" + istanbul-api "^1.3.1" + istanbul-lib-coverage "^1.2.0" + istanbul-lib-instrument "^1.10.1" + istanbul-lib-source-maps "^1.2.4" + jest-changed-files "^23.4.2" + jest-config "^23.6.0" + jest-environment-jsdom "^23.4.0" + jest-get-type "^22.1.0" + jest-haste-map "^23.6.0" + jest-message-util "^23.4.0" + jest-regex-util "^23.3.0" + jest-resolve-dependencies "^23.6.0" + jest-runner "^23.6.0" + jest-runtime "^23.6.0" + jest-snapshot "^23.6.0" + jest-util "^23.4.0" + jest-validate "^23.6.0" + jest-watcher "^23.4.0" + jest-worker "^23.2.0" micromatch "^2.3.11" - node-notifier "^5.0.2" - pify "^3.0.0" + node-notifier "^5.2.1" + prompts "^0.1.9" + realpath-native "^1.0.0" + rimraf "^2.5.4" slash "^1.0.0" string-length "^2.0.0" strip-ansi "^4.0.0" which "^1.2.12" - worker-farm "^1.3.1" - yargs "^9.0.0" + yargs "^11.0.0" -jest-config@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-21.2.1.tgz#c7586c79ead0bcc1f38c401e55f964f13bf2a480" +jest-config@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.6.0.tgz#f82546a90ade2d8c7026fbf6ac5207fc22f8eb1d" dependencies: + babel-core "^6.0.0" + babel-jest "^23.6.0" chalk "^2.0.1" glob "^7.1.1" - jest-environment-jsdom "^21.2.1" - jest-environment-node "^21.2.1" - jest-get-type "^21.2.0" - jest-jasmine2 "^21.2.1" - jest-regex-util "^21.2.0" - jest-resolve "^21.2.0" - jest-util "^21.2.1" - jest-validate "^21.2.1" - pretty-format "^21.2.1" - -jest-diff@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-21.2.1.tgz#46cccb6cab2d02ce98bc314011764bb95b065b4f" + jest-environment-jsdom "^23.4.0" + jest-environment-node "^23.4.0" + jest-get-type "^22.1.0" + jest-jasmine2 "^23.6.0" + jest-regex-util "^23.3.0" + jest-resolve "^23.6.0" + jest-util "^23.4.0" + jest-validate "^23.6.0" + micromatch "^2.3.11" + pretty-format "^23.6.0" + +jest-diff@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.6.0.tgz#1500f3f16e850bb3d71233408089be099f610c7d" dependencies: chalk "^2.0.1" diff "^3.2.0" - jest-get-type "^21.2.0" - pretty-format "^21.2.1" + jest-get-type "^22.1.0" + pretty-format "^23.6.0" + +jest-docblock@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-23.2.0.tgz#f085e1f18548d99fdd69b20207e6fd55d91383a7" + dependencies: + detect-newline "^2.1.0" -jest-docblock@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-21.2.0.tgz#51529c3b30d5fd159da60c27ceedc195faf8d414" +jest-each@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-23.6.0.tgz#ba0c3a82a8054387016139c733a05242d3d71575" + dependencies: + chalk "^2.0.1" + pretty-format "^23.6.0" -jest-environment-jsdom@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-21.2.1.tgz#38d9980c8259b2a608ec232deee6289a60d9d5b4" +jest-environment-jsdom@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz#056a7952b3fea513ac62a140a2c368c79d9e6023" dependencies: - jest-mock "^21.2.0" - jest-util "^21.2.1" - jsdom "^9.12.0" + jest-mock "^23.2.0" + jest-util "^23.4.0" + jsdom "^11.5.1" -jest-environment-node@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-21.2.1.tgz#98c67df5663c7fbe20f6e792ac2272c740d3b8c8" +jest-environment-node@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-23.4.0.tgz#57e80ed0841dea303167cce8cd79521debafde10" dependencies: - jest-mock "^21.2.0" - jest-util "^21.2.1" + jest-mock "^23.2.0" + jest-util "^23.4.0" -jest-get-type@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-21.2.0.tgz#f6376ab9db4b60d81e39f30749c6c466f40d4a23" +jest-get-type@^22.1.0: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" -jest-haste-map@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-21.2.0.tgz#1363f0a8bb4338f24f001806571eff7a4b2ff3d8" +jest-haste-map@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.6.0.tgz#2e3eb997814ca696d62afdb3f2529f5bbc935e16" dependencies: fb-watchman "^2.0.0" graceful-fs "^4.1.11" - jest-docblock "^21.2.0" + invariant "^2.2.4" + jest-docblock "^23.2.0" + jest-serializer "^23.0.1" + jest-worker "^23.2.0" micromatch "^2.3.11" sane "^2.0.0" - worker-farm "^1.3.1" -jest-jasmine2@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-21.2.1.tgz#9cc6fc108accfa97efebce10c4308548a4ea7592" +jest-jasmine2@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz#840e937f848a6c8638df24360ab869cc718592e0" dependencies: + babel-traverse "^6.0.0" chalk "^2.0.1" - expect "^21.2.1" - graceful-fs "^4.1.11" - jest-diff "^21.2.1" - jest-matcher-utils "^21.2.1" - jest-message-util "^21.2.1" - jest-snapshot "^21.2.1" - p-cancelable "^0.3.0" - -jest-matcher-utils@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-21.2.1.tgz#72c826eaba41a093ac2b4565f865eb8475de0f64" + co "^4.6.0" + expect "^23.6.0" + is-generator-fn "^1.0.0" + jest-diff "^23.6.0" + jest-each "^23.6.0" + jest-matcher-utils "^23.6.0" + jest-message-util "^23.4.0" + jest-snapshot "^23.6.0" + jest-util "^23.4.0" + pretty-format "^23.6.0" + +jest-leak-detector@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz#e4230fd42cf381a1a1971237ad56897de7e171de" + dependencies: + pretty-format "^23.6.0" + +jest-matcher-utils@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz#726bcea0c5294261a7417afb6da3186b4b8cac80" dependencies: chalk "^2.0.1" - jest-get-type "^21.2.0" - pretty-format "^21.2.1" + jest-get-type "^22.1.0" + pretty-format "^23.6.0" -jest-message-util@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-21.2.1.tgz#bfe5d4692c84c827d1dcf41823795558f0a1acbe" +jest-message-util@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-23.4.0.tgz#17610c50942349508d01a3d1e0bda2c079086a9f" dependencies: + "@babel/code-frame" "^7.0.0-beta.35" chalk "^2.0.1" micromatch "^2.3.11" slash "^1.0.0" + stack-utils "^1.0.1" -jest-mock@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-21.2.0.tgz#7eb0770e7317968165f61ea2a7281131534b3c0f" +jest-mock@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-23.2.0.tgz#ad1c60f29e8719d47c26e1138098b6d18b261134" -jest-regex-util@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-21.2.0.tgz#1b1e33e63143babc3e0f2e6c9b5ba1eb34b2d530" +jest-regex-util@^23.3.0: + version "23.3.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.3.0.tgz#5f86729547c2785c4002ceaa8f849fe8ca471bc5" -jest-resolve-dependencies@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-21.2.0.tgz#9e231e371e1a736a1ad4e4b9a843bc72bfe03d09" +jest-resolve-dependencies@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz#b4526af24c8540d9a3fab102c15081cf509b723d" dependencies: - jest-regex-util "^21.2.0" + jest-regex-util "^23.3.0" + jest-snapshot "^23.6.0" -jest-resolve@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-21.2.0.tgz#068913ad2ba6a20218e5fd32471f3874005de3a6" +jest-resolve@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.6.0.tgz#cf1d1a24ce7ee7b23d661c33ba2150f3aebfa0ae" dependencies: - browser-resolve "^1.11.2" + browser-resolve "^1.11.3" chalk "^2.0.1" - is-builtin-module "^1.0.0" + realpath-native "^1.0.0" -jest-runner@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-21.2.1.tgz#194732e3e518bfb3d7cbfc0fd5871246c7e1a467" - dependencies: - jest-config "^21.2.1" - jest-docblock "^21.2.0" - jest-haste-map "^21.2.0" - jest-jasmine2 "^21.2.1" - jest-message-util "^21.2.1" - jest-runtime "^21.2.1" - jest-util "^21.2.1" - pify "^3.0.0" +jest-runner@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.6.0.tgz#3894bd219ffc3f3cb94dc48a4170a2e6f23a5a38" + dependencies: + exit "^0.1.2" + graceful-fs "^4.1.11" + jest-config "^23.6.0" + jest-docblock "^23.2.0" + jest-haste-map "^23.6.0" + jest-jasmine2 "^23.6.0" + jest-leak-detector "^23.6.0" + jest-message-util "^23.4.0" + jest-runtime "^23.6.0" + jest-util "^23.4.0" + jest-worker "^23.2.0" + source-map-support "^0.5.6" throat "^4.0.0" - worker-farm "^1.3.1" -jest-runtime@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-21.2.1.tgz#99dce15309c670442eee2ebe1ff53a3cbdbbb73e" +jest-runtime@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.6.0.tgz#059e58c8ab445917cd0e0d84ac2ba68de8f23082" dependencies: babel-core "^6.0.0" - babel-jest "^21.2.0" - babel-plugin-istanbul "^4.0.0" + babel-plugin-istanbul "^4.1.6" chalk "^2.0.1" convert-source-map "^1.4.0" + exit "^0.1.2" + fast-json-stable-stringify "^2.0.0" graceful-fs "^4.1.11" - jest-config "^21.2.1" - jest-haste-map "^21.2.0" - jest-regex-util "^21.2.0" - jest-resolve "^21.2.0" - jest-util "^21.2.1" - json-stable-stringify "^1.0.1" + jest-config "^23.6.0" + jest-haste-map "^23.6.0" + jest-message-util "^23.4.0" + jest-regex-util "^23.3.0" + jest-resolve "^23.6.0" + jest-snapshot "^23.6.0" + jest-util "^23.4.0" + jest-validate "^23.6.0" micromatch "^2.3.11" + realpath-native "^1.0.0" slash "^1.0.0" strip-bom "3.0.0" write-file-atomic "^2.1.0" - yargs "^9.0.0" + yargs "^11.0.0" + +jest-serializer@^23.0.1: + version "23.0.1" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-23.0.1.tgz#a3776aeb311e90fe83fab9e533e85102bd164165" -jest-snapshot@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-21.2.1.tgz#29e49f16202416e47343e757e5eff948c07fd7b0" +jest-snapshot@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.6.0.tgz#f9c2625d1b18acda01ec2d2b826c0ce58a5aa17a" dependencies: + babel-types "^6.0.0" chalk "^2.0.1" - jest-diff "^21.2.1" - jest-matcher-utils "^21.2.1" + jest-diff "^23.6.0" + jest-matcher-utils "^23.6.0" + jest-message-util "^23.4.0" + jest-resolve "^23.6.0" mkdirp "^0.5.1" natural-compare "^1.4.0" - pretty-format "^21.2.1" + pretty-format "^23.6.0" + semver "^5.5.0" -jest-util@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-21.2.1.tgz#a274b2f726b0897494d694a6c3d6a61ab819bb78" +jest-util@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-23.4.0.tgz#4d063cb927baf0a23831ff61bec2cbbf49793561" dependencies: callsites "^2.0.0" chalk "^2.0.1" graceful-fs "^4.1.11" - jest-message-util "^21.2.1" - jest-mock "^21.2.0" - jest-validate "^21.2.1" + is-ci "^1.0.10" + jest-message-util "^23.4.0" mkdirp "^0.5.1" + slash "^1.0.0" + source-map "^0.6.0" -jest-validate@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-21.2.1.tgz#cc0cbca653cd54937ba4f2a111796774530dd3c7" +jest-validate@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.6.0.tgz#36761f99d1ed33fcd425b4e4c5595d62b6597474" dependencies: chalk "^2.0.1" - jest-get-type "^21.2.0" + jest-get-type "^22.1.0" leven "^2.1.0" - pretty-format "^21.2.1" + pretty-format "^23.6.0" + +jest-watcher@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-23.4.0.tgz#d2e28ce74f8dad6c6afc922b92cabef6ed05c91c" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.1" + string-length "^2.0.0" + +jest-worker@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-23.2.0.tgz#faf706a8da36fae60eb26957257fa7b5d8ea02b9" + dependencies: + merge-stream "^1.0.1" -jest@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-21.2.1.tgz#c964e0b47383768a1438e3ccf3c3d470327604e1" +jest@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-23.6.0.tgz#ad5835e923ebf6e19e7a1d7529a432edfee7813d" dependencies: - jest-cli "^21.2.1" + import-local "^1.0.0" + jest-cli "^23.6.0" js-base64@^2.1.8, js-base64@^2.1.9: - version "2.4.6" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.6.tgz#1d49f618bef43630cd191f4e122447acfdb947d8" + version "2.4.9" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.9.tgz#748911fb04f48a60c4771b375cac45a80df11c03" + +js-levenshtein@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.3.tgz#3ef627df48ec8cf24bacf05c0f184ff30ef413c5" js-string-escape@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" -js-tokens@^3.0.0, js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - -"js-tokens@^3.0.0 || ^4.0.0": +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + js-yaml@^3.11.0, js-yaml@^3.7.0, js-yaml@^3.9.0, js-yaml@^3.9.1: version "3.12.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" @@ -4605,40 +4719,40 @@ js-yaml@^3.11.0, js-yaml@^3.7.0, js-yaml@^3.9.0, js-yaml@^3.9.1: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@~3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" - dependencies: - argparse "^1.0.7" - esprima "^2.6.0" - jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" -jsdom@^9.12.0: - version "9.12.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" +jsdom@^11.5.1: + version "11.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" dependencies: - abab "^1.0.3" - acorn "^4.0.4" - acorn-globals "^3.1.0" + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" array-equal "^1.0.0" - content-type-parser "^1.0.1" cssom ">= 0.3.2 < 0.4.0" - cssstyle ">= 0.2.37 < 0.3.0" - escodegen "^1.6.1" - html-encoding-sniffer "^1.0.1" - nwmatcher ">= 1.3.9 < 2.0.0" - parse5 "^1.5.1" - request "^2.79.0" - sax "^1.2.1" - symbol-tree "^3.2.1" - tough-cookie "^2.3.2" - webidl-conversions "^4.0.0" - whatwg-encoding "^1.0.1" - whatwg-url "^4.3.0" - xml-name-validator "^2.0.1" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" jsesc@^1.3.0: version "1.3.0" @@ -4690,9 +4804,9 @@ json5@^0.5.0, json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" optionalDependencies: graceful-fs "^4.1.6" @@ -4720,8 +4834,8 @@ keycode@^2.1.7: resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.2.0.tgz#3d0af56dc7b8b8e5cba8d0a97f107204eec22b04" killable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.0.tgz#da8b84bd47de5395878f95d64d02f2449fe05e6b" + version "1.0.1" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" @@ -4743,15 +4857,9 @@ kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - optionalDependencies: - graceful-fs "^4.1.9" - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" +kleur@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-2.0.2.tgz#b704f4944d95e255d038f0cb05fb8a602c55a300" lcid@^1.0.0: version "1.0.0" @@ -4759,6 +4867,16 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + dependencies: + invert-kv "^2.0.0" + +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + leven@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" @@ -4826,6 +4944,13 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + lodash-es@^4.17.5, lodash-es@^4.2.1: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.10.tgz#62cd7104cdf5dd87f235a837f0ede0e8e5117e05" @@ -4854,18 +4979,26 @@ lodash.defaults@^4.0.1: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" +lodash.escape@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98" + lodash.flattendeep@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" lodash.mergewith@^4.6.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + lodash.tail@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664" @@ -4883,21 +5016,7 @@ lodash.templatesettings@^4.0.0: dependencies: lodash._reinterpolate "~3.0.0" -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - -"lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@~4.17.10: - version "4.17.10" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" - -log-symbols@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" - dependencies: - chalk "^2.0.1" - -lodash@^4.17.5, lodash@^4.2.0: +"lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0, lodash@~4.17.10: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" @@ -4905,25 +5024,6 @@ loglevel@^1.4.1: version "1.6.1" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" -loglevelnext@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/loglevelnext/-/loglevelnext-1.0.5.tgz#36fc4f5996d6640f539ff203ba819641680d75a2" - dependencies: - es6-symbol "^3.1.1" - object.assign "^4.1.0" - -long@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" - -long@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" - -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -4937,7 +5037,7 @@ loud-rejection@^1.0.0, loud-rejection@^1.6.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" -lru-cache@^4.0.1, lru-cache@^4.1.1: +lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" dependencies: @@ -4960,6 +5060,12 @@ mamacro@^0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" +map-age-cleaner@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz#098fb15538fd3dbe461f12745b0ca8568d4e3f74" + dependencies: + p-defer "^1.0.0" + map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -4968,9 +5074,9 @@ map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" -map-stream@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" +map-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.0.7.tgz#8a1f07896d82b10926bd3744a2420009f88974a8" map-visit@^1.0.0: version "1.0.0" @@ -4986,10 +5092,6 @@ marky@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/marky/-/marky-1.2.0.tgz#9617ed647bbbea8f45d19526da33dec70606df42" -math-expression-evaluator@^1.2.14: - version "1.2.17" - resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" - math-random@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" @@ -5011,6 +5113,14 @@ mem@^1.1.0: dependencies: mimic-fn "^1.0.0" +mem@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.0.0.tgz#6437690d9471678f6cc83659c00cbafcd6b0cdaf" + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^1.0.0" + p-is-promise "^1.1.0" + memory-fs@^0.4.0, memory-fs@~0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" @@ -5022,7 +5132,7 @@ memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" -meow@^3.3.0, meow@^3.7.0: +meow@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" dependencies: @@ -5041,6 +5151,12 @@ merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" +merge-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + dependencies: + readable-stream "^2.0.1" + merge@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" @@ -5092,25 +5208,21 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -"mime-db@>= 1.34.0 < 2": - version "1.34.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.34.0.tgz#452d0ecff5c30346a6dc1e64b1eaee0d3719ff9a" - -mime-db@~1.33.0: - version "1.33.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" +"mime-db@>= 1.34.0 < 2", mime-db@~1.36.0: + version "1.36.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397" -mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.7: - version "2.1.18" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.19, mime-types@~2.1.7: + version "2.1.20" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.20.tgz#930cb719d571e903738520f8470911548ca2cc19" dependencies: - mime-db "~1.33.0" + mime-db "~1.36.0" mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" -mime@^2.1.0: +mime@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" @@ -5118,12 +5230,12 @@ mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" -mini-css-extract-plugin@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.1.tgz#d2bcf77bb2596b8e4bd9257e43d3f9164c2e86cb" +mini-css-extract-plugin@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.2.tgz#b3ecc0d6b1bbe5ff14add42b946a7b200cf78651" dependencies: - "@webpack-contrib/schema-utils" "^1.0.0-beta.0" loader-utils "^1.1.0" + schema-utils "^1.0.0" webpack-sources "^1.1.0" minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: @@ -5134,7 +5246,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: +minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: @@ -5142,23 +5254,23 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: minimist@0.0.8: version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" minimist@1.1.x: version "1.1.3" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.1.3.tgz#3bedfd91a92d39016fcfaa1c681e8faa1a1efda8" + resolved "http://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz#3bedfd91a92d39016fcfaa1c681e8faa1a1efda8" minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + resolved "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" minimist@~0.0.1: version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" minipass@^2.2.1, minipass@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233" + version "2.3.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.4.tgz#4768d7605ed6194d6d576169b9e12ef71e9d9957" dependencies: safe-buffer "^5.1.2" yallist "^3.0.0" @@ -5184,6 +5296,21 @@ mississippi@^2.0.0: stream-each "^1.1.0" through2 "^2.0.0" +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + mixin-deep@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" @@ -5198,12 +5325,16 @@ mixin-object@^2.0.1: for-in "^0.1.3" is-extendable "^0.1.1" -mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: +mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: minimist "0.0.8" +moo@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/moo/-/moo-0.4.3.tgz#3f847a26f31cf625a956a87f2b10fbc013bfd10e" + mousetrap@^1.5.2: version "1.6.2" resolved "https://registry.yarnpkg.com/mousetrap/-/mousetrap-1.6.2.tgz#caadd9cf886db0986fb2fee59a82f6bd37527587" @@ -5223,6 +5354,10 @@ ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" +ms@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + multicast-dns-service-types@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" @@ -5239,8 +5374,8 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" nan@^2.0.0, nan@^2.10.0, nan@^2.9.2: - version "2.10.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" + version "2.11.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.0.tgz#574e360e4d954ab16966ec102c0c049fd961a099" nanomatch@^1.2.9: version "1.2.13" @@ -5263,17 +5398,18 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" nearley@^2.7.10: - version "2.13.0" - resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.13.0.tgz#6e7b0f4e68bfc3e74c99eaef2eda39e513143439" + version "2.15.1" + resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.15.1.tgz#965e4e6ec9ed6b80fc81453e161efbcebb36d247" dependencies: + moo "^0.4.3" nomnom "~1.6.2" railroad-diagrams "^1.0.0" randexp "0.4.6" semver "^5.4.1" needle@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" + version "2.2.3" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.3.tgz#c1b04da378cd634d8befe2de965dc2cfb0fd65ca" dependencies: debug "^2.1.2" iconv-lite "^0.4.4" @@ -5284,16 +5420,16 @@ negotiator@0.6.1: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" neo-async@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" + version "2.5.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.2.tgz#489105ce7bc54e709d736b195f82135048c50fcc" next-tick@1: version "1.0.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" nice-try@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4" + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" node-fetch@^1.0.1: version "1.7.3" @@ -5306,9 +5442,9 @@ node-forge@0.7.5: version "0.7.5" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" -node-gyp@^3.3.1: - version "3.7.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.7.0.tgz#789478e8f6c45e277aa014f3e28f958f286f9203" +node-gyp@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" dependencies: fstream "^1.0.0" glob "^7.0.3" @@ -5317,7 +5453,7 @@ node-gyp@^3.3.1: nopt "2 || 3" npmlog "0 || 1 || 2 || 3 || 4" osenv "0" - request ">=2.9.0 <2.82.0" + request "^2.87.0" rimraf "2" semver "~5.3.0" tar "^2.0.0" @@ -5355,7 +5491,7 @@ node-libs-browser@^2.0.0: util "^0.10.3" vm-browserify "0.0.4" -node-notifier@^5.0.2: +node-notifier@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" dependencies: @@ -5395,9 +5531,15 @@ node-pre-gyp@^0.6.4: tar "^2.2.1" tar-pack "^3.4.0" +node-releases@^1.0.0-alpha.11: + version "1.0.0-alpha.11" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.0.0-alpha.11.tgz#73c810acc2e5b741a17ddfbb39dfca9ab9359d8a" + dependencies: + semver "^5.3.0" + node-sass@^4.9.2: - version "4.9.2" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.2.tgz#5e63fe6bd0f2ae3ac9d6c14ede8620e2b8bdb437" + version "4.9.3" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.3.tgz#f407cf3d66f78308bb1e346b24fa428703196224" dependencies: async-foreach "^0.1.3" chalk "^1.1.1" @@ -5412,7 +5554,7 @@ node-sass@^4.9.2: meow "^3.7.0" mkdirp "^0.5.1" nan "^2.10.0" - node-gyp "^3.3.1" + node-gyp "^3.8.0" npmlog "^4.0.0" request "2.87.0" sass-graph "^2.2.4" @@ -5467,22 +5609,13 @@ normalize-range@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" -normalize-url@^1.4.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" - dependencies: - object-assign "^4.0.1" - prepend-http "^1.0.0" - query-string "^4.1.0" - sort-keys "^1.0.0" - npm-bundled@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" + version "1.0.5" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" npm-packlist@^1.1.6: - version "1.1.10" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a" + version "1.1.11" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de" dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" @@ -5530,14 +5663,18 @@ number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" -"nwmatcher@>= 1.3.9 < 2.0.0": - version "1.4.4" - resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e" +nwsapi@^2.0.7: + version "2.0.9" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.9.tgz#77ac0cdfdcad52b6a1151a84e73254edc33ed016" oauth-sign@~0.8.1, oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + object-assign@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" @@ -5555,10 +5692,10 @@ object-copy@^0.1.0: kind-of "^3.0.3" object-fit-images@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/object-fit-images/-/object-fit-images-3.2.3.tgz#4089f6d0070a3b5563d3c1ab6f1b28d61331f0ac" + version "3.2.4" + resolved "https://registry.yarnpkg.com/object-fit-images/-/object-fit-images-3.2.4.tgz#6c299d38fdf207746e5d2d46c2877f6f25d15b52" -object-inspect@^1.5.0: +object-inspect@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" @@ -5566,7 +5703,7 @@ object-is@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6" -object-keys@^1.0.11, object-keys@^1.0.8: +object-keys@^1.0.11, object-keys@^1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" @@ -5576,7 +5713,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.0.4, object.assign@^4.1.0: +object.assign@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" dependencies: @@ -5594,6 +5731,13 @@ object.entries@^1.0.4: function-bind "^1.1.0" has "^1.0.1" +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" @@ -5653,8 +5797,8 @@ onetime@^2.0.0: mimic-fn "^1.0.0" opener@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8" + version "1.5.1" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" opn@^5.1.0: version "5.3.0" @@ -5681,10 +5825,10 @@ optionator@^0.8.1, optionator@^0.8.2: wordwrap "~1.0.0" original@>=0.0.5: - version "1.0.1" - resolved "https://registry.yarnpkg.com/original/-/original-1.0.1.tgz#b0a53ff42ba997a8c9cd1fb5daaeb42b9d693190" + version "1.0.2" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" dependencies: - url-parse "~1.4.0" + url-parse "^1.4.3" os-browserify@^0.3.0: version "0.3.0" @@ -5696,7 +5840,7 @@ os-homedir@^1.0.0: os-locale@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + resolved "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" dependencies: lcid "^1.0.0" @@ -5708,6 +5852,14 @@ os-locale@^2.0.0: lcid "^1.0.0" mem "^1.1.0" +os-locale@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.0.1.tgz#3b014fbf01d87f60a1e5348d80fe870dc82c4620" + dependencies: + execa "^0.10.0" + lcid "^2.0.0" + mem "^4.0.0" + os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -5719,26 +5871,42 @@ osenv@0, osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -p-cancelable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" +p-is-promise@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" + p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" dependencies: p-try "^1.0.0" +p-limit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" + dependencies: + p-try "^2.0.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" dependencies: p-limit "^1.1.0" +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + dependencies: + p-limit "^2.0.0" + p-map@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" @@ -5747,6 +5915,10 @@ p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" +p-try@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" + packet-reader@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-0.3.1.tgz#cd62e60af8d7fea8a705ec4ff990871c46871f27" @@ -5765,7 +5937,7 @@ parallel-transform@^1.1.0: parse-asn1@^5.0.0: version "5.1.1" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" + resolved "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" dependencies: asn1.js "^4.0.0" browserify-aes "^1.0.0" @@ -5809,9 +5981,9 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse5@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" parse5@^3.0.1: version "3.0.3" @@ -5862,8 +6034,8 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" path-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" path-to-regexp@0.1.7: version "0.1.7" @@ -5895,9 +6067,9 @@ path-type@^3.0.0: dependencies: pify "^3.0.0" -pause-stream@0.0.11: +pause-stream@^0.0.11: version "0.0.11" - resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + resolved "http://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" dependencies: through "~2.3" @@ -5993,13 +6165,23 @@ pkg-dir@^2.0.0: dependencies: find-up "^2.1.0" +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + dependencies: + find-up "^3.0.0" + pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + portfinder@^1.0.9: - version "1.0.13" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" + version "1.0.17" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.17.tgz#a8a1691143e46c4735edefcf4fbcccedad26456a" dependencies: async "^1.5.2" debug "^2.2.0" @@ -6037,14 +6219,6 @@ postcss-attribute-case-insensitive@^2.0.0: postcss "^6.0.0" postcss-selector-parser "^2.2.3" -postcss-calc@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" - dependencies: - postcss "^5.0.2" - postcss-message-helpers "^2.0.0" - reduce-css-calc "^1.2.6" - postcss-color-hex-alpha@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-3.0.0.tgz#1e53e6c8acb237955e8fd08b7ecdb1b8b8309f95" @@ -6054,12 +6228,12 @@ postcss-color-hex-alpha@^3.0.0: postcss-message-helpers "^2.0.0" postcss-color-mod-function@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-2.4.2.tgz#bdf408f152bc3201517a4c38b7eb5cd2996114fb" + version "2.4.3" + resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-2.4.3.tgz#14a97f5b17a5f19396e9dea7ffcb5be732592baf" dependencies: "@csstools/convert-colors" "^1.4.0" - postcss "^6.0.19" - postcss-values-parser "^1.3.2" + postcss "^6.0.23" + postcss-values-parser "^1.5.0" postcss-color-rebeccapurple@^3.0.0: version "3.1.0" @@ -6075,21 +6249,6 @@ postcss-color-rgb@^2.0.0: postcss "^6.0.1" postcss-value-parser "^3.3.0" -postcss-colormin@^2.1.8: - version "2.2.2" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" - dependencies: - colormin "^1.0.5" - postcss "^5.0.13" - postcss-value-parser "^3.2.3" - -postcss-convert-values@^2.3.4: - version "2.6.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" - dependencies: - postcss "^5.0.11" - postcss-value-parser "^3.1.2" - postcss-custom-media@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-6.0.0.tgz#be532784110ecb295044fb5395a18006eb21a737" @@ -6117,37 +6276,6 @@ postcss-dir-pseudo-class@^3.0.0: postcss "^6.0.20" postcss-selector-parser "^3.1.1" -postcss-discard-comments@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" - dependencies: - postcss "^5.0.14" - -postcss-discard-duplicates@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" - dependencies: - postcss "^5.0.4" - -postcss-discard-empty@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" - dependencies: - postcss "^5.0.14" - -postcss-discard-overridden@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" - dependencies: - postcss "^5.0.16" - -postcss-discard-unused@^2.2.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" - dependencies: - postcss "^5.0.14" - uniqs "^2.0.0" - postcss-extend-rule@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/postcss-extend-rule/-/postcss-extend-rule-1.1.0.tgz#11e4d590ffe4253b853ef1fc03be7167da607d38" @@ -6155,12 +6283,6 @@ postcss-extend-rule@^1.1.0: postcss "^6.0.11" postcss-nesting "^4.2.1" -postcss-filter-plugins@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz#82245fdf82337041645e477114d8e593aa18b8ec" - dependencies: - postcss "^5.0.4" - postcss-focus-visible@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-2.0.0.tgz#a6b9881f6710f6251790e2f151c94b161e23eeb6" @@ -6193,14 +6315,14 @@ postcss-load-config@^2.0.0: cosmiconfig "^4.0.0" import-cwd "^2.0.0" -postcss-loader@^2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-2.1.6.tgz#1d7dd7b17c6ba234b9bed5af13e0bea40a42d740" +postcss-loader@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" dependencies: loader-utils "^1.1.0" - postcss "^6.0.0" + postcss "^7.0.0" postcss-load-config "^2.0.0" - schema-utils "^0.4.0" + schema-utils "^1.0.0" postcss-logical@^1.1.1: version "1.1.1" @@ -6214,67 +6336,10 @@ postcss-media-minmax@^3.0.0: dependencies: postcss "^6.0.1" -postcss-merge-idents@^2.1.5: - version "2.1.7" - resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" - dependencies: - has "^1.0.1" - postcss "^5.0.10" - postcss-value-parser "^3.1.1" - -postcss-merge-longhand@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" - dependencies: - postcss "^5.0.4" - -postcss-merge-rules@^2.0.3: - version "2.1.2" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" - dependencies: - browserslist "^1.5.2" - caniuse-api "^1.5.2" - postcss "^5.0.4" - postcss-selector-parser "^2.2.2" - vendors "^1.0.0" - postcss-message-helpers@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" -postcss-minify-font-values@^1.0.2: - version "1.0.5" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" - dependencies: - object-assign "^4.0.1" - postcss "^5.0.4" - postcss-value-parser "^3.0.2" - -postcss-minify-gradients@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" - dependencies: - postcss "^5.0.12" - postcss-value-parser "^3.3.0" - -postcss-minify-params@^1.0.4: - version "1.2.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" - dependencies: - alphanum-sort "^1.0.1" - postcss "^5.0.2" - postcss-value-parser "^3.0.2" - uniqs "^2.0.0" - -postcss-minify-selectors@^2.0.4: - version "2.1.1" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" - dependencies: - alphanum-sort "^1.0.2" - has "^1.0.1" - postcss "^5.0.14" - postcss-selector-parser "^2.0.0" - postcss-modules-extract-imports@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85" @@ -6315,21 +6380,6 @@ postcss-nesting@^4.2.1: dependencies: postcss "^6.0.11" -postcss-normalize-charset@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" - dependencies: - postcss "^5.0.5" - -postcss-normalize-url@^3.0.7: - version "3.0.8" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" - dependencies: - is-absolute-url "^2.0.0" - normalize-url "^1.4.0" - postcss "^5.0.14" - postcss-value-parser "^3.2.3" - postcss-object-fit-images@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/postcss-object-fit-images/-/postcss-object-fit-images-1.1.2.tgz#8b773043db14672ef6cd6f2cb1f0d8b26a9f573b" @@ -6338,13 +6388,6 @@ postcss-object-fit-images@^1.1.2: postcss "^5.0.16" quote "^0.4.0" -postcss-ordered-values@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" - dependencies: - postcss "^5.0.4" - postcss-value-parser "^3.0.1" - postcss-page-break@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-1.0.0.tgz#09a63b6e03db092d38569b33dcba42a343ace60b" @@ -6398,27 +6441,6 @@ postcss-pseudo-class-any-link@^4.0.0: postcss "^6.0.1" postcss-selector-parser "^2.2.3" -postcss-reduce-idents@^2.2.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" - dependencies: - postcss "^5.0.4" - postcss-value-parser "^3.0.2" - -postcss-reduce-initial@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" - dependencies: - postcss "^5.0.4" - -postcss-reduce-transforms@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" - dependencies: - has "^1.0.1" - postcss "^5.0.8" - postcss-value-parser "^3.0.1" - postcss-replace-overflow-wrap@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-2.0.0.tgz#794db6faa54f8db100854392a93af45768b4e25b" @@ -6452,7 +6474,7 @@ postcss-selector-not@^3.0.1: balanced-match "^0.4.2" postcss "^6.0.1" -postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2, postcss-selector-parser@^2.2.3: +postcss-selector-parser@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" dependencies: @@ -6484,28 +6506,11 @@ postcss-smart-import@^0.7.6: resolve "^1.5.0" sugarss "^1.0.1" -postcss-svgo@^2.1.1: - version "2.1.6" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" - dependencies: - is-svg "^2.0.0" - postcss "^5.0.14" - postcss-value-parser "^3.2.3" - svgo "^0.7.0" - -postcss-unique-selectors@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" - dependencies: - alphanum-sort "^1.0.1" - postcss "^5.0.4" - uniqs "^2.0.0" - -postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: +postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" -postcss-values-parser@^1.3.2, postcss-values-parser@^1.5.0: +postcss-values-parser@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-1.5.0.tgz#5d9fa63e2bcb0179ce48f3235303765eb89f3047" dependencies: @@ -6513,15 +6518,7 @@ postcss-values-parser@^1.3.2, postcss-values-parser@^1.5.0: indexes-of "^1.0.1" uniq "^1.0.1" -postcss-zindex@^2.0.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" - dependencies: - has "^1.0.1" - postcss "^5.0.4" - uniqs "^2.0.0" - -postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16: +postcss@^5.0.16, postcss@^5.0.5: version "5.2.18" resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" dependencies: @@ -6538,6 +6535,14 @@ postcss@^6, postcss@^6.0, postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.11, postc source-map "^0.6.1" supports-color "^5.4.0" +postcss@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.2.tgz#7b5a109de356804e27f95a960bef0e4d5bc9bb18" + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + postgres-array@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-1.0.2.tgz#8e0b32eb03bf77a5c0a7851e0441c169a256a238" @@ -6576,17 +6581,13 @@ prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" -prepend-http@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" -pretty-format@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-21.2.1.tgz#ae5407f3cf21066cd011aa1ba5fce7b6a2eddb36" +pretty-format@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760" dependencies: ansi-regex "^3.0.0" ansi-styles "^3.2.0" @@ -6623,6 +6624,13 @@ promise@^7.1.1: dependencies: asap "~2.0.3" +prompts@^0.1.9: + version "0.1.14" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-0.1.14.tgz#a8e15c612c5c9ec8f8111847df3337c9cbd443b2" + dependencies: + kleur "^2.0.1" + sisteransi "^0.1.1" + prop-types-extra@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/prop-types-extra/-/prop-types-extra-1.1.0.tgz#32609910ea2dcf190366bacd3490d5a6412a605f" @@ -6638,11 +6646,11 @@ prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.8, object-assign "^4.1.1" proxy-addr@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341" + version "2.0.4" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" dependencies: forwarded "~0.1.2" - ipaddr.js "1.6.0" + ipaddr.js "1.8.0" prr@~1.0.1: version "1.0.1" @@ -6659,12 +6667,12 @@ pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" psl@^1.1.24: - version "1.1.28" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.28.tgz#4fb6ceb08a1e2214d4fd4de0ca22dae13740bc7b" + version "1.1.29" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" public-encrypt@^4.0.0: version "4.0.2" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994" + resolved "http://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994" dependencies: bn.js "^4.1.0" browserify-rsa "^4.0.0" @@ -6679,6 +6687,13 @@ pump@^2.0.0, pump@^2.0.1: end-of-stream "^1.1.0" once "^1.3.1" +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + pumpify@^1.3.3: version "1.5.1" resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" @@ -6699,10 +6714,6 @@ punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" -q@^1.1.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - qs@6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" @@ -6711,17 +6722,10 @@ qs@~6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" -qs@~6.5.1: +qs@~6.5.1, qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" -query-string@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" - dependencies: - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" @@ -6749,8 +6753,8 @@ railroad-diagrams@^1.0.0: resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e" rails-ujs@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/rails-ujs/-/rails-ujs-5.2.0.tgz#d93f7a969a226c0ae67044172955be8c1cdf49fc" + version "5.2.1" + resolved "https://registry.yarnpkg.com/rails-ujs/-/rails-ujs-5.2.1.tgz#2869c6d54fdfefac3aaa257f4efe211d8f5a7169" randexp@0.4.6: version "0.4.6" @@ -6760,8 +6764,8 @@ randexp@0.4.6: ret "~0.1.10" randomatic@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923" + version "3.1.0" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.0.tgz#36f2ca708e9e567f5ed2ec01949026d50aa10116" dependencies: is-number "^4.0.0" kind-of "^6.0.0" @@ -6802,20 +6806,20 @@ rc@^1.1.7, rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-dom@^16.3.0: - version "16.4.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.4.1.tgz#7f8b0223b3a5fbe205116c56deb85de32685dad6" +react-dom@^16.5.0: + version "16.5.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.5.0.tgz#57704e5718669374b182a17ea79a6d24922cb27d" dependencies: - fbjs "^0.8.16" loose-envify "^1.1.0" object-assign "^4.1.1" - prop-types "^15.6.0" + prop-types "^15.6.2" + schedule "^0.3.0" react-event-listener@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/react-event-listener/-/react-event-listener-0.6.1.tgz#41c7a80a66b398c27dd511e22712b02f3d4eccca" + version "0.6.3" + resolved "https://registry.yarnpkg.com/react-event-listener/-/react-event-listener-0.6.3.tgz#8eab88129a76e095ed8aa684c29679eded1e843d" dependencies: - "@babel/runtime" "^7.0.0-beta.42" + "@babel/runtime" "7.0.0-rc.1" prop-types "^15.6.0" warning "^4.0.1" @@ -6833,8 +6837,10 @@ react-immutable-proptypes@^2.1.0: resolved "https://registry.yarnpkg.com/react-immutable-proptypes/-/react-immutable-proptypes-2.1.0.tgz#023d6f39bb15c97c071e9e60d00d136eac5fa0b4" react-immutable-pure-component@^1.1.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/react-immutable-pure-component/-/react-immutable-pure-component-1.2.2.tgz#772c8591720def73e4dc1c8e5c8bb39472ff7925" + version "1.2.3" + resolved "https://registry.yarnpkg.com/react-immutable-pure-component/-/react-immutable-pure-component-1.2.3.tgz#fa33638df68cfe9f73ccbee1d5861c17f3053f86" + optionalDependencies: + "@types/react" "16.4.6" react-intl-translations-manager@^5.0.3: version "5.0.3" @@ -6854,9 +6860,9 @@ react-intl@^2.4.0: intl-relativeformat "^2.0.0" invariant "^2.1.1" -react-is@^16.3.2, react-is@^16.4.1: - version "16.4.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.4.1.tgz#d624c4650d2c65dbd52c72622bbf389435d9776e" +react-is@^16.3.2, react-is@^16.4.2, react-is@^16.5.0: + version "16.5.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.5.0.tgz#2ec7c192709698591efe13722fab3ef56144ba55" react-lifecycles-compat@^3.0.4: version "3.0.4" @@ -6870,11 +6876,11 @@ react-motion@^0.5.2: prop-types "^15.5.8" raf "^3.1.0" -react-notification@^6.8.2: - version "6.8.2" - resolved "https://registry.yarnpkg.com/react-notification/-/react-notification-6.8.2.tgz#5d9910cc2993bd51a234d3809e94a98dc490cfb0" +react-notification@^6.8.4: + version "6.8.4" + resolved "https://registry.yarnpkg.com/react-notification/-/react-notification-6.8.4.tgz#c189d23f47b0e1b240932f4cfab2f4082cd420bf" dependencies: - prop-types "^15.5.10" + prop-types "^15.6.2" react-overlays@^0.8.3: version "0.8.3" @@ -6887,15 +6893,6 @@ react-overlays@^0.8.3: react-transition-group "^2.2.0" warning "^3.0.0" -react-reconciler@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.7.0.tgz#9614894103e5f138deeeb5eabaf3ee80eb1d026d" - dependencies: - fbjs "^0.8.16" - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.0" - react-redux-loading-bar@^2.9.3: version "2.9.3" resolved "https://registry.yarnpkg.com/react-redux-loading-bar/-/react-redux-loading-bar-2.9.3.tgz#65865dddcbf597169e787edec15eec7ebfb84149" @@ -6925,10 +6922,9 @@ react-router-dom@^4.1.1: warning "^4.0.1" react-router-scroll-4@^1.0.0-beta.1: - version "1.0.0-beta.1" - resolved "https://registry.yarnpkg.com/react-router-scroll-4/-/react-router-scroll-4-1.0.0-beta.1.tgz#b1838c6e67b9fe64db33176958e88836e10bc4ce" + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/react-router-scroll-4/-/react-router-scroll-4-1.0.0-beta.2.tgz#d887063ec0f66124aaf450158dd158ff7d3dc279" dependencies: - babel-eslint "^8.0.1" scroll-behavior "^0.9.1" warning "^3.0.0" @@ -6950,43 +6946,43 @@ react-sparklines@^1.7.0: dependencies: prop-types "^15.5.10" -react-swipeable-views-core@^0.12.11, react-swipeable-views-core@^0.12.14: - version "0.12.14" - resolved "https://registry.yarnpkg.com/react-swipeable-views-core/-/react-swipeable-views-core-0.12.14.tgz#65271fd18dd9b359e39392fe065a8067e0d7bfdb" +react-swipeable-views-core@^0.12.17: + version "0.12.17" + resolved "https://registry.yarnpkg.com/react-swipeable-views-core/-/react-swipeable-views-core-0.12.17.tgz#0998f55fd2f8595bcd01bead1c19516dc561c1cf" dependencies: - "@babel/runtime" "^7.0.0-beta.42" + "@babel/runtime" "7.0.0" warning "^4.0.1" -react-swipeable-views-utils@^0.12.13: - version "0.12.14" - resolved "https://registry.yarnpkg.com/react-swipeable-views-utils/-/react-swipeable-views-utils-0.12.14.tgz#7ba72ea8eff8149f2c50ed8abc6fb21d1e0de227" +react-swipeable-views-utils@^0.12.17: + version "0.12.17" + resolved "https://registry.yarnpkg.com/react-swipeable-views-utils/-/react-swipeable-views-utils-0.12.17.tgz#5219faa766b683d907288cdd7b86c0a14b577b7f" dependencies: - "@babel/runtime" "^7.0.0-beta.42" + "@babel/runtime" "7.0.0" fbjs "^0.8.4" keycode "^2.1.7" prop-types "^15.6.0" react-event-listener "^0.6.0" - react-swipeable-views-core "^0.12.14" + react-swipeable-views-core "^0.12.17" -react-swipeable-views@0.12.13: - version "0.12.13" - resolved "https://registry.yarnpkg.com/react-swipeable-views/-/react-swipeable-views-0.12.13.tgz#247442dbe14922efe5ad6fe0297599c817600bf9" +react-swipeable-views@^0.12.17: + version "0.12.17" + resolved "https://registry.yarnpkg.com/react-swipeable-views/-/react-swipeable-views-0.12.17.tgz#4d6a9bf4b667ce7b7aac3112d696598b94a1cf30" dependencies: - babel-runtime "^6.23.0" + "@babel/runtime" "7.0.0" dom-helpers "^3.2.1" prop-types "^15.5.4" - react-swipeable-views-core "^0.12.11" - react-swipeable-views-utils "^0.12.13" - warning "^3.0.0" + react-swipeable-views-core "^0.12.17" + react-swipeable-views-utils "^0.12.17" + warning "^4.0.1" -react-test-renderer@^16.0.0-0, react-test-renderer@^16.2.0: - version "16.4.1" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.4.1.tgz#f2fb30c2c7b517db6e5b10ed20bb6b0a7ccd8d70" +react-test-renderer@^16.0.0-0, react-test-renderer@^16.5.0: + version "16.5.0" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.5.0.tgz#1aeca0edc4f27f63265dcaed80ba82e11e762f56" dependencies: - fbjs "^0.8.16" object-assign "^4.1.1" - prop-types "^15.6.0" - react-is "^16.4.1" + prop-types "^15.6.2" + react-is "^16.5.0" + schedule "^0.3.0" react-textarea-autosize@^5.2.1: version "5.2.1" @@ -7009,14 +7005,14 @@ react-transition-group@^2.2.0: prop-types "^15.6.2" react-lifecycles-compat "^3.0.4" -react@^16.3.0: - version "16.4.1" - resolved "https://registry.yarnpkg.com/react/-/react-16.4.1.tgz#de51ba5764b5dbcd1f9079037b862bd26b82fe32" +react@^16.5.0: + version "16.5.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.5.0.tgz#f2c1e754bf9751a549d9c6d9aca41905beb56575" dependencies: - fbjs "^0.8.16" loose-envify "^1.1.0" object-assign "^4.1.1" - prop-types "^15.6.0" + prop-types "^15.6.2" + schedule "^0.3.0" read-cache@^1.0.0: version "1.0.0" @@ -7064,7 +7060,7 @@ read-pkg@^3.0.0: "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@^2.3.6: version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -7083,6 +7079,12 @@ readdirp@^2.0.0: readable-stream "^2.0.2" set-immediate-shim "^1.0.1" +realpath-native@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.2.tgz#cd51ce089b513b45cf9b1516c82989b51ccc6560" + dependencies: + util.promisify "^1.0.0" + redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" @@ -7106,20 +7108,6 @@ redis@^2.7.1: redis-commands "^1.2.0" redis-parser "^2.6.0" -reduce-css-calc@^1.2.6: - version "1.3.0" - resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" - dependencies: - balanced-match "^0.4.2" - math-expression-evaluator "^1.2.14" - reduce-function-call "^1.0.1" - -reduce-function-call@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" - dependencies: - balanced-match "^0.4.2" - redux-immutable@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/redux-immutable/-/redux-immutable-4.0.0.tgz#3a1a32df66366462b63691f0e1dc35e472bbc9f3" @@ -7137,7 +7125,13 @@ redux@^3.7.1: loose-envify "^1.1.0" symbol-observable "^1.0.3" -regenerate@^1.2.1: +regenerate-unicode-properties@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" + dependencies: + regenerate "^1.4.0" + +regenerate@^1.2.1, regenerate@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" @@ -7146,15 +7140,13 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" regenerator-runtime@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.0.tgz#8052ac952d85b10f3425192cd0c53f45cf65c6cb" + version "0.12.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" +regenerator-transform@^0.13.3: + version "0.13.3" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb" dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" private "^0.1.6" regex-cache@^0.4.2: @@ -7182,24 +7174,37 @@ regexpu-core@^1.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" +regexpu-core@^4.1.3, regexpu-core@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.2.0.tgz#a3744fa03806cffe146dea4421a3e73bdcc47b1d" dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" + regenerate "^1.4.0" + regenerate-unicode-properties "^7.0.0" + regjsgen "^0.4.0" + regjsparser "^0.3.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.0.2" regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" +regjsgen@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.4.0.tgz#c1eb4c89a209263f8717c782591523913ede2561" + regjsparser@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" dependencies: jsesc "~0.5.0" +regjsparser@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.3.0.tgz#3c326da7fcfd69fa0d332575a41c8c0cdf588c96" + dependencies: + jsesc "~0.5.0" + rellax@^1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/rellax/-/rellax-1.6.2.tgz#b22c8715f56324fa8b396465d3dca9953b711f30" @@ -7209,8 +7214,8 @@ remove-trailing-separator@^1.0.1: resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" @@ -7222,7 +7227,21 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request@2.81.0, "request@>=2.9.0 <2.82.0": +request-promise-core@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" + dependencies: + lodash "^4.13.1" + +request-promise-native@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" + dependencies: + request-promise-core "1.1.1" + stealthy-require "^1.1.0" + tough-cookie ">=2.3.3" + +request@2.81.0: version "2.81.0" resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" dependencies: @@ -7249,7 +7268,7 @@ request@2.81.0, "request@>=2.9.0 <2.82.0": tunnel-agent "^0.6.0" uuid "^3.0.0" -request@2.87.0, request@^2.79.0: +request@2.87.0: version "2.87.0" resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" dependencies: @@ -7274,15 +7293,40 @@ request@2.87.0, request@^2.79.0: tunnel-agent "^0.6.0" uuid "^3.1.0" +request@^2.87.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + requestidlecallback@^0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/requestidlecallback/-/requestidlecallback-0.3.0.tgz#6fb74e0733f90df3faa4838f9f6a2a5f9b742ac5" + resolved "http://registry.npmjs.org/requestidlecallback/-/requestidlecallback-0.3.0.tgz#6fb74e0733f90df3faa4838f9f6a2a5f9b742ac5" require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" -require-from-string@^2.0.1: +require-from-string@^2.0.1, require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" @@ -7335,7 +7379,7 @@ resolve@1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" -resolve@^1.5.0, resolve@^1.6.0: +resolve@^1.3.2, resolve@^1.5.0, resolve@^1.6.0, resolve@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" dependencies: @@ -7352,12 +7396,6 @@ ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - dependencies: - align-text "^0.1.1" - rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" @@ -7405,8 +7443,8 @@ rx-lite@*, rx-lite@^4.0.8: resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" rxjs@^6.1.0: - version "6.2.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.2.tgz#eb75fa3c186ff5289907d06483a77884586e1cf9" + version "6.3.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.2.tgz#6a688b16c4e6e980e62ea805ec30648e1c60907f" dependencies: tslib "^1.9.0" @@ -7414,7 +7452,7 @@ safe-buffer@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -7424,7 +7462,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2: +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -7453,26 +7491,41 @@ sass-graph@^2.2.4: yargs "^7.0.0" sass-loader@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.0.3.tgz#6ca10871a1cc7549f8143db5a9958242c4e4ca2a" + version "7.1.0" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.1.0.tgz#16fd5138cb8b424bf8a759528a1972d72aad069d" dependencies: clone-deep "^2.0.1" loader-utils "^1.0.1" lodash.tail "^4.1.1" neo-async "^2.5.0" pify "^3.0.0" + semver "^5.5.0" -sax@^1.2.1, sax@^1.2.4, sax@~1.2.1: +sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" -schema-utils@^0.4.0, schema-utils@^0.4.4, schema-utils@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e" +schedule@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/schedule/-/schedule-0.3.0.tgz#1be2ab2fc2e768536269ce7326efb478d6c045e8" + dependencies: + object-assign "^4.1.1" + +schema-utils@^0.4.4, schema-utils@^0.4.5: + version "0.4.7" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" dependencies: ajv "^6.1.0" ajv-keywords "^3.1.0" +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + scroll-behavior@^0.9.1: version "0.9.9" resolved "https://registry.yarnpkg.com/scroll-behavior/-/scroll-behavior-0.9.9.tgz#ebfe0658455b82ad885b66195215416674dacce2" @@ -7498,8 +7551,8 @@ selfsigned@^1.9.1: node-forge "0.7.5" "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + version "5.5.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" semver@4.3.2: version "4.3.2" @@ -7592,7 +7645,7 @@ setprototypeof@1.1.0: sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + resolved "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" @@ -7638,6 +7691,10 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" +sisteransi@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-0.1.1.tgz#5431447d5f7d1675aac667ccd0b865a4994cb3ce" + slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" @@ -7681,9 +7738,9 @@ sntp@1.x.x: dependencies: hoek "2.x.x" -sockjs-client@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.4.tgz#5babe386b775e4cf14e7520911452654016c8b12" +sockjs-client@1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.5.tgz#1bb7c0f7222c40f42adf14f4442cbd1269771a83" dependencies: debug "^2.6.6" eventsource "0.1.6" @@ -7699,12 +7756,6 @@ sockjs@0.3.19: faye-websocket "^0.10.0" uuid "^3.0.1" -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - dependencies: - is-plain-obj "^1.0.0" - source-list-map@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" @@ -7725,21 +7776,28 @@ source-map-support@^0.4.15: dependencies: source-map "^0.5.6" +source-map-support@^0.5.6: + version "0.5.9" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" -source-map@^0.4.2, source-map@^0.4.4: +source-map@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" dependencies: amdefine ">=0.0.4" -source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" -source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -7762,8 +7820,8 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz#e2a303236cac54b04031fa7a5a79c7e701df852f" spdy-transport@^2.0.18: version "2.1.0" @@ -7794,13 +7852,7 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" -split@0.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" - dependencies: - through "2" - -split@^1.0.0: +split@^1.0.0, split@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" dependencies: @@ -7831,6 +7883,16 @@ ssri@^5.2.4: dependencies: safe-buffer "^5.1.1" +ssri@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + dependencies: + figgy-pudding "^3.5.1" + +stack-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620" + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -7847,11 +7909,15 @@ statuses@~1.4.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" stdout-stream@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b" + version "1.4.1" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" dependencies: readable-stream "^2.0.1" +stealthy-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + stream-browserify@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" @@ -7859,15 +7925,16 @@ stream-browserify@^2.0.1: inherits "~2.0.1" readable-stream "^2.0.2" -stream-combiner@~0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" +stream-combiner@^0.2.2: + version "0.2.2" + resolved "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz#aec8cbac177b56b6f4fa479ced8c1912cee52858" dependencies: duplexer "~0.1.1" + through "~2.3.4" stream-each@^1.1.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd" + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" dependencies: end-of-stream "^1.1.0" stream-shift "^1.0.0" @@ -7886,10 +7953,6 @@ stream-shift@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - string-length@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" @@ -7920,6 +7983,14 @@ string.prototype.padend@^3.0.0: es-abstract "^1.4.3" function-bind "^1.0.2" +string.prototype.trim@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.0" + function-bind "^1.0.2" + string_decoder@^1.0.0, string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -7970,9 +8041,9 @@ strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" -style-loader@^0.21.0: - version "0.21.0" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.21.0.tgz#68c52e5eb2afc9ca92b6274be277ee59aea3a852" +style-loader@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.0.tgz#8377fefab68416a2e05f1cabd8c3a3acfcce74f1" dependencies: loader-utils "^1.1.0" schema-utils "^0.4.5" @@ -7998,28 +8069,16 @@ supports-color@^3.1.2, supports-color@^3.2.3: has-flag "^1.0.0" supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.4.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" dependencies: has-flag "^3.0.0" -svgo@^0.7.0: - version "0.7.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" - dependencies: - coa "~1.0.1" - colors "~1.1.2" - csso "~2.3.1" - js-yaml "~3.7.0" - mkdirp "~0.5.1" - sax "~1.2.1" - whet.extend "~0.9.9" - symbol-observable@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" -symbol-tree@^3.2.1: +symbol-tree@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" @@ -8035,8 +8094,8 @@ table@4.0.2: string-width "^2.1.1" tapable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" + version "1.1.0" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.0.tgz#0d076a172e3d9ba088fd2272b2668fb8d194b78c" tar-pack@^3.4.0: version "3.4.1" @@ -8060,8 +8119,8 @@ tar@^2.0.0, tar@^2.2.1: inherits "2" tar@^4: - version "4.4.4" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd" + version "4.4.6" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" dependencies: chownr "^1.0.1" fs-minipass "^1.2.5" @@ -8080,16 +8139,16 @@ tcomb@^3.2.21: resolved "https://registry.yarnpkg.com/tcomb/-/tcomb-3.2.27.tgz#f4928bfc536b959d21a47e5f5f1ca2b2e4b7188a" test-exclude@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.1.tgz#dfa222f03480bca69207ca728b37d74b45f724fa" + version "4.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.3.tgz#a9a5e64474e4398339245a0a769ad7c2f4a97c20" dependencies: arrify "^1.0.1" - micromatch "^3.1.8" + micromatch "^2.3.11" object-assign "^4.1.0" read-pkg-up "^1.0.1" require-main-filename "^1.0.1" -text-table@^0.2.0, text-table@~0.2.0: +text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -8110,9 +8169,9 @@ through2@^2.0.0: readable-stream "^2.1.5" xtend "~4.0.1" -through@2, through@^2.3.6, through@~2.3, through@~2.3.1: +through@2, through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.4: version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + resolved "http://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" thunky@^1.0.2: version "1.0.2" @@ -8172,7 +8231,7 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" -tough-cookie@^2.3.2: +tough-cookie@>=2.3.3, tough-cookie@^2.3.4, tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" dependencies: @@ -8185,9 +8244,11 @@ tough-cookie@~2.3.0, tough-cookie@~2.3.3: dependencies: punycode "^1.4.1" -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + dependencies: + punycode "^2.1.0" trim-newlines@^1.0.0: version "1.0.0" @@ -8198,10 +8259,10 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" "true-case-path@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.2.tgz#7ec91130924766c7f573be3020c34f8fdfd00d62" + version "1.0.3" + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" dependencies: - glob "^6.0.4" + glob "^7.1.2" tryer@^1.0.0: version "1.0.1" @@ -8253,22 +8314,16 @@ uglify-es@^3.3.4: commander "~2.13.0" source-map "~0.6.1" -uglify-js@^2.6: - version "2.8.29" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" +uglify-js@^3.1.4: + version "3.4.9" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + commander "~2.17.1" + source-map "~0.6.1" uglifyjs-webpack-plugin@^1.2.4, uglifyjs-webpack-plugin@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.7.tgz#57638dd99c853a1ebfe9d97b42160a8a507f9d00" + version "1.3.0" + resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz#75f548160858163a08643e086d5fefe18a5d67de" dependencies: cacache "^10.0.4" find-cache-dir "^1.0.0" @@ -8287,6 +8342,25 @@ underscore@~1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.4.4.tgz#61a6a32010622afa07963bf325203cf12239d604" +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz#9f1dc76926d6ccf452310564fd834ace059663d4" + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0" + union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" @@ -8300,10 +8374,6 @@ uniq@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" -uniqs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" - unique-filename@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" @@ -8316,6 +8386,10 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -8335,7 +8409,7 @@ upath@^1.0.5: version "1.1.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" -uri-js@^4.2.1: +uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" dependencies: @@ -8349,9 +8423,9 @@ url-join@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.0.tgz#4d3340e807d3773bda9991f8305acdcc2a665d2a" -url-parse@^1.1.8, url-parse@~1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.1.tgz#4dec9dad3dc8585f862fed461d2e19bbf623df30" +url-parse@^1.1.8, url-parse@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.3.tgz#bfaee455c889023219d757e045fa6a684ec36c15" dependencies: querystringify "^2.0.0" requires-port "^1.0.0" @@ -8371,6 +8445,13 @@ util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" +util.promisify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" @@ -8387,7 +8468,7 @@ utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" -uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0: +uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0, uuid@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" @@ -8396,12 +8477,12 @@ uws@10.148.0: resolved "https://registry.yarnpkg.com/uws/-/uws-10.148.0.tgz#3fcd35f083ca515e091cd33b2d78f0f51a666215" v8-compile-cache@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.0.tgz#526492e35fc616864284700b7043e01baee09f0a" + version "2.0.2" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz#a428b28bb26790734c4fc8bc9fa106fccebf6a6c" validate-npm-package-license@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" dependencies: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" @@ -8414,10 +8495,6 @@ vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" -vendors@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" - verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -8432,6 +8509,12 @@ vm-browserify@0.0.4: dependencies: indexof "0.0.1" +w3c-hr-time@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + dependencies: + browser-process-hrtime "^0.1.2" + walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" @@ -8445,8 +8528,8 @@ warning@^3.0.0: loose-envify "^1.0.0" warning@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.1.tgz#66ce376b7fbfe8a887c22bdf0e7349d73d397745" + version "4.0.2" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.2.tgz#aa6876480872116fa3e11d434b0d0d8d91e44607" dependencies: loose-envify "^1.0.0" @@ -8471,11 +8554,7 @@ wbuf@^1.1.0, wbuf@^1.7.2: dependencies: minimalistic-assert "^1.0.0" -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - -webidl-conversions@^4.0.0: +webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" @@ -8497,8 +8576,8 @@ webpack-bundle-analyzer@^2.13.1: ws "^4.0.0" webpack-cli@^3.0.8: - version "3.0.8" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.0.8.tgz#90eddcf04a4bfc31aa8c0edc4c76785bc4f1ccd9" + version "3.1.0" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.1.0.tgz#d71a83687dcfeb758fdceeb0fe042f96bcf62994" dependencies: chalk "^2.4.1" cross-spawn "^6.0.5" @@ -8510,26 +8589,25 @@ webpack-cli@^3.0.8: loader-utils "^1.1.0" supports-color "^5.4.0" v8-compile-cache "^2.0.0" - yargs "^11.1.0" + yargs "^12.0.1" -webpack-dev-middleware@3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.1.3.tgz#8b32aa43da9ae79368c1bf1183f2b6cf5e1f39ed" +webpack-dev-middleware@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.2.0.tgz#a20ceef194873710052da678f3c6ee0aeed92552" dependencies: loud-rejection "^1.6.0" memory-fs "~0.4.1" - mime "^2.1.0" + mime "^2.3.1" path-is-absolute "^1.0.0" range-parser "^1.0.3" url-join "^4.0.0" - webpack-log "^1.0.1" + webpack-log "^2.0.0" -webpack-dev-server@^3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.1.4.tgz#9a08d13c4addd1e3b6d8ace116e86715094ad5b4" +webpack-dev-server@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.1.8.tgz#eb7a95945d1108170f902604fb3b939533d9daeb" dependencies: ansi-html "0.0.7" - array-includes "^3.0.3" bonjour "^3.5.0" chokidar "^2.0.0" compression "^1.5.2" @@ -8539,70 +8617,68 @@ webpack-dev-server@^3.1.4: express "^4.16.2" html-entities "^1.2.0" http-proxy-middleware "~0.18.0" - import-local "^1.0.0" - internal-ip "1.2.0" + import-local "^2.0.0" + internal-ip "^3.0.1" ip "^1.1.5" killable "^1.0.0" loglevel "^1.4.1" opn "^5.1.0" portfinder "^1.0.9" + schema-utils "^1.0.0" selfsigned "^1.9.1" serve-index "^1.7.2" sockjs "0.3.19" - sockjs-client "1.1.4" + sockjs-client "1.1.5" spdy "^3.4.1" strip-ansi "^3.0.0" supports-color "^5.1.0" - webpack-dev-middleware "3.1.3" - webpack-log "^1.1.2" - yargs "11.0.0" + webpack-dev-middleware "3.2.0" + webpack-log "^2.0.0" + yargs "12.0.2" -webpack-log@^1.0.1, webpack-log@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-1.2.0.tgz#a4b34cda6b22b518dbb0ab32e567962d5c72a43d" +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" dependencies: - chalk "^2.1.0" - log-symbols "^2.1.0" - loglevelnext "^1.0.1" - uuid "^3.1.0" + ansi-colors "^3.0.0" + uuid "^3.3.2" -webpack-manifest-plugin@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-2.0.3.tgz#b42c5b08a0319cedb3ec45d9375a9ecee0acf5eb" +webpack-manifest-plugin@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-2.0.4.tgz#e4ca2999b09557716b8ba4475fb79fab5986f0cd" dependencies: - fs-extra "^0.30.0" + fs-extra "^7.0.0" lodash ">=3.5 <5" tapable "^1.0.0" webpack-merge@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.1.3.tgz#8aaff2108a19c29849bc9ad2a7fd7fce68e87c4a" + version "4.1.4" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.1.4.tgz#0fde38eabf2d5fd85251c24a5a8c48f8a3f4eb7b" dependencies: lodash "^4.17.5" -webpack-sources@^1.0.1, webpack-sources@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" +webpack-sources@^1.0.1, webpack-sources@^1.1.0, webpack-sources@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.2.0.tgz#18181e0d013fce096faf6f8e6d41eeffffdceac2" dependencies: source-list-map "^2.0.0" source-map "~0.6.1" -webpack@^4.16.0: - version "4.16.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.16.0.tgz#660dae90890e55b8ed17c6f9d17bebb01dab5b4c" +webpack@^4.18.0: + version "4.18.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.18.0.tgz#7dafaaf309c12e63080d3960fba7ed94afdcbe84" dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-module-context" "1.5.13" - "@webassemblyjs/wasm-edit" "1.5.13" - "@webassemblyjs/wasm-opt" "1.5.13" - "@webassemblyjs/wasm-parser" "1.5.13" + "@webassemblyjs/ast" "1.7.6" + "@webassemblyjs/helper-module-context" "1.7.6" + "@webassemblyjs/wasm-edit" "1.7.6" + "@webassemblyjs/wasm-parser" "1.7.6" acorn "^5.6.2" acorn-dynamic-import "^3.0.0" ajv "^6.1.0" ajv-keywords "^3.1.0" chrome-trace-event "^1.0.0" enhanced-resolve "^4.1.0" - eslint-scope "^3.7.1" + eslint-scope "^4.0.0" json-parse-better-errors "^1.0.2" loader-runner "^2.3.0" loader-utils "^1.1.0" @@ -8615,7 +8691,7 @@ webpack@^4.16.0: tapable "^1.0.0" uglifyjs-webpack-plugin "^1.2.4" watchpack "^1.5.0" - webpack-sources "^1.0.1" + webpack-sources "^1.2.0" websocket-driver@>=0.5.1: version "0.7.0" @@ -8634,26 +8710,35 @@ websocket.js@^0.1.12: dependencies: backoff "^2.4.1" -whatwg-encoding@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.4.tgz#63fb016b7435b795d9025632c086a5209dbd2621" dependencies: - iconv-lite "0.4.19" + iconv-lite "0.4.23" whatwg-fetch@>=0.10.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" + +whatwg-mimetype@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" -whatwg-url@^4.3.0: - version "4.8.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0" +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" -whet.extend@~0.9.9: - version "0.9.9" - resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" +whatwg-url@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" which-module@^1.0.0: version "1.0.0" @@ -8675,14 +8760,6 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" @@ -8691,7 +8768,7 @@ wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" -worker-farm@^1.3.1, worker-farm@^1.5.2: +worker-farm@^1.5.2: version "1.6.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" dependencies: @@ -8699,7 +8776,7 @@ worker-farm@^1.3.1, worker-farm@^1.5.2: wrap-ansi@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + resolved "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" @@ -8729,9 +8806,19 @@ ws@^4.0.0: async-limiter "~1.0.0" safe-buffer "~5.1.0" -xml-name-validator@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" +ws@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + dependencies: + async-limiter "~1.0.0" + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + +xregexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" xtend@^4.0.0, xtend@~4.0.1: version "4.0.1" @@ -8741,7 +8828,7 @@ y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" -y18n@^4.0.0: +"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" @@ -8753,6 +8840,12 @@ yallist@^3.0.0, yallist@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" +yargs-parser@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + dependencies: + camelcase "^4.1.0" + yargs-parser@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" @@ -8771,26 +8864,26 @@ yargs-parser@^9.0.2: dependencies: camelcase "^4.1.0" -yargs@11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.0.0.tgz#c052931006c5eee74610e5fc0354bedfd08a201b" +yargs@12.0.2, yargs@^12.0.1: + version "12.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc" dependencies: cliui "^4.0.0" - decamelize "^1.1.1" - find-up "^2.1.0" + decamelize "^2.0.0" + find-up "^3.0.0" get-caller-file "^1.0.1" - os-locale "^2.0.0" + os-locale "^3.0.0" require-directory "^2.1.1" require-main-filename "^1.0.1" set-blocking "^2.0.0" string-width "^2.0.0" which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^9.0.2" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^10.1.0" -yargs@^11.1.0: +yargs@^11.0.0: version "11.1.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" + resolved "http://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" dependencies: cliui "^4.0.0" decamelize "^1.1.1" @@ -8840,30 +8933,3 @@ yargs@^8.0.2: which-module "^2.0.0" y18n "^3.2.1" yargs-parser "^7.0.0" - -yargs@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c" - dependencies: - camelcase "^4.1.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - read-pkg-up "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^7.0.0" - -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" |