diff --git a/.gitignore b/.gitignore index 1af7f1de..64e525cd 100644 --- a/.gitignore +++ b/.gitignore @@ -7,10 +7,14 @@ elm-stuff result _site/ *.qcow2 -/website/site/content/docs/changelog/ +/website/site/content/docs/install/changelog.md /website/site/public/ /website/site/static/openapi/ /website/site/static/js/bundle.js +/website/site/static/styles.css +/website/site/static/syntax-*.css +/website/site/static/webfonts/ +/website/site/static/files/*.woff* /website/site/templates/shortcodes/server.conf /website/site/templates/shortcodes/sample-exim.conf /website/site/templates/shortcodes/joex.conf diff --git a/build.sbt b/build.sbt index 3f1d6966..2e957fb6 100644 --- a/build.sbt +++ b/build.sbt @@ -840,19 +840,17 @@ val website = project }.taskValue, Compile / resourceGenerators += Def.task { val changelog = (LocalRootProject / baseDirectory).value / "Changelog.md" - val targetDir = baseDirectory.value / "site" / "content" / "docs" / "changelog" + val targetDir = baseDirectory.value / "site" / "content" / "docs" / "install" IO.createDirectory(targetDir) - val target = targetDir / "_index.md" + val target = targetDir / "changelog.md" IO.write( target, """|+++ |title = "Changelog" |description = "See what changed between releases." - |weight = 10 + |weight = 10000 |insert_anchor_links = "right" - |[extra] - |maketoc = false |+++ |""".stripMargin ) diff --git a/project/Cmd.scala b/project/Cmd.scala index 9d0c8533..cf5535f5 100644 --- a/project/Cmd.scala +++ b/project/Cmd.scala @@ -15,6 +15,7 @@ object Cmd { } def run(cmd: Seq[String], wd: File, logger: Logger): Unit = { + logger.info(s"Running ${cmd.mkString(" ")}") val res = Cmd.exec(cmd, Some(wd)) logger.info(res.out) logger.error(res.err) diff --git a/project/ZolaPlugin.scala b/project/ZolaPlugin.scala index b6e8811d..afa3f8bb 100644 --- a/project/ZolaPlugin.scala +++ b/project/ZolaPlugin.scala @@ -2,6 +2,7 @@ package docspell.build import sbt._ import sbt.Keys._ +import sbt.nio.file.FileTreeView import scala.sys.process._ object ZolaPlugin extends AutoPlugin { @@ -74,10 +75,12 @@ object ZolaPlugin extends AutoPlugin { case Some(url) => Seq("--base-url", url) case None => - runYarnInstall("yarn", inDir.getParentFile, logger) - runElmCompile("elm", inDir.getParentFile, inDir, logger) Seq.empty } + runYarnInstall("yarn", inDir.getParentFile, logger) + runElmCompile("elm", inDir.getParentFile, inDir, logger) + runTailwind("npx", inDir.getParentFile, inDir, logger) + Cmd.run( Seq(zolaCmd, "build", "-o", outDir.absolutePath.toString) ++ baseUrl, inDir, @@ -106,4 +109,39 @@ object ZolaPlugin extends AutoPlugin { logger ) + def runTailwind(npx: String, inDir: File, zolaRoot: File, logger: Logger): Unit = { + val fontTarget = zolaRoot / "static" / "files" + val iconTarget = zolaRoot / "static" / "webfonts" + IO.createDirectories(Seq(fontTarget, iconTarget)) + + val fontIn = Glob(inDir / "node_modules" / "@fontsource") / * / "files" / * + val fontInFiles = FileTreeView.default.list(fontIn).map(_._1.toFile()) + logger.info(s"Copy ${fontInFiles.size} webfonts from node_modules to ${fontTarget}…") + IO.copy(fontInFiles.pair(Path.flat(fontTarget))) + + val iconIn = + Glob(inDir / "node_modules" / "@fortawesome" / "fontawesome-free" / "webfonts") / * + val iconInFiles = FileTreeView.default.list(iconIn).map(_._1.toFile()) + logger.info(s"Copy ${iconInFiles.size} icons from node_modules to ${iconTarget}…") + IO.copy(iconInFiles.pair(Path.flat(iconTarget))) + + logger.info("Running tailwind…") + Cmd.run( + Seq( + npx, + "tailwindcss", + "-i", + (inDir / "styles" / "input.css").toString, + "-o", + (zolaRoot / "static" / "styles.css").toString, + "--config", + (inDir / "tailwind.config.js").toString, + "--postcss", + (inDir / "postcss.config.js").toString, + "--minify" + ), + inDir, + logger + ) + } } diff --git a/website/README.md b/website/README.md index d78c17e7..66c63ed6 100644 --- a/website/README.md +++ b/website/README.md @@ -8,61 +8,61 @@ The website is created using [zola](https://github.com/getzola/zola) static site generator. The (very minimal) dynamic parts are written in Elm. -The `build.sh` script builds the site. +Sbt is used to build the site. ## Development Install things by running `yarn install`. -Open two terminals. In first run: +Open terminal for each script below: -``` shell -nix-shell --run ./run-elm.sh -``` - -and in the second - -``` shell -nix-shell --run "cd site && zola serve" -``` +1. Starting the server + ``` shell + nix-shell --run "cd site && zola serve" + ``` +2. Building the stylesheet + ``` shell + nix-shell --run ./scripts/run-styles.sh + ``` +3. Building some javascript files + ``` shell + nix-shell --run ./scripts/run-elm.sh + ``` Open browser at `localhost:1111`. ## Publishing +The above is great when editing, but doesn't fully reflect what will +be finally deployed. To see this, start sbt and change into the +website project. + ``` shell nix-shell website/shell.nix --run sbt sbt> project website ``` -### Check Links +Build everything and check for dead links: ``` scala -sbt> zolaBuild +sbt> zolaBuildTest sbt> zolaCheck ``` ### Testing ``` scala -sbt> zolaBuildTest sbt> ghpagesSynchLocal ``` -Other terminal: +The final site is now generated and a simple http server can be used +to see how it will look when deployed. ``` shell cd ~/.sbt/ghpages//com.github.eikek/docspell-website -python -m SimpleHTTPServer 1234 +python -m http.server 1234 ``` Open http://localhost:1234 in a browser. - -### Publish - -``` scala -sbt> zolaBuild -sbt> ghpagesPushSite -``` diff --git a/website/elm/Demo.elm b/website/elm/Demo.elm index 74d365f5..d20b0c0d 100644 --- a/website/elm/Demo.elm +++ b/website/elm/Demo.elm @@ -14,25 +14,21 @@ type alias Demo = demo : Demo -> Html msg demo data = - div [ class "columns is-vcentered box mb-5" ] - [ div [ class "column" ] - [ h2 [ class "title" ] - [ text data.title - ] - , if data.info == "" then - span [] [] + div [ class "px-4 py-4 mx-2 sm:mx-8 rounded border shadow-lg flex flex-col" ] + [ h2 [ class "text-3xl font-bold py-2 font-serif" ] + [ text data.title + ] + , if data.info == "" then + span [] [] - else - p [] - [ Markdown.toHtml [] data.info - ] - , div [ class "mt-5 columns is-centered" ] - [ video - [ src data.url - , controls True - ] - [] + else + Markdown.toHtml [ class "text-lg" ] data.info + , div [ class "mt-6 self-center" ] + [ video + [ src data.url + , controls True ] + [] ] ] diff --git a/website/elm/Feature.elm b/website/elm/Feature.elm index 3489c4be..37e86a3f 100644 --- a/website/elm/Feature.elm +++ b/website/elm/Feature.elm @@ -14,38 +14,66 @@ type alias Feature = featureBox : Int -> Feature -> Html msg featureBox index f = - case isOdd index of - False -> - div [ class "columns is-vcentered box mb-5" ] - [ div [ class "column is-three-quarter" ] - [ figure [ class "image is-2by1 feature-image" ] - [ img [ src f.image ] [] - ] - ] - , div [ class "column" ] - [ h2 [ class "title" ] - [ text f.header - ] - , Markdown.toHtml [] - f.description - ] - ] + let + titleCss = + "text-3xl font-bold font-serif mb-3" - True -> - div [ class "columns is-vcentered box mb-5" ] - [ div [ class "column is-three-quarter" ] - [ h2 [ class "title" ] - [ text f.header - ] - , Markdown.toHtml [] - f.description - ] - , div [ class "column" ] - [ figure [ class "image is-2by1 feature-image" ] - [ img [ src f.image ] [] + boxCss = + [ class "flex-col space-y-2" + , class "sm:flex-row sm:space-y-0 sm-space-x-4" + , class "flex px-8 py-8 border rounded mb-5 shadow-lg mx-2 sm:mx-8" + ] + + descrCss = + "flex flex-col text-xl " + in + if isOdd index then + div boxCss + [ div [ class "sm:w-1/2" ] + [ figure [ class "block my-auto" ] + [ img + [ src f.image + , class "w-full" + , style "min-width" "4rem" ] + [] ] ] + , div + [ class descrCss + , class "pl-4 sm:w-1/2" + ] + [ h2 [ class titleCss ] + [ text f.header + ] + , Markdown.toHtml [] + f.description + ] + ] + + else + div + boxCss + [ div + [ class descrCss + , class "pr-4 sm:w-1/2" + ] + [ h2 [ class titleCss ] + [ text f.header + ] + , Markdown.toHtml [] + f.description + ] + , div [ class "sm:w-1/2" ] + [ figure [ class "block my-auto " ] + [ img + [ src f.image + , class "w-full" + ] + [] + ] + ] + ] features : List Feature @@ -105,7 +133,7 @@ Users can define IMAP settings so that docspell can import their e-mails. This c , { image = "img/notify-feature.png" , header = "Notifications" , description = """ -Users can be notified by e-mail for documents whose due-date comes closer. +Users can be notified by e-mail, Matrix or Gotify with documents resulting from a query that is executed periodically. Notifications can also be configured for specific events. """ } ] diff --git a/website/elm/GetStarted.elm b/website/elm/GetStarted.elm index 42748a2c..2f529cc0 100644 --- a/website/elm/GetStarted.elm +++ b/website/elm/GetStarted.elm @@ -2,35 +2,32 @@ module GetStarted exposing (..) import Html exposing (..) import Html.Attributes exposing (..) -import Icons import Markdown -getStarted : String -> List (Html msg) -getStarted version = - [ div [ class "content container" ] - [ Markdown.toHtml [] +getStarted : String -> Html msg +getStarted _ = + div [ class "container max-w-screen-lg mx-auto text-xl px-10 lg:px-0 leading-relaxed min-h-screen" ] + [ Markdown.toHtml [ class "my-4 markdown-view" ] """Docspell consists of several components. The easiest way to get started is probably to use docker and [docker-compose](https://docs.docker.com/compose/).""" - , Markdown.toHtml [] + , Markdown.toHtml [ class "my-4 markdown-view " ] """1. Clone the github repository ```bash $ git clone https://github.com/eikek/docspell ``` Alternatively, [download](https://github.com/eikek/docspell/archive/master.zip) the sources and extract the zip file. -2. Change into the `docker` directory: +2. Change into the `docker-compose` directory: ```bash $ cd docspell/docker/docker-compose ``` 3. Run `docker-compose up`: - ```bash $ docker-compose up -d ``` 4. Goto , signup and login. When signing up, choose the same name for collective and user. Then login with this name and the password. - 5. (Optional) Create a folder `./docs/` (the name you chose for the collective at registration) and place files in there for importing them. @@ -38,58 +35,51 @@ getStarted version = The `docker-compose.yml` file defines some environment variables to configure docspell. You can [modify](docs/configure) them as needed. """ - ] - , div [ class "content container" ] - [ div [ class "notification is-info is-light" ] + , div [ class "blue-message" ] [ text "If you don't use docker, there are other ways that are " , text "described in the relevant " - , a [ href "/docs/install" ] + , a [ href "/docs/install", class "link" ] [ text "documentation page" ] ] - ] - , div [ class "content container" ] - [ div [ class "notification is-success is-light" ] - [ div [ class "content is-medium" ] - [ h3 [ class "title" ] - [ text "Where to go from here?" + , div [ class "green-message mt-4 " ] + [ h3 [ class "text-4xl font-bold font-serif py-2 mb-2" ] + [ text "Where to go from here?" + ] + , ul [ class "list-disc list-inside " ] + [ li [] + [ text "Find out " + , a [ href "/docs/feed" ] + [ text "how files can get into Docspell." + ] ] - , ul [] - [ li [] - [ text "Find out " - , a [ href "/docs/feed" ] - [ text "how files can get into Docspell." - ] + , li [] + [ text "The " + , a [ href "/docs/intro" ] + [ text "introduction" ] + , text " writes about the goals and basic idea." + ] + , li [] + [ text "There is a comprehensive " + , a [ href "/docs" ] + [ text "documentation" ] - , li [] - [ text "The " - , a [ href "/docs/intro" ] - [ text "introduction" ] - , text " writes about the goals and basic idea." + , text " available." + ] + , li [] + [ text "The source code is hosted on " + , a [ href "https://github.com/eikek/docspell" ] + [ text "github" ] - , li [] - [ text "There is a comprehensive " - , a [ href "/docs" ] - [ text "documentation" - ] - , text " available." - ] - , li [] - [ text "The source code is hosted on " - , a [ href "https://github.com/eikek/docspell" ] - [ text "github" - ] - , text "." - ] - , li [] - [ text "Chat on " - , a [ href "https://gitter.im/eikek/docspell" ] - [ text "Gitter" - ] - , text " for questions and feedback." + , text "." + ] + , li [] + [ text "Chat on " + , a [ href "https://gitter.im/eikek/docspell" ] + [ text "Gitter" ] + , text " for questions and feedback." ] ] ] ] - ] diff --git a/website/elm/Icons.elm b/website/elm/Icons.elm index 1e16ec5a..e400ede1 100644 --- a/website/elm/Icons.elm +++ b/website/elm/Icons.elm @@ -6,7 +6,7 @@ import Html.Attributes exposing (..) copyright : Html msg copyright = - img [ src "icons/copyright-40.svg" ] [] + i [ class "fa fa-copyright font-thin" ] [] infoSquared : Html msg @@ -36,19 +36,24 @@ logoWidth w = home : Html msg home = - img [ src "icons/home-40.svg" ] [] + i [ class "fa fa-home" ] [] docs : Html msg docs = - img [ src "icons/notes-40.svg" ] [] + i [ class "fa fa-book" ] [] github : Html msg github = - img [ src "/icons/github-40.svg" ] [] + i [ class "fab fa-github-alt" ] [] githubGreen : Html msg githubGreen = img [ src "/icons/github-40-green.svg" ] [] + + +blog : Html msg +blog = + i [ class "fa fa-blog" ] [] diff --git a/website/elm/Main.elm b/website/elm/Main.elm index 62e23140..d686a6e0 100644 --- a/website/elm/Main.elm +++ b/website/elm/Main.elm @@ -1,7 +1,6 @@ module Main exposing (..) -import Browser exposing (Document) -import Browser.Navigation exposing (Key) +import Browser import Demo import ExtraAttr exposing (..) import Feature exposing (Feature) @@ -109,34 +108,33 @@ subscriptions _ = view : Model -> Html Msg view model = node "body" - [] + [ class "text-gray-700" ] [ mainHero model - , demoHero - , section [ class "section" ] - [ div [ class "container" ] + , demoHeader + , section [ class "container max-w-screen-xl mx-auto mb-2" ] + [ div [ class "mt-3 flex flex-col space-y-4" ] [ Demo.demo Demo.processDemo , Demo.demo Demo.navigateDemo ] ] - , featureHero model - , section [ class "section" ] - [ div [ class "container" ] - (List.indexedMap Feature.featureBox model.features - ++ [ div [ class "columns box" ] - [ div [ class "column is-full" ] - [ div [ class "content has-text-centered is-medium" ] - [ text "A more complete list can be found in " - , a [ href "/docs/features" ] [ text "here" ] - , text "." - ] - ] + , featureHeader model + , section [ class "mx-auto max-w-screen-xl mb-2 mt-4" ] + (List.indexedMap Feature.featureBox model.features + ++ [ div + [ class "flex px-8 py-8 border rounded mb-5 shadow-lg text-2xl" + , class "sm:flex-row sm:space-y-0 sm-space-x-4" + , class "mx-2 sm:mx-8" + ] + [ div [ class "text-center w-full" ] + [ text "A more complete list can be found in " + , a [ href "/docs/features", class "link" ] [ text "here" ] + , text "." ] - ] - ) - ] - , getStartedHero model - , div [ class "section" ] - (GetStarted.getStarted model.flags.version) + ] + ] + ) + , getStartedHeader model + , GetStarted.getStarted model.flags.version , footHero model ] @@ -147,7 +145,7 @@ footHero model = [ id "footer" , class "footer" ] - [ div [ class "has-text-centered" ] + [ div [ class "text-center" ] [ span [] [ text ("Docspell, " ++ model.flags.version) ] @@ -157,6 +155,7 @@ footHero model = , a [ href "https://spdx.org/licenses/AGPL-3.0-or-later.html" , target "_blank" + , class "link" ] [ text "AGPLv3+" ] @@ -166,6 +165,7 @@ footHero model = , a [ href "https://github.com/eikek/docspell" , target "_blank" + , class "link" ] [ text "Source Code" ] @@ -176,6 +176,7 @@ footHero model = [ a [ href "https://gitter.im/eikek/docspell" , target "_blank" + , class "link" ] [ text "Chat on Gitter" ] @@ -184,166 +185,142 @@ footHero model = ] -getStartedHero : Model -> Html Msg -getStartedHero _ = +getStartedHeader : Model -> Html Msg +getStartedHeader _ = section [ id "get-started" - , class "hero is-primary is-bold" + , class "hero-header" ] - [ div [ class "hero-body" ] - [ div [ class "container" ] - [ h2 [ class "title" ] - [ text "Get Started" - ] - ] - ] + [ text "Get Started" ] -demoHero : Html msg -demoHero = - section - [ id "demos" - , class "hero is-info is-bold" +demoHeader : Html msg +demoHeader = + h2 + [ class "hero-header" + , id "demos" ] - [ div - [ class "hero-body" - ] - [ div [ class "container" ] - [ h2 [ class "title" ] - [ text "Screencasts" - ] - ] - ] + [ text "Screencasts" ] -featureHero : Model -> Html Msg -featureHero model = - section +featureHeader : Model -> Html Msg +featureHeader _ = + h2 [ id "feature-selection" - , class "hero is-info is-bold" + , class "hero-header" ] - [ div - [ class "hero-body" + [ text "Feature Selection" + ] + + +navBar : String -> Html Msg +navBar classes = + nav + [ id "top-nav" + , class "top-0 z-50 w-full flex flex-row justify-start shadow-sm h-14 antialiased " + , class classes + ] + [ a + [ onClick ToggleNavbarMenu + , href "#" + , class "font-bold inline-flex items-center px-4 w-10 sm:hidden " ] - [ div [ class "container" ] - [ h2 [ class "title" ] - [ text "Feature Selection" - ] + [ i [ class "fa fa-bars" ] [] + ] + , a + [ class "inline-flex px-4 items-center hover:bg-gray-50 hover:bg-opacity-20" + , href "/" + ] + [ div [ class "" ] + [ Icons.logo + ] + , span [ class "ml-1 text-2xl font-semibold font-serif" ] + [ text "Docspell" ] + ] + , a + [ href "docs/" + , class "px-4 flex items-center hover:bg-gray-50 hover:bg-opacity-20" + , class " text-xl" + ] + [ Icons.docs + , span [ class "ml-2 tracking-wide" ] + [ text "Documentation" + ] + ] + , a + [ href "blog/" + , class "px-4 flex items-center hover:bg-gray-50 hover:bg-opacity-20" + , class " text-xl" + ] + [ Icons.blog + , span [ class "ml-2 tracking-wide" ] + [ text "Blog" + ] + ] + , a + [ target "_blank" + , href "https://github.com/eikek/docspell" + , class "px-4 flex items-center hover:bg-gray-50 hover:bg-opacity-20" + , class " text-xl" + ] + [ Icons.github + , span [ class "ml-2 tracking-wide" ] + [ text "Github" ] ] ] mainHero : Model -> Html Msg -mainHero model = +mainHero _ = section [ id "hero-main" - , class "hero is-fullheight is-primary" + , class "min-h-screen text-white flex flex-col items-center main-background" ] - [ div [ class "hero-head" ] - [ nav [ class "navbar" ] - [ div [ class "navbar-brand" ] - [ a - [ class "navbar-item" - , href "/" - ] - [ span [ class "icon is-large" ] - [ Icons.logo - ] - , text "Docspell" - ] - , a - [ role "button" - , onClick ToggleNavbarMenu - , classList - [ ( "navbar-burger", True ) - , ( "is-active", model.navbarOpen ) - ] - , ariaLabel "menu" - , ariaExpanded False - ] - [ span [ ariaHidden True ] [] - , span [ ariaHidden True ] [] - , span [ ariaHidden True ] [] - ] + [ navBar " text-white" + , div [ class "flex-grow flex flex-col items-center justify-center w-full" ] + [ Icons.logoWidth 112 + , h1 [ class "text-6xl font-semibold shadow font-serif" ] + [ text "Docspell" + ] + , h2 [ class "text-3xl font-madium tracking-wide mt-2 mb-4 " ] + [ text "Simple document organizer" + ] + , p [ class "px-2 text-center text-xl font-light shadow max-w-prose font-sans" ] + [ text "Docspell assists in organizing your piles of " + , text "digital documents, resulting from scanners, e-mails " + , text "and other sources with miminal effort." + ] + , div + [ class "mt-4 flex flex-col space-y-2 text-2xl" + , class "sm:items-center sm:flex-row sm:space-y-0 sm:space-x-4" + ] + [ a + [ class "button info" + , href "#demos" ] - , div - [ classList - [ ( "navbar-menu", True ) - , ( "is-active", model.navbarOpen ) - ] + [ text "Screencasts" ] - [ div [ class "navbar-start" ] - [ a - [ href "docs/" - , class "navbar-item" - ] - [ span [ class "icon" ] - [ Icons.docs - ] - , span [] - [ text "Documentation" - ] - ] - , a - [ target "_blank" - , href "https://github.com/eikek/docspell" - , class "navbar-item" - ] - [ span [ class "icon" ] - [ Icons.github - ] - , span [] - [ text "Github" - ] - ] - ] + , a + [ class "button info" + , href "#feature-selection" + ] + [ text "Features" + ] + , a + [ class "button primary" + , href "#get-started" + ] + [ text "Get Started" ] ] ] - , div [ class "hero-body" ] - [ div - [ class "container has-text-centered" - ] - [ Icons.logoWidth 112 - , h1 [ class "title main-title is-2" ] - [ text "Docspell" - ] - , h2 [ class "subtitle is-3" ] - [ text "Simple document organizer" - ] - , p [ class "content is-medium narrow-center" ] - [ text "Docspell assists in organizing your piles of " - , text "digital documents, resulting from scanners, e-mails " - , text "and other sources with miminal effort." - ] - , div [ class " buttons is-centered" ] - [ a - [ class "button is-info is-medium" - , href "#demos" - ] - [ text "Screencasts" - ] - , a - [ class "button is-info is-medium" - , href "#feature-selection" - ] - [ text "Features" - ] - , a - [ class "button is-primary is-medium" - , href "#get-started" - ] - [ text "Get Started" - ] - ] - ] - ] - , div [ class "hero-foot" ] - [ span [ class "unsplash-credit" ] - [ text "Photo by " + , div [ class "text-right w-full" ] + [ span [ class "opacity-40 text-xs" ] + [ i [ class "fab fa-unsplash mr-1" ] [] + , text "Photo by " , a [ href "https://unsplash.com/@numericcitizen" , target "_blank" diff --git a/website/elm/Search.elm b/website/elm/Search.elm index d62434dd..9dc4e7df 100644 --- a/website/elm/Search.elm +++ b/website/elm/Search.elm @@ -1,11 +1,9 @@ port module Search exposing (..) -import Browser exposing (Document) -import Browser.Navigation exposing (Key) +import Browser import Html as H exposing (..) import Html.Attributes exposing (..) import Html.Events exposing (onClick, onInput, onSubmit) -import Json.Decode as D import Markdown @@ -45,14 +43,21 @@ type alias SearchEntry = } +type SearchState + = Initial + | Found (List SearchEntry) + + type alias Model = { searchInput : String - , results : List SearchEntry + , results : SearchState + , searchVisible : Bool } type Msg = SetSearch String + | ToggleBar | SubmitSearch | GetSearchResults (List SearchEntry) @@ -64,7 +69,8 @@ type Msg init : Flags -> ( Model, Cmd Msg ) init flags = ( { searchInput = "" - , results = [] + , results = Initial + , searchVisible = False } , Cmd.none ) @@ -77,6 +83,11 @@ init flags = update : Msg -> Model -> ( Model, Cmd Msg ) update msg model = case msg of + ToggleBar -> + ( { model | searchVisible = not model.searchVisible } + , Cmd.none + ) + SetSearch str -> ( { model | searchInput = str } , Cmd.none @@ -86,7 +97,7 @@ update msg model = ( model, doSearch model.searchInput ) GetSearchResults list -> - ( { model | results = List.take 8 list }, Cmd.none ) + ( { model | results = Found <| List.take 20 list }, Cmd.none ) subscriptions : Model -> Sub Msg @@ -100,56 +111,67 @@ subscriptions _ = view : Model -> Html Msg view model = - H.form - [ class "form" - , onSubmit SubmitSearch + div + [ class " inline-flex px-4 items-center hover:bg-amber-600 hover:bg-opacity-10 dark:hover:bg-stone-800" ] - [ div [ class "dropdown field is-active is-fullwidth has-addons" ] - [ div [ class "control is-fullwidth" ] + [ a + [ href "#" + , class "h-full w-full inline-flex items-center" + , onClick ToggleBar + ] + [ i [ class "fa fa-search" ] [] + ] + , div + [ class "absolute px-2 mx-2 right-0 max-w-screen-md rounded top-12 w-full border-l border-r border-b bg-white h-12 dark:bg-stone-800 dark:border-stone-700" + , classList [ ( "hidden", not model.searchVisible ) ] + ] + [ H.form [ onSubmit SubmitSearch ] [ input - [ class "input" - , type_ "text" - , placeholder "Search docs…" - , onInput SetSearch + [ type_ "text" , value model.searchInput + , autofocus True + , placeholder "Search …" + , class "w-full block h-8 border-0 border-b border-stone-400 mt-2 focus:ring-0 focus:border-indigo-500 dark:bg-stone-800 dark:focus:border-cyan-400" + , onInput SetSearch ] [] ] - , div [ class "control" ] - [ button - [ class "button is-primary" - , href "#" - , onClick SubmitSearch - ] - [ img [ src "/icons/search-white-20.svg" ] [] - ] - ] , viewResults model.results ] ] -viewResults : List SearchEntry -> Html Msg -viewResults entries = - div - [ classList - [ ( "dropdown-menu", True ) - , ( "is-hidden", entries == [] ) - ] - ] - [ div [ class "dropdown-content" ] - (List.intersperse - (div [ class "dropdown-divider" ] []) - (List.map viewResult entries) - ) - ] +viewResults : SearchState -> Html Msg +viewResults state = + case state of + Initial -> + span [ class "hidden" ] [] + + Found [] -> + div + [ class "bg-white dark:bg-stone-800 mt-2 w-full" + ] + [ div [ class "flex flex-row items-center h-14 justify-center text-xl" ] + [ i [ class "fa fa-meh font-thin mr-2" ] + [] + , text "No results." + ] + ] + + Found entries -> + div + [ class "bg-white dark:bg-stone-800 mt-2 w-screen sm:w-full h-screen-12 md:h-fit md:max-h-96 overflow-auto shadow-lg border-l border-r border-b dark:border-stone-700" + ] + [ div [ class "px-2 pt-2 pb-1 flex flex-col divide-y dark:divide-stone-700 " ] + (List.map viewResult entries) + ] viewResult : SearchEntry -> Html Msg viewResult result = - div [ class "dropdown-item" ] + div [ class "py-2 content" ] [ a - [ class "is-size-5" + [ class "text-lg font-semibold" , href result.ref ] [ text result.doc.title @@ -158,6 +180,16 @@ viewResult result = ] +textInput : String +textInput = + " placeholder-gray-400 w-full dark:text-slate-200 dark:bg-slate-800 dark:border-slate-500 border-gray-400 rounded " ++ formFocusRing + + +formFocusRing : String +formFocusRing = + " focus:ring focus:ring-black focus:ring-opacity-50 focus:ring-offset-0 dark:focus:ring-slate-400 " + + --- Ports diff --git a/website/package.json b/website/package.json index 1679a004..46a837cf 100644 --- a/website/package.json +++ b/website/package.json @@ -1,6 +1,17 @@ { "license": "GPL-3.0-or-later", "dependencies": { - "bulma": "^0.9.0" + "@fontsource/montserrat": "^4.5.3", + "@fontsource/source-code-pro": "^4.5.2", + "@fontsource/spectral": "^4.5.1", + "@fortawesome/fontawesome-free": "^5.15", + "@tailwindcss/forms": "^0.4.0", + "autoprefixer": "^10.4", + "cssnano": "^5.0", + "postcss": "^8.4.5", + "postcss-cli": "^9.1.0", + "postcss-import": "^14.0.2", + "postcss-purgecss": "^2.0.3", + "tailwindcss": "^3.0" } } diff --git a/website/postcss.config.js b/website/postcss.config.js new file mode 100644 index 00000000..2aaed666 --- /dev/null +++ b/website/postcss.config.js @@ -0,0 +1,10 @@ +//postcss.config.js + +module.exports = (ctx) => ({ + plugins: [ + require('postcss-import'), + require('tailwindcss'), + require('autoprefixer'), + require('cssnano'), + ] +}) diff --git a/website/build.sh b/website/scripts/build.sh similarity index 57% rename from website/build.sh rename to website/scripts/build.sh index 567601a8..c63f7201 100755 --- a/website/build.sh +++ b/website/scripts/build.sh @@ -3,6 +3,7 @@ set -e yarn install +npx tailwindcss -i ./styles/input.css -o ./site/public/styles.css --config ./tailwind.config.js --postcss ./postcss.config.js elm make --output site/static/js/bundle.js --optimize elm/Main.elm cd site && zola build cd .. diff --git a/website/run-elm.sh b/website/scripts/run-elm.sh similarity index 100% rename from website/run-elm.sh rename to website/scripts/run-elm.sh diff --git a/website/scripts/run-styles.sh b/website/scripts/run-styles.sh new file mode 100755 index 00000000..e8bf9b29 --- /dev/null +++ b/website/scripts/run-styles.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +mkdir -p ./site/public/files +mkdir -p ./site/public/webfonts + +echo "Copy webfonts…" +cp node_modules/@fontsource/*/files/* ./site/public/files/ +cp node_modules/@fortawesome/fontawesome-free/webfonts/* ./site/public/webfonts/ + +echo "Running tailwind…" +npx tailwindcss -i ./styles/input.css -o ./site/public/styles.css --config ./tailwind.config.js --postcss ./postcss.config.js "$1" diff --git a/website/scripts/screenshot.sh b/website/scripts/screenshot.sh new file mode 100755 index 00000000..6259be54 --- /dev/null +++ b/website/scripts/screenshot.sh @@ -0,0 +1,74 @@ +#!/usr/bin/env bash +# +# Little tool to help with doing screenshots. +# +# Run: ./screenshot.sh output.png +# +# Then select a window. It will create a screenshot from that window, +# cut (optionally) some pixels (removes the browser bar) and then +# resizes it to some maximum width. + +set -e + +# input file +file=/tmp/screenshot.png + +# final output file +out=/tmp/screenshot-out.png + +# image dimension ratio w:h +ratio=${RATIO:-"16:9"} +# cut that much from the top to remove browser bar (my firefox settings) +top_cut=${TOP_CUT:-85} +# maximum width of final image +maxw=${MAXW:-1200} +# time to wait in secs +waitsec=${WAIT_SEC:-3} + + +#### Main ############ +work=/tmp/screenshot-work.png + +debug() { + (1>&2 echo "$@") +} + +scrot -s -c -d $waitsec "$file" 1>&2 +cp "$file" "$work" + + +read -r w h < <(identify -verbose $file |\ + grep "Geometry:" | \ + cut -d':' -f2 | \ + cut -d'+' -f1 | \ + tr 'x' ' ' | xargs) +debug "Original size: ${w}x${h}" + +read nw nh < <(echo $ratio | tr ':' ' ') + +# remove browser bar from top +((h=$h - $top_cut)) + +# create height to match ratio +((newH=($w * $nh) / $nw)) + +if [ $newH -gt $h ]; then + debug "Cropping to $w x $h" + debug "Cannot crop to ratio without reducing width" + convert -crop ${w}x${h}+0+${top_cut} "$work" "$out" +else + debug "Cropping to $w x $h" + convert -crop ${w}x${newH}+0+${top_cut} "$work" "$out" +fi +cp "$out" "$work" + +debug "Resize to max width $maxw" +convert -resize $maxw "$work" "$out" +rm -f "$work" "$file" + +if [ -z "$1" ]; then + echo "$out" +else + mv "$out" "$1" + echo "$1" +fi diff --git a/website/scripts/screenshot2.sh b/website/scripts/screenshot2.sh new file mode 100755 index 00000000..00e368b7 --- /dev/null +++ b/website/scripts/screenshot2.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash +# +# Uses the `screenshot.sh` script to create one screenshot per theme. +# +# First sets light theme and takes a screenshot, then sets dark theme +# and calls screenshot.sh again +# +# Might need to fiddle with the xdotool command + + +docspell_url=http://localhost:7880 +docspell_user=demo +docspell_pass=test + +screenshot="$(dirname $0)/screenshot.sh" + +out_base="$1" + +work_dir=$(mktemp -dt screenshot2-script.XXXXXX) +export HOME=$work_dir +export RATIO="16:9" +export WAIT_SEC=4 +#export TOP_CUT=400 + +dsc write-default-config +sed -i "s,http://localhost:7880,$docspell_url,g" $HOME/.config/dsc/config.toml + +set_theme() { + dsc login -u $docspell_user --password $docspell_pass 2>&1 > /dev/null + local token=$(cat $HOME/.config/dsc/dsc-token.json | jq -r '.token') + data=$(curl -sSL -H "X-Docspell-Auth: $token" $docspell_url/api/v1/sec/clientSettings/webClient | jq ".uiTheme=\"$1\"") + + curl -sSL -H "X-Docspell-Auth: $token" -XPUT --data "$data" $docspell_url/api/v1/sec/clientSettings/user/webClient + xdotool search --name "Mozilla Firefox" | xargs xdotool windowactivate && xdotool key F5 +} + +set_theme "Light" +$screenshot "${out_base}.png" +set_theme "dark" +$screenshot "${out_base}_dark.png" diff --git a/website/shell.nix b/website/shell.nix index 181b4ad1..c2320041 100644 --- a/website/shell.nix +++ b/website/shell.nix @@ -1,7 +1,8 @@ let nixpkgs = builtins.fetchTarball { - #url = "channel:nixos-21.05"; - url = "https://github.com/NixOS/nixpkgs/archive/e6badb26fc0d238fda2432c45b7dd4e782eb8200.tar.gz"; + #url = "channel:nixos-21.11"; + #url = "https://github.com/NixOS/nixpkgs/archive/e6badb26fc0d238fda2432c45b7dd4e782eb8200.tar.gz"; + url = "https://github.com/NixOs/nixpkgs/archive/0f316e4d72daed659233817ffe52bf08e081b5de.tar.gz"; #21.11 }; pkgs = import nixpkgs { }; in @@ -11,6 +12,9 @@ with pkgs; buildInputs = [ zola yarn + sbt + elmPackages.elm + nodejs inotifyTools ]; } diff --git a/website/site/config.toml b/website/site/config.toml index 5d9969c9..afd829ea 100644 --- a/website/site/config.toml +++ b/website/site/config.toml @@ -11,7 +11,13 @@ default_language = "en" [markdown] highlight_code = true -highlight_theme = "gruvbox-dark" +#light: ayu-light, OneHalfLight, base16-ocean-light +highlight_theme = "css" + +highlight_themes_css = [ + { theme = "gruvbox-dark", filename = "syntax-dark.css" }, + { theme = "base16-ocean-light", filename = "syntax-light.css" } +] [link_checker] skip_prefixes = [ diff --git a/website/site/content/blog/2021-01-09_scan-and-process-from-adf.md b/website/site/content/blog/2021-01-09_scan-and-process-from-adf.md new file mode 100644 index 00000000..8de3d09f --- /dev/null +++ b/website/site/content/blog/2021-01-09_scan-and-process-from-adf.md @@ -0,0 +1,24 @@ ++++ +title = "Preproces Scans before upload" +[extra] +author = "@eresturo" +authorLink = "https://github.com/eresturo" ++++ + +# Preproces Scans before upload + +This script scans from the ADF (Automatic Document Feeder), +preprocesses it and uploads it to Docspell: +[scanadf2docspell](https://github.com/eresturo/scanadf2docspell) + + +
+ +
+ +I don't know if this is helpful to other Docspell users, but feel free +to link to it in the Docspell documentation. + +Any suggestions or missing features? + +Sheers eresturo diff --git a/website/site/content/blog/2022-01-17_alternative_upload_from_browser.md b/website/site/content/blog/2022-01-17_alternative_upload_from_browser.md new file mode 100644 index 00000000..c79a4807 --- /dev/null +++ b/website/site/content/blog/2022-01-17_alternative_upload_from_browser.md @@ -0,0 +1,51 @@ ++++ +title = "Upload directly from the browser or email client" +[extra] +author = "gandy92" ++++ + +# Uploading from browser or email client + +An alternative approach came to mind to directly upload from a browser +or email client that at least works on a Linux system. In case this is +interesting for others, I'd like to share it here. + + +1. Create and activate a source in your collective (in this example + MYCOLL); note that path to the file upload (the one with + `/api/v1/open/upload/item/`) +2. Create a file `docspell-upload-MYCOLL` with the following content (replace `UPLOAD_PATH` with the actual path): + ``` + #!/bin/bash + logger -t docspell_upload -- Docspell upload to MYCOLL: "$*" $( + curl -s -XPOST -F file=@"$1" UPLOAD_PATH + ) + ``` +3. Make it executable: `chmod 755 docspell-upload-MYCOLL` +4. Create a file named `docspell-MYCOLL.desktop` with the following + content (note that you need the full path to + `docspell-upload-MYCOLL`): + + ``` + [Desktop Entry] + Exec=PATH_TO_docspell-upload-MYCOLL %F + MimeType=application/pdf;application/x-zip;application/x-zip-compressed;application/zip + Name=Docspell Upload (MYCOLL) + NoDisplay=true + Type=Application + ``` +5. Place the file `docspell-MYCOLL.desktop` in + `$HOME/.local/share/applications/` +6. Configure your browser or mail-reader actions for pdf and zip: They + should always ask what to do rather than opening a link or + attachment with the standard application or save it to disk by + default. Actually, always opening a pdf in the browser is fine, if + this allows to later save the viewed file. + +Now, when clicking on a file link or attachment, the browser or email +client should ask what to do. You then should be able to choose +"Docspell Upload (MYCOLL)" from the list, which will upload the file +to your collection. + +If anything goes wrong, you can monitor the server response with the +command `journalctl -f -t docspell_upload` diff --git a/website/site/content/blog/2022-01-31_create_post.md b/website/site/content/blog/2022-01-31_create_post.md new file mode 100644 index 00000000..929090ff --- /dev/null +++ b/website/site/content/blog/2022-01-31_create_post.md @@ -0,0 +1,249 @@ ++++ +title = "Create a new post" +[extra] +author = "eikek" ++++ + +# Create a new post + +Sharing ideas and tips is very much welcome, if you like you can +create a small (or large) post here. You'll need `git` and potentially +a `github` account to make this convenient. + + + +The contents of this website is maintained in the [ git +repository](https://github.com/eikek/docspell) in the `website/site` +folder. It is build by the static site generator +[zola](https://getzola.org) from a set of +[markdown](https://www.markdownguide.org/basic-syntax) files. + +It is not necessary to know how everything is connected, you only need +to edit or create markdown files at some specific location. Here are +some proposals how to add or edit pages and getting them published to +docspell.org. + +## Where to create the files + +The contents of the published website is in the branch `current-docs`. +You should base your changes on this branch. + +All blog pages go into this directory: `website/site/content/blog/`. +In this directory each post is a markdown file named by this pattern: + +``` +--_title_with_underscores.md +``` + +For example, this page here is named `2022-01-31_create_post.md`. + +## Write on Github + +A very convenient way is to edit and create posts directly on github +in the browser. All pages contain a small `Edit` link at the bottom +that takes you directly into edit model of the corresponding file on +github. + +To create a new file on github, you can use this link: + + + +It will present a form that lets you create a new file with content. +Once you commit this change, the project will be forked into your +account and the change is applied to this new fork. Then you can +create a pull request into this repository in order to publish it. + +Plase see [below](#content) for how to start writing content. + +## Writing locally + +The preferred approach is to explicitely fork the repository and clone +it to your machine to do the modification. The big advantage is, that +you can look at the results while writing. + +If you want to see a live view of the page while editing, some tools +are required. The easiest way to get these is to install +[nix](https://nixos.org/) and run `nix-shell website/shell.nix` to get +an environment with all these tools installed. Otherwise install the +programs mentioned in `website/shell.nix`, which are: +[yarn](https://yarnpkg.com/), [zola](https://getzola.org), +[elm](https://elm-lang.org) and [sbt](https://scala-sbt.org). + +Then clone the sources to your machine and build the complete site +once, so that all assets and required stuff is present: + +``` +sbt website/zolaBuildTest +``` + +Now you can use zola to start the page and watch for changes. The +changes are visible immediately without reloading the page in the +browser. + +``` +cd website/site && zola serve +``` + +This starts a web server on some port (usually `1111`); point your +browser to it and navigate to your new page. Whenever changes are +saved to the markdown file, the page refreshes automatically. + +If styling is changed (in the css files or also sometimes when adding +new classes to HTML elements), a rebuild of the site css is necessary. +This can be done by running `scripts/run-styles.sh`. Via +`scripts/run-styles.sh --watch` it is possible to watch for these +changes as well. But it shouldn't be necessary to do large edits to +the css. + +# Content + +## Front matter + +The very beginning of such a markdown file contains some metadata. +Start each page with these lines: + +```markdown ++++ +title = "Title of the post" +[extra] +author = "" +authorLink = "https://some-url" ++++ + +# First heading… +``` + +The front matter is the first part enclosed in `+++`. See +[zola](https://www.getzola.org/documentation/content/page/) +documentation for more details. + +The `author` and `authorLink` setting is optional. You can leave out +the complete `[extra]` section. If `authorLink`is defined, the author +is rendered as a link to that URL. If `author` is missing, it defaults +to "_Unknown_". + +## Elements + +The content is styled automatically and the post is added to the list +on the main blog page. Additional to the standard markdown formatting, +there are some more usefull elements. + +### Linking + +If you want to link to an internal page, use markdown links where the +path is formatted like this: + +```markdown +[link title](@/path/to/markdown_file.md) +``` + +Using the `@/path` style, zola generates the correct final link (and +checks for dead links). + +### Info and warning boxes + +There are small templates available to format a basic info or warning +box message. + +```markdown +{%/* infobubble(title="My Title") */%} +Your content here …. +{%/* end */%} +``` + +For a box more styled like a warning, replace `info` with `warning`. + +```markdown +{%/* warningbubble(title="My Title") */%} +Your content here …. +{%/* end */%} +``` + +This will render into: + +{% infobubble(title="My Title") %} +Your content here …. +{% end %} + +{% warningbubble(title="My Title") %} +Your content here …. +{% end %} + +### Summary + +In order to get a decent summary in the list of posts, you need to set +a marker in your file. Place a line containing only + +``` + +``` + +into your file and everything before it will be rendered as a summary +on the blog listing. + + +### Buttons + +Styled buttons can be created using HTML inside the markdown file: + +```markdown +Click! +``` + +Turns into: + +Click! + + +### Images + +In image to appear on the whole page, use HTML with a `figure` tag: + +``` +
+ +
+``` + +
+ +
+ +The site has a light and dark mode and sometimes it's nice to provide +images for both variants. You can use HTML for this and a specific +class per theme: + +```html +
+ +
+
+ +
+``` + +See the effect when changing the theme: + +
+ +
+
+ +
+ +This can be done via a template if the file is next to the markdown +file in the same directory: + +```markdown +{{/* figure2(light="light-image.jpg", dark="dark-image.jpg") */}} +``` + +
+Pictures are from Unsplash. +
+ +# Publish + +Open a pull request against the `current-docs` branch. When the pull +request is merged, the publishing process starts automatically and the +content is available minutes after. diff --git a/website/site/content/blog/_index.md b/website/site/content/blog/_index.md new file mode 100644 index 00000000..062d1ff5 --- /dev/null +++ b/website/site/content/blog/_index.md @@ -0,0 +1,15 @@ ++++ +title = "Main" +description = "Random collection of stuff around Docspell" +template = "blog.html" +page_template = "blog_page.html" +sort_by = "date" +insert_anchor_links = "right" ++++ + +# Blog + +This is a place to collect random tips and knowledge around Docspell. +This is organized as a log, where entries can be added by whoever +likes to share something. Check [this +page](@/blog/2022-01-31_create_post.md) for creating content here. diff --git a/website/site/content/doc/_index.md b/website/site/content/doc/_index.md deleted file mode 100644 index 502bf030..00000000 --- a/website/site/content/doc/_index.md +++ /dev/null @@ -1,3 +0,0 @@ -+++ -redirect_to = "/docs" -+++ diff --git a/website/site/content/docs/_index.md b/website/site/content/docs/_index.md index 630db7b9..1845e801 100644 --- a/website/site/content/docs/_index.md +++ b/website/site/content/docs/_index.md @@ -1,9 +1,150 @@ +++ -title = "Overview" -template = "overview.html" +title = "Documentation" +template = "docs.html" +page_template = "docs.html" insert_anchor_links = "right" +++ -# Note -This content is not rendered. Everything is in the template. +# Introduction + +Docspell aims to be a simple yet effective document organizer that +makes stowing documents away very quick and finding them later +reliable (and also fast). It is a bit opinionated and more targeted +for home use and small/medium organizations. + +In contrast to many DMS, the main focus is not so much to provide all +kinds of features to manually create organizational structures, like +folder hierarchies, where you place the documents yourself. The +approach is to leave it as a big pile of documents, but extract and +attach metadata from each document. These are mainly properties that +emerge from the document itself. The reason is that this is possible +to automate. This makes it very simple to *add* documents, because +there is no time spent to think about where to put it. And it is +possible to apply different structures on top later, like show first +all documents of a specific correspondent, then all with tag +'invoice', etc. If these properties are attached to all documents, it +is really easy to find a document. It even can be combined with +fulltext search for the, hopefully rare, desperate cases. + +Of course, it is also possible to add custom properties and arbitrary +tags. + +Docspell analyzes the text to find metadata automatically. It can +learn from existing data and can apply +[NLP](https://en.wikipedia.org/wiki/Natural_language_processing) +techniques to support this. This metadata must be maintained manually +in the application. Docspell looks for candidates for: + +- Correspondents +- Concerned person or things +- A date and due date +- Tags + +For tags, it sets all that it thinks do apply. For the others, it will +propose a few candidates and sets the most likely one to your item. + +This might be wrong, so it is recommended to curate the results. +However, very often the correct one is either set or within the +proposals where you fix it by a single click. + +Besides these properties, there are more metadata you can use to +organize your files, for example custom fields, folders and notes. + +Docspell is also for programmers. Everything is available via a REST +or HTTP api and can be easily used within your own scripts and tools, +for example using `curl`. There are also features for "advanced use" +and many configuration options. + + +# Components + +Docspell consists of multiple components that run in separate +processes: + +- REST server +- JOEX, short for *job executor* +- Fulltext Search Index (optional, currently Apache SOLR) + +The REST server provides the Api and the web application. The web +application is a +[SPA](https://en.wikipedia.org/wiki/Single-page_application) written +in [Elm](https://elm-lang.org) and is a client to the REST api. All +features are available via a http/rest api. + +The *joex* is the component that does the “heavy work”, executing +long-running tasks, like processing files or importing your mails +periodically. While the joex component also exposes a small REST api +for controlling it, the main user interface is all inside the rest +server api. + +The rest server and the job executor can be started multiple times in +order to scale out. It must be ensured, that all connect to the same +database. And it is also recommended (though not strictly required), +that all components can reach each other. + +The fulltext search index is another separate component, where +currently only [SOLR](https://solr.apache.org) is supported. +Fulltext search is optional, so the SOLR component is not required if +docspell is run without fulltext search support. + + +# Terms + +In order to better understand the following pages, some terms are +explained. + +## Item + +An *item* is roughly your document, only that an item may span +multiple files, which are called *attachments*. An item has *meta +data* associated: + +- a *correspondent*: the other side of the communication. It can be + an organization or a person. +- a *concerning person* or *equipment*: a person or thing that + this item is about. Maybe it is an insurance contract about your + car. +- *tag*: an item can be tagged with one or more tags (or labels). A + tag can have a *category*. This is intended for grouping tags, for + example a category `doctype` could be used to group tags like + `bill`, `contract`, `receipt` etc. Usually an item is not tagged + with more than one tag of a category. +- a *folder*: a folder is similiar to a tag, but an item can only be + in exactly one folder (or none). Furthermore folders allow to + associate users, so that items are only visible to the users who are + members of a folder. +- an *item date*: this is the date of the document – if this is not + set, the created date of the item is used. +- a *due date*: an optional date indicating that something has to be + done (e.g. paying a bill, submitting it) about this item until this + date +- a *direction*: one of "incoming" or "outgoing" +- a *name*: some item name, defaults to the file name of the + attachments +- some *notes*: arbitrary descriptive text. You can use markdown + here, which is properly formatted in the web application. + +## Collective + +The users of the application are part of a *collective*. A +*collective* is a group of users that share access to the same +items. The account name is therefore comprised of a *collective name* +and a *user name*. + +All users of a collective are equal; they have same permissions to +access all items. The items don't belong to a user, but to the +collective. + +That means, to identify yourself when signing in, you have to give the +collective name and your user name. By default it is separated by a +slash `/`, for example `smith/john`. If your user name is the same as +the collective name, you can omit one; so `smith/smith` can be +abbreviated to just `smith`. + +By default, all users can see all items of their collective. A +*folder* can be used to implement other visibilities: Every user can +create a folder and associate members. It is possible to put items in +these folders and docspell shows only items that are either in no +specific folder or in a folder where the current user is owner or +member. diff --git a/website/site/content/docs/api/_index.md b/website/site/content/docs/api/_index.md index 61ef5d33..5cba035e 100644 --- a/website/site/content/docs/api/_index.md +++ b/website/site/content/docs/api/_index.md @@ -3,9 +3,6 @@ title = "Api" description = "Contains documentation about the REST API." weight = 70 insert_anchor_links = "right" -template = "pages.html" +template = "docs.html" sort_by = "weight" -redirect_to = "docs/api/intro" +++ - -No Content diff --git a/website/site/content/docs/api/intro.md b/website/site/content/docs/api/intro.md index 4ed589d5..23dabea1 100644 --- a/website/site/content/docs/api/intro.md +++ b/website/site/content/docs/api/intro.md @@ -3,10 +3,10 @@ title = "Api Introduction" description = "Api Basics" weight = 10 insert_anchor_links = "right" -[extra] -mktoc = true +++ +# Api + Docspell is designed as a REST server that uses JSON to exchange data. The REST api can be used to integrate docspell into your workflow. diff --git a/website/site/content/docs/api/upload.md b/website/site/content/docs/api/upload.md index 133d2423..c6687b4c 100644 --- a/website/site/content/docs/api/upload.md +++ b/website/site/content/docs/api/upload.md @@ -3,10 +3,10 @@ title = "Upload Request" description = "Describes the upload request" weight = 20 insert_anchor_links = "right" -[extra] -mktoc = true +++ +# Upload Request + Uploads of files to docspell are always processed the same way, no matter if coming from a source, the integration endpoint or from the webapp. diff --git a/website/site/content/docs/configure/_index.md b/website/site/content/docs/configure/_index.md index f83a1098..932b39e7 100644 --- a/website/site/content/docs/configure/_index.md +++ b/website/site/content/docs/configure/_index.md @@ -3,10 +3,11 @@ title = "Configuration" insert_anchor_links = "right" description = "Describes the configuration file and shows all default settings." weight = 40 -[extra] -mktoc = true +template = "docs.html" +++ +# Configuration + Docspell's executables (restserver and joex) can take one argument – a configuration file. If that is not given, the defaults are used, overriden by environment variables. A config file overrides default diff --git a/website/site/content/docs/dev/adr/_index.md b/website/site/content/docs/dev/adr/_index.md index 83de24d2..719a4b60 100644 --- a/website/site/content/docs/dev/adr/_index.md +++ b/website/site/content/docs/dev/adr/_index.md @@ -4,11 +4,14 @@ description = "Contains some ADRs, which are internal notes on decisions made." weight = 300 sort_by = "weight" insert_anchor_links = "right" -template = "pages.html" +template = "docs.html" +page_template = "docs.html" [extra] -mktoc = true +page_list = true +++ +# ADR + This contains a list of ADRs, most of them are from very early. It often just contains notes that could go nowhere else, but still should be captured. diff --git a/website/site/content/docs/dev/building.md b/website/site/content/docs/dev/building.md index 2a52416f..344d5174 100644 --- a/website/site/content/docs/dev/building.md +++ b/website/site/content/docs/dev/building.md @@ -3,6 +3,7 @@ title = "Building Docspell" weight = 0 +++ +# Building You must install [sbt](https://scala-sbt.org), [nodejs](https://www.npmjs.com/get-npm) (for the `npm` command) and diff --git a/website/site/content/docs/dev/development.md b/website/site/content/docs/dev/development.md index 9d2380cb..6a2d0d44 100644 --- a/website/site/content/docs/dev/development.md +++ b/website/site/content/docs/dev/development.md @@ -3,7 +3,9 @@ title = "Tips & Setup" weight = 20 +++ -# Starting Servers with `reStart` +# Setup / Tips + +## Starting Servers with `reStart` When developing, it's very convenient to use the [revolver sbt plugin](https://github.com/spray/sbt-revolver). Start the sbt console @@ -29,7 +31,7 @@ sbt:docspell-root> reStart ``` -# Custom config file +## Custom config file The sbt build is setup such that a file `dev.conf` in the directory `local` (at root of the source tree) is picked up as config file, if diff --git a/website/site/content/docs/dev/translation.md b/website/site/content/docs/dev/translation.md index e4520e65..7a280d0c 100644 --- a/website/site/content/docs/dev/translation.md +++ b/website/site/content/docs/dev/translation.md @@ -3,6 +3,7 @@ title = "Translating Web-UI" weight = 10 +++ +# UI Translation Help with translating the web-ui is greatly appreciated. I can only provide translations for English and German, and these may be wrong - @@ -16,7 +17,7 @@ messages. This guide assumes no knowledge about Elm at all. -# TL;DR +## TL;DR If you are already familiar with Elm, here is the TL;DR: @@ -92,7 +93,7 @@ sbt:docspell-root> make This will take a while, you need to wait until this is finished. -## Start the application +### Start the application If sbt is not started, start sbt from within the source root. Also export the `DOCSPELL_ENV` variable *before* starting sbt: diff --git a/website/site/content/docs/faq/_index.md b/website/site/content/docs/faq/_index.md index 74a74915..02c409b8 100644 --- a/website/site/content/docs/faq/_index.md +++ b/website/site/content/docs/faq/_index.md @@ -3,8 +3,8 @@ title = "FAQ" weight = 100 description = "Frequently asked questions." insert_anchor_links = "right" +template = "docs.html" [extra] -mktoc = true +++ # FAQ diff --git a/website/site/content/docs/features/_index.md b/website/site/content/docs/features/_index.md index 1f305af1..892883dd 100644 --- a/website/site/content/docs/features/_index.md +++ b/website/site/content/docs/features/_index.md @@ -1,8 +1,9 @@ +++ title = "Features and Limitations" -weight = 10 +weight = 9 insert_anchor_links = "right" description = "A list of features and limitations." +template = "docs.html" +++ # Features @@ -20,7 +21,7 @@ description = "A list of features and limitations." - A powerful [query language](@/docs/query/_index.md) to find documents - use [bookmarks](@/docs/webapp/bookmarks.md) to save more complex queries -- customizable [dashboads](@/docs/webapp/dashboards.md) as the main page +- customizable [dashboards](@/docs/webapp/dashboards.md) as the main page - Non-destructive: all your uploaded files are never modified and can always be downloaded untouched - Organize files using tags, folders, [Custom @@ -80,8 +81,6 @@ description = "A list of features and limitations." files, watch folders and many more! - [Android App](@/docs/tools/android.md) to quickly upload files from your android devices - - [Firefox plugin](@/docs/tools/browserext.md): right click on a - link and send the file to docspell - [SMTP Gateway](@/docs/tools/smtpgateway.md): Setup a SMTP server that delivers mails directly to docspell. - License: AGPLv3 diff --git a/website/site/content/docs/feed/_index.md b/website/site/content/docs/feed/_index.md index 71df2216..96efb1fa 100644 --- a/website/site/content/docs/feed/_index.md +++ b/website/site/content/docs/feed/_index.md @@ -1,12 +1,15 @@ +++ title = "Feed Data into Docspell" -weight = 5 +weight = 8 description = "Shows several ways for getting data into Docspell." insert_anchor_links = "right" +template = "docs.html" [extra] mktoc = true +++ +# Documents → Docspell + One of the main goals is to stow documents away quickly. Docspell makes no assumptions about where your documents are. It @@ -20,19 +23,19 @@ So the idea is to have most flexibility – that is, it is up to you how documents arrive. Of course, there is something prepared: -# Upload in Webapp +## Upload in Webapp This is the simplest way, but also the least flexible. You can just login and go to the upload page to submit files. -{{ figure(file="web-upload.png") }} +{{ figure2(light="web-upload.png", dark="web-upload_dark.png") }} This requires to login at the webapp. Since this is complicated from other applications, you can create custom hard-to-guess endpoints to use with the following options. -# Scanners / Watch Directories +## Scanners / Watch Directories If you have a (document) scanner (or think about getting one), it can usually be configured to place scanned documents as image or PDF files @@ -54,10 +57,10 @@ your scanner is connected to your computer. This can create nice pdf files from scanners with ADF, applying corrections and sending them to docspell. -{{ buttonright(classes="is-primary ", href="/docs/tools/cli#watch-a-directory", text="More") }} +{{ buttonright(href="/docs/tools/cli#watch-a-directory", text="More") }} -# Android +## Android There is an [android client](https://github.com/docspell/android-client) provided that lets @@ -71,42 +74,40 @@ into the Share-With menu and uploads the file to Docspell. This is especially useful to quickly upload small things like shopping receipts. -
-
- -
-
- -
-
-
-
+
+ -
- Download the APK from here + +
-{{ buttonright(classes="is-primary ", href="/docs/tools/android", text="More") }} +{{ buttonright(href="/docs/tools/android", text="More") }} -# Poll E-Mails +## Poll E-Mails Your mailbox can be polled periodically to import mails. For example, create a dedicated folder in your e-mail client and move mails in there that you want to push to Docspell. You can then define a recurring job, that looks into this folders and imports the mails. -{{ figure(file="scanmailbox.png") }} +{{ figure2(light="scanmailbox.png", dark="scanmailbox_dark.png") }} -{{ buttonright(classes="is-primary ", href="/docs/webapp/scanmailbox", text="More") }} +{{ buttonright(href="/docs/webapp/scanmailbox", text="More") }} -# E-Mail Server +## E-Mail Server This is a little more involved, but can be quite nice. A SMTP server can be setup that simply uploads incoming mails to Docspell (using @@ -120,29 +121,18 @@ part in Docspell to upload the files to the correct account. There is a docker container prepared to get started. Click below to read more. -{{ buttonright(classes="is-primary ", href="/docs/tools/smtpgateway", text="More") }} +{{ buttonright(href="/docs/tools/smtpgateway", text="More") }} -# Command-Line +## Command-Line I like to use the command line, and so there is a cli that can be used for some tasks, for example uploading files. Below is a quick demo, it supports many more options, see the link below for details. -
-
- -
-
+
+ +
-{{ buttonright(classes="is-primary ", href="/docs/tools/cli", text="More") }} - - -# Browser Extension - -For Firefox, there is a browser extension that creates a context-menu -entry if you right-click on a link. It then downloads the file to your -disk and uploads it to Docspell. - -{{ buttonright(classes="is-primary ", href="/docs/tools/browserext", text="More") }} +{{ buttonright(href="/docs/tools/cli", text="More") }} diff --git a/website/site/content/docs/feed/scanmailbox.png b/website/site/content/docs/feed/scanmailbox.png index b434286b..c0624ab1 100644 Binary files a/website/site/content/docs/feed/scanmailbox.png and b/website/site/content/docs/feed/scanmailbox.png differ diff --git a/website/site/content/docs/feed/scanmailbox_dark.png b/website/site/content/docs/feed/scanmailbox_dark.png new file mode 100644 index 00000000..77e9897c Binary files /dev/null and b/website/site/content/docs/feed/scanmailbox_dark.png differ diff --git a/website/site/content/docs/feed/web-upload.png b/website/site/content/docs/feed/web-upload.png index 8dd66aed..02cb341c 100644 Binary files a/website/site/content/docs/feed/web-upload.png and b/website/site/content/docs/feed/web-upload.png differ diff --git a/website/site/content/docs/feed/web-upload_dark.png b/website/site/content/docs/feed/web-upload_dark.png new file mode 100644 index 00000000..e8c8aafa Binary files /dev/null and b/website/site/content/docs/feed/web-upload_dark.png differ diff --git a/website/site/content/docs/install/_index.md b/website/site/content/docs/install/_index.md index 6d43a90b..acb3c8d9 100644 --- a/website/site/content/docs/install/_index.md +++ b/website/site/content/docs/install/_index.md @@ -1,9 +1,10 @@ +++ -title = "Installation and Deployment" +title = "Installation" description = "There are multiple ways to install Docspell. This section contains detailed instructions." -weight = 30 +weight = 5 sort_by = "weight" insert_anchor_links = "right" -template = "pages.html" +template = "docs.html" +page_template = "docs.html" redirect_to = "/docs/install/quickstart" +++ diff --git a/website/site/content/docs/install/docker.md b/website/site/content/docs/install/docker.md index 29b1da64..05ce5e25 100644 --- a/website/site/content/docs/install/docker.md +++ b/website/site/content/docs/install/docker.md @@ -3,7 +3,7 @@ title = "Docker" weight = 20 +++ -## Docker Images +# Docker Images The docker images are at [hub.docker.com](https://hub.docker.com/u/docspell). The `latest` tag @@ -29,7 +29,7 @@ release page. The images contain all the necessary is used to watch a directory for uploading files. This runs the `dsc watch` command. -### Examples +## Examples These examples use `docker run` to start the restserver and jobexecutor. Both must be connected to the same database. For this @@ -127,7 +127,7 @@ fulltext search. For a more sophisticated docker setup, use appropriate tools, for example `docker-compose` which is explained below. -## Docker Compose +# Docker Compose There is a [docker-compose](https://docs.docker.com/compose/) setup available in the `/docker/docker-compose` folder. This setup is @@ -135,8 +135,8 @@ similiar to the example above, but adding fulltext search and a PostgreSQL database by using just one command. It's only a few steps to get started. -### Start Docspell -#### 1. Get the docker-compose files +## Start Docspell +### 1. Get the docker-compose files There are two options. You can clone the whole repository: @@ -159,7 +159,7 @@ You can choose any directory instead of make the rest of the guide work for both ways of obtaining the docker-compose file. -#### 2. Run `docker-compose up` +### 2. Run `docker-compose up` Change into the new `docker-compose` directory, for example: @@ -210,7 +210,7 @@ command: to the service definition (or add it to an existing `command:` section). -### Override this setup +## Override this setup If you want to change this setup, you can simply use your own compose file or add a `docker-compose.override.yml` that allows to amend @@ -251,7 +251,7 @@ volumes: ``` -### Upgrading +## Upgrading Since [downgrading](@/docs/install/downgrading.md) is not supported, it is recommended to backup your database before upgrading. Should @@ -267,7 +267,7 @@ $ docker-compose pull $ docker-compose up --force-recreate --build -d ``` -### Backups +## Backups When running the docker compose setup, you can use the following to backup the database. diff --git a/website/site/content/docs/install/downgrading.md b/website/site/content/docs/install/downgrading.md index 558fc031..9013d4bd 100644 --- a/website/site/content/docs/install/downgrading.md +++ b/website/site/content/docs/install/downgrading.md @@ -3,7 +3,9 @@ title = "Downgrading" weight = 37 +++ -{% infobubble(mode="info", title="⚠ Please note") %} +# Downgrading + +{% warningbubble(title="Note") %} Downgrading is currently not supported! It is not safe to install a previous version, because the database diff --git a/website/site/content/docs/install/download_run.md b/website/site/content/docs/install/download_run.md index 03d82577..bab0ee6b 100644 --- a/website/site/content/docs/install/download_run.md +++ b/website/site/content/docs/install/download_run.md @@ -3,24 +3,23 @@ title = "Download & Run" weight = 22 +++ +# Download and Run + You can install via zip or deb archives. Please see the [prerequisites](@/docs/install/prereq.md) first. ## Using zip files -You need to download the two files: - -- [docspell-restserver-{{version()}}.zip](https://github.com/eikek/docspell/releases/download/v{{version()}}/docspell-restserver-{{version()}}.zip) -- [docspell-joex-{{version()}}.zip](https://github.com/eikek/docspell/releases/download/v{{version()}}/docspell-joex-{{version()}}.zip) - - -1. Unzip both files: +1. Download the two files: + - docspell-restserver-{{version()}}.zip + - docspell-joex-{{version()}}.zip +2. Unzip both files: ``` bash $ unzip docspell-*.zip ``` -2. Open two terminal windows and navigate to the the directory +3. Open two terminal windows and navigate to the the directory containing the zip files. -3. Start both components executing: +4. Start both components executing: ``` bash $ ./docspell-restserver*/bin/docspell-restserver ``` @@ -29,8 +28,8 @@ You need to download the two files: $ ./docspell-joex*/bin/docspell-joex ``` in the other. -4. Point your browser to: -5. Register a new account, sign in and try it. +5. Point your browser to: +6. Register a new account, sign in and try it. Note, that this setup doesn't include watching a directory nor fulltext search. Using zip/deb files requires to take care of the @@ -64,7 +63,7 @@ extracted and installed manually somewhere in your `$PATH`. There are no deb files provided. -## Running +# Running Run the start script (in the corresponding `bin/` directory when using the zip files): diff --git a/website/site/content/docs/install/nix.md b/website/site/content/docs/install/nix.md index a60c24c3..677ef786 100644 --- a/website/site/content/docs/install/nix.md +++ b/website/site/content/docs/install/nix.md @@ -3,6 +3,7 @@ title = "Nix / NixOS" weight = 24 +++ +# Nix ## Install via Nix @@ -73,7 +74,7 @@ back to the previous version. When using the provided nix setup, the `currentPkg` always points to the latest release. Thus it is enough to run `nix-build`. -## Docspell on NixOS {#nixos} +# Docspell on NixOS {#nixos} If you are running [NixOS](https://nixos.org), there is a module definition for installing Docspell as a service using systemd. @@ -141,7 +142,7 @@ The modules files are only applicable to the newest version of Docspell. If you really need an older version, checkout the appropriate commit. -### NixOS Example +## NixOS Example This is a example system configuration that installs docspell with a postgres database. This snippet can be used to create a vm (using diff --git a/website/site/content/docs/install/prereq.md b/website/site/content/docs/install/prereq.md index 60620520..9b4fe10c 100644 --- a/website/site/content/docs/install/prereq.md +++ b/website/site/content/docs/install/prereq.md @@ -3,6 +3,8 @@ title = "Prerequisites" weight = 10 +++ +# Prerequisites + The two components have one prerequisite in common: they both require Java to run. While this is the only requirement for the *REST server*, the *Joex* components requires some more external programs. @@ -10,7 +12,7 @@ the *Joex* components requires some more external programs. The rest server and joex components are not required to "see" each other, though it is recommended. -# Java +## Java Very often, Java is already installed. You can check this by opening a terminal and typing `java -version`. Otherwise install Java using your @@ -28,7 +30,7 @@ works on newer java versions. The provided docker images use JDK11. The next tools are only required on machines running the *Joex* component. -# External Programs for Joex +## External Programs for Joex - [Ghostscript](http://pages.cs.wisc.edu/~ghost/) (the `gs` command) is used to extract/convert PDF files into images that are then fed @@ -57,7 +59,7 @@ The performance of `unoconv` can be improved by starting `unoconv -l` in a separate process. This runs a libreoffice/openoffice listener and therefore avoids starting one each time `unoconv` is called. -## Example Debian +### Example Debian On Debian this should install all joex requirements: diff --git a/website/site/content/docs/install/quickstart.md b/website/site/content/docs/install/quickstart.md index faf7eda5..6740c76e 100644 --- a/website/site/content/docs/install/quickstart.md +++ b/website/site/content/docs/install/quickstart.md @@ -1,8 +1,10 @@ +++ -title = "Quickstart" +title = "Getting started" weight = 0 +++ +# Getting started + To get started, here are some quick links: - Using [docker and docker-compose](@/docs/install/docker.md). This @@ -28,7 +30,7 @@ To get started, here are some quick links: thread](https://forums.unraid.net/topic/103425-docspell-hilfe/) in the German Unraid forum. Thanks for providing these! -Every [component](@/docs/intro/_index.md#components) (restserver, +Every [component](@/docs/_index.md#components) (restserver, joex, dsc watch) can run on different machines and multiple times. Most of the time running all on one machine is sufficient and also for simplicity, the docker-compose setup reflects this variant. @@ -39,7 +41,7 @@ file](@/docs/configure/_index.md). If this is not given, the default is used, which gets you started on a single machine, but it is very likely you want to change these to match your use-case/setup. -{% infobubble(mode="info", title="⚠ Please note") %} +{% infobubble(title="Note") %} Please have a look at the [configuration page](/docs/configure/) page, before making docspell publicly available. By default, everyone can diff --git a/website/site/content/docs/install/reverseproxy.md b/website/site/content/docs/install/reverseproxy.md index 9534aff8..8a8e5634 100644 --- a/website/site/content/docs/install/reverseproxy.md +++ b/website/site/content/docs/install/reverseproxy.md @@ -3,6 +3,8 @@ title = "Reverse Proxy" weight = 50 +++ +# Reverse Proxy + This contains examples for how to use docspell behind a reverse proxy. For the examples below, assume the following: diff --git a/website/site/content/docs/install/rpi.md b/website/site/content/docs/install/rpi.md index 2c4a3588..f932592d 100644 --- a/website/site/content/docs/install/rpi.md +++ b/website/site/content/docs/install/rpi.md @@ -1,8 +1,10 @@ +++ -title = "Raspberry-Pi and Similiar" +title = "Raspberry-Pi" weight = 40 +++ +# Raspberry Pi + Both components can run next to each other on a raspberry pi or similiar device. diff --git a/website/site/content/docs/intro/_index.md b/website/site/content/docs/intro/_index.md index 5d35d3b1..e66d96cc 100644 --- a/website/site/content/docs/intro/_index.md +++ b/website/site/content/docs/intro/_index.md @@ -3,149 +3,8 @@ title = "Introduction" weight = 0 description = "Gives a short introduction to the goals of docspell and an overview of the components involved." insert_anchor_links = "right" +redirect_to = "/docs/" [extra] mktoc = true +hidden = true +++ - -# Introduction - -Docspell aims to be a simple yet effective document organizer that -makes stowing documents away very quick and finding them later -reliable (and also fast). It is a bit opinionated and more targeted -for home use and small/medium organizations. - -In contrast to many DMS, the main focus is not so much to provide all -kinds of features to manually create organizational structures, like -folder hierarchies, where you place the documents yourself. The -approach is to leave it as a big pile of documents, but extract and -attach metadata from each document. These are mainly properties that -emerge from the document itself. The reason is that this is possible -to automate. This makes it very simple to *add* documents, because -there is no time spent to think about where to put it. And it is -possible to apply different structures on top later, like show first -all documents of a specific correspondent, then all with tag -'invoice', etc. If these properties are attached to all documents, it -is really easy to find a document. It even can be combined with -fulltext search for the, hopefully rare, desperate cases. - -Of course, it is also possible to add custom properties and arbitrary -tags. - -Docspell analyzes the text to find metadata automatically. It can -learn from existing data and can apply -[NLP](https://en.wikipedia.org/wiki/Natural_language_processing) -techniques to support this. This metadata must be maintained manually -in the application. Docspell looks for candidates for: - -- Correspondents -- Concerned person or things -- A date and due date -- Tags - -For tags, it sets all that it thinks do apply. For the others, it will -propose a few candidates and sets the most likely one to your item. - -This might be wrong, so it is recommended to curate the results. -However, very often the correct one is either set or within the -proposals where you fix it by a single click. - -Besides these properties, there are more metadata you can use to -organize your files, for example custom fields, folders and notes. - -Docspell is also for programmers. Everything is available via a REST -or HTTP api and can be easily used within your own scripts and tools, -for example using `curl`. There are also features for "advanced use" -and many configuration options. - - -# Components - -Docspell consists of multiple components that run in separate -processes: - -- REST server -- JOEX, short for *job executor* -- Fulltext Search Index (optional, currently Apache SOLR) - -The REST server provides the Api and the web application. The web -application is a -[SPA](https://en.wikipedia.org/wiki/Single-page_application) written -in [Elm](https://elm-lang.org) and is a client to the REST api. All -features are available via a http/rest api. - -The *joex* is the component that does the “heavy work”, executing -long-running tasks, like processing files or importing your mails -periodically. While the joex component also exposes a small REST api -for controlling it, the main user interface is all inside the rest -server api. - -The rest server and the job executor can be started multiple times in -order to scale out. It must be ensured, that all connect to the same -database. And it is also recommended (though not strictly required), -that all components can reach each other. - -The fulltext search index is another separate component, where -currently only [SOLR](https://solr.apache.org) is supported. -Fulltext search is optional, so the SOLR component is not required if -docspell is run without fulltext search support. - - -# Terms - -In order to better understand the following pages, some terms are -explained. - -## Item - -An *item* is roughly your document, only that an item may span -multiple files, which are called *attachments*. An item has *meta -data* associated: - -- a *correspondent*: the other side of the communication. It can be - an organization or a person. -- a *concerning person* or *equipment*: a person or thing that - this item is about. Maybe it is an insurance contract about your - car. -- *tag*: an item can be tagged with one or more tags (or labels). A - tag can have a *category*. This is intended for grouping tags, for - example a category `doctype` could be used to group tags like - `bill`, `contract`, `receipt` etc. Usually an item is not tagged - with more than one tag of a category. -- a *folder*: a folder is similiar to a tag, but an item can only be - in exactly one folder (or none). Furthermore folders allow to - associate users, so that items are only visible to the users who are - members of a folder. -- an *item date*: this is the date of the document – if this is not - set, the created date of the item is used. -- a *due date*: an optional date indicating that something has to be - done (e.g. paying a bill, submitting it) about this item until this - date -- a *direction*: one of "incoming" or "outgoing" -- a *name*: some item name, defaults to the file name of the - attachments -- some *notes*: arbitrary descriptive text. You can use markdown - here, which is properly formatted in the web application. - -## Collective - -The users of the application are part of a *collective*. A -*collective* is a group of users that share access to the same -items. The account name is therefore comprised of a *collective name* -and a *user name*. - -All users of a collective are equal; they have same permissions to -access all items. The items don't belong to a user, but to the -collective. - -That means, to identify yourself when signing in, you have to give the -collective name and your user name. By default it is separated by a -slash `/`, for example `smith/john`. If your user name is the same as -the collective name, you can omit one; so `smith/smith` can be -abbreviated to just `smith`. - -By default, all users can see all items of their collective. A -*folder* can be used to implement other visibilities: Every user can -create a folder and associate members. It is possible to put items in -these folders and docspell shows only items that are either in no -specific folder or in a folder where the current user is owner or -member. diff --git a/website/site/content/docs/joex/file-processing.md b/website/site/content/docs/joex/file-processing.md index 360412db..c3b0fcf7 100644 --- a/website/site/content/docs/joex/file-processing.md +++ b/website/site/content/docs/joex/file-processing.md @@ -7,6 +7,8 @@ insert_anchor_links = "right" mktoc = true +++ +# File Processing + When uploading a file, it is only saved to the database together with the given meta information as a "job". The file is not visible in the ui yet. Then joex takes the next such job and starts processing it. @@ -319,7 +321,7 @@ docspell.joex { } ``` -{% infobubble(mode="warning", title="Please note") %} +{% warningbubble(title="Please note") %} When this is changed, you must re-generate all preview images. Check the api for this, there is an endpoint to regenerate all preview diff --git a/website/site/content/docs/joex/intro.md b/website/site/content/docs/joex/intro.md index 930439fa..634e9104 100644 --- a/website/site/content/docs/joex/intro.md +++ b/website/site/content/docs/joex/intro.md @@ -7,7 +7,8 @@ insert_anchor_links = "right" mktoc = true +++ -# Introduction +# Joex +## Introduction Joex is short for *Job Executor* and it is the component managing long running tasks in docspell. One of these long running tasks is the file @@ -30,7 +31,7 @@ compete on getting the next job from the queue. After a job finishes and no job is waiting in the queue, joex will sleep until notified again. It will also periodically notify itself as a fallback. -# Task vs Job +## Task vs Job Just for the sake of this document, a task denotes the code that has to be executed or the thing that has to be done. It emerges in a job, @@ -39,7 +40,7 @@ up and executed eventually. A job maintains a state and other things, while a task is just code. -# Scheduler and Queue +## Scheduler and Queue The scheduler is the part that runs and monitors the long running jobs. It works together with the job queue, which defines what job to @@ -62,7 +63,7 @@ logged in, jobs are more important that those submitted when not logged in. -# Scheduler Config +## Scheduler Config The relevant part of the config file regarding the scheduler is shown below with some explanations. @@ -130,7 +131,7 @@ reach a joex component. This periodic wakup is just to ensure that jobs are eventually run. -# Periodic Tasks +## Periodic Tasks The job executor can execute tasks periodically. These tasks are stored in the database such that they can be submitted into the job @@ -139,7 +140,7 @@ something with a task. So a periodic task is never submitted twice. It is also not submitted, if a previous task has not finished yet. -# Starting on demand +## Starting on demand The job executor and rest server can be started multiple times. This is especially useful for the job executor. For example, when @@ -154,7 +155,7 @@ Once the files have been processced you can stop the additional executors. -# Shutting down +## Shutting down If a job executor is sleeping and not executing any jobs, you can just quit using SIGTERM or `Ctrl-C` when running in a terminal. But if diff --git a/website/site/content/docs/jsonminiquery/_index.md b/website/site/content/docs/jsonminiquery/_index.md index 2669e8b6..595dfa91 100644 --- a/website/site/content/docs/jsonminiquery/_index.md +++ b/website/site/content/docs/jsonminiquery/_index.md @@ -1,10 +1,15 @@ +++ title = "JSON (mini) query" +weight = 58 +template = "docs.html" +page_template = "docs.html" + [extra] -mktoc = true hidden = true +++ +# JSON Miniquery + A "JSON mini query" is a simple expression that evaluates to `true` or `false` for any given JSON value. diff --git a/website/site/content/docs/query/_index.md b/website/site/content/docs/query/_index.md index ff59e37a..9cdb6ff7 100644 --- a/website/site/content/docs/query/_index.md +++ b/website/site/content/docs/query/_index.md @@ -3,15 +3,14 @@ title = "Query Language" weight = 55 description = "The query language is a powerful way to search for documents." insert_anchor_links = "right" -[extra] -mktoc = true +template = "docs.html" +++ +# Query Language Docspell uses a query language to provide a powerful way to search for -your documents. It is targeted at "power users" and it needs to be -enabled explicitely in your user settings to be used on the search -page. +your documents. It currently needs to be enabled explicitely in your +user settings to be used on the search page.
diff --git a/website/site/content/docs/tools/_index.md b/website/site/content/docs/tools/_index.md index d4793cda..d58f3027 100644 --- a/website/site/content/docs/tools/_index.md +++ b/website/site/content/docs/tools/_index.md @@ -6,6 +6,4 @@ insert_anchor_links = "right" template = "pages.html" redirect_to = "docs/tools/cli/" sort_by = "weight" -[extra] -mktoc = false +++ diff --git a/website/site/content/docs/tools/android.md b/website/site/content/docs/tools/android.md index 7c8f86f9..560741b6 100644 --- a/website/site/content/docs/tools/android.md +++ b/website/site/content/docs/tools/android.md @@ -10,17 +10,22 @@ There is a simple Android App available to conveniently upload files from your android devices. Combined with a scanner app, this allows to very quickly scan single page documents like receipts. -
-
+
+ -
- Download the APK from here + +
@@ -43,32 +48,30 @@ The app is very simple: - You can now either select an URL from the app, or the upload begins immediatly if you set a default URL. -
-
+
+
{{ imgnormal(file="screenshot-create.jpg", width="") }} -

(A)

+

(A)

-
+
{{ imgnormal(file="screenshot-choose.jpg", width="") }} -

(B)

+

(B)

-
+
{{ imgnormal(file="screenshot-options.jpg", width="") }} -

(C)

+

(C)

-
-
-
+
{{ imgnormal(file="screenshot-default.jpg", width="") }} -

(D)

+

(D)

-
+
{{ imgnormal(file="screenshot-share.jpg", width="") }} -

(E)

+

(E)

-
+
{{ imgnormal(file="screenshot-uploading.jpg", width="") }} -

(F)

+

(F)

diff --git a/website/site/content/docs/tools/browserext.md b/website/site/content/docs/tools/browserext.md deleted file mode 100644 index 058c06b8..00000000 --- a/website/site/content/docs/tools/browserext.md +++ /dev/null @@ -1,84 +0,0 @@ -+++ -title = "Browser Extension (Firefox)" -description = "An extension for firefox to upload files from your browser via right-click → upload to docspell." -weight = 40 -+++ - -The idea is to click on a file in firefox and send it to docspell. It -is downloaded in the context of your current page. Then handed to an -application that pushes it to docspell. There is a browser add-on -implementing this in `tools/webextension`. This add-on only works with -firefox. - -Installation is a bit complicated, since you need to install external -tools and the web extension. Both work together. - -# Install `dsc` - -First copy the [dsc](@/docs/tools/cli.md) tool somewhere in your -`PATH`, maybe `/usr/local/bin`. - - -# Install the native part - -Then install the "native" part of the web extension: - -Copy or symlink the `native.py` script into some known location. For -example: - -``` bash -ln -s ~/docspell-checkout/tools/webextension/native/native.py /usr/local/share/docspell/native.py -``` - -Then copy the `app_manifest.json` to -`$HOME/.mozilla/native-messaging-hosts/docspell.json`. For example: - -``` bash -cp ~/docspell-checkout/tools/webextension/native/app_manifest.json ~/.mozilla/native-messaging-hosts/docspell.json -``` - -See -[here](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Native_manifests#manifest_location) -for details. - -And you might want to modify this json file, so the path to the -`native.py` script is correct (it must be absolute). - -If the `dsc` tool is in your `$PATH`, then this should work. You need -to provide a default source id in your `~/.config/dsc/config.toml` so -that the upload command can be used without further arguments. - -Otherwise, edit the `native.py` script and change the path to the tool -and/or the arguments. Or create a file -`$HOME/.config/docspell/dsc.cmd` whose content is the path to the -`dsc` tool. - - -# Install the extension - -An extension file can be build using the `make-xpi.sh` script. But -installing it in "standard" firefox won't work, because [Mozilla -requires extensions to be signed by -them](https://wiki.mozilla.org/Add-ons/Extension_Signing). This means -creating an account and going through some process…. So here are two -alternatives: - -1. Open firefox and type `about:debugging` in the addressbar. Then - click on *'Load Temporary Add-on...'* and select the - `manifest.json` file. The extension is now installed. The downside - is, that the extension will be removed once firefox is closed. -2. Use Firefox ESR, which allows to install Add-ons not signed by - Mozilla. But it has to be configured: Open firefox and type - `about:config` in the address bar. Search for key - `xpinstall.signatures.required` and set it to `false`. This is - described on the last paragraph on [this - page](https://support.mozilla.org/en-US/kb/add-on-signing-in-firefox). - -When you right click on a file link, there should be a context menu -entry *'Docspell Upload Helper'*. The add-on will download this file -using the browser and then send the file path to the `native.py` -script. This script will in turn call `dsc` which finally uploads it -to your configured URLs. - -Open the Add-ons page (`Ctrl`+`Shift`+`A`), the new add-on should be -there. diff --git a/website/site/content/docs/tools/cli.md b/website/site/content/docs/tools/cli.md index 7f8a207b..4e9cfaa6 100644 --- a/website/site/content/docs/tools/cli.md +++ b/website/site/content/docs/tools/cli.md @@ -4,7 +4,8 @@ description = "A command line interface to." weight = 5 +++ -# Introduction +# Docspell CLI +## Introduction The **d**oc**s**pell **c**lient, short [dsc](https://github.com/docspell/dsc), is a tool to use @@ -17,7 +18,7 @@ directory. It is a work in progress; eventually most of the [api](@/docs/api/_index.md) will be covered. -# Usage +## Usage Download the binary for your architecture from the [release page](https://github.com/docspell/dsc/releases/latest) and rename it @@ -86,11 +87,9 @@ you need to `login` again. ## Demo -
-
- -
-
+
+ +
# Use Cases / Examples diff --git a/website/site/content/docs/tools/paperless-import.md b/website/site/content/docs/tools/paperless-import.md index c93b9adc..33d7cb24 100644 --- a/website/site/content/docs/tools/paperless-import.md +++ b/website/site/content/docs/tools/paperless-import.md @@ -4,7 +4,9 @@ description = "Import your data from paperless." weight = 60 +++ -# Introduction +# Import from Paperless + +## Introduction Coming from [paperless](https://github.com/the-paperless-project/paperless/), the @@ -15,7 +17,7 @@ importing your data from paperless into docspell. The script imports the files and also tags and correspondents. -{% infobubble(mode="info", title="⚠ Please note") %} +{% infobubble(title="Note") %} The script was written some while ago. It currently doesn't work out of the box, but is a good starting point as the issues are most @@ -25,7 +27,7 @@ issue](https://github.com/eikek/docspell/issues/1241). {% end %} -# Usage +## Usage Copy the script to the machine where paperless is running. Run it with the following arguments: diff --git a/website/site/content/docs/tools/smtpgateway.md b/website/site/content/docs/tools/smtpgateway.md index d9ff2cea..dd2be02c 100644 --- a/website/site/content/docs/tools/smtpgateway.md +++ b/website/site/content/docs/tools/smtpgateway.md @@ -4,6 +4,8 @@ description = "Start a SMTP server that forwards all mails to docspell." weight = 50 +++ +# SMTP Gateway with Exim + One possible use case for the [integration endpoint](@/docs/api/upload.md#integration-endpoint) is a SMTP server that forwards all local mail to docspell. This way there is no diff --git a/website/site/content/docs/webapp/autotagging.md b/website/site/content/docs/webapp/autotagging.md index b2e91b36..4f282512 100644 --- a/website/site/content/docs/webapp/autotagging.md +++ b/website/site/content/docs/webapp/autotagging.md @@ -5,6 +5,7 @@ weight = 90 mktoc = true +++ +# Auto-Tagging Auto-Tagging must be enabled in the collective profile. Docspell can go through your items periodically and learn from your existing tags. @@ -20,7 +21,7 @@ determined by looking at the text of the document. It would mean that Docspell could learn relationships that are not correct and then tag the next incoming items with `Done`. -{{ figure(file="collective-settings-autotag.png") }} +{{ figure2(light="collective-settings-autotag.png", dark="collective-settings-autotag_dark.png") }} That is why you need to specify what tags to learn. This is done by defining whitelist or a blacklist of tag categories. When defining a diff --git a/website/site/content/docs/webapp/bookmarks-01.png b/website/site/content/docs/webapp/bookmarks-01.png index 2aeadfcd..101dbc15 100644 Binary files a/website/site/content/docs/webapp/bookmarks-01.png and b/website/site/content/docs/webapp/bookmarks-01.png differ diff --git a/website/site/content/docs/webapp/bookmarks-01_dark.png b/website/site/content/docs/webapp/bookmarks-01_dark.png new file mode 100644 index 00000000..e02d2e4b Binary files /dev/null and b/website/site/content/docs/webapp/bookmarks-01_dark.png differ diff --git a/website/site/content/docs/webapp/bookmarks-02.png b/website/site/content/docs/webapp/bookmarks-02.png index 46309d26..d4d21c57 100644 Binary files a/website/site/content/docs/webapp/bookmarks-02.png and b/website/site/content/docs/webapp/bookmarks-02.png differ diff --git a/website/site/content/docs/webapp/bookmarks-02_dark.png b/website/site/content/docs/webapp/bookmarks-02_dark.png new file mode 100644 index 00000000..e884dc38 Binary files /dev/null and b/website/site/content/docs/webapp/bookmarks-02_dark.png differ diff --git a/website/site/content/docs/webapp/bookmarks-03.png b/website/site/content/docs/webapp/bookmarks-03.png index bc0f1999..09828983 100644 Binary files a/website/site/content/docs/webapp/bookmarks-03.png and b/website/site/content/docs/webapp/bookmarks-03.png differ diff --git a/website/site/content/docs/webapp/bookmarks-03_dark.png b/website/site/content/docs/webapp/bookmarks-03_dark.png new file mode 100644 index 00000000..db6c5957 Binary files /dev/null and b/website/site/content/docs/webapp/bookmarks-03_dark.png differ diff --git a/website/site/content/docs/webapp/bookmarks-04.png b/website/site/content/docs/webapp/bookmarks-04.png index 535a582c..96b1ab0c 100644 Binary files a/website/site/content/docs/webapp/bookmarks-04.png and b/website/site/content/docs/webapp/bookmarks-04.png differ diff --git a/website/site/content/docs/webapp/bookmarks-04_dark.png b/website/site/content/docs/webapp/bookmarks-04_dark.png new file mode 100644 index 00000000..5fb3501a Binary files /dev/null and b/website/site/content/docs/webapp/bookmarks-04_dark.png differ diff --git a/website/site/content/docs/webapp/bookmarks.md b/website/site/content/docs/webapp/bookmarks.md index e18c6b0c..8aab41b0 100644 --- a/website/site/content/docs/webapp/bookmarks.md +++ b/website/site/content/docs/webapp/bookmarks.md @@ -5,6 +5,8 @@ weight = 35 mktoc = true +++ +# Bookmarks + Bookmarks allow you to save queries under a name and refer to it from the search menu. ## Creating bookmarks @@ -12,13 +14,13 @@ Bookmarks allow you to save queries under a name and refer to it from the search Bookmarks can be created from the search view. Apply some criteria to select items and then click on the top left menu. -{{ figure(file="bookmarks-02.png") }} +{{ figure2(light="bookmarks-02.png", dark="bookmarks-02_dark.png") }} This opens a small form right below the search bar where you can adjust the query and enter the name. You can also decide whether this bookmark is for all users or just for you. -{{ figure(file="bookmarks-03.png") }} +{{ figure2(light="bookmarks-03.png", dark="bookmarks-03_dark.png") }} The other way is to go to *Manage Data* where you can edit and delete existing bookmarks and also create new ones. @@ -31,8 +33,8 @@ that shows you all your bookmarks as well as your shares. Clicking one "enables" it, meaning the query is used in conjunction with other criteria. -
- {{ imgnormal(file="bookmarks-01.png", width="") }} +
+ {{ imgnormal2(light="bookmarks-01.png", dark="bookmarks-01_dark.png", width="") }}
An active bookmark has a check icon next to its name. @@ -47,7 +49,7 @@ registered users), expired shares are shown as well. The *Manage Data* page has a section for bookmarks. There you can delete and edit bookmarks. -{{ figure(file="bookmarks-04.png") }} +{{ figure2(light="bookmarks-04.png", dark="bookmarks-04_dark.png") }} The personal bookmarks are only visible to you. The collective bookmarks are visible to every user in the collective, which also diff --git a/website/site/content/docs/webapp/collective-settings-autotag.png b/website/site/content/docs/webapp/collective-settings-autotag.png index 2999afbc..fb147b9c 100644 Binary files a/website/site/content/docs/webapp/collective-settings-autotag.png and b/website/site/content/docs/webapp/collective-settings-autotag.png differ diff --git a/website/site/content/docs/webapp/collective-settings-autotag_dark.png b/website/site/content/docs/webapp/collective-settings-autotag_dark.png new file mode 100644 index 00000000..99dcf20a Binary files /dev/null and b/website/site/content/docs/webapp/collective-settings-autotag_dark.png differ diff --git a/website/site/content/docs/webapp/curate.md b/website/site/content/docs/webapp/curate.md index 86d95a1b..f0c7bb4b 100644 --- a/website/site/content/docs/webapp/curate.md +++ b/website/site/content/docs/webapp/curate.md @@ -3,11 +3,13 @@ title = "Curate Items" weight = 20 +++ +# Curate items + Curating the items meta data helps finding them later. This page describes how you can quickly go through those items and correct or amend with existing data. -# Select New items +## Select New items After files have been uploaded and the job executor created the corresponding items, they will show up on the main page. All items the @@ -15,14 +17,14 @@ job executor has just created are initially marked as *New*. The option *Inbox* in the left search menu can be used to select only new items: -{{ figure(file="docspell-curate-1.png") }} +{{ figure2(light="docspell-curate-1.png", dark="docspell-curate-1_dark.png") }} Then you can go through all new items and check their metadata: Click on the first item to open the detail view. This shows the documents and the meta data in the header. -# Modify if necessary +## Modify if necessary You can compare the data with the documents and change as you like. Since the item status is *New*, you'll see the suggestions docspell @@ -31,7 +33,7 @@ select another one by clicking its name in the suggestion list. In state *New* the left menu is fully expanded so you see all suggestions immediatly. -{{ figure(file="docspell-curate-3.png") }} +{{ figure2(light="docspell-curate-3.png", dark="docspell-curate-3_dark.png") }} When you change something in the form, it is immediatly applied. @@ -39,13 +41,11 @@ When you change something in the form, it is immediatly applied. It is also possible to change tags and folders in the list view via drag&drop. -
-
- {{ imgnormal(file="drop-tag.png", width="500px") }} -
+
+ {{ imgnormal2(light="drop-tag.png", dark="drop-tag_dark.png", width="500px") }}
-# Confirm +## Confirm If everything looks good, click the *Confirm* button to confirm the current data. The *New* status goes away and also the suggestions are @@ -54,10 +54,10 @@ before. You can always go back by clicking the *Unconfirm* button at the right of the menu bar. -{{ figure(file="docspell-curate-5.png") }} +{{ figure2(light="docspell-curate-5.png", dark="docspell-curate-5_dark.png") }} -# Proceed with next item +## Proceed with next item To look at the next item in the search results, click the *Next* button in the menu (next to the *Edit* button). Clicking next, will @@ -65,4 +65,4 @@ keep the current view, so you can continue checking the data. If you are on the last item, the view switches to the listing view when clicking *Next*. -{{ figure(file="docspell-curate-6.png") }} +{{ figure2(light="docspell-curate-6.png", dark="docspell-curate-6_dark.png") }} diff --git a/website/site/content/docs/webapp/custom-fields-01.png b/website/site/content/docs/webapp/custom-fields-01.png index b7107e11..1d27295e 100644 Binary files a/website/site/content/docs/webapp/custom-fields-01.png and b/website/site/content/docs/webapp/custom-fields-01.png differ diff --git a/website/site/content/docs/webapp/custom-fields-01_dark.png b/website/site/content/docs/webapp/custom-fields-01_dark.png new file mode 100644 index 00000000..34434ab7 Binary files /dev/null and b/website/site/content/docs/webapp/custom-fields-01_dark.png differ diff --git a/website/site/content/docs/webapp/custom-fields-02.png b/website/site/content/docs/webapp/custom-fields-02.png index aef251c9..b98d9dbd 100644 Binary files a/website/site/content/docs/webapp/custom-fields-02.png and b/website/site/content/docs/webapp/custom-fields-02.png differ diff --git a/website/site/content/docs/webapp/custom-fields-02_dark.png b/website/site/content/docs/webapp/custom-fields-02_dark.png new file mode 100644 index 00000000..97573e7c Binary files /dev/null and b/website/site/content/docs/webapp/custom-fields-02_dark.png differ diff --git a/website/site/content/docs/webapp/custom-fields-03-dark.png b/website/site/content/docs/webapp/custom-fields-03_dark.png similarity index 100% rename from website/site/content/docs/webapp/custom-fields-03-dark.png rename to website/site/content/docs/webapp/custom-fields-03_dark.png diff --git a/website/site/content/docs/webapp/custom-fields-04-dark.png b/website/site/content/docs/webapp/custom-fields-04_dark.png similarity index 100% rename from website/site/content/docs/webapp/custom-fields-04-dark.png rename to website/site/content/docs/webapp/custom-fields-04_dark.png diff --git a/website/site/content/docs/webapp/custom-fields-05.png b/website/site/content/docs/webapp/custom-fields-05.png index 6b1a9915..e989db3e 100644 Binary files a/website/site/content/docs/webapp/custom-fields-05.png and b/website/site/content/docs/webapp/custom-fields-05.png differ diff --git a/website/site/content/docs/webapp/custom-fields-05_dark.png b/website/site/content/docs/webapp/custom-fields-05_dark.png new file mode 100644 index 00000000..1b41d7de Binary files /dev/null and b/website/site/content/docs/webapp/custom-fields-05_dark.png differ diff --git a/website/site/content/docs/webapp/custom-fields-06.png b/website/site/content/docs/webapp/custom-fields-06.png index 5fb6521f..167ce575 100644 Binary files a/website/site/content/docs/webapp/custom-fields-06.png and b/website/site/content/docs/webapp/custom-fields-06.png differ diff --git a/website/site/content/docs/webapp/custom-fields-06_dark.png b/website/site/content/docs/webapp/custom-fields-06_dark.png new file mode 100644 index 00000000..34a75f14 Binary files /dev/null and b/website/site/content/docs/webapp/custom-fields-06_dark.png differ diff --git a/website/site/content/docs/webapp/custom-fields-07.png b/website/site/content/docs/webapp/custom-fields-07.png index 40b6702b..813646f3 100644 Binary files a/website/site/content/docs/webapp/custom-fields-07.png and b/website/site/content/docs/webapp/custom-fields-07.png differ diff --git a/website/site/content/docs/webapp/custom-fields-07_dark.png b/website/site/content/docs/webapp/custom-fields-07_dark.png new file mode 100644 index 00000000..59a8aaa7 Binary files /dev/null and b/website/site/content/docs/webapp/custom-fields-07_dark.png differ diff --git a/website/site/content/docs/webapp/customfields.md b/website/site/content/docs/webapp/customfields.md index 0357d097..6be0825c 100644 --- a/website/site/content/docs/webapp/customfields.md +++ b/website/site/content/docs/webapp/customfields.md @@ -3,6 +3,8 @@ title = "Custom Fields" weight = 18 +++ +# Custom Fields + Custom fields allow to attach user defined metadata to items. For example, you may want to track the amount of each receipt or the invoice number etc. You can define fields that can be associated to @@ -15,7 +17,7 @@ Custom fields can be deactivated in the user settings. Go to the _Manage Data_ page, that can be reached from the top right menu. One entry at the left shows _Custom Fields_: -{{ figure(file="custom-fields-01.png") }} +{{ figure2(light="custom-fields-01.png", dark="custom-fields-01_dark.png") }} Fields are defined per collective. They can also be created in the item edit menu (just like creating organizations). The `#Usage` @@ -23,7 +25,7 @@ columns show how many items have a value for this field. A field consists of a name, a format and optional a label: -{{ figure(file="custom-fields-02.png") }} +{{ figure2(light="custom-fields-02.png", dark="custom-fields-02_dark.png") }} The name and format is required. The name must be unique among all your fields and it is special in that it must be a valid _identifier_: @@ -73,7 +75,7 @@ corresponding input field is shown asking for values. You can select multiple fields. Only one value is allowed to set per item and field. The example below shows a text field and a money field: -{{ figure(file="custom-fields-03.png") }} +{{ figure2(light="custom-fields-03.png", dark="custom-fields-03_dark.png") }} You can create new fields right here without going to the _Manage Data_ page, by clicking the plus icon (1). The format of each field is @@ -83,14 +85,13 @@ As soon as a correct value is typed in, it is saved to the item and shown in the header next to the tags. If you click the trash-can icon next to an input, the value is removed from the item. -{{ figure(file="custom-fields-04.png") }} +{{ figure2(light="custom-fields-04.png", dark="custom-fields-04_dark.png") }} The item card also shows custom fields, in the same place as tags: -
-
- {{ imgnormal(file="custom-fields-05.png", width=300) }} -
+ +
+{{ imgnormal2(light="custom-fields-05.png", dark="custom-fields-05_dark.png", width=300) }}
Adding values for custom fields in @@ -102,13 +103,13 @@ Adding values for custom fields in The search menu shows the same dropdown for selecting a custom field. Then you can set values that are matched against your items. -{{ figure(file="custom-fields-06.png") }} +{{ figure2(light="custom-fields-06.png", dark="custom-fields-06_dark.png") }} Values are also validated in the search form. Only valid values are sent to the server for searching. There is one exception: you can use a wildcard at beginning and/or end to do a substring match: -{{ figure(file="custom-fields-07.png") }} +{{ figure2(light="custom-fields-07.png", dark="custom-fields-07_dark.png") }} For all numeric and money values, a little summary is displayed next to the overall item count at the top of the page. diff --git a/website/site/content/docs/webapp/dashboards-01.png b/website/site/content/docs/webapp/dashboards-01.png index 8aeaee2d..cdd3ce7e 100644 Binary files a/website/site/content/docs/webapp/dashboards-01.png and b/website/site/content/docs/webapp/dashboards-01.png differ diff --git a/website/site/content/docs/webapp/dashboards-01_dark.png b/website/site/content/docs/webapp/dashboards-01_dark.png new file mode 100644 index 00000000..43b64b0c Binary files /dev/null and b/website/site/content/docs/webapp/dashboards-01_dark.png differ diff --git a/website/site/content/docs/webapp/dashboards-02.png b/website/site/content/docs/webapp/dashboards-02.png index 928d02fb..d46b1904 100644 Binary files a/website/site/content/docs/webapp/dashboards-02.png and b/website/site/content/docs/webapp/dashboards-02.png differ diff --git a/website/site/content/docs/webapp/dashboards-02_dark.png b/website/site/content/docs/webapp/dashboards-02_dark.png new file mode 100644 index 00000000..738b6b86 Binary files /dev/null and b/website/site/content/docs/webapp/dashboards-02_dark.png differ diff --git a/website/site/content/docs/webapp/dashboards-03.png b/website/site/content/docs/webapp/dashboards-03.png index 0feed509..4c5e1f9b 100644 Binary files a/website/site/content/docs/webapp/dashboards-03.png and b/website/site/content/docs/webapp/dashboards-03.png differ diff --git a/website/site/content/docs/webapp/dashboards-03_dark.png b/website/site/content/docs/webapp/dashboards-03_dark.png new file mode 100644 index 00000000..c24e0c4c Binary files /dev/null and b/website/site/content/docs/webapp/dashboards-03_dark.png differ diff --git a/website/site/content/docs/webapp/dashboards-04.png b/website/site/content/docs/webapp/dashboards-04.png index 9df746fd..c3e0ee65 100644 Binary files a/website/site/content/docs/webapp/dashboards-04.png and b/website/site/content/docs/webapp/dashboards-04.png differ diff --git a/website/site/content/docs/webapp/dashboards-04_dark.png b/website/site/content/docs/webapp/dashboards-04_dark.png new file mode 100644 index 00000000..289bf716 Binary files /dev/null and b/website/site/content/docs/webapp/dashboards-04_dark.png differ diff --git a/website/site/content/docs/webapp/dashboards-05_dark.png b/website/site/content/docs/webapp/dashboards-05_dark.png new file mode 100644 index 00000000..e50746c6 Binary files /dev/null and b/website/site/content/docs/webapp/dashboards-05_dark.png differ diff --git a/website/site/content/docs/webapp/dashboards.md b/website/site/content/docs/webapp/dashboards.md index 72d61b7c..8ab7da66 100644 --- a/website/site/content/docs/webapp/dashboards.md +++ b/website/site/content/docs/webapp/dashboards.md @@ -5,18 +5,20 @@ weight = 5 mktoc = true +++ +# Dashboards + The main page shows a dashboard that can be configured to show some aspects of your documents. The following shows the default dashboard that is bundled in the application: -{{ figure(file="dashboards-01.png") }} +{{ figure2(light="dashboards-01.png", dark="dashboards-01_dark.png") }} It shows a predefined set of information, which can be customized. You can create multiple dashboards and switch between them, you can also define one as the "default" which is shown when the page loads. -# Side menu +## Side menu The side menu contains a list of useful links. The first loads the default dashboard. All others (and more) are available through the @@ -29,7 +31,7 @@ The _Settings_ section contains some links to useful settings and the _Manage_ section has links to metadata that can be managed separately. These links are fixed and cannot be changed. -# Dasbhoard properties +## Dasbhoard properties The main component on this page is the "dashboard". A dashboard has the following properties (all required): @@ -57,7 +59,7 @@ removing boxes and the dashboard properties. After clicking _Edit Dashboard_ the dashboard changes into a form: -{{ figure(file="dashboards-02.png") }} +{{ figure2(light="dashboards-02.png", dark="dashboards-02_dark.png") }} Note the message on the top: it indicates that this dashboard is the bundled one that is used only if there are no custom ones available. @@ -72,19 +74,19 @@ reorder the boxes using the arrow buttons or drag and drop. When satisfied, click _Submit_. In the example, the last two boxes are removed and box decorations are enabled for the field overview box. -{{ figure(file="dashboards-03.png") }} +{{ figure2(light="dashboards-03.png", dark="dashboards-03_dark.png") }} When you now edit this dasbhoard again, the message is gone and you can change the dashboard and also delete it. You can also create a new dashboard or copy the current one. -{{ figure(file="dashboards-04.png") }} +{{ figure2(light="dashboards-04.png", dark="dashboards-04_dark.png") }} In this example, the dashboard was copied, then the message was changed and it was set to the default dashboard. This is how it looks now: -{{ figure(file="dashboards-05.png") }} +{{ figure2(light="dashboards-05.png", dark="dashboards-05_dark.png") }} When there is more than one dashboard, the side menu shows all of them. The little house icon indicates whether this is the default diff --git a/website/site/content/docs/webapp/docspell-curate-1-dark.png b/website/site/content/docs/webapp/docspell-curate-1_dark.png similarity index 100% rename from website/site/content/docs/webapp/docspell-curate-1-dark.png rename to website/site/content/docs/webapp/docspell-curate-1_dark.png diff --git a/website/site/content/docs/webapp/docspell-curate-3.png b/website/site/content/docs/webapp/docspell-curate-3.png index 62982bc6..2158ebbd 100644 Binary files a/website/site/content/docs/webapp/docspell-curate-3.png and b/website/site/content/docs/webapp/docspell-curate-3.png differ diff --git a/website/site/content/docs/webapp/docspell-curate-3_dark.png b/website/site/content/docs/webapp/docspell-curate-3_dark.png new file mode 100644 index 00000000..46f775f0 Binary files /dev/null and b/website/site/content/docs/webapp/docspell-curate-3_dark.png differ diff --git a/website/site/content/docs/webapp/docspell-curate-5-dark.png b/website/site/content/docs/webapp/docspell-curate-5_dark.png similarity index 100% rename from website/site/content/docs/webapp/docspell-curate-5-dark.png rename to website/site/content/docs/webapp/docspell-curate-5_dark.png diff --git a/website/site/content/docs/webapp/docspell-curate-6-dark.png b/website/site/content/docs/webapp/docspell-curate-6_dark.png similarity index 100% rename from website/site/content/docs/webapp/docspell-curate-6-dark.png rename to website/site/content/docs/webapp/docspell-curate-6_dark.png diff --git a/website/site/content/docs/webapp/drop-tag.png b/website/site/content/docs/webapp/drop-tag.png index f29aad46..18e5985f 100644 Binary files a/website/site/content/docs/webapp/drop-tag.png and b/website/site/content/docs/webapp/drop-tag.png differ diff --git a/website/site/content/docs/webapp/drop-tag_dark.png b/website/site/content/docs/webapp/drop-tag_dark.png new file mode 100644 index 00000000..9b62fd1c Binary files /dev/null and b/website/site/content/docs/webapp/drop-tag_dark.png differ diff --git a/website/site/content/docs/webapp/emailsettings.md b/website/site/content/docs/webapp/emailsettings.md index 751c612a..f91e84bd 100644 --- a/website/site/content/docs/webapp/emailsettings.md +++ b/website/site/content/docs/webapp/emailsettings.md @@ -5,6 +5,8 @@ weight = 40 mktoc = true +++ +# E-Mail Settings + Docspell has a good integration for E-Mail. You can send e-mails related to an item and you can import e-mails from your mailbox into docspell. @@ -24,7 +26,7 @@ your e-mail account to send mails on behalf of you and receive your mails.* -# SMTP Settings +## SMTP Settings For sending mail, you need to provide information to connect to a SMTP server. Every e-mail provider has this information somewhere @@ -32,7 +34,7 @@ available. Configure this in *User Settings -> E-Mail Settings (SMTP)*: -{{ figure(file="mail-settings-1.png") }} +{{ figure2(light="mail-settings-1.png", dark="mail-settings-1_dark.png") }} First, you need to provide some name that is used to recognize this account. This name is also used in URLs to docspell and so it must not @@ -61,7 +63,7 @@ possible to set up these settings for multiple providers, so you can choose from which account you want to send mails. -# IMAP Settings +## IMAP Settings For receiving e-mails, you need to provide information to connect to an IMAP server. Your e-mail provider should have this information @@ -69,7 +71,7 @@ somewhere available. Configure this in *User Settings -> E-Mail Settings (IMAP)*: -{{ figure(file="mail-settings-2.png") }} +{{ figure2(light="mail-settings-2.png", dark="mail-settings-2_dark.png") }} First you need to define a *Name* to recognize this connection inside docspell. This name is also used in URLs to docspell and so it must diff --git a/website/site/content/docs/webapp/finding.md b/website/site/content/docs/webapp/finding.md index b39560f6..205cde2a 100644 --- a/website/site/content/docs/webapp/finding.md +++ b/website/site/content/docs/webapp/finding.md @@ -5,6 +5,8 @@ weight = 30 mktoc = true +++ +# Finding items + Items can be searched by their annotated meta data and their contents using full text search. The landing page shows a list of current items. Items are displayed sorted by their date, newest first. @@ -12,8 +14,6 @@ items. Items are displayed sorted by their date, newest first. # Search Bar -{{ imgright(file="search-bar.png") }} - The search bar let's you search in item and attachment names names and do fulltext search. The icon next to the search field can switch between these modes. @@ -44,7 +44,7 @@ unmodified. # Search Menu -{{ imgright(file="search-menu.png") }} +{{ imgright2(light="search-menu.png", dark="search-menu_dark.png") }} The search menu can be opened by clicking the left icon in the top bar. It shows some options to constrain the item list: @@ -79,11 +79,11 @@ You can also use drag&drop to tag items in this view. Simply drag an item card and drop it on a tag, this will toggle the tag on the item. If the item was tagged already, the tag is removed, otherwise added. -
-
- {{ imgnormal(file="drop-tag.png", width="400px") }} -
-
+
+ + +
+ ## Folder @@ -186,6 +186,7 @@ contents, attachment names, item name and item notes. When using full text search, each item in the result list is annotated with the highlighted occurrence of the match. -
- +
+ +
diff --git a/website/site/content/docs/webapp/itemcard-customize-01.png b/website/site/content/docs/webapp/itemcard-customize-01.png index c9598d15..9da32ca5 100644 Binary files a/website/site/content/docs/webapp/itemcard-customize-01.png and b/website/site/content/docs/webapp/itemcard-customize-01.png differ diff --git a/website/site/content/docs/webapp/itemcard-customize-01_dark.png b/website/site/content/docs/webapp/itemcard-customize-01_dark.png new file mode 100644 index 00000000..387a0cd4 Binary files /dev/null and b/website/site/content/docs/webapp/itemcard-customize-01_dark.png differ diff --git a/website/site/content/docs/webapp/itemcard-customize.md b/website/site/content/docs/webapp/itemcard-customize.md index db7b2df0..5b43bcc1 100644 --- a/website/site/content/docs/webapp/itemcard-customize.md +++ b/website/site/content/docs/webapp/itemcard-customize.md @@ -1,10 +1,10 @@ +++ title = "Customize Item Card" weight = 39 -[extra] -mktoc = true +++ +# Customize item card + The search view or list view displays the search results as a list of item cards. Each cards represents one item. @@ -12,7 +12,7 @@ The item card can be customized a bit in the user settings. In the user menu (the user icon, top right), choose _User Profile_ and then _UI Settings_. Among other things, there is a _Item Cards_ section: -{{ figure(file="itemcard-customize-01.png") }} +{{ figure2(light="itemcard-customize-01.png", dark="itemcard-customize-01_dark.png") }} ### Max Note Length @@ -33,14 +33,14 @@ specified via this setting. A _small_ preview uses about 80px width, a _medium_ one 160px and _large_ means to use the available space in the card. -
-
+
+
{{ imgnormal(file="itemcard-customize-04.png", width="300")}}
-
+
{{ imgnormal(file="itemcard-customize-03.png", width="300")}}
-
+
{{ imgnormal(file="itemcard-customize-02.png", width="300")}}
diff --git a/website/site/content/docs/webapp/mail-item-1.png b/website/site/content/docs/webapp/mail-item-1.png index 2f575c04..c96a0bc3 100644 Binary files a/website/site/content/docs/webapp/mail-item-1.png and b/website/site/content/docs/webapp/mail-item-1.png differ diff --git a/website/site/content/docs/webapp/mail-item-1_dark.png b/website/site/content/docs/webapp/mail-item-1_dark.png new file mode 100644 index 00000000..5fc8d174 Binary files /dev/null and b/website/site/content/docs/webapp/mail-item-1_dark.png differ diff --git a/website/site/content/docs/webapp/mail-item-2.png b/website/site/content/docs/webapp/mail-item-2.png index 4894a3e3..d8078a0d 100644 Binary files a/website/site/content/docs/webapp/mail-item-2.png and b/website/site/content/docs/webapp/mail-item-2.png differ diff --git a/website/site/content/docs/webapp/mail-item-2_dark.png b/website/site/content/docs/webapp/mail-item-2_dark.png new file mode 100644 index 00000000..7e1bc644 Binary files /dev/null and b/website/site/content/docs/webapp/mail-item-2_dark.png differ diff --git a/website/site/content/docs/webapp/mail-item-4.png b/website/site/content/docs/webapp/mail-item-4.png index c161181a..e625aa17 100644 Binary files a/website/site/content/docs/webapp/mail-item-4.png and b/website/site/content/docs/webapp/mail-item-4.png differ diff --git a/website/site/content/docs/webapp/mail-item-4_dark.png b/website/site/content/docs/webapp/mail-item-4_dark.png new file mode 100644 index 00000000..dc7425ae Binary files /dev/null and b/website/site/content/docs/webapp/mail-item-4_dark.png differ diff --git a/website/site/content/docs/webapp/mail-settings-1.png b/website/site/content/docs/webapp/mail-settings-1.png index 1ea5d9bc..d8e80fc3 100644 Binary files a/website/site/content/docs/webapp/mail-settings-1.png and b/website/site/content/docs/webapp/mail-settings-1.png differ diff --git a/website/site/content/docs/webapp/mail-settings-1_dark.png b/website/site/content/docs/webapp/mail-settings-1_dark.png new file mode 100644 index 00000000..adc6d1d0 Binary files /dev/null and b/website/site/content/docs/webapp/mail-settings-1_dark.png differ diff --git a/website/site/content/docs/webapp/mail-settings-2.png b/website/site/content/docs/webapp/mail-settings-2.png index fd3f1f5d..adcbcdfc 100644 Binary files a/website/site/content/docs/webapp/mail-settings-2.png and b/website/site/content/docs/webapp/mail-settings-2.png differ diff --git a/website/site/content/docs/webapp/mail-settings-2_dark.png b/website/site/content/docs/webapp/mail-settings-2_dark.png new file mode 100644 index 00000000..13b8d2da Binary files /dev/null and b/website/site/content/docs/webapp/mail-settings-2_dark.png differ diff --git a/website/site/content/docs/webapp/mailitem.md b/website/site/content/docs/webapp/mailitem.md index 01e790be..c70307e1 100644 --- a/website/site/content/docs/webapp/mailitem.md +++ b/website/site/content/docs/webapp/mailitem.md @@ -1,19 +1,16 @@ +++ title = "Send items via E-Mail" weight = 50 -[extra] -mktoc = true +++ +# E-Mail Settings (SMTP) + You can send e-mails from within docspell attaching the files of an item. This is useful to collaborate or share certain documents with people outside docspell. All sent mails are stored attached to the item. - -# E-Mail Settings (SMTP) - To send mails, there are SMTP settings required. Please see the page about [e-mail settings](@/docs/webapp/emailsettings.md#smtp-settings). @@ -27,7 +24,7 @@ item, or you may choose to send the mail without any attachments. In the item detail view, click on the envelope icon to open the mail form: -{{ figure(file="mail-item-1.png") }} +{{ figure2(light="mail-item-1.png", dark="mail-item-1_dark.png") }} Then write the mail. Multiple recipients may be specified. The input field shows completion proposals from all contacts in your address @@ -61,8 +58,8 @@ database and you'll see a message in the form. If there is an e-mail for an item, another section is rendered below the item notes. -{{ figure(file="mail-item-2.png") }} +{{ figure2(light="mail-item-2.png", dark="mail-item-2_dark.png") }} Clicking on a the eye icon opens the mail. -{{ figure(file="mail-item-4.png") }} +{{ figure2(light="mail-item-4.png", dark="mail-item-4_dark.png") }} diff --git a/website/site/content/docs/webapp/merge-01.png b/website/site/content/docs/webapp/merge-01.png index fe8cfc39..7d33c138 100644 Binary files a/website/site/content/docs/webapp/merge-01.png and b/website/site/content/docs/webapp/merge-01.png differ diff --git a/website/site/content/docs/webapp/merge-01_dark.png b/website/site/content/docs/webapp/merge-01_dark.png new file mode 100644 index 00000000..1883c9ac Binary files /dev/null and b/website/site/content/docs/webapp/merge-01_dark.png differ diff --git a/website/site/content/docs/webapp/merge-02.png b/website/site/content/docs/webapp/merge-02.png index 3a6b9837..91205118 100644 Binary files a/website/site/content/docs/webapp/merge-02.png and b/website/site/content/docs/webapp/merge-02.png differ diff --git a/website/site/content/docs/webapp/merge-02_dark.png b/website/site/content/docs/webapp/merge-02_dark.png new file mode 100644 index 00000000..d0ccd092 Binary files /dev/null and b/website/site/content/docs/webapp/merge-02_dark.png differ diff --git a/website/site/content/docs/webapp/merge-04.png b/website/site/content/docs/webapp/merge-04.png index dfeac3c5..2a8aa12b 100644 Binary files a/website/site/content/docs/webapp/merge-04.png and b/website/site/content/docs/webapp/merge-04.png differ diff --git a/website/site/content/docs/webapp/merge-04_dark.png b/website/site/content/docs/webapp/merge-04_dark.png new file mode 100644 index 00000000..5b1986a4 Binary files /dev/null and b/website/site/content/docs/webapp/merge-04_dark.png differ diff --git a/website/site/content/docs/webapp/merge.md b/website/site/content/docs/webapp/merge.md index 7e394ea0..51c110dd 100644 --- a/website/site/content/docs/webapp/merge.md +++ b/website/site/content/docs/webapp/merge.md @@ -5,12 +5,14 @@ weight = 100 mktoc = true +++ +# Merge Items + Merging multiple items into one lets you transfer metadata and attachments from multiple items into a single one. The items that have been merged are removed afterwards. -# Usage -## Select items to merge +## Usage +### Select items to merge Multiple items can be merged where all metadata is copied into the target item. This can be done by selecting multiple items to merge via @@ -19,26 +21,26 @@ the multi selection tool as described Then select some items (at least 2) and click the merge tool button. -{{ figure(file="merge-01.png") }} +{{ figure2(light="merge-01.png", dark="merge-01_dark.png") }} -## Edit order of items +### Edit order of items This opens the merge view, where you can change the order of the selected items. -{{ figure(file="merge-02.png") }} +{{ figure2(light="merge-02.png", dark="merge-02_dark.png") }} The order of this list can matter when merging (see below). You can move items via drag and drop or the buttons on the right. -## Click merge +### Click merge Once you clicke the *Merge* button, the items are merged and you will be taken to the search view. -{{ figure(file="merge-04.png") }} +{{ figure2(light="merge-04.png", dark="merge-04_dark.png") }} As you can see, tags are all combined. Custom fields of same name are also merged, where possible. For text fields, the values are diff --git a/website/site/content/docs/webapp/multiedit-01-dark.png b/website/site/content/docs/webapp/multiedit-01_dark.png similarity index 100% rename from website/site/content/docs/webapp/multiedit-01-dark.png rename to website/site/content/docs/webapp/multiedit-01_dark.png diff --git a/website/site/content/docs/webapp/multiedit-02-dark.png b/website/site/content/docs/webapp/multiedit-02_dark.png similarity index 100% rename from website/site/content/docs/webapp/multiedit-02-dark.png rename to website/site/content/docs/webapp/multiedit-02_dark.png diff --git a/website/site/content/docs/webapp/multiedit-03-dark.png b/website/site/content/docs/webapp/multiedit-03_dark.png similarity index 100% rename from website/site/content/docs/webapp/multiedit-03-dark.png rename to website/site/content/docs/webapp/multiedit-03_dark.png diff --git a/website/site/content/docs/webapp/multiedit-04-dark.png b/website/site/content/docs/webapp/multiedit-04_dark.png similarity index 100% rename from website/site/content/docs/webapp/multiedit-04-dark.png rename to website/site/content/docs/webapp/multiedit-04_dark.png diff --git a/website/site/content/docs/webapp/multiedit-06.png b/website/site/content/docs/webapp/multiedit-06.png deleted file mode 100644 index 589087b6..00000000 Binary files a/website/site/content/docs/webapp/multiedit-06.png and /dev/null differ diff --git a/website/site/content/docs/webapp/multiedit.md b/website/site/content/docs/webapp/multiedit.md index e4fd1e4a..cdc73149 100644 --- a/website/site/content/docs/webapp/multiedit.md +++ b/website/site/content/docs/webapp/multiedit.md @@ -3,6 +3,8 @@ title = "Multi Edit" weight = 25 +++ +# Multi-Edit + Docspell allows to edit and delete multiple items at once. ## Toggle Selection Mode @@ -12,7 +14,7 @@ changing into "select mode". This changes the view slightly by changing the menu to the main area and the item cards have a dashed border: -{{ figure(file="multiedit-01.png") }} +{{ figure2(light="multiedit-01.png", dark="multiedit-01_dark.png") }} Then select items by clicking on the card. You can also change the search form and add more items to the selection. The top left shows @@ -20,7 +22,7 @@ how many items are selected and allows to select and deselect all visible items. Selected items are displayed grey-ed out with a big check icon. Clicking this icon deselects the item. -{{ figure(file="multiedit-02.png") }} +{{ figure2(light="multiedit-02.png", dark="multiedit-02_dark.png") }} ## Choose an Action: Edit @@ -29,12 +31,12 @@ Once all desired items are selected, choose an action. Currently you can edit or delete them. When clicking "edit", the left side menu changes to a form for changing the metadata: -{{ figure(file="multiedit-03.png") }} +{{ figure2(light="multiedit-03.png", dark="multiedit-03_dark.png") }} Changing the metadata in that form immediately applies it to all selected items. You can change the selection anytime. -{{ figure(file="multiedit-04.png") }} +{{ figure2(light="multiedit-04.png", dark="multiedit-04_dark.png") }} If you are done, just click on the *Close* button or the icon from the @@ -61,5 +63,3 @@ When choosing the delete action, a confirmation dialog shows up. If you confirm the deletion, then all selected items are deleted at the server and the view is switched back to normal mode afterwards. Note that deleting a lot of items may take a while to finish. - -{{ figure(file="multiedit-06.png") }} diff --git a/website/site/content/docs/webapp/notification-01.png b/website/site/content/docs/webapp/notification-01.png index b59d4730..5fcf25ca 100644 Binary files a/website/site/content/docs/webapp/notification-01.png and b/website/site/content/docs/webapp/notification-01.png differ diff --git a/website/site/content/docs/webapp/notification-01_dark.png b/website/site/content/docs/webapp/notification-01_dark.png new file mode 100644 index 00000000..c2ee7a14 Binary files /dev/null and b/website/site/content/docs/webapp/notification-01_dark.png differ diff --git a/website/site/content/docs/webapp/notification-02.png b/website/site/content/docs/webapp/notification-02.png index e2ffd40c..64b8dd87 100644 Binary files a/website/site/content/docs/webapp/notification-02.png and b/website/site/content/docs/webapp/notification-02.png differ diff --git a/website/site/content/docs/webapp/notification-02_dark.png b/website/site/content/docs/webapp/notification-02_dark.png new file mode 100644 index 00000000..e7a17aad Binary files /dev/null and b/website/site/content/docs/webapp/notification-02_dark.png differ diff --git a/website/site/content/docs/webapp/notification-03.png b/website/site/content/docs/webapp/notification-03.png index d177741f..3f33495f 100644 Binary files a/website/site/content/docs/webapp/notification-03.png and b/website/site/content/docs/webapp/notification-03.png differ diff --git a/website/site/content/docs/webapp/notification-03_dark.png b/website/site/content/docs/webapp/notification-03_dark.png new file mode 100644 index 00000000..9ebf0abd Binary files /dev/null and b/website/site/content/docs/webapp/notification-03_dark.png differ diff --git a/website/site/content/docs/webapp/notification-04.png b/website/site/content/docs/webapp/notification-04.png index 0d1a25bb..0c9c8657 100644 Binary files a/website/site/content/docs/webapp/notification-04.png and b/website/site/content/docs/webapp/notification-04.png differ diff --git a/website/site/content/docs/webapp/notification-04_dark.png b/website/site/content/docs/webapp/notification-04_dark.png new file mode 100644 index 00000000..d93ce57c Binary files /dev/null and b/website/site/content/docs/webapp/notification-04_dark.png differ diff --git a/website/site/content/docs/webapp/notification-05.png b/website/site/content/docs/webapp/notification-05.png index 4da60ab4..c058f971 100644 Binary files a/website/site/content/docs/webapp/notification-05.png and b/website/site/content/docs/webapp/notification-05.png differ diff --git a/website/site/content/docs/webapp/notification-05_dark.png b/website/site/content/docs/webapp/notification-05_dark.png new file mode 100644 index 00000000..285ac473 Binary files /dev/null and b/website/site/content/docs/webapp/notification-05_dark.png differ diff --git a/website/site/content/docs/webapp/notification-06.png b/website/site/content/docs/webapp/notification-06.png index 6875db0a..b1892833 100644 Binary files a/website/site/content/docs/webapp/notification-06.png and b/website/site/content/docs/webapp/notification-06.png differ diff --git a/website/site/content/docs/webapp/notification-06_dark.png b/website/site/content/docs/webapp/notification-06_dark.png new file mode 100644 index 00000000..096302b1 Binary files /dev/null and b/website/site/content/docs/webapp/notification-06_dark.png differ diff --git a/website/site/content/docs/webapp/notification-07.png b/website/site/content/docs/webapp/notification-07.png index 11972603..fd833b1e 100644 Binary files a/website/site/content/docs/webapp/notification-07.png and b/website/site/content/docs/webapp/notification-07.png differ diff --git a/website/site/content/docs/webapp/notification-07_dark.png b/website/site/content/docs/webapp/notification-07_dark.png new file mode 100644 index 00000000..0e9104f8 Binary files /dev/null and b/website/site/content/docs/webapp/notification-07_dark.png differ diff --git a/website/site/content/docs/webapp/notification.md b/website/site/content/docs/webapp/notification.md index c3366cdf..74f87c19 100644 --- a/website/site/content/docs/webapp/notification.md +++ b/website/site/content/docs/webapp/notification.md @@ -5,6 +5,8 @@ weight = 60 mktoc = true +++ +# Notifications + Docspell can notify on specific events and it can run queries periodically and notify about the result. @@ -16,11 +18,10 @@ item. Periodic queries can be used for running queries regularly and get the result sent as message. Both require to first select a channel, for how the message should be -sent. +sent. This can be done in *User profile → Notification Channels*. -{{ imgnormal(file="notification-01.png", width="250px") }} -# Channels +## Channels Channels are means to deliver a message. Currently, docspell supports these channels: @@ -32,7 +33,12 @@ these channels: - [Matrix](https://matrix.org) - [Gotify](https://gotify.net) -## Matrix +
+{{ imgnormal2(light="notification-01.png", dark="notification-01_dark.png", width="250px") }} +
+ + +### Matrix Matrix is an open network for secure and decentralized communication. It relies on open standards and can be self-hosted. @@ -45,9 +51,9 @@ You can find the room id in your room settings under "Advanced" in Element. The access key is in your user settings under tab "Help & About" in Element. -{{ figure(file="notification-02.png") }} +{{ figure2(light="notification-02.png", dark="notification-02_dark.png") }} -## Gotify +### Gotify Gotify is a simple application for receiving messages to be notified on several clients via websockets. It is great for connecting @@ -55,10 +61,10 @@ applications to your devices. It requires only your gotify url and the application secret. -{{ figure(file="notification-03.png") }} +{{ figure2(light="notification-03.png", dark="notification-03_dark.png") }} -## E-Mail +### E-Mail E-Mails are sent using one of your configured [SMTP connections](@/docs/webapp/emailsettings.md#smtp-settings). @@ -66,22 +72,22 @@ connections](@/docs/webapp/emailsettings.md#smtp-settings). The part `docspell.joex.send-mail.list-id` in joex' configuration file can be used to add a `List-Id` mail header to every notification mail. -## HTTP Request +### HTTP Request The most generic form is the channel *HTTP Request*. This just sends a POST request to a configured endpoint. The requests contains a JSON body with the event details. -# Webhooks +## Webhooks Webhooks are http requests that are generated on specific events in Docspell. -## Events +### Events You need to choose which events you are interested in. -{{ figure(file="notification-04.png") }} +{{ figure2(light="notification-04.png", dark="notification-04_dark.png") }} You can do so by selecting multiple event types or by clicking the *Notify on all events* checkbox. @@ -93,7 +99,9 @@ a message from it. Additionally, it is possible to filter the events using an expression that is applied to the event data JSON structure. -## Testing +Events can be send to multiple channels. + +### Testing The webhook form allows you to look at some sample events. These events are generated from random data and show how the message would @@ -105,7 +113,7 @@ event of the first of the selected event (or some chosen one, if *Notify on all events* is active) and sends it via the current channel. -## JSON filter expression +### JSON filter expression This filter allows to further constrain the events that trigger a notification. For example, it can be used to be notified only when @@ -117,7 +125,7 @@ good way is to look at the sample events for the *HTTP Request* channel. These show the exact JSON structure that this filter is applied to (that applies to every channel). -{{ figure(file="notification-05.png") }} +{{ figure2(light="notification-05.png", dark="notification-05_dark.png") }} As an example: Choose the event *TagsChanged* and this filter expression: `content.added,removed.category=document_type` to be @@ -127,12 +135,10 @@ notified whenever a tag is added or removed whose category is Please see [this page](@/docs/jsonminiquery/_index.md) for details about it. -{% infobubble(mode="info", title="⚠ Please note") %} - +{% infobubble(title="Note") %} The webhook feature is still experimental. It starts out with only a few events to choose from and the JSON structure of events might change in next versions. - {% end %} # Periodic Queries @@ -146,7 +152,7 @@ items tagged *Todo* etc. ## Due Items Task -{{ figure(file="notification-06.png") }} +{{ figure2(light="notification-06.png", dark="notification-06_dark.png") }} The settings allow to customize the query for searching items. You can choose to only include items that have one or more tags (these are @@ -180,9 +186,9 @@ selecting the items via form elements, you can define a custom [query](@/docs/query/_index.md) and optionally in combination with a [bookmark](@/docs/webapp/bookmarks.md). -{{ figure(file="notification-07.png") }} +{{ figure2(light="notification-07.png", dark="notification-07_dark.png") }} -## Schedule +### Schedule Both tasks have a *Schedule* field to specify the periodicity of the task. The syntax is similiar to a date-time string, like `2019-09-15 diff --git a/website/site/content/docs/webapp/processing.md b/website/site/content/docs/webapp/processing.md index 06cf9740..555fdce8 100644 --- a/website/site/content/docs/webapp/processing.md +++ b/website/site/content/docs/webapp/processing.md @@ -1,11 +1,13 @@ +++ -title = "Processing Queue" +title = "Job Queue" weight = 80 [extra] mktoc = true +++ +# Job Queue + The page *Processing Queue* shows the current state of document processing for your uploads. The page currently only shows at most the 80 newest jobs. There is a maximum of 40 done jobs (successful, diff --git a/website/site/content/docs/webapp/scanmailbox-detail-01.png b/website/site/content/docs/webapp/scanmailbox-detail-01.png index 14bb6488..769c2424 100644 Binary files a/website/site/content/docs/webapp/scanmailbox-detail-01.png and b/website/site/content/docs/webapp/scanmailbox-detail-01.png differ diff --git a/website/site/content/docs/webapp/scanmailbox-detail-01_dark.png b/website/site/content/docs/webapp/scanmailbox-detail-01_dark.png new file mode 100644 index 00000000..a2278014 Binary files /dev/null and b/website/site/content/docs/webapp/scanmailbox-detail-01_dark.png differ diff --git a/website/site/content/docs/webapp/scanmailbox-detail-02.png b/website/site/content/docs/webapp/scanmailbox-detail-02.png index fea0739d..042d72da 100644 Binary files a/website/site/content/docs/webapp/scanmailbox-detail-02.png and b/website/site/content/docs/webapp/scanmailbox-detail-02.png differ diff --git a/website/site/content/docs/webapp/scanmailbox-detail-02_dark.png b/website/site/content/docs/webapp/scanmailbox-detail-02_dark.png new file mode 100644 index 00000000..ae8f4f87 Binary files /dev/null and b/website/site/content/docs/webapp/scanmailbox-detail-02_dark.png differ diff --git a/website/site/content/docs/webapp/scanmailbox-detail-03.png b/website/site/content/docs/webapp/scanmailbox-detail-03.png index db09e07e..64301819 100644 Binary files a/website/site/content/docs/webapp/scanmailbox-detail-03.png and b/website/site/content/docs/webapp/scanmailbox-detail-03.png differ diff --git a/website/site/content/docs/webapp/scanmailbox-detail-03_dark.png b/website/site/content/docs/webapp/scanmailbox-detail-03_dark.png new file mode 100644 index 00000000..8d98936c Binary files /dev/null and b/website/site/content/docs/webapp/scanmailbox-detail-03_dark.png differ diff --git a/website/site/content/docs/webapp/scanmailbox-detail-04.png b/website/site/content/docs/webapp/scanmailbox-detail-04.png index 1cca17c4..810f1fa1 100644 Binary files a/website/site/content/docs/webapp/scanmailbox-detail-04.png and b/website/site/content/docs/webapp/scanmailbox-detail-04.png differ diff --git a/website/site/content/docs/webapp/scanmailbox-detail-04_dark.png b/website/site/content/docs/webapp/scanmailbox-detail-04_dark.png new file mode 100644 index 00000000..98ec8ad5 Binary files /dev/null and b/website/site/content/docs/webapp/scanmailbox-detail-04_dark.png differ diff --git a/website/site/content/docs/webapp/scanmailbox-detail-05.png b/website/site/content/docs/webapp/scanmailbox-detail-05.png index d45d41fe..ed3b9c29 100644 Binary files a/website/site/content/docs/webapp/scanmailbox-detail-05.png and b/website/site/content/docs/webapp/scanmailbox-detail-05.png differ diff --git a/website/site/content/docs/webapp/scanmailbox-detail-05_dark.png b/website/site/content/docs/webapp/scanmailbox-detail-05_dark.png new file mode 100644 index 00000000..d07b08cd Binary files /dev/null and b/website/site/content/docs/webapp/scanmailbox-detail-05_dark.png differ diff --git a/website/site/content/docs/webapp/scanmailbox-detail-06.png b/website/site/content/docs/webapp/scanmailbox-detail-06.png index b1bdec97..a37e5f66 100644 Binary files a/website/site/content/docs/webapp/scanmailbox-detail-06.png and b/website/site/content/docs/webapp/scanmailbox-detail-06.png differ diff --git a/website/site/content/docs/webapp/scanmailbox-detail-06_dark.png b/website/site/content/docs/webapp/scanmailbox-detail-06_dark.png new file mode 100644 index 00000000..3f382341 Binary files /dev/null and b/website/site/content/docs/webapp/scanmailbox-detail-06_dark.png differ diff --git a/website/site/content/docs/webapp/scanmailbox-list.png b/website/site/content/docs/webapp/scanmailbox-list.png index 11c9804e..c271a68a 100644 Binary files a/website/site/content/docs/webapp/scanmailbox-list.png and b/website/site/content/docs/webapp/scanmailbox-list.png differ diff --git a/website/site/content/docs/webapp/scanmailbox-list_dark.png b/website/site/content/docs/webapp/scanmailbox-list_dark.png new file mode 100644 index 00000000..70e65329 Binary files /dev/null and b/website/site/content/docs/webapp/scanmailbox-list_dark.png differ diff --git a/website/site/content/docs/webapp/scanmailbox.md b/website/site/content/docs/webapp/scanmailbox.md index e3ca24c9..772a6b54 100644 --- a/website/site/content/docs/webapp/scanmailbox.md +++ b/website/site/content/docs/webapp/scanmailbox.md @@ -5,6 +5,8 @@ weight = 70 mktoc = true +++ +# Scan Mailboxes + User that provide valid email (imap) settings, can import mails from their mailbox into docspell periodically. @@ -16,14 +18,14 @@ tasks that connects to your mailbox and import mails into docspell. It is possible to define multiple tasks, for example, if you have multiple e-mail accounts you want to import periodically. -{{ figure(file="scanmailbox-list.png") }} +{{ figure2(light="scanmailbox-list.png", dark="scanmailbox-list_dark.png") }} -# Details +## Details -## General +### General -{{ figure(file="scanmailbox-detail-01.png") }} +{{ figure2(light="scanmailbox-detail-01.png", dark="scanmailbox-detail-01_dark.png") }} You can enable or disable this task. A disabled task will not run periodically. You can still choose to run it manually if you click the @@ -33,9 +35,9 @@ Then you need to specify which [IMAP connection](@/docs/webapp/emailsettings.md#imap-settings) to use. -## Processing +### Processing -{{ figure(file="scanmailbox-detail-02.png") }} +{{ figure2(light="scanmailbox-detail-02.png", dark="scanmailbox-detail-02_dark.png") }} A list of folders is required. Docspell will only look into these folders. You can specify multiple folders. The "Inbox" folder is a @@ -56,9 +58,9 @@ run this task all 6 hours and read mails from 8 hours back. This setting is used to query the mail server. -## Additional Filter +### Additional Filter -{{ figure(file="scanmailbox-detail-03.png") }} +{{ figure2(light="scanmailbox-detail-03.png", dark="scanmailbox-detail-03_dark.png") }} The following properties allow to filter those downloaded mails that should be imported. @@ -77,9 +79,9 @@ pattern. For example, if your scanner mails to you with a certain subject like _"Scanned Document 214"_, you could include those via a `Scanned Document*` pattern. -## Post Processing +### Post Processing -{{ figure(file="scanmailbox-detail-04.png") }} +{{ figure2(light="scanmailbox-detail-04.png", dark="scanmailbox-detail-04_dark.png") }} The next settings tell docspell what to do once a mail has been read by docspell. It can be moved into another folder in your mail account. @@ -103,9 +105,9 @@ mails*. -## Metadata +### Metadata -{{ figure(file="scanmailbox-detail-05.png") }} +{{ figure2(light="scanmailbox-detail-05.png", dark="scanmailbox-detail-05_dark.png") }} These properties allow to specify some metadata that are automatically attached to the items being created. @@ -131,9 +133,9 @@ The *Language* setting is applied when processing the mails. If not set, the default language of the collective is used. -## Schedule +### Schedule -{{ figure(file="scanmailbox-detail-06.png") }} +{{ figure2(light="scanmailbox-detail-06.png", dark="scanmailbox-detail-06_dark.png") }} At last the *Schedule* defines when and how often this task should run. The syntax is similiar to a date-time string, like `2019-09-15 diff --git a/website/site/content/docs/webapp/search-bar.png b/website/site/content/docs/webapp/search-bar.png deleted file mode 100644 index a1dcec42..00000000 Binary files a/website/site/content/docs/webapp/search-bar.png and /dev/null differ diff --git a/website/site/content/docs/webapp/search-menu.png b/website/site/content/docs/webapp/search-menu.png index 38204b3e..8a3a9a00 100644 Binary files a/website/site/content/docs/webapp/search-menu.png and b/website/site/content/docs/webapp/search-menu.png differ diff --git a/website/site/content/docs/webapp/search-menu_dark.png b/website/site/content/docs/webapp/search-menu_dark.png new file mode 100644 index 00000000..a60453a0 Binary files /dev/null and b/website/site/content/docs/webapp/search-menu_dark.png differ diff --git a/website/site/content/docs/webapp/share-01.png b/website/site/content/docs/webapp/share-01.png index f3effe78..9c022496 100644 Binary files a/website/site/content/docs/webapp/share-01.png and b/website/site/content/docs/webapp/share-01.png differ diff --git a/website/site/content/docs/webapp/share-01_dark.png b/website/site/content/docs/webapp/share-01_dark.png new file mode 100644 index 00000000..07773bc1 Binary files /dev/null and b/website/site/content/docs/webapp/share-01_dark.png differ diff --git a/website/site/content/docs/webapp/share-02.png b/website/site/content/docs/webapp/share-02.png index 30c17b34..7a6699ed 100644 Binary files a/website/site/content/docs/webapp/share-02.png and b/website/site/content/docs/webapp/share-02.png differ diff --git a/website/site/content/docs/webapp/share-02_dark.png b/website/site/content/docs/webapp/share-02_dark.png new file mode 100644 index 00000000..7021b597 Binary files /dev/null and b/website/site/content/docs/webapp/share-02_dark.png differ diff --git a/website/site/content/docs/webapp/share-03.png b/website/site/content/docs/webapp/share-03.png index 97ad036f..3803d0c0 100644 Binary files a/website/site/content/docs/webapp/share-03.png and b/website/site/content/docs/webapp/share-03.png differ diff --git a/website/site/content/docs/webapp/share-03_dark.png b/website/site/content/docs/webapp/share-03_dark.png new file mode 100644 index 00000000..355e0449 Binary files /dev/null and b/website/site/content/docs/webapp/share-03_dark.png differ diff --git a/website/site/content/docs/webapp/share-04.png b/website/site/content/docs/webapp/share-04.png index 31288b53..d9b4b055 100644 Binary files a/website/site/content/docs/webapp/share-04.png and b/website/site/content/docs/webapp/share-04.png differ diff --git a/website/site/content/docs/webapp/share-04_dark.png b/website/site/content/docs/webapp/share-04_dark.png new file mode 100644 index 00000000..8bceb526 Binary files /dev/null and b/website/site/content/docs/webapp/share-04_dark.png differ diff --git a/website/site/content/docs/webapp/share-06.png b/website/site/content/docs/webapp/share-06.png index 443efcd0..c4bc8fcc 100644 Binary files a/website/site/content/docs/webapp/share-06.png and b/website/site/content/docs/webapp/share-06.png differ diff --git a/website/site/content/docs/webapp/share-06_dark.png b/website/site/content/docs/webapp/share-06_dark.png new file mode 100644 index 00000000..756e5bcb Binary files /dev/null and b/website/site/content/docs/webapp/share-06_dark.png differ diff --git a/website/site/content/docs/webapp/share-07.png b/website/site/content/docs/webapp/share-07.png index 200620a9..bd84fa14 100644 Binary files a/website/site/content/docs/webapp/share-07.png and b/website/site/content/docs/webapp/share-07.png differ diff --git a/website/site/content/docs/webapp/share-07_dark.png b/website/site/content/docs/webapp/share-07_dark.png new file mode 100644 index 00000000..eeaafb56 Binary files /dev/null and b/website/site/content/docs/webapp/share-07_dark.png differ diff --git a/website/site/content/docs/webapp/share-08.png b/website/site/content/docs/webapp/share-08.png index b995654f..4171bca9 100644 Binary files a/website/site/content/docs/webapp/share-08.png and b/website/site/content/docs/webapp/share-08.png differ diff --git a/website/site/content/docs/webapp/share-08_dark.png b/website/site/content/docs/webapp/share-08_dark.png new file mode 100644 index 00000000..7694882a Binary files /dev/null and b/website/site/content/docs/webapp/share-08_dark.png differ diff --git a/website/site/content/docs/webapp/share-09.png b/website/site/content/docs/webapp/share-09.png index 84dce974..371e9979 100644 Binary files a/website/site/content/docs/webapp/share-09.png and b/website/site/content/docs/webapp/share-09.png differ diff --git a/website/site/content/docs/webapp/share-09_dark.png b/website/site/content/docs/webapp/share-09_dark.png new file mode 100644 index 00000000..f5357023 Binary files /dev/null and b/website/site/content/docs/webapp/share-09_dark.png differ diff --git a/website/site/content/docs/webapp/share-10.png b/website/site/content/docs/webapp/share-10.png index 975f503e..49cb378e 100644 Binary files a/website/site/content/docs/webapp/share-10.png and b/website/site/content/docs/webapp/share-10.png differ diff --git a/website/site/content/docs/webapp/share-10_dark.png b/website/site/content/docs/webapp/share-10_dark.png new file mode 100644 index 00000000..f6f03a03 Binary files /dev/null and b/website/site/content/docs/webapp/share-10_dark.png differ diff --git a/website/site/content/docs/webapp/share-11.png b/website/site/content/docs/webapp/share-11.png index 135955b2..456c1ece 100644 Binary files a/website/site/content/docs/webapp/share-11.png and b/website/site/content/docs/webapp/share-11.png differ diff --git a/website/site/content/docs/webapp/share-11_dark.png b/website/site/content/docs/webapp/share-11_dark.png new file mode 100644 index 00000000..a13cd6b9 Binary files /dev/null and b/website/site/content/docs/webapp/share-11_dark.png differ diff --git a/website/site/content/docs/webapp/share-12.png b/website/site/content/docs/webapp/share-12.png index cc8fd2b6..46033863 100644 Binary files a/website/site/content/docs/webapp/share-12.png and b/website/site/content/docs/webapp/share-12.png differ diff --git a/website/site/content/docs/webapp/share-12_dark.png b/website/site/content/docs/webapp/share-12_dark.png new file mode 100644 index 00000000..2440841e Binary files /dev/null and b/website/site/content/docs/webapp/share-12_dark.png differ diff --git a/website/site/content/docs/webapp/share.md b/website/site/content/docs/webapp/share.md index 714eaa18..235301ba 100644 --- a/website/site/content/docs/webapp/share.md +++ b/website/site/content/docs/webapp/share.md @@ -5,21 +5,21 @@ weight = 120 mktoc = true +++ +# Shares + Docspell has a thought-out share feature that allows you to create read-only views to a subset of your documents and create a public but not-guessable link to it. -# Concept +## Concept A share is a cryptic *share id* that maps to a [query](@/docs/query/_index.md). A share can be accessed via a public link that contains the share id. -{% infobubble(mode="warning", title="Please note") %} - +{% warningbubble(title="Please note") %} Everyone who has this link can access all documents resulting from the query and their metadata. - {% end %} To further protect this link, a password can be specified which should @@ -90,7 +90,7 @@ you want to publish. In the screenshot below all items with tag `Manual` are selected. Then click the *Share Results* item in the menu. -{{ figure(file="share-01.png") }} +{{ figure2(light="share-01.png", dark="share-01_dark.png") }} A form appears that lets you edit the query and set some properties. The query is taken from the search page and may look a bit strange. It @@ -104,7 +104,7 @@ shares. Then a password and the *Publish Until* date can be set. The *Publish Until* date is mandatory. You can set it to something very far away to have shares exist "forever". -{{ figure(file="share-02.png") }} +{{ figure2(light="share-02.png", dark="share-02_dark.png") }} Clicking *Cancel* brings you back to the search results. If you are satifsied, click *Publish*. The next screen allows you to inspect your @@ -112,7 +112,7 @@ new share and to copy the url and/or send an e-mail. The email form is prefilled with some template that contains the link, so you don't need to copy it. -{{ figure(file="share-03.png") }} +{{ figure2(light="share-03.png", dark="share-03_dark.png") }} When typing in an e-mail address, there are completion proposals provided from your address book. If you type in an arbitrary address @@ -130,7 +130,7 @@ Creating a share for a hand picked set of items is almost the same as the above. In the search page, go to *Select Mode* and select some items. -{{ figure(file="share-04.png") }} +{{ figure2(light="share-04.png", dark="share-04_dark.png") }} Then click the *Share* button and follow the same process as described above. The query selects now exactly the picked items like in @@ -145,7 +145,7 @@ be filled manually (there is some syntax help). It is the same query as in the "power search" bar, as described [here](@/docs/query/_index.md). -{{ figure(file="share-12.png") }} +{{ figure2(light="share-12.png", dark="share-12_dark.png") }} ## Managing Shares @@ -153,7 +153,7 @@ Go to *Collective Profile -> Shares* to see all the shares of your collective. You can also look into shares that were created by other users. -{{ figure(file="share-06.png") }} +{{ figure2(light="share-06.png", dark="share-06_dark.png") }} To not make it too easy to look into private folders, you cannot change attributes of shares that were created by another user. @@ -166,11 +166,11 @@ allowed. If you edit your own share, you can change its properties. -{{ figure(file="share-07.png") }} +{{ figure2(light="share-07.png", dark="share-07_dark.png") }} If you are not the owner, the form is hidden: -{{ figure(file="share-08.png") }} +{{ figure2(light="share-08.png", dark="share-08_dark.png") }} # Accessing a share @@ -178,7 +178,7 @@ If you are not the owner, the form is hidden: Pasting the share link into a browser shows you the results of the query: -{{ figure(file="share-09.png") }} +{{ figure2(light="share-09.png", dark="share-09_dark.png") }} The search input allows to do a fulltext search and the search menu to the left can be used to further constrain the results. The search will @@ -192,7 +192,7 @@ search results will be available to select. Other data is not leaked. Clicking the search icon next to the search input, switches the input to be the "power search" input: -{{ figure(file="share-11.png") }} +{{ figure2(light="share-11.png", dark="share-11_dark.png") }} There is a link below the input field that opens a new tab with the [query documentation page](@/docs/query/_index.md). @@ -202,7 +202,7 @@ will populate the corresponding section in the search menu, just like the default search view. You can click on an item card to go to the detail view: -{{ figure(file="share-10.png") }} +{{ figure2(light="share-10.png", dark="share-10_dark.png") }} This link to a single item is also bookmarkable. You can copy it via the QR code or by clicking the *Copy* button. In the detail view you diff --git a/website/site/content/docs/webapp/sources-edit.png b/website/site/content/docs/webapp/sources-edit.png deleted file mode 100644 index dcf04cb3..00000000 Binary files a/website/site/content/docs/webapp/sources-edit.png and /dev/null differ diff --git a/website/site/content/docs/webapp/sources-form.png b/website/site/content/docs/webapp/sources-form.png deleted file mode 100644 index 12b00344..00000000 Binary files a/website/site/content/docs/webapp/sources-form.png and /dev/null differ diff --git a/website/site/content/docs/webapp/totp-01.png b/website/site/content/docs/webapp/totp-01.png index 6e45101d..c4dd02c0 100644 Binary files a/website/site/content/docs/webapp/totp-01.png and b/website/site/content/docs/webapp/totp-01.png differ diff --git a/website/site/content/docs/webapp/totp-01_dark.png b/website/site/content/docs/webapp/totp-01_dark.png new file mode 100644 index 00000000..ab929740 Binary files /dev/null and b/website/site/content/docs/webapp/totp-01_dark.png differ diff --git a/website/site/content/docs/webapp/totp-02.png b/website/site/content/docs/webapp/totp-02.png index 133ace34..dfb0d98c 100644 Binary files a/website/site/content/docs/webapp/totp-02.png and b/website/site/content/docs/webapp/totp-02.png differ diff --git a/website/site/content/docs/webapp/totp-02_dark.png b/website/site/content/docs/webapp/totp-02_dark.png new file mode 100644 index 00000000..9d098ed6 Binary files /dev/null and b/website/site/content/docs/webapp/totp-02_dark.png differ diff --git a/website/site/content/docs/webapp/totp-03.png b/website/site/content/docs/webapp/totp-03.png index a0a022ac..ebffcc74 100644 Binary files a/website/site/content/docs/webapp/totp-03.png and b/website/site/content/docs/webapp/totp-03.png differ diff --git a/website/site/content/docs/webapp/totp-03_dark.png b/website/site/content/docs/webapp/totp-03_dark.png new file mode 100644 index 00000000..727f191f Binary files /dev/null and b/website/site/content/docs/webapp/totp-03_dark.png differ diff --git a/website/site/content/docs/webapp/totp.md b/website/site/content/docs/webapp/totp.md index 8e34e64f..a9a2d332 100644 --- a/website/site/content/docs/webapp/totp.md +++ b/website/site/content/docs/webapp/totp.md @@ -5,13 +5,15 @@ weight = 110 mktoc = true +++ +# TOTP + Docspell has built-in support for two-factor (2FA) authentication using [TOTP](https://en.wikipedia.org/wiki/Time-based_One-Time_Password)s. For anything more, consider a dedicated account management tool and [OpenID Connect](@/docs/configure/_index.md#openid-connect-oauth2). -# Setup +## Setup A user can enable a TOTP as a second factor in their user settings. It is required to have some external device to hold the shared secret. A @@ -23,7 +25,7 @@ and there are others as well. In user settings, go to _Two Factor Authentication_ and click on _Activate two-factor authentication_. This then shows you a QR code: -{{ figure(file="totp-01.png") }} +{{ figure2(light="totp-01.png", dark="totp-01_dark.png") }} Open the app (or whatever you use) and scan the QR code. A new account is created and a 6-digit code will be shown to you. Enter this code in @@ -37,12 +39,12 @@ in this case. Once you typed in the code, the 2FA is enabled. -{{ figure(file="totp-02.png") }} +{{ figure2(light="totp-02.png", dark="totp-02_dark.png") }} When you now login, a second login form will be shown where you must now enter a one time password from the device. -# Remove 2FA +## Remove 2FA If you go to this page with 2FA enabled (refresh the page after finishing the setup), you can disable it. The secret will be removed @@ -51,14 +53,14 @@ from the database. It shows a form that allows you to disable 2FA again, but requires you to enter a one time password. -{{ figure(file="totp-03.png") }} +{{ figure2(light="totp-03.png", dark="totp-03_dark.png") }} If you have successfully disabled 2FA, you'll see the first screen where you can activate 2FA. You can remove the account from your device. Should you want to go back to 2FA, you need to go through the setup again and create a new secret. -# When secret is lost +## When secret is lost Should you loose your device where the secret is stored, you cannot log into docspell anymore. In this case you can use the [command line diff --git a/website/site/content/docs/webapp/uploading-01.png b/website/site/content/docs/webapp/uploading-01.png new file mode 100644 index 00000000..dd46f723 Binary files /dev/null and b/website/site/content/docs/webapp/uploading-01.png differ diff --git a/website/site/content/docs/webapp/uploading-01_dark.png b/website/site/content/docs/webapp/uploading-01_dark.png new file mode 100644 index 00000000..5d143684 Binary files /dev/null and b/website/site/content/docs/webapp/uploading-01_dark.png differ diff --git a/website/site/content/docs/webapp/uploading-02.png b/website/site/content/docs/webapp/uploading-02.png new file mode 100644 index 00000000..5a760efd Binary files /dev/null and b/website/site/content/docs/webapp/uploading-02.png differ diff --git a/website/site/content/docs/webapp/uploading-02_dark.png b/website/site/content/docs/webapp/uploading-02_dark.png new file mode 100644 index 00000000..d08478ee Binary files /dev/null and b/website/site/content/docs/webapp/uploading-02_dark.png differ diff --git a/website/site/content/docs/webapp/uploading.md b/website/site/content/docs/webapp/uploading.md index c98182b5..e5ee4f11 100644 --- a/website/site/content/docs/webapp/uploading.md +++ b/website/site/content/docs/webapp/uploading.md @@ -3,11 +3,13 @@ title = "Uploads" weight = 8 +++ +# File Uploads + This page describes, how files can get into docspell. Technically, there is just one way: via http multipart/form-data requests. -# Authenticated Upload +## Authenticated Upload From within the web application there is the "Upload Files" page. There you can select multiple files to upload. You can also @@ -25,7 +27,7 @@ This obviously requires an authenticated user. While this is handy for ad-hoc uploads, it is very inconvenient for automating it by custom scripts. For this the next variant exists. -# Anonymous Upload +## Anonymous Upload It is also possible to upload files without authentication. This should make tools that interact with docspell much easier to write. @@ -43,7 +45,7 @@ username is not visible. Example screenshot: -{{ figure(file="sources-edit.png") }} +{{ figure2(light="uploading-01.png", dark="uploading-01_dark.png") }} This example shows a source with name "test". Besides a description and a name that is only used for displaying purposes, a priority and a @@ -60,7 +62,7 @@ The source endpoint defines two urls: - `/app/upload/` - `/api/v1/open/upload/item/` -{{ figure(file="sources-form.png") }} +{{ figure2(light="uploading-02.png", dark="uploading-02_dark.png") }} The first points to a web page where everyone could upload files into your account. You could give this url to people for sending files @@ -92,7 +94,7 @@ docspell count the files uploaded through the web interface, just create a source (can be inactive) with that name (`webapp`). -# Other options +## Other options More details about the actual http request and other upload options can be found [here](@/docs/api/upload.md). diff --git a/website/site/sass/styles.sass b/website/site/sass/styles.sass deleted file mode 100644 index 2149c216..00000000 --- a/website/site/sass/styles.sass +++ /dev/null @@ -1,120 +0,0 @@ -@charset "utf-8" - -// Set your brand colors -$dblue: #1c2d61 -$infoblue: #193e74 -$dred: #9c0011 -$dwhite: #f0f8ff -$code: $dblue -$pre: $dblue - -@import url('https://fonts.googleapis.com/css?family=Libre+Baskerville:400,700') -@import url('https://fonts.googleapis.com/css?family=Montserrat:400,600') -@import url('https://fonts.googleapis.com/css?family=Source+Code+Pro:400') - -// Update Bulma's global variables -$family-serif: "Libre Baskerville",serif -$family-sans-serif: "Montserrat", sans-serif -$family-monospace: "Source Code Pro",monospace -//$family-primary: $family-serif - -/* $grey-dark: $brown; -/* $grey-light: $beige-light; -$primary: $dred -$info: $infoblue - -//josh-rose-trYl7JYATH0-unsplash -//tersius-van-rhyn-xcQWMPm9fG8-unsplash -//cassie-boca-x-tbVqkfQCU-unsplash -//jf-martin-Ofs3LjEUcrk-unsplash - // background: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 1)), url(img/jf-martin-Ofs3LjEUcrk-unsplash.jpg) -//jesse-gardner-EqdpXeemf58-unsplash -#hero-main - background: linear-gradient(rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 1)), url('img/jf-martin-Ofs3LjEUcrk-unsplash.jpg') - background-size: 100% 100% - background-repeat: no-repeat - .hero-body h1, h2, p - text-shadow: -2px -2px black - color: #fff - -.main-title - font-size: 4rem - -.card.full-height - height: 100% - &:hover - box-shadow: 1px 1px 3px $info; - -h1 - font-family: $family-serif - -.doc - h1 - border-bottom: 1px solid #ccc - padding-bottom: 0.15em - - -a.zola-anchor - padding-left: 0.75rem - display: none - font-family: $family-monospace - -h1:hover a.zola-anchor - display: inline - -h2:hover a.zola-anchor - display: inline - -h3:hover a.zola-anchor - display: inline - -h4:hover a.zola-anchor - display: inline - -nav.breadcrumb - background: $dwhite - padding-top: 0.25rem - padding-bottom: 0.25rem - a - font-weight: bold - color: $dblue - &:hover - color: black - -span.unsplash-credit - color: #555 - margin-right: 0.5em - float: right - font-size: smaller - a - color: #555 - &:hover - color: #777 - - -//import all of bulma -@import "../../node_modules/bulma/bulma.sass" - -p.has-text - color: $text - -.card.full-height - .card-content - height: 100% - -.content.doc - font-size: 1.1em - max-width: $desktop - text-align: left - -.content.narrow-center - margin-left: auto - margin-right: auto - max-width: $tablet - -.dropdown.is-fullwidth - width: 100% - -.dropdown - .control.is-fullwidth - width: 100% diff --git a/website/site/static/icons/eye-40.svg b/website/site/static/icons/eye-40.svg deleted file mode 100644 index e305ed34..00000000 --- a/website/site/static/icons/eye-40.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/website/site/static/icons/ghost-40.svg b/website/site/static/icons/ghost-40.svg deleted file mode 100644 index 42483f76..00000000 --- a/website/site/static/icons/ghost-40.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/website/site/static/icons/github-40.svg b/website/site/static/icons/github-40.svg deleted file mode 100644 index df004111..00000000 --- a/website/site/static/icons/github-40.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/website/site/static/icons/info-square-40.svg b/website/site/static/icons/info-square-40.svg deleted file mode 100644 index 538939f1..00000000 --- a/website/site/static/icons/info-square-40.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/website/site/static/icons/notes-40.svg b/website/site/static/icons/notes-40.svg deleted file mode 100644 index bfccbc8d..00000000 --- a/website/site/static/icons/notes-40.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/website/site/static/icons/refresh-40.svg b/website/site/static/icons/refresh-40.svg deleted file mode 100644 index a10715ec..00000000 --- a/website/site/static/icons/refresh-40.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/website/site/static/icons/search-20.svg b/website/site/static/icons/search-20.svg deleted file mode 100644 index 072fceb9..00000000 --- a/website/site/static/icons/search-20.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/website/site/static/icons/search-white-20.svg b/website/site/static/icons/search-white-20.svg deleted file mode 100644 index 5cc165a7..00000000 --- a/website/site/static/icons/search-white-20.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/website/site/static/icons/square-plus-40.svg b/website/site/static/icons/square-plus-40.svg deleted file mode 100644 index a201824e..00000000 --- a/website/site/static/icons/square-plus-40.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/website/site/static/img/fts-feature.png b/website/site/static/img/fts-feature.png index 7e098146..bb2e7dd4 100644 Binary files a/website/site/static/img/fts-feature.png and b/website/site/static/img/fts-feature.png differ diff --git a/website/site/static/img/fts-feature_dark.png b/website/site/static/img/fts-feature_dark.png new file mode 100644 index 00000000..35213312 Binary files /dev/null and b/website/site/static/img/fts-feature_dark.png differ diff --git a/website/site/static/js/light-switch.js b/website/site/static/js/light-switch.js new file mode 100644 index 00000000..9735529a --- /dev/null +++ b/website/site/static/js/light-switch.js @@ -0,0 +1,97 @@ +/// Handles lights-switch link + +var loadTheme = function() { + var syntaxCss = document.getElementById('syntax-css'); + if (localStorage.theme === 'dark' || + (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) { + document.documentElement.classList.add('dark'); + if (syntaxCss) { + syntaxCss.href = "/syntax-dark.css"; + } + } else { + document.documentElement.classList.remove('dark'); + if (syntaxCss) { + syntaxCss.href = "/syntax-light.css"; + } + } +} + +var updateIcon = function(btn) { + var icon = document.createElement('i'); + icon.classList.add('fa'); + if (localStorage.theme === 'dark') { + icon.classList.add('fa-moon'); + } + else if (localStorage.theme === 'light') { + icon.classList.add('fa-sun'); + icon.classList.add('font-thin'); + } + else { + if (window.matchMedia('(prefers-color-scheme: dark)').matches) { + icon.classList.add('fa-moon'); + } else { + icon.classList.add('fa-sun'); + } + icon.classList.add('opacity-40'); + } + btn.replaceChild(icon, btn.firstElementChild); +}; + +var initTheme = function() { + loadTheme(); + const switches = document.getElementsByClassName('lights-container'); + if (switches) { + for (var i=0; i - - - - - - Not Found - - {% include "search-head.html" %} - - -
-
- {% include "navbar.html" %} -
-
-
-
-

- Not Found -

-
-
- -
-
-
-
+{% extends "base.html" %} -
-
-
-
- Not Found Ghost -
-
-
-

- Not Found :( -

-

- → Documentation? -

-
-
-
- {% include "footer.html" %} - - {% include "search-part.html" %} - {% include "fathom.html" %} - +{% block title %}Not Found :({% endblock title %} + +{% block sidebar %} +{% endblock sidebar %} +{% block rightToc %} +{% endblock rightToc %} + +{% block mainContent %} + +
+

+

Not Found

+
+ +{% endblock mainContent %} diff --git a/website/site/templates/base.html b/website/site/templates/base.html new file mode 100644 index 00000000..fd6c7897 --- /dev/null +++ b/website/site/templates/base.html @@ -0,0 +1,86 @@ + +{% if section is defined %} +{% set currentTitle = section.title %} +{% set currentToc = section.toc %} +{% set relative_path = section.relative_path %} +{% endif %} +{%if page is defined %} +{% set currentTitle = page.title %} +{% set currentToc = page.toc %} +{% set relative_path = page.relative_path %} +{% endif %} + + + + {% include "parts/meta.html" %} + + {% block title %}{% endblock title %} + + + {% include "parts/search-head.html" %} + + + + + + + + {% include "parts/topnav.html" %} + +
+ + {% block sidebar %} + + {% endblock sidebar %} + +
+
+
+ {% block mainContent %}{% endblock mainContent %} +
+ + {% include "parts/footer.html" %} +
+ + {% block rightToc %} + + {% endblock rightToc %} +
+
+ {% include "parts/search-part.html" %} + {% include "parts/fathom.html" %} + + + diff --git a/website/site/templates/blog.html b/website/site/templates/blog.html new file mode 100644 index 00000000..5f190f71 --- /dev/null +++ b/website/site/templates/blog.html @@ -0,0 +1,57 @@ +{% extends "base.html" %} + +{% block title %}Docspell Blog{% endblock title %} + +{% block sidebar %} +{% endblock sidebar %} +{% block rightToc %} +{% endblock rightToc %} + +{% block mainContent %} +{{ section.content | safe }} + +
+ {% for p in section.pages %} + {% if not p.extra.hidden %} + {% set author = "Unknown" %} + {% if p.extra.author is defined %} + {% set author = p.extra.author %} + {% endif %} +
+
+ +
+
+ + {{ p.date }} +
+
+ + {{ p.word_count }} +
+
+ + {% if p.extra.authorLink is defined %} + {{ author }} + {% else %} + {{ author }} + {% endif %} +
+
+
+ +
+ {{ p.summary | safe }} +
+ + +
+ {% endif %} + {% endfor %} +
+{% endblock mainContent %} diff --git a/website/site/templates/blog_page.html b/website/site/templates/blog_page.html new file mode 100644 index 00000000..86df6817 --- /dev/null +++ b/website/site/templates/blog_page.html @@ -0,0 +1,53 @@ +{% extends "base.html" %} + +{% block title %}{{ currentTitle }} - Docspell Blog{% endblock title %} + +{% block sidebar %} +{% endblock sidebar %} + +{% block mainContent %} +
+ {% set author = "Unkown" %} + {% if page.extra.author is defined %} + {% set author = page.extra.author %} + {% endif %} +
+ by + {% if page.extra.authorLink is defined %} + {{ author }} + {% else %} + {{ author }} + {% endif %} +
+
+ on + {{ page.date }} +
+
+ +{{ page.content | safe }} + +
+ +
+ {% if page.earlier and not page.earlier.extra.hidden %} + {% set p = page.earlier %} + + + +
{{ p.title }}
+ {% endif %} +
+ +
+ {% if page.later and not page.later.extra.hidden %} + {% set p = page.later %} +
{{ p.title }}
+ + + + {% endif %} +
+ +
+{% endblock mainContent %} diff --git a/website/site/templates/docs.html b/website/site/templates/docs.html new file mode 100644 index 00000000..5c44179c --- /dev/null +++ b/website/site/templates/docs.html @@ -0,0 +1,70 @@ +{% extends "base.html" %} + +{% block title %}{{ currentTitle }} - Docspell Documentatios{% endblock title %} + +{% block sidebarItems %} +
+ {% set topSection = get_section(path="docs/_index.md") %} + + + {% for subs in topSection.subsections %} + {% set sect = get_section(path=subs) %} + {% if not sect.extra.hidden %} + + {# Use the first page of a section with sub pages as the section link target. #} + {% if sect.pages | length > 0 %} + {% set permlink = sect.pages[0].permalink %} + {% else %} + {% set permlink = sect.permalink %} + {% endif %} + + + {% if sect.pages | length > 0 %} +
+ {% for subpage in sect.pages %} + + {% endfor %} +
+ {% endif %} + + {% endif %} + {% endfor %} +
+ +{% endblock sidebarItems %} + +{% block mainContent %} + {% if section is defined %} + {{ section.content | safe }} + {% endif %} + {%if page is defined %} + {{ page.content | safe }} + {% endif %} + +{% if section is defined and section.extra.page_list %} + +{% endif %} +{% endblock mainContent %} diff --git a/website/site/templates/footer.html b/website/site/templates/footer.html deleted file mode 100644 index 328c2e55..00000000 --- a/website/site/templates/footer.html +++ /dev/null @@ -1,20 +0,0 @@ - diff --git a/website/site/templates/index.html b/website/site/templates/index.html index dbd2b349..af61476d 100644 --- a/website/site/templates/index.html +++ b/website/site/templates/index.html @@ -1,10 +1,10 @@ - {% include "meta.html" %} + {% include "parts/meta.html" %} Docspell – Simple document organizer - - + + @@ -19,6 +19,6 @@ }); - {% include "fathom.html" %} + {% include "parts/fathom.html" %} diff --git a/website/site/templates/navbar.html b/website/site/templates/navbar.html deleted file mode 100644 index 92210868..00000000 --- a/website/site/templates/navbar.html +++ /dev/null @@ -1,24 +0,0 @@ - diff --git a/website/site/templates/overview.html b/website/site/templates/overview.html deleted file mode 100644 index 3f154ba2..00000000 --- a/website/site/templates/overview.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - {% include "meta.html" %} - {{ section.title }} – Docspell Documentation - - - -
-
- {% include "navbar.html" %} -
-
-
-
-

- Docspell Documentation -

-

- {{ section.title }} -

-
-
- -
-
-
-
- -
-
-
- This is the documentation for Docspell, version {{ config.extra.version }}. -
-
- {% for section in section.subsections %} - - {% set sub = get_section(path=section) %} - {% if not sub.extra.hidden %} - - - {% endif %} - - {% endfor %} -
-
-
- - - {% include "footer.html" %} - {% include "search-head.html" %} - {% include "search-part.html" %} - {% include "fathom.html" %} - - - diff --git a/website/site/templates/page.html b/website/site/templates/page.html deleted file mode 100644 index 46e9ef19..00000000 --- a/website/site/templates/page.html +++ /dev/null @@ -1,104 +0,0 @@ - - - - {% include "meta.html" %} - {{ page.title }} – Docspell Documentation - - - -
-
- {% include "navbar.html" %} -
-
-
-
-

- {{ page.title }} -

-

- Docspell Documentation -

-
-
- -
-
-
-
- - -
-
-
- -
- -
-
-
- {{ page.content | safe }} -
-
-
-
-
- - {% include "footer.html" %} - {% include "search-head.html" %} - {% include "search-part.html" %} - {% include "fathom.html" %} - - diff --git a/website/site/templates/pages.html b/website/site/templates/pages.html deleted file mode 100644 index aad46a6b..00000000 --- a/website/site/templates/pages.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - {% include "meta.html" %} - {{ section.title }} – Docspell Documentation - - - -
-
- {% include "navbar.html" %} -
-
-
-
-

- Docspell Documentation -

-

- {{ section.title }} -

-
-
- -
-
-
-
- - -
-
-
- - -
-
-
- {{ section.content | safe }} -
-
-
-
- - {% include "footer.html" %} - - {% include "search-head.html" %} - {% include "search-part.html" %} - {% include "fathom.html" %} - - diff --git a/website/site/templates/fathom.html b/website/site/templates/parts/fathom.html similarity index 100% rename from website/site/templates/fathom.html rename to website/site/templates/parts/fathom.html diff --git a/website/site/templates/parts/footer.html b/website/site/templates/parts/footer.html new file mode 100644 index 00000000..2c52978b --- /dev/null +++ b/website/site/templates/parts/footer.html @@ -0,0 +1,32 @@ + diff --git a/website/site/templates/meta.html b/website/site/templates/parts/meta.html similarity index 100% rename from website/site/templates/meta.html rename to website/site/templates/parts/meta.html diff --git a/website/site/templates/search-head.html b/website/site/templates/parts/search-head.html similarity index 100% rename from website/site/templates/search-head.html rename to website/site/templates/parts/search-head.html diff --git a/website/site/templates/search-part.html b/website/site/templates/parts/search-part.html similarity index 100% rename from website/site/templates/search-part.html rename to website/site/templates/parts/search-part.html diff --git a/website/site/templates/parts/topnav.html b/website/site/templates/parts/topnav.html new file mode 100644 index 00000000..5bcf33c7 --- /dev/null +++ b/website/site/templates/parts/topnav.html @@ -0,0 +1,69 @@ +
+ + +
+ +
+ +
+ +
+
+ {{ config.extra.version }} +
+
+ +
+ + +
+ + + + + + + + + + + + + + + + +
diff --git a/website/site/templates/section.html b/website/site/templates/section.html deleted file mode 100644 index 2a871a31..00000000 --- a/website/site/templates/section.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - {% include "meta.html" %} - {{ section.title }} – Docspell Documentation - - {% include "search-head.html" %} - - -
-
- {% include "navbar.html" %} -
-
-
-
-

- {{ section.title }} -

-

- Docspell Documentation -

-
-
- -
-
-
-
- - {% if section.extra.mktoc %} -
-
-
- -
- -
-
-
- {{ section.content | safe }} -
-
-
-
-
- {% endif %} - - {% if not section.extra.mktoc %} -
-
-
- {{ section.content | safe }} -
-
-
- {% endif %} - {% include "footer.html" %} - {% include "search-part.html" %} - {% include "fathom.html" %} - - diff --git a/website/site/templates/shortcodes/buttonright.html b/website/site/templates/shortcodes/buttonright.html index b9f5ccb5..c39b1500 100644 --- a/website/site/templates/shortcodes/buttonright.html +++ b/website/site/templates/shortcodes/buttonright.html @@ -1,5 +1,5 @@ -
- + diff --git a/website/site/templates/shortcodes/figure.html b/website/site/templates/shortcodes/figure.html index 8af66af7..c1e527ed 100644 --- a/website/site/templates/shortcodes/figure.html +++ b/website/site/templates/shortcodes/figure.html @@ -1,4 +1,4 @@ -
+
{% if page is defined %} {% set len = page.components | length %} {% set p = page.components | slice(end=len - 1) | join(sep='/') %} @@ -6,5 +6,5 @@ {% set p = section.components | join(sep='/') %} {% endif %} - +
diff --git a/website/site/templates/shortcodes/figure2.html b/website/site/templates/shortcodes/figure2.html new file mode 100644 index 00000000..29c4908c --- /dev/null +++ b/website/site/templates/shortcodes/figure2.html @@ -0,0 +1,14 @@ +{% if page is defined %} +{% set len = page.components | length %} +{% set p = page.components | slice(end=len - 1) | join(sep='/') %} +{% else %} +{% set p = section.components | join(sep='/') %} +{% endif %} + + +
+ +
+
+ +
diff --git a/website/site/templates/shortcodes/imgnormal2.html b/website/site/templates/shortcodes/imgnormal2.html new file mode 100644 index 00000000..5efaf9b4 --- /dev/null +++ b/website/site/templates/shortcodes/imgnormal2.html @@ -0,0 +1,4 @@ +{% set len = page.components | length %} +{% set p = page.components | slice(end=len - 1) | join(sep='/') %} + + diff --git a/website/site/templates/shortcodes/imgright2.html b/website/site/templates/shortcodes/imgright2.html new file mode 100644 index 00000000..7175901f --- /dev/null +++ b/website/site/templates/shortcodes/imgright2.html @@ -0,0 +1,4 @@ +{% set len = page.components | length %} +{% set p = page.components | slice(end=len - 1) | join(sep='/') %} + + diff --git a/website/site/templates/shortcodes/infobubble.html b/website/site/templates/shortcodes/infobubble.html index c2f27adf..1fdbd230 100644 --- a/website/site/templates/shortcodes/infobubble.html +++ b/website/site/templates/shortcodes/infobubble.html @@ -1,10 +1,10 @@ -
-
-

- {{ title }} -

-
- {{ body | markdown | safe }} -
+
+
+ + {{ title }} +
+ +
+ {{ body | markdown | safe }}
diff --git a/website/site/templates/shortcodes/warningbubble.html b/website/site/templates/shortcodes/warningbubble.html new file mode 100644 index 00000000..2cc74c60 --- /dev/null +++ b/website/site/templates/shortcodes/warningbubble.html @@ -0,0 +1,10 @@ +
+
+ + {{ title }} +
+ +
+ {{ body | markdown | safe }} +
+
diff --git a/website/styles/content.css b/website/styles/content.css new file mode 100644 index 00000000..e936f10e --- /dev/null +++ b/website/styles/content.css @@ -0,0 +1,63 @@ +@layer base { + .content { + @apply leading-relaxed text-left; + } + + .content h1:not(.no-default) { + @apply text-4xl font-serif font-bold mt-6 mb-3 py-1 border-b dark:border-stone-800 text-stone-700 dark:text-stone-200; + } + .content h2:not(.no-default) { + @apply text-3xl font-serif font-semibold mt-6 py-1 text-stone-700 dark:text-stone-200; + } + .content h3:not(.no-default) { + @apply text-2xl font-medium mt-3 py-1 text-stone-700 dark:text-stone-200 ; + } + + .content p:not(.no-default) { + @apply mt-1 mb-2; + } + + .content ul:not(.no-default) { + @apply list-disc list-outside pl-6; + } + .content ol:not(.no-default) { + @apply list-decimal list-outside pl-6; + } + .content :not(li) > ul:not(.no-default) { + @apply my-4; + } + .content :not(li) > ol:not(.no-default) { + @apply my-4; + } + + .content pre:not(.no-default) { + @apply font-mono py-4 px-4 rounded overflow-auto max-w-full; + } + .content :not(li) > pre:not(.no-default) { + @apply my-4; + } + + .content a:not(.no-default) { + @apply dark:text-cyan-400 dark:hover:text-cyan-300 text-indigo-400 hover:text-indigo-500 font-medium; + } + + .content .box-shadow { + @apply shadow dark:shadow-stone-700; + } + + .content figure:not(.no-default) { + @apply outline outline-stone-200 dark:outline-stone-500 rounded mx-6 my-4 shadow dark:shadow-stone-600; + } + + .content figure > img:not(.no-default) { + @apply rounded block w-full; + } + + .content :not(pre) > code:not(.no-default) { + @apply bg-stone-100 dark:bg-black my-1 mx-1 px-1 text-stone-800 dark:text-stone-100; + } + + .content .button1 { + @apply px-6 py-3 rounded cursor-pointer border text-center text-indigo-50 bg-indigo-400 hover:bg-indigo-500 dark:bg-cyan-400 dark:bg-opacity-20 dark:border-cyan-400 dark:text-cyan-400 dark:hover:bg-opacity-80 dark:hover:text-stone-900; + } +} diff --git a/website/styles/custom-components.css b/website/styles/custom-components.css new file mode 100644 index 00000000..52515dff --- /dev/null +++ b/website/styles/custom-components.css @@ -0,0 +1,74 @@ +@layer components { + .label { + @apply flex flex-row items-center px-2 py-0.5 rounded border; + } + + .button { + @apply px-6 py-3 rounded text-center ; + } + + .info { + @apply bg-blue-800 hover:bg-blue-700; + } + + .primary { + @apply bg-red-800 hover:bg-red-700; + } + + .hero-header { + @apply py-4 sm:py-10 px-8 text-4xl bg-gradient-to-r from-yellow-800 to-yellow-900 text-gray-100 font-bold; + } + + .link { + @apply text-blue-600 hover:text-blue-800; + } + + .blue-message { + @apply px-4 py-4 bg-blue-50 text-blue-500 border rounded border-blue-100; + } + .green-message { + @apply border border-green-600 bg-green-50 text-green-600 px-4 py-2 rounded; + } + .green-message a { + @apply underline; + } + + + .markdown-view pre { + @apply font-mono py-4 px-4 bg-zinc-600 text-gray-100; + } + .markdown-view ul { + @apply list-disc list-outside; + } + .markdown-view ol { + @apply list-decimal list-outside; + } + .markdown-view a { + @apply link; + } + .markdown-view li { + @apply my-2; + } + .markdown-view p code { + @apply font-mono pl-1 pr-1 bg-gray-100 text-black; + } + + .footer { + @apply py-12 bg-gray-100 mt-1 bg-opacity-60; + } + + /* +//josh-rose-trYl7JYATH0-unsplash +//tersius-van-rhyn-xcQWMPm9fG8-unsplash +//cassie-boca-x-tbVqkfQCU-unsplash +//jf-martin-Ofs3LjEUcrk-unsplash + // background: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 1)), url(img/jf-martin-Ofs3LjEUcrk-unsplash.jpg) +//jesse-gardner-EqdpXeemf58-unsplash +*/ + .main-background { + background: linear-gradient(rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 1)), url('img/jf-martin-Ofs3LjEUcrk-unsplash.jpg'); + background-size: 100% 100%; + background-repeat: no-repeat; + } + +} diff --git a/website/styles/custom-utilities.css b/website/styles/custom-utilities.css new file mode 100644 index 00000000..86c4341d --- /dev/null +++ b/website/styles/custom-utilities.css @@ -0,0 +1,19 @@ +@layer utilities { + .disabled { + @apply opacity-50 cursor-not-allowed; + } + .h-screen-12 { + height: calc(100vh - 3rem); + } + .max-h-screen-12 { + max-height: calc(100vh - 3rem); + } + + .dark-block { + @apply hidden dark:block; + } + .light-block { + @apply block dark:hidden; + } + +} diff --git a/website/styles/input.css b/website/styles/input.css new file mode 100644 index 00000000..09f70787 --- /dev/null +++ b/website/styles/input.css @@ -0,0 +1,41 @@ +@import "@fontsource/spectral"; +@import "@fontsource/spectral/latin"; + +@import "@fontsource/montserrat"; +@import "@fontsource/montserrat/latin"; + +@import "@fontsource/source-code-pro"; + +@import "@fortawesome/fontawesome-free/css/all"; + + +@import "tailwindcss/base"; +@import "tailwindcss/components"; +@import "tailwindcss/utilities"; + +@import "./custom-components.css"; +@import "./custom-utilities.css"; +@import "./content.css"; + +a.zola-anchor { + padding-left: 0.75rem; + display: none; + font-family: mono; + font-size: smaller; +} + +h1:hover a.zola-anchor { + display: inline; +} + +h2:hover a.zola-anchor { + display: inline +} + +h3:hover a.zola-anchor { + display: inline +} + +h4:hover a.zola-anchor { + display: inline +} diff --git a/website/tailwind.config.js b/website/tailwind.config.js new file mode 100644 index 00000000..c6ca4a17 --- /dev/null +++ b/website/tailwind.config.js @@ -0,0 +1,21 @@ +module.exports = { + darkMode: 'class', + content: ["./site/**/*.{html,md}", "elm/**/*.elm"], + theme: { + fontFamily: { + 'serif': ['Spectral', 'serif'], + 'mono': ['"Source Code Pro"', 'mono'], + 'sans': ['"Montserrat"', 'sans-serif'] + }, + extend: { + }, + }, + variants: { + extend: { + display: ['dark'] + } + }, + plugins: [ + require('@tailwindcss/forms') + ], +} diff --git a/website/yarn.lock b/website/yarn.lock index 6444860a..946fb581 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -2,7 +2,1411 @@ # yarn lockfile v1 -bulma@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/bulma/-/bulma-0.9.0.tgz#948c5445a49e9d7546f0826cb3820d17178a814f" - integrity sha512-rV75CJkubNUroAt0qCRkjznZLoaXq/ctfMXsMvKSL84UetbSyx5REl96e8GoQ04G4Tkw0XF3STECffTOQrbzOQ== +"@babel/code-frame@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + dependencies: + "@babel/highlight" "^7.16.7" + +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== + +"@babel/highlight@^7.16.7": + version "7.16.10" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" + integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@fontsource/montserrat@^4.5.3": + version "4.5.3" + resolved "https://registry.yarnpkg.com/@fontsource/montserrat/-/montserrat-4.5.3.tgz#30e8943df4f9904b7379a27304073837193b53b3" + integrity sha512-VT+wPK/PHWwqm7r6UbTjI+oj31obzj9+V9HSUl8tcuKtv4deYuH+OAbMf5RG62uVDT8wiZ8QyCbr5gmfHQ3ykg== + +"@fontsource/source-code-pro@^4.5.2": + version "4.5.2" + resolved "https://registry.yarnpkg.com/@fontsource/source-code-pro/-/source-code-pro-4.5.2.tgz#ff1fe6dbfb7108d67515f5a127326de394e1789d" + integrity sha512-63KzxRMclgUU8Qd3UStOO9CEAhwboaJF67+zyW19bm/JmNJSkv+fvfJ6GRhXgdWzjqHM3Emn4MDsqZ76kXCdDg== + +"@fontsource/spectral@^4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@fontsource/spectral/-/spectral-4.5.1.tgz#90ff34171bcbd64efa02c717b95e189888fbbd20" + integrity sha512-7o3zvFDu3deo8tRL3kFDQPf7ELs4qBh2h5oMqELaWVfzoihmOXfAce4toZtVpQF+TM3FAApDYTO1lbqz2qddJQ== + +"@fortawesome/fontawesome-free@^5.15": + version "5.15.4" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz#ecda5712b61ac852c760d8b3c79c96adca5554e5" + integrity sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@tailwindcss/forms@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@tailwindcss/forms/-/forms-0.4.0.tgz#a46715e347a32d216a3973eb67473bd29ae3798e" + integrity sha512-DeaQBx6EgEeuZPQACvC+mKneJsD8am1uiJugjgQK1+/Vt+Ai0GpFBC2T2fqnUad71WgOxyrZPE6BG1VaI6YqfQ== + dependencies: + mini-svg-data-uri "^1.2.3" + +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +acorn-node@^1.6.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== + dependencies: + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" + +acorn-walk@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^7.0.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.1.tgz#eb0c9a8f77786cad2af8ff2b862899842d7b6adb" + integrity sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA== + +array-union@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-3.0.1.tgz#da52630d327f8b88cfbfb57728e2af5cd9b6b975" + integrity sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw== + +autoprefixer@^10.4: + version "10.4.2" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.2.tgz#25e1df09a31a9fba5c40b578936b90d35c9d4d3b" + integrity sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ== + dependencies: + browserslist "^4.19.1" + caniuse-lite "^1.0.30001297" + fraction.js "^4.1.2" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.0.0, browserslist@^4.16.6, browserslist@^4.19.1: + version "4.19.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" + integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== + dependencies: + caniuse-lite "^1.0.30001286" + electron-to-chromium "^1.4.17" + escalade "^3.1.1" + node-releases "^2.0.1" + picocolors "^1.0.0" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001286, caniuse-lite@^1.0.30001297: + version "1.0.30001304" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001304.tgz#38af55ed3fc8220cb13e35e6e7309c8c65a05559" + integrity sha512-bdsfZd6K6ap87AGqSHJP/s1V+U6Z5lyrcbBu3ovbCCf8cSYpwTtGrCBObMpJqwxfTbLW6YTIdbb1jEeTelcpYQ== + +chalk@^2.0.0, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^3.3.0, chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.1.4, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colord@^2.9.1: + version "2.9.2" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.2.tgz#25e2bacbbaa65991422c07ea209e2089428effb1" + integrity sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ== + +commander@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +cosmiconfig@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +css-declaration-sorter@^6.0.3: + version "6.1.4" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.1.4.tgz#b9bfb4ed9a41f8dcca9bf7184d849ea94a8294b4" + integrity sha512-lpfkqS0fctcmZotJGhnxkIyJWvBXgpyi2wsFd4J8VB7wzyrT6Ch/3Q+FMNJpjK4gu1+GN5khOnpU2ZVKrLbhCw== + dependencies: + timsort "^0.3.0" + +css-select@^4.1.3: + version "4.2.1" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.2.1.tgz#9e665d6ae4c7f9d65dbe69d0316e3221fb274cdd" + integrity sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ== + dependencies: + boolbase "^1.0.0" + css-what "^5.1.0" + domhandler "^4.3.0" + domutils "^2.8.0" + nth-check "^2.0.1" + +css-tree@^1.1.2, css-tree@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" + integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^5.1.11: + version "5.1.11" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.1.11.tgz#db10fb1ecee310e8285c5aca45bd8237be206828" + integrity sha512-ETet5hqHxmzQq2ynXMOQofKuLm7VOjMiOB7E2zdtm/hSeCKlD9fabzIUV4GoPcRyJRHi+4kGf0vsfGYbQ4nmPw== + dependencies: + css-declaration-sorter "^6.0.3" + cssnano-utils "^3.0.1" + postcss-calc "^8.2.0" + postcss-colormin "^5.2.4" + postcss-convert-values "^5.0.3" + postcss-discard-comments "^5.0.2" + postcss-discard-duplicates "^5.0.2" + postcss-discard-empty "^5.0.2" + postcss-discard-overridden "^5.0.3" + postcss-merge-longhand "^5.0.5" + postcss-merge-rules "^5.0.5" + postcss-minify-font-values "^5.0.3" + postcss-minify-gradients "^5.0.5" + postcss-minify-params "^5.0.4" + postcss-minify-selectors "^5.1.2" + postcss-normalize-charset "^5.0.2" + postcss-normalize-display-values "^5.0.2" + postcss-normalize-positions "^5.0.3" + postcss-normalize-repeat-style "^5.0.3" + postcss-normalize-string "^5.0.3" + postcss-normalize-timing-functions "^5.0.2" + postcss-normalize-unicode "^5.0.3" + postcss-normalize-url "^5.0.4" + postcss-normalize-whitespace "^5.0.3" + postcss-ordered-values "^5.0.4" + postcss-reduce-initial "^5.0.2" + postcss-reduce-transforms "^5.0.3" + postcss-svgo "^5.0.3" + postcss-unique-selectors "^5.0.3" + +cssnano-utils@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.0.1.tgz#d3cc0a142d3d217f8736837ec0a2ccff6a89c6ea" + integrity sha512-VNCHL364lh++/ono+S3j9NlUK+d97KNkxI77NlqZU2W3xd2/qmyN61dsa47pTpb55zuU4G4lI7qFjAXZJH1OAQ== + +cssnano@^5.0: + version "5.0.16" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.0.16.tgz#4ee97d30411693f3de24cef70b36f7ae2a843e04" + integrity sha512-ryhRI9/B9VFCwPbb1z60LLK5/ldoExi7nwdnJzpkLZkm2/r7j2X3jfY+ZvDVJhC/0fPZlrAguYdHNFg0iglPKQ== + dependencies: + cssnano-preset-default "^5.1.11" + lilconfig "^2.0.3" + yaml "^1.10.2" + +csso@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= + +dependency-graph@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.11.0.tgz#ac0ce7ed68a54da22165a85e97a01d53f5eb2e27" + integrity sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg== + +detective@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b" + integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg== + dependencies: + acorn-node "^1.6.1" + defined "^1.0.0" + minimist "^1.1.1" + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +dom-serializer@^1.0.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" + integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" + integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== + +domhandler@^4.2.0, domhandler@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.0.tgz#16c658c626cf966967e306f966b431f77d4a5626" + integrity sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g== + dependencies: + domelementtype "^2.2.0" + +domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +electron-to-chromium@^1.4.17: + version "1.4.57" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.57.tgz#2b2766df76ac8dbc0a1d41249bc5684a31849892" + integrity sha512-FNC+P5K1n6pF+M0zIK+gFCoXcJhhzDViL3DRIGy2Fv5PohuSES1JHR7T+GlwxSxlzx4yYbsuzCZvHxcBSRCIOw== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +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" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +fast-glob@^3.2.11, fast-glob@^3.2.7: + version "3.2.11" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +fraction.js@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.1.2.tgz#13e420a92422b6cf244dff8690ed89401029fbe8" + integrity sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA== + +fs-extra@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" + integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-stdin@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575" + integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globby@^12.0.0: + version "12.2.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-12.2.0.tgz#2ab8046b4fba4ff6eede835b29f678f90e3d3c22" + integrity sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA== + dependencies: + array-union "^3.0.1" + dir-glob "^3.0.1" + fast-glob "^3.2.7" + ignore "^5.1.9" + merge2 "^1.4.1" + slash "^4.0.0" + +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.9" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" + integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +ignore@^5.1.9: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" + integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== + dependencies: + has "^1.0.3" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +lilconfig@^2.0.3, lilconfig@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.4.tgz#f4507d043d7058b380b6a8f5cb7bcd4b34cee082" + integrity sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +mini-svg-data-uri@^1.2.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/mini-svg-data-uri/-/mini-svg-data-uri-1.4.3.tgz#43177b2e93766ba338931a3e2a84a3dfd3a222b8" + integrity sha512-gSfqpMRC8IxghvMcxzzmMnWpXAChSA+vy4cia33RgerMS8Fex95akUyQZPbxJJmeBGiGmK7n/1OpUX8ksRjIdA== + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.1.1: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +nanoid@^3.1.30: + version "3.2.0" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c" + integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA== + +node-releases@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" + integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +nth-check@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" + integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== + dependencies: + boolbase "^1.0.0" + +object-hash@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" + integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +postcss-calc@^8.2.0: + version "8.2.3" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.3.tgz#53b95ce93de19213c2a5fdd71277a81690ef41d0" + integrity sha512-EGM2EBBWqP57N0E7N7WOLT116PJ39dwHVU01WO4XPPQLJfkL2xVgkMZ+TZvCfapj/uJH07UEfKHQNPHzSw/14Q== + dependencies: + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-cli@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/postcss-cli/-/postcss-cli-9.1.0.tgz#1a86404cbe848e370127b4bdf5cd2be83bc45ebe" + integrity sha512-zvDN2ADbWfza42sAnj+O2uUWyL0eRL1V+6giM2vi4SqTR3gTYy8XzcpfwccayF2szcUif0HMmXiEaDv9iEhcpw== + dependencies: + chokidar "^3.3.0" + dependency-graph "^0.11.0" + fs-extra "^10.0.0" + get-stdin "^9.0.0" + globby "^12.0.0" + picocolors "^1.0.0" + postcss-load-config "^3.0.0" + postcss-reporter "^7.0.0" + pretty-hrtime "^1.0.3" + read-cache "^1.0.0" + slash "^4.0.0" + yargs "^17.0.0" + +postcss-colormin@^5.2.4: + version "5.2.4" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.2.4.tgz#7726d3f3d24f111d39faff50a6500688225d5324" + integrity sha512-rYlC5015aNqVQt/B6Cy156g7sH5tRUJGmT9xeagYthtKehetbKx7jHxhyLpulP4bs4vbp8u/B2rac0J7S7qPQg== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + colord "^2.9.1" + postcss-value-parser "^4.2.0" + +postcss-convert-values@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.0.3.tgz#492db08a28af84d57651f10edc8f6c8fb2f6df40" + integrity sha512-fVkjHm2T0PSMqXUCIhHNWVGjhB9mHEWX2GboVs7j3iCgr6FpIl9c/IdXy0PHWZSQ9LFTRgmj98amxJE6KOnlsA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-discard-comments@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.0.2.tgz#811ed34e2b6c40713daab0beb4d7a04125927dcd" + integrity sha512-6VQ3pYTsJHEsN2Bic88Aa7J/Brn4Bv8j/rqaFQZkH+pcVkKYwxCIvoMQkykEW7fBjmofdTnQgcivt5CCBJhtrg== + +postcss-discard-duplicates@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.2.tgz#61076f3d256351bdaac8e20aade730fef0609f44" + integrity sha512-LKY81YjUjc78p6rbXIsnppsaFo8XzCoMZkXVILJU//sK0DgPkPSpuq/cZvHss3EtdKvWNYgWzQL+wiJFtEET4g== + +postcss-discard-empty@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.0.2.tgz#0676a9bcfc44bb00d338352a45ab80845a31d8f0" + integrity sha512-SxBsbTjlsKUvZLL+dMrdWauuNZU8TBq5IOL/DHa6jBUSXFEwmDqeXRfTIK/FQpPTa8MJMxEHjSV3UbiuyLARPQ== + +postcss-discard-overridden@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.0.3.tgz#004b9818cabb407e60616509267567150b327a3f" + integrity sha512-yRTXknIZA4k8Yo4FiF1xbsLj/VBxfXEWxJNIrtIy6HC9KQ4xJxcPtoaaskh6QptCGrrcGnhKsTsENTRPZOBu4g== + +postcss-import@^14.0.2: + version "14.0.2" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.0.2.tgz#60eff77e6be92e7b67fe469ec797d9424cae1aa1" + integrity sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-js@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.0.tgz#31db79889531b80dc7bc9b0ad283e418dce0ac00" + integrity sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ== + dependencies: + camelcase-css "^2.0.1" + +postcss-load-config@^3.0.0, postcss-load-config@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.1.tgz#2f53a17f2f543d9e63864460af42efdac0d41f87" + integrity sha512-c/9XYboIbSEUZpiD1UQD0IKiUe8n9WHYV7YFe7X7J+ZwCsEKkUJSFWjS9hBU1RR9THR7jMXst8sxiqP0jjo2mg== + dependencies: + lilconfig "^2.0.4" + yaml "^1.10.2" + +postcss-merge-longhand@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.0.5.tgz#cbc217ca22fb5a3e6ee22a6a1aa6920ec1f3c628" + integrity sha512-R2BCPJJ/U2oh1uTWEYn9CcJ7MMcQ1iIbj9wfr2s/zHu5om5MP/ewKdaunpfJqR1WYzqCsgnXuRoVXPAzxdqy8g== + dependencies: + postcss-value-parser "^4.2.0" + stylehacks "^5.0.2" + +postcss-merge-rules@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.0.5.tgz#2a18669ec214019884a60f0a0d356803a8138366" + integrity sha512-3Oa26/Pb9VOFVksJjFG45SNoe4nhGvJ2Uc6TlRimqF8uhfOCEhVCaJ3rvEat5UFOn2UZqTY5Da8dFgCh3Iq0Ug== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + cssnano-utils "^3.0.1" + postcss-selector-parser "^6.0.5" + +postcss-minify-font-values@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.0.3.tgz#48c455c4cd980ecd07ac9bf3fc58e9d8a2ae4168" + integrity sha512-bC45rVzEwsLhv/cL1eCjoo2OOjbSk9I7HKFBYnBvtyuIZlf7uMipMATXtA0Fc3jwPo3wuPIW1jRJWKzflMh1sA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-minify-gradients@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.0.5.tgz#a5572b9c98ed52cbd7414db24b873f8b9e418290" + integrity sha512-/YjvXs8PepsoiZAIpjstOO4IHKwFAqYNqbA1yVdqklM84tbUUneh6omJxGlRlF3mi6K5Pa067Mg6IwqEnYC8Zg== + dependencies: + colord "^2.9.1" + cssnano-utils "^3.0.1" + postcss-value-parser "^4.2.0" + +postcss-minify-params@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.0.4.tgz#230a4d04456609e614db1d48c2eebc21f6490a45" + integrity sha512-Z0vjod9lRZEmEPfEmA2sCfjbfEEFKefMD3RDIQSUfXK4LpCyWkX1CniUgyNvnjJFLDPSxtgKzozhHhPHKoeGkg== + dependencies: + browserslist "^4.16.6" + cssnano-utils "^3.0.1" + postcss-value-parser "^4.2.0" + +postcss-minify-selectors@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.1.2.tgz#bc9698f713b9dab7f44f1ec30643fcbad9a043c0" + integrity sha512-gpn1nJDMCf3g32y/7kl+jsdamhiYT+/zmEt57RoT9GmzlixBNRPohI7k8UIHelLABhdLf3MSZhtM33xuH5eQOQ== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-nested@5.0.6: + version "5.0.6" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-5.0.6.tgz#466343f7fc8d3d46af3e7dba3fcd47d052a945bc" + integrity sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA== + dependencies: + postcss-selector-parser "^6.0.6" + +postcss-normalize-charset@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.0.2.tgz#eb6130c8a8e950ce25f9ea512de1d9d6a6f81439" + integrity sha512-fEMhYXzO8My+gC009qDc/3bgnFP8Fv1Ic8uw4ec4YTlhIOw63tGPk1YFd7fk9bZUf1DAbkhiL/QPWs9JLqdF2g== + +postcss-normalize-display-values@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.2.tgz#8b5273c6c7d0a445e6ef226b8a5bb3204a55fb99" + integrity sha512-RxXoJPUR0shSjkMMzgEZDjGPrgXUVYyWA/YwQRicb48H15OClPuaDR7tYokLAlGZ2tCSENEN5WxjgxSD5m4cUw== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-positions@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.0.3.tgz#b63fcc4ff5fbf65934fafaf83270b2da214711d1" + integrity sha512-U+rmhjrNBvIGYqr/1tD4wXPFFMKUbXsYXvlUCzLi0tOCUS6LoeEAnmVXXJY/MEB/1CKZZwBSs2tmzGawcygVBA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-repeat-style@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.3.tgz#488c0ad8aac0fa4f66ef56cc8d604b3fd9bf705f" + integrity sha512-uk1+xYx0AMbA3nLSNhbDrqbf/rx+Iuq5tVad2VNyaxxJzx79oGieJ6D9F6AfOL2GtiIbP7vTYlpYHtG+ERFXTg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-string@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.0.3.tgz#49e0a1d58a119d5435ef21893ad03136a6e8f0e6" + integrity sha512-Mf2V4JbIDboNGQhW6xW0YREDiYXoX3WrD3EjKkjvnpAJ6W4qqjLnK/c9aioyVFaWWHVdP5zVRw/9DI5S3oLDFw== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-timing-functions@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.2.tgz#db4f4f49721f47667afd1fdc5edb032f8d9cdb2e" + integrity sha512-Ao0PP6MoYsRU1LxeVUW740ioknvdIUmfr6uAA3xWlQJ9s69/Tupy8qwhuKG3xWfl+KvLMAP9p2WXF9cwuk/7Bg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-unicode@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.3.tgz#10f0d30093598a58c48a616491cc7fa53256dd43" + integrity sha512-uNC7BmS/7h6to2UWa4RFH8sOTzu2O9dVWPE/F9Vm9GdhONiD/c1kNaCLbmsFHlKWcEx7alNUChQ+jH/QAlqsQw== + dependencies: + browserslist "^4.16.6" + postcss-value-parser "^4.2.0" + +postcss-normalize-url@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.0.4.tgz#3b0322c425e31dd275174d0d5db0e466f50810fb" + integrity sha512-cNj3RzK2pgQQyNp7dzq0dqpUpQ/wYtdDZM3DepPmFjCmYIfceuD9VIAcOdvrNetjIU65g1B4uwdP/Krf6AFdXg== + dependencies: + normalize-url "^6.0.1" + postcss-value-parser "^4.2.0" + +postcss-normalize-whitespace@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.3.tgz#fb6bcc9ff2f834448b802657c7acd0956f4591d1" + integrity sha512-333JWRnX655fSoUbufJ10HJop3c8mrpKkCCUnEmgz/Cb/QEtW+/TMZwDAUt4lnwqP6tCCk0x0b58jqvDgiQm/A== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-ordered-values@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.0.4.tgz#f799dca87a7f17526d31a20085e61768d0b00534" + integrity sha512-taKtGDZtyYUMVYkg+MuJeBUiTF6cGHZmo/qcW7ibvW79UlyKuSHbo6dpCIiqI+j9oJsXWzP+ovIxoyLDOeQFdw== + dependencies: + cssnano-utils "^3.0.1" + postcss-value-parser "^4.2.0" + +postcss-purgecss@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/postcss-purgecss/-/postcss-purgecss-2.0.3.tgz#21a1ef079e2a38e5cb248db45fa9fe0966d92eb6" + integrity sha512-cuQin5PgZzvDe7EjW4S27iM6p4ZNz4iBEPmBrAykXm2WyaBtri1sA4ZVn/zECN7x3uxeADwDq1u4VDY5C9iusg== + dependencies: + postcss "7.0.26" + purgecss "^2.0.3" + +postcss-reduce-initial@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.0.2.tgz#fa424ce8aa88a89bc0b6d0f94871b24abe94c048" + integrity sha512-v/kbAAQ+S1V5v9TJvbGkV98V2ERPdU6XvMcKMjqAlYiJ2NtsHGlKYLPjWWcXlaTKNxooId7BGxeraK8qXvzKtw== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + +postcss-reduce-transforms@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.3.tgz#df60fab34698a43073e8b87938c71df7a3b040ac" + integrity sha512-yDnTUab5i7auHiNwdcL1f+pBnqQFf+7eC4cbC7D8Lc1FkvNZhtpkdad+9U4wDdFb84haupMf0rA/Zc5LcTe/3A== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-reporter@^7.0.0: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-reporter/-/postcss-reporter-7.0.5.tgz#e55bd0fdf8d17e4f25fb55e9143fcd79349a2ceb" + integrity sha512-glWg7VZBilooZGOFPhN9msJ3FQs19Hie7l5a/eE6WglzYqVeH3ong3ShFcp9kDWJT1g2Y/wd59cocf9XxBtkWA== + dependencies: + picocolors "^1.0.0" + thenby "^1.3.4" + +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.6, postcss-selector-parser@^6.0.9: + version "6.0.9" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz#ee71c3b9ff63d9cd130838876c13a2ec1a992b2f" + integrity sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-svgo@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.0.3.tgz#d945185756e5dfaae07f9edb0d3cae7ff79f9b30" + integrity sha512-41XZUA1wNDAZrQ3XgWREL/M2zSw8LJPvb5ZWivljBsUQAGoEKMYm6okHsTjJxKYI4M75RQEH4KYlEM52VwdXVA== + dependencies: + postcss-value-parser "^4.1.0" + svgo "^2.7.0" + +postcss-unique-selectors@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.0.3.tgz#07fd116a8fbd9202e7030f7c4952e7b52c26c63d" + integrity sha512-V5tX2hadSSn+miVCluuK1IDGy+7jAXSOfRZ2DQ+s/4uQZb/orDYBjH0CHgFrXsRw78p4QTuEFA9kI6C956UnHQ== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@7.0.26: + version "7.0.26" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.26.tgz#5ed615cfcab35ba9bbb82414a4fa88ea10429587" + integrity sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postcss@7.0.32: + version "7.0.32" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" + integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postcss@^8.4.5: + version "8.4.5" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.5.tgz#bae665764dfd4c6fcc24dc0fdf7e7aa00cc77f95" + integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg== + dependencies: + nanoid "^3.1.30" + picocolors "^1.0.0" + source-map-js "^1.0.1" + +pretty-hrtime@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= + +purgecss@^2.0.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/purgecss/-/purgecss-2.3.0.tgz#5327587abf5795e6541517af8b190a6fb5488bb3" + integrity sha512-BE5CROfVGsx2XIhxGuZAT7rTH9lLeQx/6M0P7DTXQH4IUc3BBzs9JUzt4yzGf3JrH9enkeq6YJBe9CTtkm1WmQ== + dependencies: + commander "^5.0.0" + glob "^7.0.0" + postcss "7.0.32" + postcss-selector-parser "^6.0.2" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= + dependencies: + pify "^2.3.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.1.7, resolve@^1.21.0: + version "1.22.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +source-map-js@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +stylehacks@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.0.2.tgz#fa10e5181c6e8dc0bddb4a3fb372e9ac42bba2ad" + integrity sha512-114zeJdOpTrbQYRD4OU5UWJ99LKUaqCPJTU1HQ/n3q3BwmllFN8kHENaLnOeqVq6AhXrWfxHNZTl33iJ4oy3cQ== + dependencies: + browserslist "^4.16.6" + postcss-selector-parser "^6.0.4" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svgo@^2.7.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" + integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^4.1.3" + css-tree "^1.1.3" + csso "^4.2.0" + picocolors "^1.0.0" + stable "^0.1.8" + +tailwindcss@^3.0: + version "3.0.18" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.0.18.tgz#ea4825e6496d77dc21877b6b61c7cc56cda3add5" + integrity sha512-ihPTpEyA5ANgZbwKlgrbfnzOp9R5vDHFWmqxB1PT8NwOGCOFVVMl+Ps1cQQ369acaqqf1BEF77roCwK0lvNmTw== + dependencies: + arg "^5.0.1" + chalk "^4.1.2" + chokidar "^3.5.3" + color-name "^1.1.4" + cosmiconfig "^7.0.1" + detective "^5.2.0" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.2.11" + glob-parent "^6.0.2" + is-glob "^4.0.3" + normalize-path "^3.0.0" + object-hash "^2.2.0" + postcss-js "^4.0.0" + postcss-load-config "^3.1.0" + postcss-nested "5.0.6" + postcss-selector-parser "^6.0.9" + postcss-value-parser "^4.2.0" + quick-lru "^5.1.1" + resolve "^1.21.0" + +thenby@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/thenby/-/thenby-1.3.4.tgz#81581f6e1bb324c6dedeae9bfc28e59b1a2201cc" + integrity sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ== + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +xtend@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yaml@^1.10.0, yaml@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@^21.0.0: + version "21.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.0.tgz#a485d3966be4317426dd56bdb6a30131b281dc55" + integrity sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA== + +yargs@^17.0.0: + version "17.3.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.3.1.tgz#da56b28f32e2fd45aefb402ed9c26f42be4c07b9" + integrity sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.0.0"