├── .github └── workflows │ ├── ci.yml │ └── clean.yml ├── .gitignore ├── .scalafmt.conf ├── CHANGELOG.md ├── LICENSE.md ├── README.md ├── build.sbt ├── modules └── frontroute │ ├── src │ ├── main │ │ └── scala │ │ │ └── frontroute │ │ │ ├── BrowserLocationProvider.scala │ │ │ ├── BrowserNavigation.scala │ │ │ ├── ConjunctionMagnet.scala │ │ │ ├── CustomLocationProvider.scala │ │ │ ├── Directive.scala │ │ │ ├── DirectiveExecute.scala │ │ │ ├── Directives.scala │ │ │ ├── DocumentMeta.scala │ │ │ ├── LinkHandler.scala │ │ │ ├── Location.scala │ │ │ ├── LocationProvider.scala │ │ │ ├── LocationUtils.scala │ │ │ ├── NavElement.scala │ │ │ ├── PageStatusCode.scala │ │ │ ├── PathMatcher.scala │ │ │ ├── Route.scala │ │ │ ├── RouteResult.scala │ │ │ ├── ScrollPosition.scala │ │ │ ├── domext │ │ │ └── WindowWithScrollXY.scala │ │ │ ├── internal │ │ │ ├── HistoryState.scala │ │ │ ├── LocationState.scala │ │ │ ├── PathMatchResult.scala │ │ │ ├── RoutingPath.scala │ │ │ ├── RoutingPathStep.scala │ │ │ ├── RoutingState.scala │ │ │ └── UrlString.scala │ │ │ ├── ops │ │ │ └── DirectiveOfOptionOps.scala │ │ │ └── package.scala │ └── test │ │ └── scala │ │ ├── com │ │ └── raquo │ │ │ └── laminar │ │ │ └── utils │ │ │ └── LaminarSpec.scala │ │ └── frontroute │ │ ├── ConjunctionTests.scala │ │ ├── Disjunction2xAndCollectTests.scala │ │ ├── Disjunction2xAndMapTest.scala │ │ ├── Disjunction2xAndMapToTest.scala │ │ ├── Disjunction3xSignalTest.scala │ │ ├── DisjunctionAndCollectTest.scala │ │ ├── DisjunctionAndMapTest.scala │ │ ├── DisjunctionAndMapToTest.scala │ │ ├── DisjunctionSignalTest.scala │ │ ├── ExtractHostNameTest.scala │ │ ├── ExtractHostTest.scala │ │ ├── ExtractOriginTest.scala │ │ ├── ExtractPortTest.scala │ │ ├── ExtractProtocolTest.scala │ │ ├── FirstMatchTests.scala │ │ ├── HistoryStateTest.scala │ │ ├── ParamSignalTest.scala │ │ ├── PathMatcherTests.scala │ │ ├── SignalX1Test.scala │ │ ├── SignalX3Test.scala │ │ ├── TwoMaybeParamsSignalTest.scala │ │ ├── pathDirectives │ │ ├── PathWithOneOfAndRecoverTest.scala │ │ ├── PathWithOneOfTest.scala │ │ ├── RevisitPreviousMatchTest.scala │ │ ├── SimplePathEndTest.scala │ │ ├── TestPathPrefixTest.scala │ │ └── TestPathTest.scala │ │ └── testing │ │ ├── TestBase.scala │ │ ├── TestLocationProvider.scala │ │ └── package.scala │ └── yarn.lock ├── package-lock.json ├── package.json ├── project ├── Dependencies.scala ├── DependencyVersions.scala ├── JSEnv.scala ├── ScalaOptions.scala ├── ScalaVersions.scala ├── build.properties └── plugins.sbt └── website ├── .frontroute-version ├── .gitignore ├── index.html ├── package.json ├── postcss.config.js ├── scala-version.js ├── src └── main │ ├── public │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── apple-touch-icon.png │ ├── browserconfig.xml │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon.ico │ ├── images │ │ └── logo.svg │ ├── mstile-144x144.png │ ├── mstile-150x150.png │ ├── mstile-310x150.png │ ├── mstile-310x310.png │ ├── mstile-70x70.png │ ├── robots.txt │ ├── safari-pinned-tab.svg │ ├── site.webmanifest │ └── stylesheets │ │ └── highlightjs │ │ ├── a11y-dark.css │ │ ├── a11y-light.css │ │ ├── agate.css │ │ ├── an-old-hope.css │ │ ├── androidstudio.css │ │ ├── arduino-light.css │ │ ├── arta.css │ │ ├── ascetic.css │ │ ├── atelier-cave-dark.css │ │ ├── atelier-cave-light.css │ │ ├── atelier-dune-dark.css │ │ ├── atelier-dune-light.css │ │ ├── atelier-estuary-dark.css │ │ ├── atelier-estuary-light.css │ │ ├── atelier-forest-dark.css │ │ ├── atelier-forest-light.css │ │ ├── atelier-heath-dark.css │ │ ├── atelier-heath-light.css │ │ ├── atelier-lakeside-dark.css │ │ ├── atelier-lakeside-light.css │ │ ├── atelier-plateau-dark.css │ │ ├── atelier-plateau-light.css │ │ ├── atelier-savanna-dark.css │ │ ├── atelier-savanna-light.css │ │ ├── atelier-seaside-dark.css │ │ ├── atelier-seaside-light.css │ │ ├── atelier-sulphurpool-dark.css │ │ ├── atelier-sulphurpool-light.css │ │ ├── atom-one-dark-reasonable.css │ │ ├── atom-one-dark.css │ │ ├── atom-one-light.css │ │ ├── brown-paper.css │ │ ├── brown-papersq.png │ │ ├── codepen-embed.css │ │ ├── color-brewer.css │ │ ├── darcula.css │ │ ├── dark.css │ │ ├── default.css │ │ ├── docco.css │ │ ├── dracula.css │ │ ├── far.css │ │ ├── foundation.css │ │ ├── github-gist.css │ │ ├── github.css │ │ ├── gml.css │ │ ├── googlecode.css │ │ ├── gradient-dark.css │ │ ├── gradient-light.css │ │ ├── grayscale.css │ │ ├── gruvbox-dark.css │ │ ├── gruvbox-light.css │ │ ├── hopscotch.css │ │ ├── hybrid.css │ │ ├── idea.css │ │ ├── ir-black.css │ │ ├── isbl-editor-dark.css │ │ ├── isbl-editor-light.css │ │ ├── kimbie.dark.css │ │ ├── kimbie.light.css │ │ ├── lightfair.css │ │ ├── lioshi.css │ │ ├── magula.css │ │ ├── mono-blue.css │ │ ├── monokai-sublime.css │ │ ├── monokai.css │ │ ├── night-owl.css │ │ ├── nnfx-dark.css │ │ ├── nnfx.css │ │ ├── nord.css │ │ ├── obsidian.css │ │ ├── ocean.css │ │ ├── paraiso-dark.css │ │ ├── paraiso-light.css │ │ ├── pojoaque.css │ │ ├── pojoaque.jpg │ │ ├── purebasic.css │ │ ├── qtcreator_dark.css │ │ ├── qtcreator_light.css │ │ ├── railscasts.css │ │ ├── rainbow.css │ │ ├── routeros.css │ │ ├── school-book.css │ │ ├── school-book.png │ │ ├── shades-of-purple.css │ │ ├── solarized-dark.css │ │ ├── solarized-light.css │ │ ├── srcery.css │ │ ├── stackoverflow-dark.css │ │ ├── stackoverflow-light.css │ │ ├── sunburst.css │ │ ├── tomorrow-night-blue.css │ │ ├── tomorrow-night-bright.css │ │ ├── tomorrow-night-eighties.css │ │ ├── tomorrow-night.css │ │ ├── tomorrow.css │ │ ├── vs.css │ │ ├── vs2015.css │ │ ├── xcode.css │ │ ├── xt256.css │ │ └── zenburn.css │ ├── resources │ └── doc │ │ ├── examples │ │ └── index.md │ │ ├── getting-started │ │ ├── building-routes.md │ │ ├── drafts.md │ │ ├── first-routes.md │ │ ├── handling-not-found.md │ │ ├── index.md │ │ ├── laminar-basics.md │ │ ├── links-and-navigation.md │ │ └── nested-routes.md │ │ ├── index.md │ │ └── reference │ │ ├── built-in-directives.md │ │ ├── built-in-path-matchers.md │ │ ├── conjunction.md │ │ ├── custom-directives.md │ │ ├── directive-combinators.md │ │ ├── disjunction.md │ │ ├── first-match.md │ │ ├── index.md │ │ ├── navigation.md │ │ ├── path-matcher-combinators.md │ │ ├── signal-directive.md │ │ └── under-the-hood │ │ ├── directive.md │ │ ├── path-matching.md │ │ └── route.md │ ├── scala │ └── frontroute │ │ └── site │ │ ├── Main.scala │ │ ├── Page.scala │ │ ├── Routes.scala │ │ ├── Site.scala │ │ ├── SiteModule.scala │ │ ├── SsrContext.scala │ │ ├── Styles.scala │ │ ├── Wiring.scala │ │ ├── components │ │ ├── CodeExampleDisplay.scala │ │ └── DocumentationDisplay.scala │ │ ├── examples │ │ ├── CodeExample.scala │ │ ├── ex_advanced_params │ │ │ ├── AdvancedParamsExample.scala │ │ │ └── description.md │ │ ├── ex_auth │ │ │ ├── AuthExample.scala │ │ │ └── description.md │ │ ├── ex_basic │ │ │ ├── BasicRoutingExample.scala │ │ │ └── description.md │ │ ├── ex_custom_directives │ │ │ ├── CustomDirectivesExample.scala │ │ │ └── description.md │ │ ├── ex_effect │ │ │ ├── EffectExample.scala │ │ │ └── description.md │ │ ├── ex_execute │ │ │ ├── ExecuteExample.scala │ │ │ └── description.md │ │ ├── ex_extract_matched_path │ │ │ ├── ExtractMatchedPathExample.scala │ │ │ └── description.md │ │ ├── ex_matched_path │ │ │ ├── MatchedPathExample.scala │ │ │ └── description.md │ │ ├── ex_multiparams │ │ │ ├── MultiParamsExample.scala │ │ │ └── description.md │ │ ├── ex_navigate │ │ │ ├── NavigateExample.scala │ │ │ └── description.md │ │ ├── ex_navmod │ │ │ ├── NavModExample.scala │ │ │ └── description.md │ │ ├── ex_nested │ │ │ ├── NestedExample.scala │ │ │ └── description.md │ │ ├── ex_params │ │ │ ├── ParamsExample.scala │ │ │ └── description.md │ │ ├── ex_path_matching │ │ │ ├── PathMatchingExample.scala │ │ │ └── description.md │ │ ├── ex_recursive_path_matching │ │ │ ├── RecursivePathMatchingExample.scala │ │ │ └── description.md │ │ ├── ex_tabs │ │ │ ├── TabsExample.scala │ │ │ └── description.md │ │ └── package.scala │ │ ├── icons │ │ └── Icons.scala │ │ ├── layout │ │ ├── PageFooter.scala │ │ ├── PageHeader.scala │ │ ├── PageNavigation.scala │ │ └── PageWrap.scala │ │ └── pages │ │ ├── CodeExamplePage.scala │ │ ├── DocumentationPage.scala │ │ ├── NotFoundPage.scala │ │ └── package.scala │ └── static │ ├── fonts │ ├── Inter-VariableFont_slnt,wght.ttf │ ├── JetBrainsMono-VariableFont_wght.ttf │ └── Oxanium-VariableFont_wght.ttf │ └── stylesheets │ ├── buttons.css │ ├── fonts.css │ ├── index.css │ ├── markdown.css │ └── tailwind.css ├── stylelint.config.js ├── tailwind.config.js ├── vite.config.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | target 2 | .idea 3 | .vscode 4 | .metals 5 | .bsp 6 | node_modules 7 | -------------------------------------------------------------------------------- /.scalafmt.conf: -------------------------------------------------------------------------------- 1 | version = 3.8.4-RC3 2 | runner.dialect = "scala213source3" 3 | fileOverride { 4 | "glob:**/scala-3/**" { 5 | runner.dialect = scala3 6 | } 7 | } 8 | style = defaultWithAlign 9 | align.openParenCallSite = true 10 | align.openParenDefnSite = true 11 | align.arrowEnumeratorGenerator = true 12 | maxColumn = 180 13 | continuationIndent.defnSite = 2 14 | assumeStandardLibraryStripMargin = true 15 | danglingParentheses.defnSite = true 16 | danglingParentheses.callSite = true 17 | rewrite.rules = [AvoidInfix, ExpandImportSelectors, RedundantParens, SortModifiers] 18 | docstrings = JavaDoc 19 | newlines.afterCurlyLambda = preserve 20 | docstrings.style = Asterisk 21 | docstrings.oneline = unfold 22 | trailingCommas = "preserve" 23 | optIn.breaksInsideChains = true 24 | includeCurlyBraceInSelectChains = true 25 | align.preset = most 26 | rewrite.scala3.convertToNewSyntax = true 27 | runner.dialectOverride.allowAsForImportRename = true 28 | runner.dialectOverride.allowStarWildcardImport = true 29 | runner.dialectOverride.allowPostfixStarVarargSplices = true 30 | runner.dialectOverride.allowQuestionMarkAsTypeWildcard = true 31 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | # The MIT License (MIT) 2 | 3 | Copyright 2018 Iurii Malchenko 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # frontroute 2 | 3 | ![Maven Central](https://img.shields.io/maven-central/v/io.frontroute/frontroute_sjs1_2.13.svg?versionPrefix=0.19) ![Scala.js](https://img.shields.io/static/v1?label=built+with&message=Scala.js&color=green) 4 | 5 | `frontroute` is a front-end router library for single-page applications (SPA) built with [Scala.js](http://www.scala-js.org/) and [raquo/Laminar](https://github.com/raquo/Laminar), 6 | with an API inspired by [Akka HTTP](https://doc.akka.io/docs/akka-http/current/). 7 | 8 | ## Important 9 | 10 | Starting with version `0.19.1` the dependency organization name has changed from `io.frontroute` to `dev.frontroute`. 11 | 12 | ## Example project 13 | 14 | An example is available here: https://github.com/yurique/frontroute-example 15 | 16 | ## Documentation 17 | 18 | https://frontroute.dev 19 | 20 | ## Author 21 | 22 | Iurii Malchenko – [@yurique](https://twitter.com/yurique) 23 | 24 | 25 | ## License 26 | 27 | `frontroute` is provided under the [MIT license](https://github.com/tulz-app/frontroute/blob/main/LICENSE.md). 28 | 29 | -------------------------------------------------------------------------------- /modules/frontroute/src/main/scala/frontroute/BrowserLocationProvider.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | import com.raquo.laminar.api.L.* 4 | import org.scalajs.dom 5 | 6 | import scala.scalajs.js 7 | 8 | class BrowserLocationProvider( 9 | popStateEvents: EventStream[dom.PopStateEvent] 10 | ) extends LocationProvider { 11 | 12 | private val currentVar = Var(Option.empty[Location]) 13 | val current: Signal[Option[Location]] = currentVar.signal.distinct 14 | 15 | def start()(implicit owner: Owner): Subscription = { 16 | EventStream 17 | .merge( 18 | EventStream.fromValue(js.undefined: js.Any), 19 | popStateEvents.map(_.state), 20 | ) 21 | .map(state => Location(dom.window.location, state)) 22 | .foreach { l => 23 | currentVar.set(Some(l)) 24 | } 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /modules/frontroute/src/main/scala/frontroute/ConjunctionMagnet.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | import app.tulz.tuplez.Composition 4 | 5 | trait ConjunctionMagnet[L] { 6 | type Out 7 | def apply(underlying: Directive[L]): Out 8 | } 9 | 10 | object ConjunctionMagnet { 11 | 12 | implicit def fromDirective[L, R](other: Directive[R])(implicit 13 | composition: Composition[L, R] 14 | ): ConjunctionMagnet[L] { 15 | type Out = Directive[composition.Composed] 16 | } = 17 | new ConjunctionMagnet[L] { 18 | type Out = Directive[composition.Composed] 19 | def apply(underlying: Directive[L]): Directive[composition.Composed] = 20 | Directive[composition.Composed] { inner => (location, previous, state) => 21 | underlying.tapply { prefix => (location, previous, state) => 22 | other.tapply { suffix => 23 | inner(composition.compose(prefix, suffix)) 24 | }(location, previous, state.enterConjunction) 25 | }(location, previous, state) 26 | } 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /modules/frontroute/src/main/scala/frontroute/CustomLocationProvider.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | import com.raquo.laminar.api.L.* 4 | import frontroute.internal.UrlString 5 | 6 | import scala.scalajs.js 7 | 8 | class CustomLocationProvider(locationStrings: Signal[String]) extends LocationProvider { 9 | 10 | val current: Signal[Option[Location]] = locationStrings.map { case UrlString(location) => 11 | Some(Location(location, js.undefined)) 12 | } 13 | 14 | def start()(implicit owner: Owner): Subscription = new Subscription(owner, () => {}) 15 | 16 | } 17 | -------------------------------------------------------------------------------- /modules/frontroute/src/main/scala/frontroute/DirectiveExecute.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | trait DirectiveExecute[In] { 4 | 5 | def execute(run: In): Route 6 | 7 | } 8 | 9 | trait DirectiveUnitExecute { 10 | 11 | def execute(run: => Unit): Route 12 | 13 | } 14 | -------------------------------------------------------------------------------- /modules/frontroute/src/main/scala/frontroute/Location.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | import frontroute.internal.HistoryState 4 | import org.scalajs.dom 5 | import scala.scalajs.js 6 | 7 | final case class Location( 8 | hostname: String, 9 | port: String, 10 | protocol: String, 11 | host: String, 12 | origin: String, 13 | path: List[String], 14 | fullPath: List[String], 15 | params: Map[String, Seq[String]], 16 | state: js.UndefOr[js.Any], 17 | otherMatched: Boolean 18 | ) { 19 | 20 | @inline def withUnmatchedPath(path: List[String]): Location = this.copy(path = path) 21 | 22 | private[frontroute] val parsedState = HistoryState.tryParse(state) 23 | 24 | override def toString: String = 25 | s"path: '${path.mkString("/")}${if (params.nonEmpty) "?" else ""}${params 26 | .flatMap { case (name, values) => 27 | values.map(value => s"$name=$value") 28 | } 29 | .mkString("&")}'" 30 | 31 | } 32 | 33 | object Location { 34 | 35 | def apply(location: dom.Location, state: js.UndefOr[js.Any]): Location = { 36 | val path = extractPath(location) 37 | new Location( 38 | hostname = location.hostname, 39 | port = location.port, 40 | protocol = location.protocol, 41 | host = location.host, 42 | origin = location.origin, 43 | path = path, 44 | fullPath = path, 45 | params = LocationUtils.parseLocationParams(location), 46 | state = state, 47 | otherMatched = false 48 | ) 49 | } 50 | 51 | private def extractPath(location: dom.Location): List[String] = { 52 | location.pathname.dropWhile(_ == '/').split('/').toList.dropWhile(_.isEmpty) 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /modules/frontroute/src/main/scala/frontroute/LocationProvider.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | import com.raquo.laminar.api.L.* 4 | import com.raquo.airstream.core.EventStream 5 | import org.scalajs.dom 6 | 7 | trait LocationProvider { 8 | 9 | def current: Signal[Option[Location]] 10 | def start()(implicit owner: Owner): Subscription 11 | 12 | } 13 | 14 | object LocationProvider { 15 | 16 | lazy val windowLocationProvider: LocationProvider = browser(windowEvents(_.onPopState)) 17 | 18 | def browser(popStateEvents: EventStream[dom.PopStateEvent]): LocationProvider = new BrowserLocationProvider(popStateEvents.delay(0)) 19 | 20 | def custom(locationStrings: Signal[String]) = new CustomLocationProvider(locationStrings) 21 | 22 | } 23 | -------------------------------------------------------------------------------- /modules/frontroute/src/main/scala/frontroute/LocationUtils.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | import org.scalajs.dom 4 | import scala.scalajs.js.URIUtils.encodeURIComponent 5 | import scala.scalajs.js.URIUtils.decodeURIComponent 6 | 7 | object LocationUtils { 8 | 9 | def parseLocationParams(location: dom.Location): Map[String, Seq[String]] = { 10 | val vars = location.search.dropWhile(_ == '?').split('&') 11 | val result = scala.collection.mutable.Map[String, Seq[String]]() 12 | vars.foreach { entry => 13 | entry.split('=') match { 14 | case Array(key, value) => 15 | val decodedKey = decodeURIComponent(key) 16 | val decodedValue = decodeURIComponent(value) 17 | result(decodedKey) = result.getOrElse(decodedKey, Seq.empty) :+ decodedValue 18 | case _ => 19 | } 20 | } 21 | result.toMap 22 | } 23 | 24 | @inline def encodeLocationParams(params: Map[String, Seq[String]]): String = 25 | encodeLocationParams(params.toSeq) 26 | 27 | def encodeLocationParams(params: Seq[(String, Seq[String])]): String = 28 | if (params.isEmpty) { 29 | "" 30 | } else { 31 | s"?${params 32 | .flatMap { case (name, values) => 33 | values.map { value => 34 | s"${encodeURIComponent(name)}=${encodeURIComponent(value)}" 35 | } 36 | }.mkString("&")}" 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /modules/frontroute/src/main/scala/frontroute/NavElement.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | object NavElement {} 4 | -------------------------------------------------------------------------------- /modules/frontroute/src/main/scala/frontroute/PageStatusCode.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | sealed trait PageStatusCode extends Product with Serializable 4 | 5 | object PageStatusCode { 6 | 7 | case object Ok extends PageStatusCode 8 | case object Error extends PageStatusCode 9 | case object NotFound extends PageStatusCode 10 | 11 | } 12 | -------------------------------------------------------------------------------- /modules/frontroute/src/main/scala/frontroute/RouteResult.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | import com.raquo.laminar.api.L.* 4 | import frontroute.internal.RoutingState 5 | 6 | sealed trait RouteResult extends Product with Serializable 7 | 8 | object RouteResult { 9 | final case class Matched(state: RoutingState, location: Location, consumed: List[String], result: () => HtmlElement) extends RouteResult 10 | final case class RunEffect(state: RoutingState, location: Location, consumed: List[String], run: () => Unit) extends RouteResult 11 | case object Rejected extends RouteResult 12 | } 13 | -------------------------------------------------------------------------------- /modules/frontroute/src/main/scala/frontroute/ScrollPosition.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | final case class ScrollPosition( 4 | scrollX: Option[Int], 5 | scrollY: Option[Int] 6 | ) 7 | -------------------------------------------------------------------------------- /modules/frontroute/src/main/scala/frontroute/domext/WindowWithScrollXY.scala: -------------------------------------------------------------------------------- 1 | package frontroute.domext 2 | 3 | import scala.scalajs.js 4 | 5 | @js.native 6 | private[frontroute] trait WindowWithScrollXY extends js.Object { 7 | 8 | val scrollX: js.UndefOr[Double] // = js.native 9 | val scrollY: js.UndefOr[Double] // = js.native 10 | 11 | } 12 | -------------------------------------------------------------------------------- /modules/frontroute/src/main/scala/frontroute/internal/HistoryState.scala: -------------------------------------------------------------------------------- 1 | package frontroute.internal 2 | 3 | import org.scalajs.dom 4 | 5 | import scala.scalajs.js 6 | 7 | private[frontroute] class HistoryStateScrollPosition( 8 | val scrollX: js.UndefOr[Double], 9 | val scrollY: js.UndefOr[Double] 10 | ) extends js.Object 11 | 12 | private[frontroute] class FrontrouteHistoryState( 13 | val scroll: js.UndefOr[HistoryStateScrollPosition] 14 | ) extends js.Object 15 | 16 | private[frontroute] class HistoryState( 17 | var internal: js.UndefOr[FrontrouteHistoryState], 18 | var user: js.UndefOr[js.Any], 19 | val frontroute: js.UndefOr[String] = "frontroute" 20 | ) extends js.Object {} 21 | 22 | object HistoryState { 23 | 24 | def tryParse(raw: js.UndefOr[js.Any]): Option[HistoryState] = { 25 | if (js.isUndefined(raw) || raw == null) { 26 | Some(new HistoryState(js.undefined, js.undefined)) 27 | } else { 28 | val state = raw.asInstanceOf[HistoryState] 29 | if (state.frontroute.contains("frontroute")) { 30 | Some(state) 31 | } else { 32 | dom.console.debug("history state was set outside frontroute", state, state.isInstanceOf[HistoryState]) 33 | None 34 | } 35 | } 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /modules/frontroute/src/main/scala/frontroute/internal/PathMatchResult.scala: -------------------------------------------------------------------------------- 1 | package frontroute.internal 2 | 3 | sealed abstract class PathMatchResult[+A] extends Product with Serializable { 4 | 5 | def map[B](f: A => B): PathMatchResult[B] = this match { 6 | case PathMatchResult.NoMatch => PathMatchResult.NoMatch 7 | case PathMatchResult.Rejected(tail) => PathMatchResult.Rejected(tail) 8 | case PathMatchResult.Match(value, consumed, tail) => PathMatchResult.Match(f(value), consumed, tail) 9 | } 10 | 11 | } 12 | 13 | object PathMatchResult { 14 | 15 | case object NoMatch extends PathMatchResult[Nothing] 16 | case class Rejected[T]( 17 | tail: List[String] 18 | ) extends PathMatchResult[T] 19 | case class Match[T]( 20 | value: T, 21 | consumed: List[String], 22 | tail: List[String] 23 | ) extends PathMatchResult[T] 24 | 25 | } 26 | -------------------------------------------------------------------------------- /modules/frontroute/src/main/scala/frontroute/internal/RoutingPathStep.scala: -------------------------------------------------------------------------------- 1 | package frontroute.internal 2 | 3 | sealed abstract class RoutingPathStep(repr: String) extends Product with Serializable { 4 | override def toString: String = repr 5 | } 6 | 7 | object RoutingPathStep { 8 | 9 | case object Initial extends RoutingPathStep("i") 10 | case object Dir extends RoutingPathStep("d") 11 | case class Concat(index: Int) extends RoutingPathStep(index.toString) 12 | case object Disjunction extends RoutingPathStep("j") 13 | case object EnterDisjunction extends RoutingPathStep("e") 14 | case object Conjunction extends RoutingPathStep("c") 15 | 16 | } 17 | -------------------------------------------------------------------------------- /modules/frontroute/src/main/scala/frontroute/internal/UrlString.scala: -------------------------------------------------------------------------------- 1 | package frontroute.internal 2 | 3 | import org.scalajs.dom 4 | import scala.scalajs.js 5 | 6 | object UrlString { 7 | 8 | def unapply(url: String): Some[dom.Location] = { 9 | val l = dom.document.createElement("a").asInstanceOf[dom.HTMLAnchorElement] 10 | l.href = url 11 | Some( 12 | js.Dynamic 13 | .literal( 14 | hash = l.hash, 15 | protocol = l.protocol, 16 | search = l.search, 17 | href = l.href, 18 | hostname = l.hostname, 19 | port = l.port, 20 | pathname = l.pathname, 21 | host = l.host 22 | ) 23 | .asInstanceOf[dom.Location] 24 | ) 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /modules/frontroute/src/main/scala/frontroute/ops/DirectiveOfOptionOps.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | package ops 3 | 4 | class DirectiveOfOptionOps[A](underlying: Directive[Option[A]]) { 5 | 6 | @inline def mapOption[R](f: A => R): Directive[Option[R]] = underlying.map(_.map(f)) 7 | 8 | @inline def default(v: => A): Directive[A] = underlying.map(_.getOrElse(v)) 9 | 10 | @inline def collectOption[R](f: PartialFunction[A, R]): Directive[Option[R]] = underlying.map(_.collect(f)) 11 | 12 | } 13 | -------------------------------------------------------------------------------- /modules/frontroute/src/test/scala/frontroute/ConjunctionTests.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | import frontroute.testing.* 4 | 5 | class ConjunctionTests extends TestBase { 6 | 7 | test("conjunction") { 8 | routeTest( 9 | route = probe => 10 | pathPrefix("prefix1") { 11 | pathPrefix("prefix2") { 12 | (path(segment) & param("param1")) { (seg, paramValue) => 13 | testComplete { 14 | probe.append(s"prefix1/prefix2/$seg?param1=$paramValue") 15 | } 16 | } 17 | } 18 | }, 19 | init = locationProvider => { 20 | locationProvider.path("prefix1", "prefix2", "other-suffix-1") 21 | locationProvider.params("param1" -> "param1-value1") 22 | locationProvider.params("param1" -> "param1-value2") 23 | locationProvider.params("param1" -> "param1-value2") // dup 24 | locationProvider.path("prefix1", "prefix2", "other-suffix-2") 25 | } 26 | ) { probe => 27 | probe.toList shouldBe List( 28 | "prefix1/prefix2/other-suffix-1?param1=param1-value1", 29 | "prefix1/prefix2/other-suffix-1?param1=param1-value2", 30 | "prefix1/prefix2/other-suffix-2?param1=param1-value2" 31 | ) 32 | } 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /modules/frontroute/src/test/scala/frontroute/Disjunction2xAndCollectTests.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | import frontroute.testing.* 4 | 5 | class Disjunction2xAndCollectTests extends TestBase { 6 | 7 | test("2x disjunction and .collect") { 8 | case class Page(index: Int) 9 | routeTest( 10 | route = probe => 11 | ( 12 | pathEnd.collect { case _ => 0 } | 13 | path("page-1").collect { case _ => 1 } | 14 | path("page-2").collect { case _ => 2 } 15 | ) { index => 16 | testComplete { 17 | probe.append(Page(index).toString) 18 | } 19 | }, 20 | init = locationProvider => { 21 | locationProvider.path() 22 | locationProvider.path("page-1") 23 | locationProvider.path() 24 | locationProvider.path("page-1") 25 | locationProvider.path("page-2") 26 | locationProvider.path() 27 | locationProvider.path("page-2") 28 | locationProvider.path() 29 | } 30 | ) { probe => 31 | probe.toList shouldBe Seq( 32 | Page(0).toString, 33 | Page(1).toString, 34 | Page(0).toString, 35 | Page(1).toString, 36 | Page(2).toString, 37 | Page(0).toString, 38 | Page(2).toString, 39 | Page(0).toString 40 | ) 41 | } 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /modules/frontroute/src/test/scala/frontroute/Disjunction2xAndMapTest.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | import frontroute.testing.* 4 | 5 | class Disjunction2xAndMapTest extends TestBase { 6 | 7 | test("2x disjunction and .map") { 8 | case class Page(index: Int) 9 | routeTest( 10 | route = probe => 11 | ( 12 | pathEnd.map(_ => 0) | 13 | path("page-1").map(_ => 1) | 14 | path("page-2").map(_ => 2) 15 | ) { index => 16 | testComplete { 17 | probe.append(Page(index).toString) 18 | } 19 | }, 20 | init = locationProvider => { 21 | locationProvider.path() 22 | locationProvider.path("page-1") 23 | locationProvider.path() 24 | locationProvider.path("page-1") 25 | locationProvider.path("page-2") 26 | locationProvider.path() 27 | locationProvider.path("page-2") 28 | locationProvider.path() 29 | } 30 | ) { probe => 31 | probe.toList shouldBe Seq( 32 | Page(0).toString, 33 | Page(1).toString, 34 | Page(0).toString, 35 | Page(1).toString, 36 | Page(2).toString, 37 | Page(0).toString, 38 | Page(2).toString, 39 | Page(0).toString 40 | ) 41 | } 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /modules/frontroute/src/test/scala/frontroute/Disjunction2xAndMapToTest.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | import frontroute.testing.* 4 | 5 | class Disjunction2xAndMapToTest extends TestBase { 6 | 7 | test("2x disjunction and .mapTo") { 8 | case class Page(index: Int) 9 | routeTest( 10 | route = probe => 11 | ( 12 | pathEnd.mapTo(0) | 13 | path("page-1").mapTo(1) | 14 | path("page-2").mapTo(2) 15 | ) { index => 16 | testComplete { 17 | probe.append(Page(index).toString) 18 | } 19 | }, 20 | init = locationProvider => { 21 | locationProvider.path() 22 | locationProvider.path("page-1") 23 | locationProvider.path() 24 | locationProvider.path("page-1") 25 | locationProvider.path("page-2") 26 | locationProvider.path() 27 | locationProvider.path("page-2") 28 | locationProvider.path() 29 | } 30 | ) { probe => 31 | probe.toList shouldBe Seq( 32 | Page(0).toString, 33 | Page(1).toString, 34 | Page(0).toString, 35 | Page(1).toString, 36 | Page(2).toString, 37 | Page(0).toString, 38 | Page(2).toString, 39 | Page(0).toString 40 | ) 41 | } 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /modules/frontroute/src/test/scala/frontroute/Disjunction3xSignalTest.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | import com.raquo.airstream.core.Signal 4 | import frontroute.testing.* 5 | import scala.concurrent.Future 6 | 7 | class Disjunction3xSignalTest extends TestBase { 8 | 9 | test("disjunction 3x signal") { 10 | var pathSignal: Signal[String] = null 11 | var signals: Future[List[String]] = null 12 | routeTestF( 13 | route = probe => 14 | pathPrefix("prefix1") { 15 | pathPrefix("prefix2") { 16 | ( 17 | path("suffix-1").mapTo("suffix-1") | 18 | path("suffix-2").mapTo("suffix-2") | 19 | path("suffix-3").mapTo("suffix-3") | 20 | pathEnd.mapTo("default") 21 | ).signal { s => 22 | testComplete { 23 | pathSignal = s 24 | signals = nSignals(5, pathSignal) 25 | probe.append("prefix1/prefix2") 26 | } 27 | } 28 | } 29 | }, 30 | init = locationProvider => { 31 | locationProvider.path("prefix1", "prefix2") 32 | locationProvider.path("prefix1", "prefix2", "suffix-1") 33 | locationProvider.path("prefix1", "prefix2", "suffix-1") 34 | locationProvider.path("prefix1", "prefix2", "suffix-2") 35 | locationProvider.path("prefix1", "prefix2", "suffix-3") 36 | } 37 | ) { probe => 38 | signals 39 | .map { suffixes => 40 | suffixes shouldBe List( 41 | "default", 42 | "suffix-1", 43 | "suffix-1", 44 | "suffix-2", 45 | "suffix-3" 46 | ) 47 | probe.toList shouldBe List( 48 | "prefix1/prefix2" 49 | ) 50 | } 51 | } 52 | } 53 | 54 | } 55 | -------------------------------------------------------------------------------- /modules/frontroute/src/test/scala/frontroute/DisjunctionAndCollectTest.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | import frontroute.testing.* 4 | 5 | class DisjunctionAndCollectTest extends TestBase { 6 | 7 | test("disjunction and .collect") { 8 | case class Page(isIndex: Boolean) 9 | routeTest( 10 | route = probe => 11 | (pathEnd.collect { case _ => true } | path("page-1").collect { case _ => false }) { isIndex => 12 | testComplete { 13 | probe.append(Page(isIndex).toString) 14 | } 15 | }, 16 | init = locationProvider => { 17 | locationProvider.path() 18 | locationProvider.path("page-1") 19 | locationProvider.path() 20 | locationProvider.path("page-1") 21 | locationProvider.path() 22 | } 23 | ) { probe => 24 | probe.toList shouldBe Seq( 25 | Page(true).toString, 26 | Page(false).toString, 27 | Page(true).toString, 28 | Page(false).toString, 29 | Page(true).toString 30 | ) 31 | } 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /modules/frontroute/src/test/scala/frontroute/DisjunctionAndMapTest.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | import frontroute.testing.* 4 | 5 | class DisjunctionAndMapTest extends TestBase { 6 | 7 | test("disjunction and .map") { 8 | case class Page(isIndex: Boolean) 9 | routeTest( 10 | route = probe => 11 | (pathEnd.map(_ => true) | path("page-1").map(_ => false)) { isIndex => 12 | testComplete { 13 | probe.append(Page(isIndex).toString) 14 | } 15 | }, 16 | init = locationProvider => { 17 | locationProvider.path() 18 | locationProvider.path("page-1") 19 | locationProvider.path() 20 | locationProvider.path("page-1") 21 | locationProvider.path() 22 | } 23 | ) { probe => 24 | probe.toList shouldBe Seq( 25 | Page(true).toString, 26 | Page(false).toString, 27 | Page(true).toString, 28 | Page(false).toString, 29 | Page(true).toString 30 | ) 31 | } 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /modules/frontroute/src/test/scala/frontroute/DisjunctionAndMapToTest.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | import frontroute.testing.* 4 | 5 | class DisjunctionAndMapToTest extends TestBase { 6 | 7 | test("disjunction and .mapTo") { 8 | case class Page(isIndex: Boolean) 9 | routeTest( 10 | route = probe => 11 | (pathEnd.mapTo(true) | path("page-1").mapTo(false)) { isIndex => 12 | testComplete { 13 | probe.append(Page(isIndex).toString) 14 | } 15 | }, 16 | init = locationProvider => { 17 | locationProvider.path() 18 | locationProvider.path("page-1") 19 | locationProvider.path() 20 | locationProvider.path("page-1") 21 | locationProvider.path() 22 | } 23 | ) { probe => 24 | probe.toList shouldBe Seq( 25 | Page(true).toString, 26 | Page(false).toString, 27 | Page(true).toString, 28 | Page(false).toString, 29 | Page(true).toString 30 | ) 31 | } 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /modules/frontroute/src/test/scala/frontroute/DisjunctionSignalTest.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | import com.raquo.airstream.core.Signal 4 | import frontroute.testing.* 5 | 6 | import scala.concurrent.Future 7 | 8 | class DisjunctionSignalTest extends TestBase { 9 | 10 | test("disjunction signal") { 11 | var pathSignal: Signal[String] = null 12 | var signals: Future[List[String]] = null 13 | routeTestF( 14 | route = probe => 15 | pathPrefix("prefix1") { 16 | pathPrefix("prefix2") { 17 | (path(segment) | pathEnd.map(_ => "default")).signal { s => 18 | testComplete { 19 | pathSignal = s 20 | signals = nSignals(5, pathSignal) 21 | probe.append("prefix1/prefix2") 22 | } 23 | } 24 | } 25 | }, 26 | init = locationProvider => { 27 | locationProvider.path("prefix1", "prefix2") 28 | locationProvider.path("prefix1", "prefix2", "suffix-1") 29 | locationProvider.path("prefix1", "prefix2", "suffix-1") 30 | locationProvider.path("prefix1", "prefix2", "suffix-2") 31 | locationProvider.path("prefix1", "prefix2", "suffix-3") 32 | } 33 | ) { probe => 34 | signals 35 | .map { suffixes => 36 | suffixes shouldBe List( 37 | "default", 38 | "suffix-1", 39 | "suffix-1", 40 | "suffix-2", 41 | "suffix-3" 42 | ) 43 | probe.toList shouldBe List( 44 | "prefix1/prefix2" 45 | ) 46 | } 47 | } 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /modules/frontroute/src/test/scala/frontroute/ExtractHostNameTest.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | import frontroute.testing.* 4 | 5 | class ExtractHostNameTest extends TestBase { 6 | 7 | test("extractHostname") { 8 | routeTest( 9 | route = probe => 10 | extractHostname { hostname => 11 | testComplete { 12 | probe.append(hostname) 13 | } 14 | }, 15 | init = locationProvider => { 16 | locationProvider.path() 17 | } 18 | ) { probe => 19 | probe.toList shouldBe List("test.nowhere") 20 | } 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /modules/frontroute/src/test/scala/frontroute/ExtractHostTest.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | import frontroute.testing.* 4 | 5 | import scala.scalajs.js 6 | import scala.scalajs.js.JSON 7 | 8 | class ExtractHostTest extends TestBase { 9 | 10 | test("extractHost") { 11 | routeTest( 12 | route = probe => 13 | extractHost { host => 14 | testComplete { 15 | probe.append(host) 16 | } 17 | }, 18 | init = locationProvider => { 19 | locationProvider.path() 20 | } 21 | ) { probe => 22 | probe.toList shouldBe List("test.nowhere:443") 23 | } 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /modules/frontroute/src/test/scala/frontroute/ExtractOriginTest.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | import frontroute.testing.* 4 | 5 | import scala.scalajs.js 6 | import scala.scalajs.js.JSON 7 | 8 | class ExtractOriginTest extends TestBase { 9 | 10 | test("extractOrigin") { 11 | routeTest( 12 | route = probe => 13 | extractOrigin { origin => 14 | testComplete { 15 | probe.append(origin) 16 | } 17 | }, 18 | init = locationProvider => { 19 | locationProvider.path() 20 | } 21 | ) { probe => 22 | probe.toList shouldBe List("https://test.nowhere:443") 23 | } 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /modules/frontroute/src/test/scala/frontroute/ExtractPortTest.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | import frontroute.testing.* 4 | 5 | import scala.scalajs.js 6 | import scala.scalajs.js.JSON 7 | 8 | class ExtractPortTest extends TestBase { 9 | 10 | test("extractPort") { 11 | routeTest( 12 | route = probe => 13 | extractPort { port => 14 | testComplete { 15 | probe.append(port) 16 | } 17 | }, 18 | init = locationProvider => { 19 | locationProvider.path() 20 | } 21 | ) { probe => 22 | probe.toList shouldBe List("443") 23 | } 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /modules/frontroute/src/test/scala/frontroute/ExtractProtocolTest.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | import frontroute.testing.* 4 | 5 | import scala.scalajs.js 6 | import scala.scalajs.js.JSON 7 | 8 | class ExtractProtocolTest extends TestBase { 9 | 10 | test("extractProtocol") { 11 | routeTest( 12 | route = probe => 13 | extractProtocol { protocol => 14 | testComplete { 15 | probe.append(protocol) 16 | } 17 | }, 18 | init = locationProvider => { 19 | locationProvider.path() 20 | } 21 | ) { probe => 22 | probe.toList shouldBe List("https") 23 | } 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /modules/frontroute/src/test/scala/frontroute/HistoryStateTest.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | import frontroute.testing.* 4 | 5 | import scala.scalajs.js 6 | import scala.scalajs.js.JSON 7 | 8 | class HistoryStateTest extends TestBase { 9 | 10 | test("historyState") { 11 | routeTest( 12 | route = probe => 13 | historyState { state => 14 | testComplete { 15 | probe.append(JSON.stringify(state.getOrElse("NO-STATE"))) 16 | } 17 | }, 18 | init = locationProvider => { 19 | locationProvider.path("state-test") 20 | locationProvider.state(js.Dynamic.literal(a = "test")) 21 | locationProvider.state(js.Dynamic.literal(a = "test", b = "something")) 22 | } 23 | ) { probe => 24 | probe.toList shouldBe List(""""NO-STATE"""", """{"a":"test"}""", """{"a":"test","b":"something"}""") 25 | } 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /modules/frontroute/src/test/scala/frontroute/ParamSignalTest.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | import com.raquo.airstream.core.Signal 4 | import frontroute.testing.* 5 | 6 | import scala.concurrent.Future 7 | 8 | class ParamSignalTest extends TestBase { 9 | 10 | test("param signal") { 11 | var paramSignal: Signal[String] = null 12 | var signals: Future[List[String]] = null 13 | routeTestF( 14 | route = probe => 15 | pathPrefix("prefix1") { 16 | pathPrefix("prefix2") { 17 | param("test-param").signal { s => 18 | testComplete { 19 | paramSignal = s 20 | signals = nSignals(3, paramSignal) 21 | probe.append("prefix1/prefix2") 22 | } 23 | } 24 | } 25 | }, 26 | init = locationProvider => { 27 | locationProvider.path("prefix1", "prefix2") 28 | locationProvider.params("test-param" -> "value-1") 29 | locationProvider.params("test-param" -> "value-2") 30 | locationProvider.params("test-param" -> "value-3") 31 | } 32 | ) { probe => 33 | signals 34 | .map { params => 35 | params shouldBe List( 36 | "value-1", 37 | "value-2", 38 | "value-3" 39 | ) 40 | probe.toList shouldBe List( 41 | "prefix1/prefix2" 42 | ) 43 | } 44 | } 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /modules/frontroute/src/test/scala/frontroute/SignalX1Test.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | import com.raquo.airstream.core.Signal 4 | import frontroute.testing.* 5 | 6 | import scala.concurrent.Future 7 | 8 | class SignalX1Test extends TestBase { 9 | 10 | test("signal x1") { 11 | var pathSignal: Signal[String] = null 12 | var signals: Future[List[String]] = null 13 | routeTestF( 14 | route = probe => 15 | pathPrefix("prefix1") { 16 | pathPrefix("prefix2") { 17 | path(segment).signal { s => 18 | testComplete { 19 | pathSignal = s 20 | signals = nSignals(1, pathSignal) 21 | probe.append("prefix1/prefix2") 22 | } 23 | } 24 | } 25 | }, 26 | init = locationProvider => { 27 | locationProvider.path("prefix1", "prefix2", "other-suffix-1") 28 | } 29 | ) { probe => 30 | signals 31 | .map { params => 32 | params shouldBe List( 33 | "other-suffix-1" 34 | ) 35 | probe.toList shouldBe List( 36 | "prefix1/prefix2" 37 | ) 38 | } 39 | } 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /modules/frontroute/src/test/scala/frontroute/SignalX3Test.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | import com.raquo.airstream.core.Signal 4 | import frontroute.testing.* 5 | 6 | import scala.concurrent.Future 7 | 8 | class SignalX3Test extends TestBase { 9 | 10 | test("signal x3") { 11 | var pathSignal: Signal[String] = null 12 | var signals: Future[List[String]] = null 13 | routeTestF( 14 | route = probe => 15 | pathPrefix("prefix1") { 16 | pathPrefix("prefix2") { 17 | path(segment).signal { s => 18 | testComplete { 19 | pathSignal = s 20 | signals = nSignals(3, pathSignal) 21 | probe.append("prefix1/prefix2") 22 | } 23 | } 24 | } 25 | }, 26 | init = locationProvider => { 27 | locationProvider.path("prefix1", "prefix2", "other-suffix-1") 28 | locationProvider.path("prefix1", "prefix2", "other-suffix-2") 29 | locationProvider.path("prefix1", "prefix2", "other-suffix-3") 30 | } 31 | ) { probe => 32 | signals 33 | .map { params => 34 | params shouldBe List( 35 | "other-suffix-1", 36 | "other-suffix-2", 37 | "other-suffix-3" 38 | ) 39 | probe.toList shouldBe List( 40 | "prefix1/prefix2" 41 | ) 42 | } 43 | } 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /modules/frontroute/src/test/scala/frontroute/pathDirectives/PathWithOneOfAndRecoverTest.scala: -------------------------------------------------------------------------------- 1 | package frontroute.pathDirectives 2 | 3 | import frontroute.testing.TestBase 4 | import frontroute.* 5 | 6 | class PathWithOneOfAndRecoverTest extends TestBase { 7 | 8 | test("path with oneOf path matcher and recover") { 9 | routeTest( 10 | route = probe => 11 | path(segment(Set("a", "b")).recover("default")) { str => 12 | testComplete { 13 | probe.append(str) 14 | } 15 | }, 16 | init = locationProvider => { 17 | locationProvider.path("a") 18 | locationProvider.path("b") 19 | locationProvider.path("c") 20 | } 21 | ) { probe => 22 | probe.toList shouldBe List("a", "b", "default") 23 | } 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /modules/frontroute/src/test/scala/frontroute/pathDirectives/PathWithOneOfTest.scala: -------------------------------------------------------------------------------- 1 | package frontroute.pathDirectives 2 | 3 | import frontroute.testing.TestBase 4 | import frontroute.* 5 | 6 | class PathWithOneOfTest extends TestBase { 7 | 8 | test("path with oneOf path matcher") { 9 | routeTest( 10 | route = probe => 11 | path(segment(Set("a", "b"))) { str => 12 | testComplete { 13 | probe.append(str) 14 | } 15 | }, 16 | init = locationProvider => { 17 | locationProvider.path("a") 18 | locationProvider.path("b") 19 | } 20 | ) { probe => 21 | probe.toList shouldBe List("a", "b") 22 | } 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /modules/frontroute/src/test/scala/frontroute/pathDirectives/RevisitPreviousMatchTest.scala: -------------------------------------------------------------------------------- 1 | package frontroute.pathDirectives 2 | 3 | import frontroute.testing.TestBase 4 | import frontroute.* 5 | 6 | class RevisitPreviousMatchTest extends TestBase { 7 | 8 | test("revisit previous match") { 9 | routeTest( 10 | route = probe => 11 | firstMatch( 12 | pathEnd { 13 | testComplete { 14 | probe.append("end") 15 | } 16 | }, 17 | path("path1") { 18 | testComplete { 19 | probe.append("path1") 20 | } 21 | } 22 | ), 23 | init = locationProvider => { 24 | locationProvider.path() 25 | locationProvider.path("path1") 26 | locationProvider.path() 27 | } 28 | ) { probe => 29 | probe.toList shouldBe List("end", "path1", "end") 30 | } 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /modules/frontroute/src/test/scala/frontroute/pathDirectives/SimplePathEndTest.scala: -------------------------------------------------------------------------------- 1 | package frontroute.pathDirectives 2 | 3 | import frontroute.* 4 | import frontroute.testing.TestBase 5 | 6 | class SimplePathEndTest extends TestBase { 7 | 8 | test("simple pathEnd") { 9 | routeTest( 10 | route = probe => 11 | pathEnd { 12 | testComplete { 13 | probe.append("end") 14 | } 15 | }, 16 | init = locationProvider => { 17 | locationProvider.path() 18 | } 19 | ) { probe => 20 | probe.toList shouldBe List("end") 21 | } 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /modules/frontroute/src/test/scala/frontroute/pathDirectives/TestPathPrefixTest.scala: -------------------------------------------------------------------------------- 1 | package frontroute.pathDirectives 2 | 3 | import frontroute.testing.TestBase 4 | import frontroute.* 5 | 6 | class TestPathPrefixTest extends TestBase { 7 | 8 | test("test path prefix") { 9 | routeTest( 10 | route = probe => 11 | testPathPrefix("a" / "b") { 12 | extractUnmatchedPath { unmatched => 13 | testComplete { 14 | probe.append(unmatched.mkString("/")) 15 | } 16 | } 17 | }, 18 | init = locationProvider => { 19 | locationProvider.path("a", "b", "c", "d") 20 | } 21 | ) { probe => 22 | probe.toList shouldBe List("a/b/c/d") 23 | } 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /modules/frontroute/src/test/scala/frontroute/pathDirectives/TestPathTest.scala: -------------------------------------------------------------------------------- 1 | package frontroute.pathDirectives 2 | 3 | import frontroute.testing.TestBase 4 | import frontroute.* 5 | 6 | class TestPathTest extends TestBase { 7 | 8 | test("test path") { 9 | routeTest( 10 | route = probe => 11 | testPath("a" / "b" / "c" / "d") { 12 | extractUnmatchedPath { unmatched => 13 | testComplete { 14 | probe.append(unmatched.mkString("/")) 15 | } 16 | } 17 | }, 18 | init = locationProvider => { 19 | locationProvider.path("a", "b", "c", "d") 20 | } 21 | ) { probe => 22 | probe.toList shouldBe List("a/b/c/d") 23 | } 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /modules/frontroute/src/test/scala/frontroute/testing/package.scala: -------------------------------------------------------------------------------- 1 | package frontroute 2 | 3 | import scala.concurrent.duration.FiniteDuration 4 | import scala.concurrent.Future 5 | import scala.concurrent.Promise 6 | import scala.scalajs.js 7 | import scala.scalajs.concurrent.JSExecutionContext.Implicits.queue 8 | 9 | package object testing { 10 | 11 | def delayedFuture(duration: FiniteDuration): Future[Unit] = 12 | Future.unit.delayed(duration) 13 | 14 | implicit class FutureExt[T](f: => Future[T]) { 15 | 16 | def delayed(duration: FiniteDuration): Future[T] = { 17 | val promise = Promise[T]() 18 | f.onComplete { t => 19 | js.timers.setTimeout(duration) { 20 | promise.complete(t) 21 | } 22 | } 23 | promise.future 24 | } 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "devDependencies": { 4 | "jsdom": "^21.1.0" 5 | } 6 | } -------------------------------------------------------------------------------- /project/DependencyVersions.scala: -------------------------------------------------------------------------------- 1 | object DependencyVersions { 2 | 3 | val laminar = "17.2.0" 4 | val `tuplez-apply` = "0.4.0" 5 | val domtestutils = "18.0.1" 6 | val scalatest = "3.2.19" 7 | 8 | // tests 9 | val `scala-js-macrotask-executor` = "1.1.1" 10 | 11 | // website 12 | val laminext = "0.17.1" 13 | val sourcecode = "0.4.1" 14 | val `embedded-files-macro` = "0.2.4" 15 | 16 | } 17 | -------------------------------------------------------------------------------- /project/JSEnv.scala: -------------------------------------------------------------------------------- 1 | sealed abstract class JSEnv(val isBrowser: Boolean) 2 | object JSEnv { 3 | case object Chrome extends JSEnv(true) 4 | case object Firefox extends JSEnv(true) 5 | case object JSDOMNodeJS extends JSEnv(false) 6 | case object NodeJS extends JSEnv(false) 7 | } 8 | -------------------------------------------------------------------------------- /project/ScalaVersions.scala: -------------------------------------------------------------------------------- 1 | object ScalaVersions { 2 | val v213 = "2.13.15" 3 | val v3 = "3.3.4" 4 | } 5 | -------------------------------------------------------------------------------- /project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version=1.10.6 2 | -------------------------------------------------------------------------------- /project/plugins.sbt: -------------------------------------------------------------------------------- 1 | logLevel := Level.Warn 2 | 3 | libraryDependencies += "org.commonmark" % "commonmark" % "0.24.0" 4 | libraryDependencies += "org.scala-js" %% "scalajs-env-nodejs" % "1.4.0" 5 | libraryDependencies += "org.scala-js" %% "scalajs-env-selenium" % "1.1.1" 6 | libraryDependencies += "org.scala-js" %% "scalajs-env-jsdom-nodejs" % "1.1.0" 7 | 8 | addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.16.0") 9 | 10 | addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.5.2") 11 | 12 | addSbtPlugin("com.github.sbt" % "sbt-pgp" % "2.3.1") 13 | 14 | addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "3.12.2") 15 | 16 | addSbtPlugin("org.typelevel" % "sbt-tpolecat" % "0.5.2") 17 | 18 | addSbtPlugin("com.github.sbt" % "sbt-github-actions" % "0.24.0") 19 | 20 | addSbtPlugin("com.github.sbt" % "sbt-ci-release" % "1.9.0") 21 | 22 | addSbtPlugin("ch.epfl.scala" % "sbt-version-policy" % "3.2.1") 23 | 24 | addSbtPlugin("com.yurique" % "sbt-embedded-files" % "0.4.0") 25 | 26 | addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.13.1") 27 | -------------------------------------------------------------------------------- /website/.frontroute-version: -------------------------------------------------------------------------------- 1 | 0.19.x -------------------------------------------------------------------------------- /website/.gitignore: -------------------------------------------------------------------------------- 1 | build/ 2 | dist/ 3 | .yarn/* 4 | !.yarn/releases 5 | !.yarn/plugins 6 | .pnp.js 7 | 8 | -------------------------------------------------------------------------------- /website/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | frontroute, Laminar edition 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | <%- pl %> 16 | 17 | 18 | 19 |
20 | 21 | <%- script %> 22 | 23 | -------------------------------------------------------------------------------- /website/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "license": "UNLICENSED", 4 | "dependencies": { 5 | "highlight.js": "^11.8.0" 6 | }, 7 | "devDependencies": { 8 | "@rollup/plugin-commonjs": "^25.0.2", 9 | "@tailwindcss/aspect-ratio": "^0.4.2", 10 | "@tailwindcss/forms": "^0.5.3", 11 | "@tailwindcss/typography": "^0.5.9", 12 | "autoprefixer": "^10.4.14", 13 | "cssnano": "^6.0.1", 14 | "lodash": "^4.17.21", 15 | "postcss": "^8.4.25", 16 | "postcss-import": "^15.1.0", 17 | "postcss-preset-env": "^9.0.0", 18 | "stylelint": "^15.10.1", 19 | "stylelint-config-recommended": "^13.0.0", 20 | "stylelint-config-standard": "^34.0.0", 21 | "tailwindcss": "^3.3.2", 22 | "vite": "^4.4.2", 23 | "vite-plugin-compression": "^0.5.1", 24 | "vite-plugin-html": "^3.2.0" 25 | }, 26 | "browserslist": [ 27 | "defaults" 28 | ], 29 | "scripts": { 30 | "dev": "vite", 31 | "build": "vite build", 32 | "preview": "vite preview" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /website/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = (api) => { 2 | const tailwindcss = require('./tailwind.config')(api) 3 | const plugins = { 4 | 'tailwindcss/nesting': {}, 5 | 'postcss-import': {}, 6 | tailwindcss, 7 | autoprefixer: {} 8 | } 9 | if (api.mode === 'production') { 10 | plugins.cssnano = {} 11 | } 12 | return { 13 | plugins 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /website/scala-version.js: -------------------------------------------------------------------------------- 1 | const scala2 = '2.13' 2 | const scala3 = '3.3.4' 3 | 4 | module.exports = scala3 5 | -------------------------------------------------------------------------------- /website/src/main/public/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tulz-app/frontroute/6f13ad036ae6dfb1c5b557e392a9bfda2c2654fe/website/src/main/public/android-chrome-192x192.png -------------------------------------------------------------------------------- /website/src/main/public/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tulz-app/frontroute/6f13ad036ae6dfb1c5b557e392a9bfda2c2654fe/website/src/main/public/android-chrome-512x512.png -------------------------------------------------------------------------------- /website/src/main/public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tulz-app/frontroute/6f13ad036ae6dfb1c5b557e392a9bfda2c2654fe/website/src/main/public/apple-touch-icon.png -------------------------------------------------------------------------------- /website/src/main/public/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #da532c 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /website/src/main/public/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tulz-app/frontroute/6f13ad036ae6dfb1c5b557e392a9bfda2c2654fe/website/src/main/public/favicon-16x16.png -------------------------------------------------------------------------------- /website/src/main/public/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tulz-app/frontroute/6f13ad036ae6dfb1c5b557e392a9bfda2c2654fe/website/src/main/public/favicon-32x32.png -------------------------------------------------------------------------------- /website/src/main/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tulz-app/frontroute/6f13ad036ae6dfb1c5b557e392a9bfda2c2654fe/website/src/main/public/favicon.ico -------------------------------------------------------------------------------- /website/src/main/public/mstile-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tulz-app/frontroute/6f13ad036ae6dfb1c5b557e392a9bfda2c2654fe/website/src/main/public/mstile-144x144.png -------------------------------------------------------------------------------- /website/src/main/public/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tulz-app/frontroute/6f13ad036ae6dfb1c5b557e392a9bfda2c2654fe/website/src/main/public/mstile-150x150.png -------------------------------------------------------------------------------- /website/src/main/public/mstile-310x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tulz-app/frontroute/6f13ad036ae6dfb1c5b557e392a9bfda2c2654fe/website/src/main/public/mstile-310x150.png -------------------------------------------------------------------------------- /website/src/main/public/mstile-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tulz-app/frontroute/6f13ad036ae6dfb1c5b557e392a9bfda2c2654fe/website/src/main/public/mstile-310x310.png -------------------------------------------------------------------------------- /website/src/main/public/mstile-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tulz-app/frontroute/6f13ad036ae6dfb1c5b557e392a9bfda2c2654fe/website/src/main/public/mstile-70x70.png -------------------------------------------------------------------------------- /website/src/main/public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /website/src/main/public/site.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "", 3 | "short_name": "", 4 | "icons": [ 5 | { 6 | "src": "/android-chrome-192x192.png", 7 | "sizes": "192x192", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "/android-chrome-512x512.png", 12 | "sizes": "512x512", 13 | "type": "image/png" 14 | } 15 | ], 16 | "theme_color": "#ffffff", 17 | "background_color": "#ffffff", 18 | "display": "standalone" 19 | } 20 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/an-old-hope.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | An Old Hope – Star Wars Syntax (c) Gustavo Costa 4 | Original theme - Ocean Dark Theme – by https://github.com/gavsiu 5 | Based on Jesse Leite's Atom syntax theme 'An Old Hope' – https://github.com/JesseLeite/an-old-hope-syntax-atom 6 | 7 | */ 8 | 9 | /* Death Star Comment */ 10 | .hljs-comment, 11 | .hljs-quote 12 | { 13 | color: #B6B18B; 14 | } 15 | 16 | /* Darth Vader */ 17 | .hljs-variable, 18 | .hljs-template-variable, 19 | .hljs-tag, 20 | .hljs-name, 21 | .hljs-selector-id, 22 | .hljs-selector-class, 23 | .hljs-regexp, 24 | .hljs-deletion 25 | { 26 | color: #EB3C54; 27 | } 28 | 29 | /* Threepio */ 30 | .hljs-number, 31 | .hljs-built_in, 32 | .hljs-builtin-name, 33 | .hljs-literal, 34 | .hljs-type, 35 | .hljs-params, 36 | .hljs-meta, 37 | .hljs-link 38 | { 39 | color: #E7CE56; 40 | } 41 | 42 | /* Luke Skywalker */ 43 | .hljs-attribute 44 | { 45 | color: #EE7C2B; 46 | } 47 | 48 | /* Obi Wan Kenobi */ 49 | .hljs-string, 50 | .hljs-symbol, 51 | .hljs-bullet, 52 | .hljs-addition 53 | { 54 | color: #4FB4D7; 55 | } 56 | 57 | /* Yoda */ 58 | .hljs-title, 59 | .hljs-section 60 | { 61 | color: #78BB65; 62 | } 63 | 64 | /* Mace Windu */ 65 | .hljs-keyword, 66 | .hljs-selector-tag 67 | { 68 | color: #B45EA4; 69 | } 70 | 71 | /* Millenium Falcon */ 72 | .hljs 73 | { 74 | display: block; 75 | overflow-x: auto; 76 | background: #1C1D21; 77 | color: #c0c5ce; 78 | padding: 0.5em; 79 | } 80 | 81 | .hljs-emphasis 82 | { 83 | font-style: italic; 84 | } 85 | 86 | .hljs-strong 87 | { 88 | font-weight: bold; 89 | } 90 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/androidstudio.css: -------------------------------------------------------------------------------- 1 | /* 2 | Date: 24 Fev 2015 3 | Author: Pedro Oliveira 4 | */ 5 | 6 | .hljs { 7 | color: #a9b7c6; 8 | background: #282b2e; 9 | display: block; 10 | overflow-x: auto; 11 | padding: 0.5em; 12 | } 13 | 14 | .hljs-number, 15 | .hljs-literal, 16 | .hljs-symbol, 17 | .hljs-bullet { 18 | color: #6897BB; 19 | } 20 | 21 | .hljs-keyword, 22 | .hljs-selector-tag, 23 | .hljs-deletion { 24 | color: #cc7832; 25 | } 26 | 27 | .hljs-variable, 28 | .hljs-template-variable, 29 | .hljs-link { 30 | color: #629755; 31 | } 32 | 33 | .hljs-comment, 34 | .hljs-quote { 35 | color: #808080; 36 | } 37 | 38 | .hljs-meta { 39 | color: #bbb529; 40 | } 41 | 42 | .hljs-string, 43 | .hljs-attribute, 44 | .hljs-addition { 45 | color: #6A8759; 46 | } 47 | 48 | .hljs-section, 49 | .hljs-title, 50 | .hljs-type { 51 | color: #ffc66d; 52 | } 53 | 54 | .hljs-name, 55 | .hljs-selector-id, 56 | .hljs-selector-class { 57 | color: #e8bf6a; 58 | } 59 | 60 | .hljs-emphasis { 61 | font-style: italic; 62 | } 63 | 64 | .hljs-strong { 65 | font-weight: bold; 66 | } 67 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/arduino-light.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Arduino® Light Theme - Stefania Mellai 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: #FFFFFF; 12 | } 13 | 14 | .hljs, 15 | .hljs-subst { 16 | color: #434f54; 17 | } 18 | 19 | .hljs-keyword, 20 | .hljs-attribute, 21 | .hljs-selector-tag, 22 | .hljs-doctag, 23 | .hljs-name { 24 | color: #00979D; 25 | } 26 | 27 | .hljs-built_in, 28 | .hljs-literal, 29 | .hljs-bullet, 30 | .hljs-code, 31 | .hljs-addition { 32 | color: #D35400; 33 | } 34 | 35 | .hljs-regexp, 36 | .hljs-symbol, 37 | .hljs-variable, 38 | .hljs-template-variable, 39 | .hljs-link, 40 | .hljs-selector-attr, 41 | .hljs-selector-pseudo { 42 | color: #00979D; 43 | } 44 | 45 | .hljs-type, 46 | .hljs-string, 47 | .hljs-selector-id, 48 | .hljs-selector-class, 49 | .hljs-quote, 50 | .hljs-template-tag, 51 | .hljs-deletion { 52 | color: #005C5F; 53 | } 54 | 55 | .hljs-title, 56 | .hljs-section { 57 | color: #880000; 58 | font-weight: bold; 59 | } 60 | 61 | .hljs-comment { 62 | color: rgba(149,165,166,.8); 63 | } 64 | 65 | .hljs-meta-keyword { 66 | color: #728E00; 67 | } 68 | 69 | .hljs-meta { 70 | color: #434f54; 71 | } 72 | 73 | .hljs-emphasis { 74 | font-style: italic; 75 | } 76 | 77 | .hljs-strong { 78 | font-weight: bold; 79 | } 80 | 81 | .hljs-function { 82 | color: #728E00; 83 | } 84 | 85 | .hljs-number { 86 | color: #8A7B52; 87 | } 88 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/arta.css: -------------------------------------------------------------------------------- 1 | /* 2 | Date: 17.V.2011 3 | Author: pumbur 4 | */ 5 | 6 | .hljs { 7 | display: block; 8 | overflow-x: auto; 9 | padding: 0.5em; 10 | background: #222; 11 | } 12 | 13 | .hljs, 14 | .hljs-subst { 15 | color: #aaa; 16 | } 17 | 18 | .hljs-section { 19 | color: #fff; 20 | } 21 | 22 | .hljs-comment, 23 | .hljs-quote, 24 | .hljs-meta { 25 | color: #444; 26 | } 27 | 28 | .hljs-string, 29 | .hljs-symbol, 30 | .hljs-bullet, 31 | .hljs-regexp { 32 | color: #ffcc33; 33 | } 34 | 35 | .hljs-number, 36 | .hljs-addition { 37 | color: #00cc66; 38 | } 39 | 40 | .hljs-built_in, 41 | .hljs-builtin-name, 42 | .hljs-literal, 43 | .hljs-type, 44 | .hljs-template-variable, 45 | .hljs-attribute, 46 | .hljs-link { 47 | color: #32aaee; 48 | } 49 | 50 | .hljs-keyword, 51 | .hljs-selector-tag, 52 | .hljs-name, 53 | .hljs-selector-id, 54 | .hljs-selector-class { 55 | color: #6644aa; 56 | } 57 | 58 | .hljs-title, 59 | .hljs-variable, 60 | .hljs-deletion, 61 | .hljs-template-tag { 62 | color: #bb1166; 63 | } 64 | 65 | .hljs-section, 66 | .hljs-doctag, 67 | .hljs-strong { 68 | font-weight: bold; 69 | } 70 | 71 | .hljs-emphasis { 72 | font-style: italic; 73 | } 74 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/ascetic.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Original style from softwaremaniacs.org (c) Ivan Sagalaev 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: white; 12 | color: black; 13 | } 14 | 15 | .hljs-string, 16 | .hljs-variable, 17 | .hljs-template-variable, 18 | .hljs-symbol, 19 | .hljs-bullet, 20 | .hljs-section, 21 | .hljs-addition, 22 | .hljs-attribute, 23 | .hljs-link { 24 | color: #888; 25 | } 26 | 27 | .hljs-comment, 28 | .hljs-quote, 29 | .hljs-meta, 30 | .hljs-deletion { 31 | color: #ccc; 32 | } 33 | 34 | .hljs-keyword, 35 | .hljs-selector-tag, 36 | .hljs-section, 37 | .hljs-name, 38 | .hljs-type, 39 | .hljs-strong { 40 | font-weight: bold; 41 | } 42 | 43 | .hljs-emphasis { 44 | font-style: italic; 45 | } 46 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/atelier-cave-dark.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Cave Dark - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Cave Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #7e7887; 9 | } 10 | 11 | /* Atelier-Cave Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-regexp, 16 | .hljs-link, 17 | .hljs-tag, 18 | .hljs-name, 19 | .hljs-selector-id, 20 | .hljs-selector-class { 21 | color: #be4678; 22 | } 23 | 24 | /* Atelier-Cave Orange */ 25 | .hljs-number, 26 | .hljs-meta, 27 | .hljs-built_in, 28 | .hljs-builtin-name, 29 | .hljs-literal, 30 | .hljs-type, 31 | .hljs-params { 32 | color: #aa573c; 33 | } 34 | 35 | /* Atelier-Cave Green */ 36 | .hljs-string, 37 | .hljs-symbol, 38 | .hljs-bullet { 39 | color: #2a9292; 40 | } 41 | 42 | /* Atelier-Cave Blue */ 43 | .hljs-title, 44 | .hljs-section { 45 | color: #576ddb; 46 | } 47 | 48 | /* Atelier-Cave Purple */ 49 | .hljs-keyword, 50 | .hljs-selector-tag { 51 | color: #955ae7; 52 | } 53 | 54 | .hljs-deletion, 55 | .hljs-addition { 56 | color: #19171c; 57 | display: inline-block; 58 | width: 100%; 59 | } 60 | 61 | .hljs-deletion { 62 | background-color: #be4678; 63 | } 64 | 65 | .hljs-addition { 66 | background-color: #2a9292; 67 | } 68 | 69 | .hljs { 70 | display: block; 71 | overflow-x: auto; 72 | background: #19171c; 73 | color: #8b8792; 74 | padding: 0.5em; 75 | } 76 | 77 | .hljs-emphasis { 78 | font-style: italic; 79 | } 80 | 81 | .hljs-strong { 82 | font-weight: bold; 83 | } 84 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/atelier-cave-light.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Cave Light - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Cave Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #655f6d; 9 | } 10 | 11 | /* Atelier-Cave Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-name, 21 | .hljs-selector-id, 22 | .hljs-selector-class { 23 | color: #be4678; 24 | } 25 | 26 | /* Atelier-Cave Orange */ 27 | .hljs-number, 28 | .hljs-meta, 29 | .hljs-built_in, 30 | .hljs-builtin-name, 31 | .hljs-literal, 32 | .hljs-type, 33 | .hljs-params { 34 | color: #aa573c; 35 | } 36 | 37 | /* Atelier-Cave Green */ 38 | .hljs-string, 39 | .hljs-symbol, 40 | .hljs-bullet { 41 | color: #2a9292; 42 | } 43 | 44 | /* Atelier-Cave Blue */ 45 | .hljs-title, 46 | .hljs-section { 47 | color: #576ddb; 48 | } 49 | 50 | /* Atelier-Cave Purple */ 51 | .hljs-keyword, 52 | .hljs-selector-tag { 53 | color: #955ae7; 54 | } 55 | 56 | .hljs-deletion, 57 | .hljs-addition { 58 | color: #19171c; 59 | display: inline-block; 60 | width: 100%; 61 | } 62 | 63 | .hljs-deletion { 64 | background-color: #be4678; 65 | } 66 | 67 | .hljs-addition { 68 | background-color: #2a9292; 69 | } 70 | 71 | .hljs { 72 | display: block; 73 | overflow-x: auto; 74 | background: #efecf4; 75 | color: #585260; 76 | padding: 0.5em; 77 | } 78 | 79 | .hljs-emphasis { 80 | font-style: italic; 81 | } 82 | 83 | .hljs-strong { 84 | font-weight: bold; 85 | } 86 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/atelier-dune-dark.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Dune Dark - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Dune Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #999580; 9 | } 10 | 11 | /* Atelier-Dune Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #d73737; 23 | } 24 | 25 | /* Atelier-Dune Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #b65611; 34 | } 35 | 36 | /* Atelier-Dune Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #60ac39; 41 | } 42 | 43 | /* Atelier-Dune Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #6684e1; 47 | } 48 | 49 | /* Atelier-Dune Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #b854d4; 53 | } 54 | 55 | .hljs { 56 | display: block; 57 | overflow-x: auto; 58 | background: #20201d; 59 | color: #a6a28c; 60 | padding: 0.5em; 61 | } 62 | 63 | .hljs-emphasis { 64 | font-style: italic; 65 | } 66 | 67 | .hljs-strong { 68 | font-weight: bold; 69 | } 70 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/atelier-dune-light.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Dune Light - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Dune Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #7d7a68; 9 | } 10 | 11 | /* Atelier-Dune Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #d73737; 23 | } 24 | 25 | /* Atelier-Dune Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #b65611; 34 | } 35 | 36 | /* Atelier-Dune Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #60ac39; 41 | } 42 | 43 | /* Atelier-Dune Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #6684e1; 47 | } 48 | 49 | /* Atelier-Dune Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #b854d4; 53 | } 54 | 55 | .hljs { 56 | display: block; 57 | overflow-x: auto; 58 | background: #fefbec; 59 | color: #6e6b5e; 60 | padding: 0.5em; 61 | } 62 | 63 | .hljs-emphasis { 64 | font-style: italic; 65 | } 66 | 67 | .hljs-strong { 68 | font-weight: bold; 69 | } 70 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/atelier-estuary-dark.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Estuary Dark - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/estuary) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Estuary Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #878573; 9 | } 10 | 11 | /* Atelier-Estuary Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #ba6236; 23 | } 24 | 25 | /* Atelier-Estuary Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #ae7313; 34 | } 35 | 36 | /* Atelier-Estuary Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #7d9726; 41 | } 42 | 43 | /* Atelier-Estuary Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #36a166; 47 | } 48 | 49 | /* Atelier-Estuary Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #5f9182; 53 | } 54 | 55 | .hljs-deletion, 56 | .hljs-addition { 57 | color: #22221b; 58 | display: inline-block; 59 | width: 100%; 60 | } 61 | 62 | .hljs-deletion { 63 | background-color: #ba6236; 64 | } 65 | 66 | .hljs-addition { 67 | background-color: #7d9726; 68 | } 69 | 70 | .hljs { 71 | display: block; 72 | overflow-x: auto; 73 | background: #22221b; 74 | color: #929181; 75 | padding: 0.5em; 76 | } 77 | 78 | .hljs-emphasis { 79 | font-style: italic; 80 | } 81 | 82 | .hljs-strong { 83 | font-weight: bold; 84 | } 85 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/atelier-estuary-light.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Estuary Light - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/estuary) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Estuary Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #6c6b5a; 9 | } 10 | 11 | /* Atelier-Estuary Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #ba6236; 23 | } 24 | 25 | /* Atelier-Estuary Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #ae7313; 34 | } 35 | 36 | /* Atelier-Estuary Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #7d9726; 41 | } 42 | 43 | /* Atelier-Estuary Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #36a166; 47 | } 48 | 49 | /* Atelier-Estuary Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #5f9182; 53 | } 54 | 55 | .hljs-deletion, 56 | .hljs-addition { 57 | color: #22221b; 58 | display: inline-block; 59 | width: 100%; 60 | } 61 | 62 | .hljs-deletion { 63 | background-color: #ba6236; 64 | } 65 | 66 | .hljs-addition { 67 | background-color: #7d9726; 68 | } 69 | 70 | .hljs { 71 | display: block; 72 | overflow-x: auto; 73 | background: #f4f3ec; 74 | color: #5f5e4e; 75 | padding: 0.5em; 76 | } 77 | 78 | .hljs-emphasis { 79 | font-style: italic; 80 | } 81 | 82 | .hljs-strong { 83 | font-weight: bold; 84 | } 85 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/atelier-forest-dark.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Forest Dark - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/forest) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Forest Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #9c9491; 9 | } 10 | 11 | /* Atelier-Forest Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #f22c40; 23 | } 24 | 25 | /* Atelier-Forest Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #df5320; 34 | } 35 | 36 | /* Atelier-Forest Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #7b9726; 41 | } 42 | 43 | /* Atelier-Forest Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #407ee7; 47 | } 48 | 49 | /* Atelier-Forest Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #6666ea; 53 | } 54 | 55 | .hljs { 56 | display: block; 57 | overflow-x: auto; 58 | background: #1b1918; 59 | color: #a8a19f; 60 | padding: 0.5em; 61 | } 62 | 63 | .hljs-emphasis { 64 | font-style: italic; 65 | } 66 | 67 | .hljs-strong { 68 | font-weight: bold; 69 | } 70 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/atelier-forest-light.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Forest Light - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/forest) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Forest Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #766e6b; 9 | } 10 | 11 | /* Atelier-Forest Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #f22c40; 23 | } 24 | 25 | /* Atelier-Forest Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #df5320; 34 | } 35 | 36 | /* Atelier-Forest Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #7b9726; 41 | } 42 | 43 | /* Atelier-Forest Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #407ee7; 47 | } 48 | 49 | /* Atelier-Forest Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #6666ea; 53 | } 54 | 55 | .hljs { 56 | display: block; 57 | overflow-x: auto; 58 | background: #f1efee; 59 | color: #68615e; 60 | padding: 0.5em; 61 | } 62 | 63 | .hljs-emphasis { 64 | font-style: italic; 65 | } 66 | 67 | .hljs-strong { 68 | font-weight: bold; 69 | } 70 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/atelier-heath-dark.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Heath Dark - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/heath) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Heath Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #9e8f9e; 9 | } 10 | 11 | /* Atelier-Heath Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #ca402b; 23 | } 24 | 25 | /* Atelier-Heath Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #a65926; 34 | } 35 | 36 | /* Atelier-Heath Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #918b3b; 41 | } 42 | 43 | /* Atelier-Heath Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #516aec; 47 | } 48 | 49 | /* Atelier-Heath Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #7b59c0; 53 | } 54 | 55 | .hljs { 56 | display: block; 57 | overflow-x: auto; 58 | background: #1b181b; 59 | color: #ab9bab; 60 | padding: 0.5em; 61 | } 62 | 63 | .hljs-emphasis { 64 | font-style: italic; 65 | } 66 | 67 | .hljs-strong { 68 | font-weight: bold; 69 | } 70 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/atelier-heath-light.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Heath Light - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/heath) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Heath Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #776977; 9 | } 10 | 11 | /* Atelier-Heath Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #ca402b; 23 | } 24 | 25 | /* Atelier-Heath Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #a65926; 34 | } 35 | 36 | /* Atelier-Heath Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #918b3b; 41 | } 42 | 43 | /* Atelier-Heath Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #516aec; 47 | } 48 | 49 | /* Atelier-Heath Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #7b59c0; 53 | } 54 | 55 | .hljs { 56 | display: block; 57 | overflow-x: auto; 58 | background: #f7f3f7; 59 | color: #695d69; 60 | padding: 0.5em; 61 | } 62 | 63 | .hljs-emphasis { 64 | font-style: italic; 65 | } 66 | 67 | .hljs-strong { 68 | font-weight: bold; 69 | } 70 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/atelier-lakeside-dark.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Lakeside Dark - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/lakeside) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Lakeside Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #7195a8; 9 | } 10 | 11 | /* Atelier-Lakeside Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #d22d72; 23 | } 24 | 25 | /* Atelier-Lakeside Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #935c25; 34 | } 35 | 36 | /* Atelier-Lakeside Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #568c3b; 41 | } 42 | 43 | /* Atelier-Lakeside Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #257fad; 47 | } 48 | 49 | /* Atelier-Lakeside Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #6b6bb8; 53 | } 54 | 55 | .hljs { 56 | display: block; 57 | overflow-x: auto; 58 | background: #161b1d; 59 | color: #7ea2b4; 60 | padding: 0.5em; 61 | } 62 | 63 | .hljs-emphasis { 64 | font-style: italic; 65 | } 66 | 67 | .hljs-strong { 68 | font-weight: bold; 69 | } 70 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/atelier-lakeside-light.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Lakeside Light - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/lakeside) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Lakeside Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #5a7b8c; 9 | } 10 | 11 | /* Atelier-Lakeside Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #d22d72; 23 | } 24 | 25 | /* Atelier-Lakeside Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #935c25; 34 | } 35 | 36 | /* Atelier-Lakeside Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #568c3b; 41 | } 42 | 43 | /* Atelier-Lakeside Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #257fad; 47 | } 48 | 49 | /* Atelier-Lakeside Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #6b6bb8; 53 | } 54 | 55 | .hljs { 56 | display: block; 57 | overflow-x: auto; 58 | background: #ebf8ff; 59 | color: #516d7b; 60 | padding: 0.5em; 61 | } 62 | 63 | .hljs-emphasis { 64 | font-style: italic; 65 | } 66 | 67 | .hljs-strong { 68 | font-weight: bold; 69 | } 70 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/atelier-plateau-dark.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Plateau Dark - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/plateau) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Plateau Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #7e7777; 9 | } 10 | 11 | /* Atelier-Plateau Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #ca4949; 23 | } 24 | 25 | /* Atelier-Plateau Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #b45a3c; 34 | } 35 | 36 | /* Atelier-Plateau Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #4b8b8b; 41 | } 42 | 43 | /* Atelier-Plateau Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #7272ca; 47 | } 48 | 49 | /* Atelier-Plateau Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #8464c4; 53 | } 54 | 55 | .hljs-deletion, 56 | .hljs-addition { 57 | color: #1b1818; 58 | display: inline-block; 59 | width: 100%; 60 | } 61 | 62 | .hljs-deletion { 63 | background-color: #ca4949; 64 | } 65 | 66 | .hljs-addition { 67 | background-color: #4b8b8b; 68 | } 69 | 70 | .hljs { 71 | display: block; 72 | overflow-x: auto; 73 | background: #1b1818; 74 | color: #8a8585; 75 | padding: 0.5em; 76 | } 77 | 78 | .hljs-emphasis { 79 | font-style: italic; 80 | } 81 | 82 | .hljs-strong { 83 | font-weight: bold; 84 | } 85 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/atelier-plateau-light.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Plateau Light - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/plateau) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Plateau Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #655d5d; 9 | } 10 | 11 | /* Atelier-Plateau Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #ca4949; 23 | } 24 | 25 | /* Atelier-Plateau Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #b45a3c; 34 | } 35 | 36 | /* Atelier-Plateau Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #4b8b8b; 41 | } 42 | 43 | /* Atelier-Plateau Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #7272ca; 47 | } 48 | 49 | /* Atelier-Plateau Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #8464c4; 53 | } 54 | 55 | .hljs-deletion, 56 | .hljs-addition { 57 | color: #1b1818; 58 | display: inline-block; 59 | width: 100%; 60 | } 61 | 62 | .hljs-deletion { 63 | background-color: #ca4949; 64 | } 65 | 66 | .hljs-addition { 67 | background-color: #4b8b8b; 68 | } 69 | 70 | .hljs { 71 | display: block; 72 | overflow-x: auto; 73 | background: #f4ecec; 74 | color: #585050; 75 | padding: 0.5em; 76 | } 77 | 78 | .hljs-emphasis { 79 | font-style: italic; 80 | } 81 | 82 | .hljs-strong { 83 | font-weight: bold; 84 | } 85 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/atelier-savanna-dark.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Savanna Dark - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/savanna) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Savanna Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #78877d; 9 | } 10 | 11 | /* Atelier-Savanna Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #b16139; 23 | } 24 | 25 | /* Atelier-Savanna Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #9f713c; 34 | } 35 | 36 | /* Atelier-Savanna Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #489963; 41 | } 42 | 43 | /* Atelier-Savanna Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #478c90; 47 | } 48 | 49 | /* Atelier-Savanna Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #55859b; 53 | } 54 | 55 | .hljs-deletion, 56 | .hljs-addition { 57 | color: #171c19; 58 | display: inline-block; 59 | width: 100%; 60 | } 61 | 62 | .hljs-deletion { 63 | background-color: #b16139; 64 | } 65 | 66 | .hljs-addition { 67 | background-color: #489963; 68 | } 69 | 70 | .hljs { 71 | display: block; 72 | overflow-x: auto; 73 | background: #171c19; 74 | color: #87928a; 75 | padding: 0.5em; 76 | } 77 | 78 | .hljs-emphasis { 79 | font-style: italic; 80 | } 81 | 82 | .hljs-strong { 83 | font-weight: bold; 84 | } 85 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/atelier-savanna-light.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Savanna Light - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/savanna) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Savanna Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #5f6d64; 9 | } 10 | 11 | /* Atelier-Savanna Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #b16139; 23 | } 24 | 25 | /* Atelier-Savanna Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #9f713c; 34 | } 35 | 36 | /* Atelier-Savanna Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #489963; 41 | } 42 | 43 | /* Atelier-Savanna Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #478c90; 47 | } 48 | 49 | /* Atelier-Savanna Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #55859b; 53 | } 54 | 55 | .hljs-deletion, 56 | .hljs-addition { 57 | color: #171c19; 58 | display: inline-block; 59 | width: 100%; 60 | } 61 | 62 | .hljs-deletion { 63 | background-color: #b16139; 64 | } 65 | 66 | .hljs-addition { 67 | background-color: #489963; 68 | } 69 | 70 | .hljs { 71 | display: block; 72 | overflow-x: auto; 73 | background: #ecf4ee; 74 | color: #526057; 75 | padding: 0.5em; 76 | } 77 | 78 | .hljs-emphasis { 79 | font-style: italic; 80 | } 81 | 82 | .hljs-strong { 83 | font-weight: bold; 84 | } 85 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/atelier-seaside-dark.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Seaside Dark - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/seaside) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Seaside Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #809980; 9 | } 10 | 11 | /* Atelier-Seaside Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #e6193c; 23 | } 24 | 25 | /* Atelier-Seaside Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #87711d; 34 | } 35 | 36 | /* Atelier-Seaside Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #29a329; 41 | } 42 | 43 | /* Atelier-Seaside Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #3d62f5; 47 | } 48 | 49 | /* Atelier-Seaside Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #ad2bee; 53 | } 54 | 55 | .hljs { 56 | display: block; 57 | overflow-x: auto; 58 | background: #131513; 59 | color: #8ca68c; 60 | padding: 0.5em; 61 | } 62 | 63 | .hljs-emphasis { 64 | font-style: italic; 65 | } 66 | 67 | .hljs-strong { 68 | font-weight: bold; 69 | } 70 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/atelier-seaside-light.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Seaside Light - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/seaside) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Seaside Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #687d68; 9 | } 10 | 11 | /* Atelier-Seaside Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #e6193c; 23 | } 24 | 25 | /* Atelier-Seaside Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #87711d; 34 | } 35 | 36 | /* Atelier-Seaside Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #29a329; 41 | } 42 | 43 | /* Atelier-Seaside Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #3d62f5; 47 | } 48 | 49 | /* Atelier-Seaside Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #ad2bee; 53 | } 54 | 55 | .hljs { 56 | display: block; 57 | overflow-x: auto; 58 | background: #f4fbf4; 59 | color: #5e6e5e; 60 | padding: 0.5em; 61 | } 62 | 63 | .hljs-emphasis { 64 | font-style: italic; 65 | } 66 | 67 | .hljs-strong { 68 | font-weight: bold; 69 | } 70 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/atelier-sulphurpool-dark.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Sulphurpool Dark - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/sulphurpool) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Sulphurpool Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #898ea4; 9 | } 10 | 11 | /* Atelier-Sulphurpool Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #c94922; 23 | } 24 | 25 | /* Atelier-Sulphurpool Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #c76b29; 34 | } 35 | 36 | /* Atelier-Sulphurpool Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #ac9739; 41 | } 42 | 43 | /* Atelier-Sulphurpool Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #3d8fd1; 47 | } 48 | 49 | /* Atelier-Sulphurpool Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #6679cc; 53 | } 54 | 55 | .hljs { 56 | display: block; 57 | overflow-x: auto; 58 | background: #202746; 59 | color: #979db4; 60 | padding: 0.5em; 61 | } 62 | 63 | .hljs-emphasis { 64 | font-style: italic; 65 | } 66 | 67 | .hljs-strong { 68 | font-weight: bold; 69 | } 70 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/atelier-sulphurpool-light.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Sulphurpool Light - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/sulphurpool) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Sulphurpool Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #6b7394; 9 | } 10 | 11 | /* Atelier-Sulphurpool Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #c94922; 23 | } 24 | 25 | /* Atelier-Sulphurpool Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #c76b29; 34 | } 35 | 36 | /* Atelier-Sulphurpool Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #ac9739; 41 | } 42 | 43 | /* Atelier-Sulphurpool Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #3d8fd1; 47 | } 48 | 49 | /* Atelier-Sulphurpool Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #6679cc; 53 | } 54 | 55 | .hljs { 56 | display: block; 57 | overflow-x: auto; 58 | background: #f5f7ff; 59 | color: #5e6687; 60 | padding: 0.5em; 61 | } 62 | 63 | .hljs-emphasis { 64 | font-style: italic; 65 | } 66 | 67 | .hljs-strong { 68 | font-weight: bold; 69 | } 70 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/atom-one-dark.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Atom One Dark by Daniel Gamage 4 | Original One Dark Syntax theme from https://github.com/atom/one-dark-syntax 5 | 6 | base: #282c34 7 | mono-1: #abb2bf 8 | mono-2: #818896 9 | mono-3: #5c6370 10 | hue-1: #56b6c2 11 | hue-2: #61aeee 12 | hue-3: #c678dd 13 | hue-4: #98c379 14 | hue-5: #e06c75 15 | hue-5-2: #be5046 16 | hue-6: #d19a66 17 | hue-6-2: #e6c07b 18 | 19 | */ 20 | 21 | .hljs { 22 | display: block; 23 | overflow-x: auto; 24 | padding: 0.5em; 25 | color: #abb2bf; 26 | background: #282c34; 27 | } 28 | 29 | .hljs-comment, 30 | .hljs-quote { 31 | color: #5c6370; 32 | font-style: italic; 33 | } 34 | 35 | .hljs-doctag, 36 | .hljs-keyword, 37 | .hljs-formula { 38 | color: #c678dd; 39 | } 40 | 41 | .hljs-section, 42 | .hljs-name, 43 | .hljs-selector-tag, 44 | .hljs-deletion, 45 | .hljs-subst { 46 | color: #e06c75; 47 | } 48 | 49 | .hljs-literal { 50 | color: #56b6c2; 51 | } 52 | 53 | .hljs-string, 54 | .hljs-regexp, 55 | .hljs-addition, 56 | .hljs-attribute, 57 | .hljs-meta-string { 58 | color: #98c379; 59 | } 60 | 61 | .hljs-built_in, 62 | .hljs-class .hljs-title { 63 | color: #e6c07b; 64 | } 65 | 66 | .hljs-attr, 67 | .hljs-variable, 68 | .hljs-template-variable, 69 | .hljs-type, 70 | .hljs-selector-class, 71 | .hljs-selector-attr, 72 | .hljs-selector-pseudo, 73 | .hljs-number { 74 | color: #d19a66; 75 | } 76 | 77 | .hljs-symbol, 78 | .hljs-bullet, 79 | .hljs-link, 80 | .hljs-meta, 81 | .hljs-selector-id, 82 | .hljs-title { 83 | color: #61aeee; 84 | } 85 | 86 | .hljs-emphasis { 87 | font-style: italic; 88 | } 89 | 90 | .hljs-strong { 91 | font-weight: bold; 92 | } 93 | 94 | .hljs-link { 95 | text-decoration: underline; 96 | } 97 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/atom-one-light.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Atom One Light by Daniel Gamage 4 | Original One Light Syntax theme from https://github.com/atom/one-light-syntax 5 | 6 | base: #fafafa 7 | mono-1: #383a42 8 | mono-2: #686b77 9 | mono-3: #a0a1a7 10 | hue-1: #0184bb 11 | hue-2: #4078f2 12 | hue-3: #a626a4 13 | hue-4: #50a14f 14 | hue-5: #e45649 15 | hue-5-2: #c91243 16 | hue-6: #986801 17 | hue-6-2: #c18401 18 | 19 | */ 20 | 21 | .hljs { 22 | display: block; 23 | overflow-x: auto; 24 | padding: 0.5em; 25 | color: #383a42; 26 | background: #fafafa; 27 | } 28 | 29 | .hljs-comment, 30 | .hljs-quote { 31 | color: #a0a1a7; 32 | font-style: italic; 33 | } 34 | 35 | .hljs-doctag, 36 | .hljs-keyword, 37 | .hljs-formula { 38 | color: #a626a4; 39 | } 40 | 41 | .hljs-section, 42 | .hljs-name, 43 | .hljs-selector-tag, 44 | .hljs-deletion, 45 | .hljs-subst { 46 | color: #e45649; 47 | } 48 | 49 | .hljs-literal { 50 | color: #0184bb; 51 | } 52 | 53 | .hljs-string, 54 | .hljs-regexp, 55 | .hljs-addition, 56 | .hljs-attribute, 57 | .hljs-meta-string { 58 | color: #50a14f; 59 | } 60 | 61 | .hljs-built_in, 62 | .hljs-class .hljs-title { 63 | color: #c18401; 64 | } 65 | 66 | .hljs-attr, 67 | .hljs-variable, 68 | .hljs-template-variable, 69 | .hljs-type, 70 | .hljs-selector-class, 71 | .hljs-selector-attr, 72 | .hljs-selector-pseudo, 73 | .hljs-number { 74 | color: #986801; 75 | } 76 | 77 | .hljs-symbol, 78 | .hljs-bullet, 79 | .hljs-link, 80 | .hljs-meta, 81 | .hljs-selector-id, 82 | .hljs-title { 83 | color: #4078f2; 84 | } 85 | 86 | .hljs-emphasis { 87 | font-style: italic; 88 | } 89 | 90 | .hljs-strong { 91 | font-weight: bold; 92 | } 93 | 94 | .hljs-link { 95 | text-decoration: underline; 96 | } 97 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/brown-paper.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Brown Paper style from goldblog.com.ua (c) Zaripov Yura 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background:#b7a68e url(./brown-papersq.png); 12 | } 13 | 14 | .hljs-keyword, 15 | .hljs-selector-tag, 16 | .hljs-literal { 17 | color:#005599; 18 | font-weight:bold; 19 | } 20 | 21 | .hljs, 22 | .hljs-subst { 23 | color: #363c69; 24 | } 25 | 26 | .hljs-string, 27 | .hljs-title, 28 | .hljs-section, 29 | .hljs-type, 30 | .hljs-attribute, 31 | .hljs-symbol, 32 | .hljs-bullet, 33 | .hljs-built_in, 34 | .hljs-addition, 35 | .hljs-variable, 36 | .hljs-template-tag, 37 | .hljs-template-variable, 38 | .hljs-link, 39 | .hljs-name { 40 | color: #2c009f; 41 | } 42 | 43 | .hljs-comment, 44 | .hljs-quote, 45 | .hljs-meta, 46 | .hljs-deletion { 47 | color: #802022; 48 | } 49 | 50 | .hljs-keyword, 51 | .hljs-selector-tag, 52 | .hljs-literal, 53 | .hljs-doctag, 54 | .hljs-title, 55 | .hljs-section, 56 | .hljs-type, 57 | .hljs-name, 58 | .hljs-strong { 59 | font-weight: bold; 60 | } 61 | 62 | .hljs-emphasis { 63 | font-style: italic; 64 | } 65 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/brown-papersq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tulz-app/frontroute/6f13ad036ae6dfb1c5b557e392a9bfda2c2654fe/website/src/main/public/stylesheets/highlightjs/brown-papersq.png -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/codepen-embed.css: -------------------------------------------------------------------------------- 1 | /* 2 | codepen.io Embed Theme 3 | Author: Justin Perry 4 | Original theme - https://github.com/chriskempson/tomorrow-theme 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: #222; 12 | color: #fff; 13 | } 14 | 15 | .hljs-comment, 16 | .hljs-quote { 17 | color: #777; 18 | } 19 | 20 | .hljs-variable, 21 | .hljs-template-variable, 22 | .hljs-tag, 23 | .hljs-regexp, 24 | .hljs-meta, 25 | .hljs-number, 26 | .hljs-built_in, 27 | .hljs-builtin-name, 28 | .hljs-literal, 29 | .hljs-params, 30 | .hljs-symbol, 31 | .hljs-bullet, 32 | .hljs-link, 33 | .hljs-deletion { 34 | color: #ab875d; 35 | } 36 | 37 | .hljs-section, 38 | .hljs-title, 39 | .hljs-name, 40 | .hljs-selector-id, 41 | .hljs-selector-class, 42 | .hljs-type, 43 | .hljs-attribute { 44 | color: #9b869b; 45 | } 46 | 47 | .hljs-string, 48 | .hljs-keyword, 49 | .hljs-selector-tag, 50 | .hljs-addition { 51 | color: #8f9c6c; 52 | } 53 | 54 | .hljs-emphasis { 55 | font-style: italic; 56 | } 57 | 58 | .hljs-strong { 59 | font-weight: bold; 60 | } 61 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/color-brewer.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Colorbrewer theme 4 | Original: https://github.com/mbostock/colorbrewer-theme (c) Mike Bostock 5 | Ported by Fabrício Tavares de Oliveira 6 | 7 | */ 8 | 9 | .hljs { 10 | display: block; 11 | overflow-x: auto; 12 | padding: 0.5em; 13 | background: #fff; 14 | } 15 | 16 | .hljs, 17 | .hljs-subst { 18 | color: #000; 19 | } 20 | 21 | .hljs-string, 22 | .hljs-meta, 23 | .hljs-symbol, 24 | .hljs-template-tag, 25 | .hljs-template-variable, 26 | .hljs-addition { 27 | color: #756bb1; 28 | } 29 | 30 | .hljs-comment, 31 | .hljs-quote { 32 | color: #636363; 33 | } 34 | 35 | .hljs-number, 36 | .hljs-regexp, 37 | .hljs-literal, 38 | .hljs-bullet, 39 | .hljs-link { 40 | color: #31a354; 41 | } 42 | 43 | .hljs-deletion, 44 | .hljs-variable { 45 | color: #88f; 46 | } 47 | 48 | 49 | 50 | .hljs-keyword, 51 | .hljs-selector-tag, 52 | .hljs-title, 53 | .hljs-section, 54 | .hljs-built_in, 55 | .hljs-doctag, 56 | .hljs-type, 57 | .hljs-tag, 58 | .hljs-name, 59 | .hljs-selector-id, 60 | .hljs-selector-class, 61 | .hljs-strong { 62 | color: #3182bd; 63 | } 64 | 65 | .hljs-emphasis { 66 | font-style: italic; 67 | } 68 | 69 | .hljs-attribute { 70 | color: #e6550d; 71 | } 72 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/darcula.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Darcula color scheme from the JetBrains family of IDEs 4 | 5 | */ 6 | 7 | 8 | .hljs { 9 | display: block; 10 | overflow-x: auto; 11 | padding: 0.5em; 12 | background: #2b2b2b; 13 | color: #bababa; 14 | } 15 | 16 | .hljs-strong, 17 | .hljs-emphasis { 18 | color: #a8a8a2; 19 | } 20 | 21 | .hljs-bullet, 22 | .hljs-quote, 23 | .hljs-link, 24 | .hljs-number, 25 | .hljs-regexp, 26 | .hljs-literal { 27 | color: #6896ba; 28 | } 29 | 30 | .hljs-code, 31 | .hljs-selector-class { 32 | color: #a6e22e; 33 | } 34 | 35 | .hljs-emphasis { 36 | font-style: italic; 37 | } 38 | 39 | .hljs-keyword, 40 | .hljs-selector-tag, 41 | .hljs-section, 42 | .hljs-attribute, 43 | .hljs-name, 44 | .hljs-variable { 45 | color: #cb7832; 46 | } 47 | 48 | .hljs-params { 49 | color: #b9b9b9; 50 | } 51 | 52 | .hljs-string { 53 | color: #6a8759; 54 | } 55 | 56 | .hljs-subst, 57 | .hljs-type, 58 | .hljs-built_in, 59 | .hljs-builtin-name, 60 | .hljs-symbol, 61 | .hljs-selector-id, 62 | .hljs-selector-attr, 63 | .hljs-selector-pseudo, 64 | .hljs-template-tag, 65 | .hljs-template-variable, 66 | .hljs-addition { 67 | color: #e0c46c; 68 | } 69 | 70 | .hljs-comment, 71 | .hljs-deletion, 72 | .hljs-meta { 73 | color: #7f7f7f; 74 | } 75 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/dark.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Dark style from softwaremaniacs.org (c) Ivan Sagalaev 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: #444; 12 | } 13 | 14 | .hljs-keyword, 15 | .hljs-selector-tag, 16 | .hljs-literal, 17 | .hljs-section, 18 | .hljs-link { 19 | color: white; 20 | } 21 | 22 | .hljs, 23 | .hljs-subst { 24 | color: #ddd; 25 | } 26 | 27 | .hljs-string, 28 | .hljs-title, 29 | .hljs-name, 30 | .hljs-type, 31 | .hljs-attribute, 32 | .hljs-symbol, 33 | .hljs-bullet, 34 | .hljs-built_in, 35 | .hljs-addition, 36 | .hljs-variable, 37 | .hljs-template-tag, 38 | .hljs-template-variable { 39 | color: #d88; 40 | } 41 | 42 | .hljs-comment, 43 | .hljs-quote, 44 | .hljs-deletion, 45 | .hljs-meta { 46 | color: #777; 47 | } 48 | 49 | .hljs-keyword, 50 | .hljs-selector-tag, 51 | .hljs-literal, 52 | .hljs-title, 53 | .hljs-section, 54 | .hljs-doctag, 55 | .hljs-type, 56 | .hljs-name, 57 | .hljs-strong { 58 | font-weight: bold; 59 | } 60 | 61 | .hljs-emphasis { 62 | font-style: italic; 63 | } 64 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/default.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Original highlight.js style (c) Ivan Sagalaev 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: #F0F0F0; 12 | } 13 | 14 | 15 | /* Base color: saturation 0; */ 16 | 17 | .hljs, 18 | .hljs-subst { 19 | color: #444; 20 | } 21 | 22 | .hljs-comment { 23 | color: #888888; 24 | } 25 | 26 | .hljs-keyword, 27 | .hljs-attribute, 28 | .hljs-selector-tag, 29 | .hljs-meta-keyword, 30 | .hljs-doctag, 31 | .hljs-name { 32 | font-weight: bold; 33 | } 34 | 35 | 36 | /* User color: hue: 0 */ 37 | 38 | .hljs-type, 39 | .hljs-string, 40 | .hljs-number, 41 | .hljs-selector-id, 42 | .hljs-selector-class, 43 | .hljs-quote, 44 | .hljs-template-tag, 45 | .hljs-deletion { 46 | color: #880000; 47 | } 48 | 49 | .hljs-title, 50 | .hljs-section { 51 | color: #880000; 52 | font-weight: bold; 53 | } 54 | 55 | .hljs-regexp, 56 | .hljs-symbol, 57 | .hljs-variable, 58 | .hljs-template-variable, 59 | .hljs-link, 60 | .hljs-selector-attr, 61 | .hljs-selector-pseudo { 62 | color: #BC6060; 63 | } 64 | 65 | 66 | /* Language color: hue: 90; */ 67 | 68 | .hljs-literal { 69 | color: #78A960; 70 | } 71 | 72 | .hljs-built_in, 73 | .hljs-bullet, 74 | .hljs-code, 75 | .hljs-addition { 76 | color: #397300; 77 | } 78 | 79 | 80 | /* Meta color: hue: 200 */ 81 | 82 | .hljs-meta { 83 | color: #1f7199; 84 | } 85 | 86 | .hljs-meta-string { 87 | color: #4d99bf; 88 | } 89 | 90 | 91 | /* Misc effects */ 92 | 93 | .hljs-emphasis { 94 | font-style: italic; 95 | } 96 | 97 | .hljs-strong { 98 | font-weight: bold; 99 | } 100 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/docco.css: -------------------------------------------------------------------------------- 1 | /* 2 | Docco style used in http://jashkenas.github.com/docco/ converted by Simon Madine (@thingsinjars) 3 | */ 4 | 5 | .hljs { 6 | display: block; 7 | overflow-x: auto; 8 | padding: 0.5em; 9 | color: #000; 10 | background: #f8f8ff; 11 | } 12 | 13 | .hljs-comment, 14 | .hljs-quote { 15 | color: #408080; 16 | font-style: italic; 17 | } 18 | 19 | .hljs-keyword, 20 | .hljs-selector-tag, 21 | .hljs-literal, 22 | .hljs-subst { 23 | color: #954121; 24 | } 25 | 26 | .hljs-number { 27 | color: #40a070; 28 | } 29 | 30 | .hljs-string, 31 | .hljs-doctag { 32 | color: #219161; 33 | } 34 | 35 | .hljs-selector-id, 36 | .hljs-selector-class, 37 | .hljs-section, 38 | .hljs-type { 39 | color: #19469d; 40 | } 41 | 42 | .hljs-params { 43 | color: #00f; 44 | } 45 | 46 | .hljs-title { 47 | color: #458; 48 | font-weight: bold; 49 | } 50 | 51 | .hljs-tag, 52 | .hljs-name, 53 | .hljs-attribute { 54 | color: #000080; 55 | font-weight: normal; 56 | } 57 | 58 | .hljs-variable, 59 | .hljs-template-variable { 60 | color: #008080; 61 | } 62 | 63 | .hljs-regexp, 64 | .hljs-link { 65 | color: #b68; 66 | } 67 | 68 | .hljs-symbol, 69 | .hljs-bullet { 70 | color: #990073; 71 | } 72 | 73 | .hljs-built_in, 74 | .hljs-builtin-name { 75 | color: #0086b3; 76 | } 77 | 78 | .hljs-meta { 79 | color: #999; 80 | font-weight: bold; 81 | } 82 | 83 | .hljs-deletion { 84 | background: #fdd; 85 | } 86 | 87 | .hljs-addition { 88 | background: #dfd; 89 | } 90 | 91 | .hljs-emphasis { 92 | font-style: italic; 93 | } 94 | 95 | .hljs-strong { 96 | font-weight: bold; 97 | } 98 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/dracula.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Dracula Theme v1.2.0 4 | 5 | https://github.com/zenorocha/dracula-theme 6 | 7 | Copyright 2015, All rights reserved 8 | 9 | Code licensed under the MIT license 10 | http://zenorocha.mit-license.org 11 | 12 | @author Éverton Ribeiro 13 | @author Zeno Rocha 14 | 15 | */ 16 | 17 | .hljs { 18 | display: block; 19 | overflow-x: auto; 20 | padding: 0.5em; 21 | background: #282a36; 22 | } 23 | 24 | .hljs-keyword, 25 | .hljs-selector-tag, 26 | .hljs-literal, 27 | .hljs-section, 28 | .hljs-link { 29 | color: #8be9fd; 30 | } 31 | 32 | .hljs-function .hljs-keyword { 33 | color: #ff79c6; 34 | } 35 | 36 | .hljs, 37 | .hljs-subst { 38 | color: #f8f8f2; 39 | } 40 | 41 | .hljs-string, 42 | .hljs-title, 43 | .hljs-name, 44 | .hljs-type, 45 | .hljs-attribute, 46 | .hljs-symbol, 47 | .hljs-bullet, 48 | .hljs-addition, 49 | .hljs-variable, 50 | .hljs-template-tag, 51 | .hljs-template-variable { 52 | color: #f1fa8c; 53 | } 54 | 55 | .hljs-comment, 56 | .hljs-quote, 57 | .hljs-deletion, 58 | .hljs-meta { 59 | color: #6272a4; 60 | } 61 | 62 | .hljs-keyword, 63 | .hljs-selector-tag, 64 | .hljs-literal, 65 | .hljs-title, 66 | .hljs-section, 67 | .hljs-doctag, 68 | .hljs-type, 69 | .hljs-name, 70 | .hljs-strong { 71 | font-weight: bold; 72 | } 73 | 74 | .hljs-emphasis { 75 | font-style: italic; 76 | } 77 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/far.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | FAR Style (c) MajestiC 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: #000080; 12 | } 13 | 14 | .hljs, 15 | .hljs-subst { 16 | color: #0ff; 17 | } 18 | 19 | .hljs-string, 20 | .hljs-attribute, 21 | .hljs-symbol, 22 | .hljs-bullet, 23 | .hljs-built_in, 24 | .hljs-builtin-name, 25 | .hljs-template-tag, 26 | .hljs-template-variable, 27 | .hljs-addition { 28 | color: #ff0; 29 | } 30 | 31 | .hljs-keyword, 32 | .hljs-selector-tag, 33 | .hljs-section, 34 | .hljs-type, 35 | .hljs-name, 36 | .hljs-selector-id, 37 | .hljs-selector-class, 38 | .hljs-variable { 39 | color: #fff; 40 | } 41 | 42 | .hljs-comment, 43 | .hljs-quote, 44 | .hljs-doctag, 45 | .hljs-deletion { 46 | color: #888; 47 | } 48 | 49 | .hljs-number, 50 | .hljs-regexp, 51 | .hljs-literal, 52 | .hljs-link { 53 | color: #0f0; 54 | } 55 | 56 | .hljs-meta { 57 | color: #008080; 58 | } 59 | 60 | .hljs-keyword, 61 | .hljs-selector-tag, 62 | .hljs-title, 63 | .hljs-section, 64 | .hljs-name, 65 | .hljs-strong { 66 | font-weight: bold; 67 | } 68 | 69 | .hljs-emphasis { 70 | font-style: italic; 71 | } 72 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/foundation.css: -------------------------------------------------------------------------------- 1 | /* 2 | Description: Foundation 4 docs style for highlight.js 3 | Author: Dan Allen 4 | Website: http://foundation.zurb.com/docs/ 5 | Version: 1.0 6 | Date: 2013-04-02 7 | */ 8 | 9 | .hljs { 10 | display: block; 11 | overflow-x: auto; 12 | padding: 0.5em; 13 | background: #eee; 14 | color: black; 15 | } 16 | 17 | .hljs-link, 18 | .hljs-emphasis, 19 | .hljs-attribute, 20 | .hljs-addition { 21 | color: #070; 22 | } 23 | 24 | .hljs-emphasis { 25 | font-style: italic; 26 | } 27 | 28 | .hljs-strong, 29 | .hljs-string, 30 | .hljs-deletion { 31 | color: #d14; 32 | } 33 | 34 | .hljs-strong { 35 | font-weight: bold; 36 | } 37 | 38 | .hljs-quote, 39 | .hljs-comment { 40 | color: #998; 41 | font-style: italic; 42 | } 43 | 44 | .hljs-section, 45 | .hljs-title { 46 | color: #900; 47 | } 48 | 49 | .hljs-class .hljs-title, 50 | .hljs-type { 51 | color: #458; 52 | } 53 | 54 | .hljs-variable, 55 | .hljs-template-variable { 56 | color: #336699; 57 | } 58 | 59 | .hljs-bullet { 60 | color: #997700; 61 | } 62 | 63 | .hljs-meta { 64 | color: #3344bb; 65 | } 66 | 67 | .hljs-code, 68 | .hljs-number, 69 | .hljs-literal, 70 | .hljs-keyword, 71 | .hljs-selector-tag { 72 | color: #099; 73 | } 74 | 75 | .hljs-regexp { 76 | background-color: #fff0ff; 77 | color: #880088; 78 | } 79 | 80 | .hljs-symbol { 81 | color: #990073; 82 | } 83 | 84 | .hljs-tag, 85 | .hljs-name, 86 | .hljs-selector-id, 87 | .hljs-selector-class { 88 | color: #007700; 89 | } 90 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/github-gist.css: -------------------------------------------------------------------------------- 1 | /** 2 | * GitHub Gist Theme 3 | * Author : Anthony Attard - https://github.com/AnthonyAttard 4 | * Author : Louis Barranqueiro - https://github.com/LouisBarranqueiro 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | background: white; 10 | padding: 0.5em; 11 | color: #333333; 12 | overflow-x: auto; 13 | } 14 | 15 | .hljs-comment, 16 | .hljs-meta { 17 | color: #969896; 18 | } 19 | 20 | .hljs-variable, 21 | .hljs-template-variable, 22 | .hljs-strong, 23 | .hljs-emphasis, 24 | .hljs-quote { 25 | color: #df5000; 26 | } 27 | 28 | .hljs-keyword, 29 | .hljs-selector-tag, 30 | .hljs-type { 31 | color: #d73a49; 32 | } 33 | 34 | .hljs-literal, 35 | .hljs-symbol, 36 | .hljs-bullet, 37 | .hljs-attribute { 38 | color: #0086b3; 39 | } 40 | 41 | .hljs-section, 42 | .hljs-name { 43 | color: #63a35c; 44 | } 45 | 46 | .hljs-tag { 47 | color: #333333; 48 | } 49 | 50 | .hljs-title, 51 | .hljs-attr, 52 | .hljs-selector-id, 53 | .hljs-selector-class, 54 | .hljs-selector-attr, 55 | .hljs-selector-pseudo { 56 | color: #6f42c1; 57 | } 58 | 59 | .hljs-addition { 60 | color: #55a532; 61 | background-color: #eaffea; 62 | } 63 | 64 | .hljs-deletion { 65 | color: #bd2c00; 66 | background-color: #ffecec; 67 | } 68 | 69 | .hljs-link { 70 | text-decoration: underline; 71 | } 72 | 73 | .hljs-number { 74 | color: #005cc5; 75 | } 76 | 77 | .hljs-string { 78 | color: #032f62; 79 | } 80 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/github.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | github.com style (c) Vasily Polovnyov 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | color: #333; 12 | background: #f8f8f8; 13 | } 14 | 15 | .hljs-comment, 16 | .hljs-quote { 17 | color: #998; 18 | font-style: italic; 19 | } 20 | 21 | .hljs-keyword, 22 | .hljs-selector-tag, 23 | .hljs-subst { 24 | color: #333; 25 | font-weight: bold; 26 | } 27 | 28 | .hljs-number, 29 | .hljs-literal, 30 | .hljs-variable, 31 | .hljs-template-variable, 32 | .hljs-tag .hljs-attr { 33 | color: #008080; 34 | } 35 | 36 | .hljs-string, 37 | .hljs-doctag { 38 | color: #d14; 39 | } 40 | 41 | .hljs-title, 42 | .hljs-section, 43 | .hljs-selector-id { 44 | color: #900; 45 | font-weight: bold; 46 | } 47 | 48 | .hljs-subst { 49 | font-weight: normal; 50 | } 51 | 52 | .hljs-type, 53 | .hljs-class .hljs-title { 54 | color: #458; 55 | font-weight: bold; 56 | } 57 | 58 | .hljs-tag, 59 | .hljs-name, 60 | .hljs-attribute { 61 | color: #000080; 62 | font-weight: normal; 63 | } 64 | 65 | .hljs-regexp, 66 | .hljs-link { 67 | color: #009926; 68 | } 69 | 70 | .hljs-symbol, 71 | .hljs-bullet { 72 | color: #990073; 73 | } 74 | 75 | .hljs-built_in, 76 | .hljs-builtin-name { 77 | color: #0086b3; 78 | } 79 | 80 | .hljs-meta { 81 | color: #999; 82 | font-weight: bold; 83 | } 84 | 85 | .hljs-deletion { 86 | background: #fdd; 87 | } 88 | 89 | .hljs-addition { 90 | background: #dfd; 91 | } 92 | 93 | .hljs-emphasis { 94 | font-style: italic; 95 | } 96 | 97 | .hljs-strong { 98 | font-weight: bold; 99 | } 100 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/gml.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | GML Theme - Meseta 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: #222222; 12 | color: #C0C0C0; 13 | } 14 | 15 | .hljs-keyword { 16 | color: #FFB871; 17 | font-weight: bold; 18 | } 19 | 20 | .hljs-built_in { 21 | color: #FFB871; 22 | } 23 | 24 | .hljs-literal { 25 | color: #FF8080; 26 | } 27 | 28 | .hljs-symbol { 29 | color: #58E55A; 30 | } 31 | 32 | .hljs-comment { 33 | color: #5B995B; 34 | } 35 | 36 | .hljs-string { 37 | color: #FFFF00; 38 | } 39 | 40 | .hljs-number { 41 | color: #FF8080; 42 | } 43 | 44 | .hljs-attribute, 45 | .hljs-selector-tag, 46 | .hljs-doctag, 47 | .hljs-name, 48 | .hljs-bullet, 49 | .hljs-code, 50 | .hljs-addition, 51 | .hljs-regexp, 52 | .hljs-variable, 53 | .hljs-template-variable, 54 | .hljs-link, 55 | .hljs-selector-attr, 56 | .hljs-selector-pseudo, 57 | .hljs-type, 58 | .hljs-selector-id, 59 | .hljs-selector-class, 60 | .hljs-quote, 61 | .hljs-template-tag, 62 | .hljs-deletion, 63 | .hljs-title, 64 | .hljs-section, 65 | .hljs-function, 66 | .hljs-meta-keyword, 67 | .hljs-meta, 68 | .hljs-subst { 69 | color: #C0C0C0; 70 | } 71 | 72 | .hljs-emphasis { 73 | font-style: italic; 74 | } 75 | 76 | .hljs-strong { 77 | font-weight: bold; 78 | } 79 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/googlecode.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Google Code style (c) Aahan Krish 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: white; 12 | color: black; 13 | } 14 | 15 | .hljs-comment, 16 | .hljs-quote { 17 | color: #800; 18 | } 19 | 20 | .hljs-keyword, 21 | .hljs-selector-tag, 22 | .hljs-section, 23 | .hljs-title, 24 | .hljs-name { 25 | color: #008; 26 | } 27 | 28 | .hljs-variable, 29 | .hljs-template-variable { 30 | color: #660; 31 | } 32 | 33 | .hljs-string, 34 | .hljs-selector-attr, 35 | .hljs-selector-pseudo, 36 | .hljs-regexp { 37 | color: #080; 38 | } 39 | 40 | .hljs-literal, 41 | .hljs-symbol, 42 | .hljs-bullet, 43 | .hljs-meta, 44 | .hljs-number, 45 | .hljs-link { 46 | color: #066; 47 | } 48 | 49 | .hljs-title, 50 | .hljs-doctag, 51 | .hljs-type, 52 | .hljs-attr, 53 | .hljs-built_in, 54 | .hljs-builtin-name, 55 | .hljs-params { 56 | color: #606; 57 | } 58 | 59 | .hljs-attribute, 60 | .hljs-subst { 61 | color: #000; 62 | } 63 | 64 | .hljs-formula { 65 | background-color: #eee; 66 | font-style: italic; 67 | } 68 | 69 | .hljs-selector-id, 70 | .hljs-selector-class { 71 | color: #9B703F 72 | } 73 | 74 | .hljs-addition { 75 | background-color: #baeeba; 76 | } 77 | 78 | .hljs-deletion { 79 | background-color: #ffc8bd; 80 | } 81 | 82 | .hljs-doctag, 83 | .hljs-strong { 84 | font-weight: bold; 85 | } 86 | 87 | .hljs-emphasis { 88 | font-style: italic; 89 | } 90 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/hopscotch.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Hopscotch 3 | * by Jan T. Sott 4 | * https://github.com/idleberg/Hopscotch 5 | * 6 | * This work is licensed under the Creative Commons CC0 1.0 Universal License 7 | */ 8 | 9 | /* Comment */ 10 | .hljs-comment, 11 | .hljs-quote { 12 | color: #989498; 13 | } 14 | 15 | /* Red */ 16 | .hljs-variable, 17 | .hljs-template-variable, 18 | .hljs-attribute, 19 | .hljs-tag, 20 | .hljs-name, 21 | .hljs-selector-id, 22 | .hljs-selector-class, 23 | .hljs-regexp, 24 | .hljs-link, 25 | .hljs-deletion { 26 | color: #dd464c; 27 | } 28 | 29 | /* Orange */ 30 | .hljs-number, 31 | .hljs-built_in, 32 | .hljs-builtin-name, 33 | .hljs-literal, 34 | .hljs-type, 35 | .hljs-params { 36 | color: #fd8b19; 37 | } 38 | 39 | /* Yellow */ 40 | .hljs-class .hljs-title { 41 | color: #fdcc59; 42 | } 43 | 44 | /* Green */ 45 | .hljs-string, 46 | .hljs-symbol, 47 | .hljs-bullet, 48 | .hljs-addition { 49 | color: #8fc13e; 50 | } 51 | 52 | /* Aqua */ 53 | .hljs-meta { 54 | color: #149b93; 55 | } 56 | 57 | /* Blue */ 58 | .hljs-function, 59 | .hljs-section, 60 | .hljs-title { 61 | color: #1290bf; 62 | } 63 | 64 | /* Purple */ 65 | .hljs-keyword, 66 | .hljs-selector-tag { 67 | color: #c85e7c; 68 | } 69 | 70 | .hljs { 71 | display: block; 72 | overflow-x: auto; 73 | background: #322931; 74 | color: #b9b5b8; 75 | padding: 0.5em; 76 | } 77 | 78 | .hljs-emphasis { 79 | font-style: italic; 80 | } 81 | 82 | .hljs-strong { 83 | font-weight: bold; 84 | } 85 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/idea.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Intellij Idea-like styling (c) Vasily Polovnyov 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | color: #000; 12 | background: #fff; 13 | } 14 | 15 | .hljs-subst, 16 | .hljs-title { 17 | font-weight: normal; 18 | color: #000; 19 | } 20 | 21 | .hljs-comment, 22 | .hljs-quote { 23 | color: #808080; 24 | font-style: italic; 25 | } 26 | 27 | .hljs-meta { 28 | color: #808000; 29 | } 30 | 31 | .hljs-tag { 32 | background: #efefef; 33 | } 34 | 35 | .hljs-section, 36 | .hljs-name, 37 | .hljs-literal, 38 | .hljs-keyword, 39 | .hljs-selector-tag, 40 | .hljs-type, 41 | .hljs-selector-id, 42 | .hljs-selector-class { 43 | font-weight: bold; 44 | color: #000080; 45 | } 46 | 47 | .hljs-attribute, 48 | .hljs-number, 49 | .hljs-regexp, 50 | .hljs-link { 51 | font-weight: bold; 52 | color: #0000ff; 53 | } 54 | 55 | .hljs-number, 56 | .hljs-regexp, 57 | .hljs-link { 58 | font-weight: normal; 59 | } 60 | 61 | .hljs-string { 62 | color: #008000; 63 | font-weight: bold; 64 | } 65 | 66 | .hljs-symbol, 67 | .hljs-bullet, 68 | .hljs-formula { 69 | color: #000; 70 | background: #d0eded; 71 | font-style: italic; 72 | } 73 | 74 | .hljs-doctag { 75 | text-decoration: underline; 76 | } 77 | 78 | .hljs-variable, 79 | .hljs-template-variable { 80 | color: #660e7a; 81 | } 82 | 83 | .hljs-addition { 84 | background: #baeeba; 85 | } 86 | 87 | .hljs-deletion { 88 | background: #ffc8bd; 89 | } 90 | 91 | .hljs-emphasis { 92 | font-style: italic; 93 | } 94 | 95 | .hljs-strong { 96 | font-weight: bold; 97 | } 98 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/ir-black.css: -------------------------------------------------------------------------------- 1 | /* 2 | IR_Black style (c) Vasily Mikhailitchenko 3 | */ 4 | 5 | .hljs { 6 | display: block; 7 | overflow-x: auto; 8 | padding: 0.5em; 9 | background: #000; 10 | color: #f8f8f8; 11 | } 12 | 13 | .hljs-comment, 14 | .hljs-quote, 15 | .hljs-meta { 16 | color: #7c7c7c; 17 | } 18 | 19 | .hljs-keyword, 20 | .hljs-selector-tag, 21 | .hljs-tag, 22 | .hljs-name { 23 | color: #96cbfe; 24 | } 25 | 26 | .hljs-attribute, 27 | .hljs-selector-id { 28 | color: #ffffb6; 29 | } 30 | 31 | .hljs-string, 32 | .hljs-selector-attr, 33 | .hljs-selector-pseudo, 34 | .hljs-addition { 35 | color: #a8ff60; 36 | } 37 | 38 | .hljs-subst { 39 | color: #daefa3; 40 | } 41 | 42 | .hljs-regexp, 43 | .hljs-link { 44 | color: #e9c062; 45 | } 46 | 47 | .hljs-title, 48 | .hljs-section, 49 | .hljs-type, 50 | .hljs-doctag { 51 | color: #ffffb6; 52 | } 53 | 54 | .hljs-symbol, 55 | .hljs-bullet, 56 | .hljs-variable, 57 | .hljs-template-variable, 58 | .hljs-literal { 59 | color: #c6c5fe; 60 | } 61 | 62 | .hljs-number, 63 | .hljs-deletion { 64 | color:#ff73fd; 65 | } 66 | 67 | .hljs-emphasis { 68 | font-style: italic; 69 | } 70 | 71 | .hljs-strong { 72 | font-weight: bold; 73 | } 74 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/kimbie.dark.css: -------------------------------------------------------------------------------- 1 | /* 2 | Name: Kimbie (dark) 3 | Author: Jan T. Sott 4 | License: Creative Commons Attribution-ShareAlike 4.0 Unported License 5 | URL: https://github.com/idleberg/Kimbie-highlight.js 6 | */ 7 | 8 | /* Kimbie Comment */ 9 | .hljs-comment, 10 | .hljs-quote { 11 | color: #d6baad; 12 | } 13 | 14 | /* Kimbie Red */ 15 | .hljs-variable, 16 | .hljs-template-variable, 17 | .hljs-tag, 18 | .hljs-name, 19 | .hljs-selector-id, 20 | .hljs-selector-class, 21 | .hljs-regexp, 22 | .hljs-meta { 23 | color: #dc3958; 24 | } 25 | 26 | /* Kimbie Orange */ 27 | .hljs-number, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params, 33 | .hljs-deletion, 34 | .hljs-link { 35 | color: #f79a32; 36 | } 37 | 38 | /* Kimbie Yellow */ 39 | .hljs-title, 40 | .hljs-section, 41 | .hljs-attribute { 42 | color: #f06431; 43 | } 44 | 45 | /* Kimbie Green */ 46 | .hljs-string, 47 | .hljs-symbol, 48 | .hljs-bullet, 49 | .hljs-addition { 50 | color: #889b4a; 51 | } 52 | 53 | /* Kimbie Purple */ 54 | .hljs-keyword, 55 | .hljs-selector-tag, 56 | .hljs-function { 57 | color: #98676a; 58 | } 59 | 60 | .hljs { 61 | display: block; 62 | overflow-x: auto; 63 | background: #221a0f; 64 | color: #d3af86; 65 | padding: 0.5em; 66 | } 67 | 68 | .hljs-emphasis { 69 | font-style: italic; 70 | } 71 | 72 | .hljs-strong { 73 | font-weight: bold; 74 | } 75 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/kimbie.light.css: -------------------------------------------------------------------------------- 1 | /* 2 | Name: Kimbie (light) 3 | Author: Jan T. Sott 4 | License: Creative Commons Attribution-ShareAlike 4.0 Unported License 5 | URL: https://github.com/idleberg/Kimbie-highlight.js 6 | */ 7 | 8 | /* Kimbie Comment */ 9 | .hljs-comment, 10 | .hljs-quote { 11 | color: #a57a4c; 12 | } 13 | 14 | /* Kimbie Red */ 15 | .hljs-variable, 16 | .hljs-template-variable, 17 | .hljs-tag, 18 | .hljs-name, 19 | .hljs-selector-id, 20 | .hljs-selector-class, 21 | .hljs-regexp, 22 | .hljs-meta { 23 | color: #dc3958; 24 | } 25 | 26 | /* Kimbie Orange */ 27 | .hljs-number, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params, 33 | .hljs-deletion, 34 | .hljs-link { 35 | color: #f79a32; 36 | } 37 | 38 | /* Kimbie Yellow */ 39 | .hljs-title, 40 | .hljs-section, 41 | .hljs-attribute { 42 | color: #f06431; 43 | } 44 | 45 | /* Kimbie Green */ 46 | .hljs-string, 47 | .hljs-symbol, 48 | .hljs-bullet, 49 | .hljs-addition { 50 | color: #889b4a; 51 | } 52 | 53 | /* Kimbie Purple */ 54 | .hljs-keyword, 55 | .hljs-selector-tag, 56 | .hljs-function { 57 | color: #98676a; 58 | } 59 | 60 | .hljs { 61 | display: block; 62 | overflow-x: auto; 63 | background: #fbebd4; 64 | color: #84613d; 65 | padding: 0.5em; 66 | } 67 | 68 | .hljs-emphasis { 69 | font-style: italic; 70 | } 71 | 72 | .hljs-strong { 73 | font-weight: bold; 74 | } 75 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/lightfair.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Lightfair style (c) Tristian Kelly 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: #fff; 12 | } 13 | 14 | .hljs-name { 15 | color:#01a3a3; 16 | } 17 | 18 | .hljs-tag,.hljs-meta { 19 | color:#778899; 20 | } 21 | 22 | .hljs, 23 | .hljs-subst { 24 | color: #444 25 | } 26 | 27 | .hljs-comment { 28 | color: #888888 29 | } 30 | 31 | .hljs-keyword, 32 | .hljs-attribute, 33 | .hljs-selector-tag, 34 | .hljs-meta-keyword, 35 | .hljs-doctag, 36 | .hljs-name { 37 | font-weight: bold 38 | } 39 | 40 | .hljs-type, 41 | .hljs-string, 42 | .hljs-number, 43 | .hljs-selector-id, 44 | .hljs-selector-class, 45 | .hljs-quote, 46 | .hljs-template-tag, 47 | .hljs-deletion { 48 | color: #4286f4 49 | } 50 | 51 | .hljs-title, 52 | .hljs-section { 53 | color: #4286f4; 54 | font-weight: bold 55 | } 56 | 57 | .hljs-regexp, 58 | .hljs-symbol, 59 | .hljs-variable, 60 | .hljs-template-variable, 61 | .hljs-link, 62 | .hljs-selector-attr, 63 | .hljs-selector-pseudo { 64 | color: #BC6060 65 | } 66 | 67 | .hljs-literal { 68 | color: #62bcbc 69 | } 70 | 71 | .hljs-built_in, 72 | .hljs-bullet, 73 | .hljs-code, 74 | .hljs-addition { 75 | color: #25c6c6 76 | } 77 | 78 | .hljs-meta-string { 79 | color: #4d99bf 80 | } 81 | 82 | .hljs-emphasis { 83 | font-style: italic 84 | } 85 | 86 | .hljs-strong { 87 | font-weight: bold 88 | } 89 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/lioshi.css: -------------------------------------------------------------------------------- 1 | /* lioshi Theme */ 2 | /* Original theme - https://github.com/lioshi/vscode-lioshi-theme */ 3 | 4 | /* Comment */ 5 | .hljs-comment { 6 | color: #8d8d8d; 7 | } 8 | 9 | /* quote */ 10 | .hljs-quote { 11 | color: #b3c7d8; 12 | } 13 | 14 | /* Red */ 15 | .hljs-variable, 16 | .hljs-template-variable, 17 | .hljs-tag, 18 | .hljs-name, 19 | .hljs-selector-id, 20 | .hljs-selector-class, 21 | .hljs-regexp, 22 | .hljs-deletion { 23 | color: #cc6666; 24 | } 25 | 26 | /* Orange */ 27 | .hljs-number, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-subst 33 | .hljs-link { 34 | color: #de935f; 35 | } 36 | 37 | /* Yellow */ 38 | .hljs-attribute { 39 | color: #f0c674; 40 | } 41 | 42 | /* Green */ 43 | .hljs-string, 44 | .hljs-bullet, 45 | .hljs-params, 46 | .hljs-addition { 47 | color: #b5bd68; 48 | } 49 | 50 | /* Blue */ 51 | .hljs-title, 52 | .hljs-meta, 53 | .hljs-section { 54 | color: #81a2be; 55 | } 56 | 57 | /* Purple */ 58 | .hljs-selector-tag, 59 | .hljs-keyword, 60 | .hljs-function, 61 | .hljs-class { 62 | color: #be94bb; 63 | } 64 | 65 | /* Purple light */ 66 | .hljs-symbol { 67 | color: #dbc4d9; 68 | } 69 | 70 | .hljs { 71 | display: block; 72 | overflow-x: auto; 73 | background: #303030; 74 | color: #c5c8c6; 75 | padding: 0.5em; 76 | } 77 | 78 | .hljs-emphasis { 79 | font-style: italic; 80 | } 81 | 82 | .hljs-strong { 83 | font-weight: bold; 84 | } 85 | 86 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/magula.css: -------------------------------------------------------------------------------- 1 | /* 2 | Description: Magula style for highligh.js 3 | Author: Ruslan Keba 4 | Website: http://rukeba.com/ 5 | Version: 1.0 6 | Date: 2009-01-03 7 | Music: Aphex Twin / Xtal 8 | */ 9 | 10 | .hljs { 11 | display: block; 12 | overflow-x: auto; 13 | padding: 0.5em; 14 | background-color: #f4f4f4; 15 | color: black; 16 | } 17 | 18 | .hljs-subst { 19 | color: black; 20 | } 21 | 22 | .hljs-string, 23 | .hljs-title, 24 | .hljs-symbol, 25 | .hljs-bullet, 26 | .hljs-attribute, 27 | .hljs-addition, 28 | .hljs-variable, 29 | .hljs-template-tag, 30 | .hljs-template-variable { 31 | color: #050; 32 | } 33 | 34 | .hljs-comment, 35 | .hljs-quote { 36 | color: #777; 37 | } 38 | 39 | .hljs-number, 40 | .hljs-regexp, 41 | .hljs-literal, 42 | .hljs-type, 43 | .hljs-link { 44 | color: #800; 45 | } 46 | 47 | .hljs-deletion, 48 | .hljs-meta { 49 | color: #00e; 50 | } 51 | 52 | .hljs-keyword, 53 | .hljs-selector-tag, 54 | .hljs-doctag, 55 | .hljs-title, 56 | .hljs-section, 57 | .hljs-built_in, 58 | .hljs-tag, 59 | .hljs-name { 60 | font-weight: bold; 61 | color: navy; 62 | } 63 | 64 | .hljs-emphasis { 65 | font-style: italic; 66 | } 67 | 68 | .hljs-strong { 69 | font-weight: bold; 70 | } 71 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/mono-blue.css: -------------------------------------------------------------------------------- 1 | /* 2 | Five-color theme from a single blue hue. 3 | */ 4 | .hljs { 5 | display: block; 6 | overflow-x: auto; 7 | padding: 0.5em; 8 | background: #eaeef3; 9 | color: #00193a; 10 | } 11 | 12 | .hljs-keyword, 13 | .hljs-selector-tag, 14 | .hljs-title, 15 | .hljs-section, 16 | .hljs-doctag, 17 | .hljs-name, 18 | .hljs-strong { 19 | font-weight: bold; 20 | } 21 | 22 | .hljs-comment { 23 | color: #738191; 24 | } 25 | 26 | .hljs-string, 27 | .hljs-title, 28 | .hljs-section, 29 | .hljs-built_in, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-addition, 33 | .hljs-tag, 34 | .hljs-quote, 35 | .hljs-name, 36 | .hljs-selector-id, 37 | .hljs-selector-class { 38 | color: #0048ab; 39 | } 40 | 41 | .hljs-meta, 42 | .hljs-subst, 43 | .hljs-symbol, 44 | .hljs-regexp, 45 | .hljs-attribute, 46 | .hljs-deletion, 47 | .hljs-variable, 48 | .hljs-template-variable, 49 | .hljs-link, 50 | .hljs-bullet { 51 | color: #4c81c9; 52 | } 53 | 54 | .hljs-emphasis { 55 | font-style: italic; 56 | } 57 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/monokai-sublime.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Monokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-license.org/ 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: #23241f; 12 | } 13 | 14 | .hljs, 15 | .hljs-tag, 16 | .hljs-subst { 17 | color: #f8f8f2; 18 | } 19 | 20 | .hljs-strong, 21 | .hljs-emphasis { 22 | color: #a8a8a2; 23 | } 24 | 25 | .hljs-bullet, 26 | .hljs-quote, 27 | .hljs-number, 28 | .hljs-regexp, 29 | .hljs-literal, 30 | .hljs-link { 31 | color: #ae81ff; 32 | } 33 | 34 | .hljs-code, 35 | .hljs-title, 36 | .hljs-section, 37 | .hljs-selector-class { 38 | color: #a6e22e; 39 | } 40 | 41 | .hljs-strong { 42 | font-weight: bold; 43 | } 44 | 45 | .hljs-emphasis { 46 | font-style: italic; 47 | } 48 | 49 | .hljs-keyword, 50 | .hljs-selector-tag, 51 | .hljs-name, 52 | .hljs-attr { 53 | color: #f92672; 54 | } 55 | 56 | .hljs-symbol, 57 | .hljs-attribute { 58 | color: #66d9ef; 59 | } 60 | 61 | .hljs-params, 62 | .hljs-class .hljs-title { 63 | color: #f8f8f2; 64 | } 65 | 66 | .hljs-string, 67 | .hljs-type, 68 | .hljs-built_in, 69 | .hljs-builtin-name, 70 | .hljs-selector-id, 71 | .hljs-selector-attr, 72 | .hljs-selector-pseudo, 73 | .hljs-addition, 74 | .hljs-variable, 75 | .hljs-template-variable { 76 | color: #e6db74; 77 | } 78 | 79 | .hljs-comment, 80 | .hljs-deletion, 81 | .hljs-meta { 82 | color: #75715e; 83 | } 84 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/monokai.css: -------------------------------------------------------------------------------- 1 | /* 2 | Monokai style - ported by Luigi Maselli - http://grigio.org 3 | */ 4 | 5 | .hljs { 6 | display: block; 7 | overflow-x: auto; 8 | padding: 0.5em; 9 | background: #272822; 10 | color: #ddd; 11 | } 12 | 13 | .hljs-tag, 14 | .hljs-keyword, 15 | .hljs-selector-tag, 16 | .hljs-literal, 17 | .hljs-strong, 18 | .hljs-name { 19 | color: #f92672; 20 | } 21 | 22 | .hljs-code { 23 | color: #66d9ef; 24 | } 25 | 26 | .hljs-class .hljs-title { 27 | color: white; 28 | } 29 | 30 | .hljs-attribute, 31 | .hljs-symbol, 32 | .hljs-regexp, 33 | .hljs-link { 34 | color: #bf79db; 35 | } 36 | 37 | .hljs-string, 38 | .hljs-bullet, 39 | .hljs-subst, 40 | .hljs-title, 41 | .hljs-section, 42 | .hljs-emphasis, 43 | .hljs-type, 44 | .hljs-built_in, 45 | .hljs-builtin-name, 46 | .hljs-selector-attr, 47 | .hljs-selector-pseudo, 48 | .hljs-addition, 49 | .hljs-variable, 50 | .hljs-template-tag, 51 | .hljs-template-variable { 52 | color: #a6e22e; 53 | } 54 | 55 | .hljs-comment, 56 | .hljs-quote, 57 | .hljs-deletion, 58 | .hljs-meta { 59 | color: #75715e; 60 | } 61 | 62 | .hljs-keyword, 63 | .hljs-selector-tag, 64 | .hljs-literal, 65 | .hljs-doctag, 66 | .hljs-title, 67 | .hljs-section, 68 | .hljs-type, 69 | .hljs-selector-id { 70 | font-weight: bold; 71 | } 72 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/obsidian.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Obsidian style 3 | * ported by Alexander Marenin (http://github.com/ioncreature) 4 | */ 5 | 6 | .hljs { 7 | display: block; 8 | overflow-x: auto; 9 | padding: 0.5em; 10 | background: #282b2e; 11 | } 12 | 13 | .hljs-keyword, 14 | .hljs-selector-tag, 15 | .hljs-literal, 16 | .hljs-selector-id { 17 | color: #93c763; 18 | } 19 | 20 | .hljs-number { 21 | color: #ffcd22; 22 | } 23 | 24 | .hljs { 25 | color: #e0e2e4; 26 | } 27 | 28 | .hljs-attribute { 29 | color: #668bb0; 30 | } 31 | 32 | .hljs-code, 33 | .hljs-class .hljs-title, 34 | .hljs-section { 35 | color: white; 36 | } 37 | 38 | .hljs-regexp, 39 | .hljs-link { 40 | color: #d39745; 41 | } 42 | 43 | .hljs-meta { 44 | color: #557182; 45 | } 46 | 47 | .hljs-tag, 48 | .hljs-name, 49 | .hljs-bullet, 50 | .hljs-subst, 51 | .hljs-emphasis, 52 | .hljs-type, 53 | .hljs-built_in, 54 | .hljs-selector-attr, 55 | .hljs-selector-pseudo, 56 | .hljs-addition, 57 | .hljs-variable, 58 | .hljs-template-tag, 59 | .hljs-template-variable { 60 | color: #8cbbad; 61 | } 62 | 63 | .hljs-string, 64 | .hljs-symbol { 65 | color: #ec7600; 66 | } 67 | 68 | .hljs-comment, 69 | .hljs-quote, 70 | .hljs-deletion { 71 | color: #818e96; 72 | } 73 | 74 | .hljs-selector-class { 75 | color: #A082BD 76 | } 77 | 78 | .hljs-keyword, 79 | .hljs-selector-tag, 80 | .hljs-literal, 81 | .hljs-doctag, 82 | .hljs-title, 83 | .hljs-section, 84 | .hljs-type, 85 | .hljs-name, 86 | .hljs-strong { 87 | font-weight: bold; 88 | } 89 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/ocean.css: -------------------------------------------------------------------------------- 1 | /* Ocean Dark Theme */ 2 | /* https://github.com/gavsiu */ 3 | /* Original theme - https://github.com/chriskempson/base16 */ 4 | 5 | /* Ocean Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #65737e; 9 | } 10 | 11 | /* Ocean Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-tag, 15 | .hljs-name, 16 | .hljs-selector-id, 17 | .hljs-selector-class, 18 | .hljs-regexp, 19 | .hljs-deletion { 20 | color: #bf616a; 21 | } 22 | 23 | /* Ocean Orange */ 24 | .hljs-number, 25 | .hljs-built_in, 26 | .hljs-builtin-name, 27 | .hljs-literal, 28 | .hljs-type, 29 | .hljs-params, 30 | .hljs-meta, 31 | .hljs-link { 32 | color: #d08770; 33 | } 34 | 35 | /* Ocean Yellow */ 36 | .hljs-attribute { 37 | color: #ebcb8b; 38 | } 39 | 40 | /* Ocean Green */ 41 | .hljs-string, 42 | .hljs-symbol, 43 | .hljs-bullet, 44 | .hljs-addition { 45 | color: #a3be8c; 46 | } 47 | 48 | /* Ocean Blue */ 49 | .hljs-title, 50 | .hljs-section { 51 | color: #8fa1b3; 52 | } 53 | 54 | /* Ocean Purple */ 55 | .hljs-keyword, 56 | .hljs-selector-tag { 57 | color: #b48ead; 58 | } 59 | 60 | .hljs { 61 | display: block; 62 | overflow-x: auto; 63 | background: #2b303b; 64 | color: #c0c5ce; 65 | padding: 0.5em; 66 | } 67 | 68 | .hljs-emphasis { 69 | font-style: italic; 70 | } 71 | 72 | .hljs-strong { 73 | font-weight: bold; 74 | } 75 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/paraiso-dark.css: -------------------------------------------------------------------------------- 1 | /* 2 | Paraíso (dark) 3 | Created by Jan T. Sott (http://github.com/idleberg) 4 | Inspired by the art of Rubens LP (http://www.rubenslp.com.br) 5 | */ 6 | 7 | /* Paraíso Comment */ 8 | .hljs-comment, 9 | .hljs-quote { 10 | color: #8d8687; 11 | } 12 | 13 | /* Paraíso Red */ 14 | .hljs-variable, 15 | .hljs-template-variable, 16 | .hljs-tag, 17 | .hljs-name, 18 | .hljs-selector-id, 19 | .hljs-selector-class, 20 | .hljs-regexp, 21 | .hljs-link, 22 | .hljs-meta { 23 | color: #ef6155; 24 | } 25 | 26 | /* Paraíso Orange */ 27 | .hljs-number, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params, 33 | .hljs-deletion { 34 | color: #f99b15; 35 | } 36 | 37 | /* Paraíso Yellow */ 38 | .hljs-title, 39 | .hljs-section, 40 | .hljs-attribute { 41 | color: #fec418; 42 | } 43 | 44 | /* Paraíso Green */ 45 | .hljs-string, 46 | .hljs-symbol, 47 | .hljs-bullet, 48 | .hljs-addition { 49 | color: #48b685; 50 | } 51 | 52 | /* Paraíso Purple */ 53 | .hljs-keyword, 54 | .hljs-selector-tag { 55 | color: #815ba4; 56 | } 57 | 58 | .hljs { 59 | display: block; 60 | overflow-x: auto; 61 | background: #2f1e2e; 62 | color: #a39e9b; 63 | padding: 0.5em; 64 | } 65 | 66 | .hljs-emphasis { 67 | font-style: italic; 68 | } 69 | 70 | .hljs-strong { 71 | font-weight: bold; 72 | } 73 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/paraiso-light.css: -------------------------------------------------------------------------------- 1 | /* 2 | Paraíso (light) 3 | Created by Jan T. Sott (http://github.com/idleberg) 4 | Inspired by the art of Rubens LP (http://www.rubenslp.com.br) 5 | */ 6 | 7 | /* Paraíso Comment */ 8 | .hljs-comment, 9 | .hljs-quote { 10 | color: #776e71; 11 | } 12 | 13 | /* Paraíso Red */ 14 | .hljs-variable, 15 | .hljs-template-variable, 16 | .hljs-tag, 17 | .hljs-name, 18 | .hljs-selector-id, 19 | .hljs-selector-class, 20 | .hljs-regexp, 21 | .hljs-link, 22 | .hljs-meta { 23 | color: #ef6155; 24 | } 25 | 26 | /* Paraíso Orange */ 27 | .hljs-number, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params, 33 | .hljs-deletion { 34 | color: #f99b15; 35 | } 36 | 37 | /* Paraíso Yellow */ 38 | .hljs-title, 39 | .hljs-section, 40 | .hljs-attribute { 41 | color: #fec418; 42 | } 43 | 44 | /* Paraíso Green */ 45 | .hljs-string, 46 | .hljs-symbol, 47 | .hljs-bullet, 48 | .hljs-addition { 49 | color: #48b685; 50 | } 51 | 52 | /* Paraíso Purple */ 53 | .hljs-keyword, 54 | .hljs-selector-tag { 55 | color: #815ba4; 56 | } 57 | 58 | .hljs { 59 | display: block; 60 | overflow-x: auto; 61 | background: #e7e9db; 62 | color: #4f424c; 63 | padding: 0.5em; 64 | } 65 | 66 | .hljs-emphasis { 67 | font-style: italic; 68 | } 69 | 70 | .hljs-strong { 71 | font-weight: bold; 72 | } 73 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/pojoaque.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Pojoaque Style by Jason Tate 4 | http://web-cms-designs.com/ftopict-10-pojoaque-style-for-highlight-js-code-highlighter.html 5 | Based on Solarized Style from http://ethanschoonover.com/solarized 6 | 7 | */ 8 | 9 | .hljs { 10 | display: block; 11 | overflow-x: auto; 12 | padding: 0.5em; 13 | color: #dccf8f; 14 | background: url(./pojoaque.jpg) repeat scroll left top #181914; 15 | } 16 | 17 | .hljs-comment, 18 | .hljs-quote { 19 | color: #586e75; 20 | font-style: italic; 21 | } 22 | 23 | .hljs-keyword, 24 | .hljs-selector-tag, 25 | .hljs-literal, 26 | .hljs-addition { 27 | color: #b64926; 28 | } 29 | 30 | .hljs-number, 31 | .hljs-string, 32 | .hljs-doctag, 33 | .hljs-regexp { 34 | color: #468966; 35 | } 36 | 37 | .hljs-title, 38 | .hljs-section, 39 | .hljs-built_in, 40 | .hljs-name { 41 | color: #ffb03b; 42 | } 43 | 44 | .hljs-variable, 45 | .hljs-template-variable, 46 | .hljs-class .hljs-title, 47 | .hljs-type, 48 | .hljs-tag { 49 | color: #b58900; 50 | } 51 | 52 | .hljs-attribute { 53 | color: #b89859; 54 | } 55 | 56 | .hljs-symbol, 57 | .hljs-bullet, 58 | .hljs-link, 59 | .hljs-subst, 60 | .hljs-meta { 61 | color: #cb4b16; 62 | } 63 | 64 | .hljs-deletion { 65 | color: #dc322f; 66 | } 67 | 68 | .hljs-selector-id, 69 | .hljs-selector-class { 70 | color: #d3a60c; 71 | } 72 | 73 | .hljs-formula { 74 | background: #073642; 75 | } 76 | 77 | .hljs-emphasis { 78 | font-style: italic; 79 | } 80 | 81 | .hljs-strong { 82 | font-weight: bold; 83 | } 84 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/pojoaque.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tulz-app/frontroute/6f13ad036ae6dfb1c5b557e392a9bfda2c2654fe/website/src/main/public/stylesheets/highlightjs/pojoaque.jpg -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/qtcreator_dark.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Qt Creator dark color scheme 4 | 5 | */ 6 | 7 | 8 | .hljs { 9 | display: block; 10 | overflow-x: auto; 11 | padding: 0.5em; 12 | background: #000000; 13 | } 14 | 15 | .hljs, 16 | .hljs-subst, 17 | .hljs-tag, 18 | .hljs-title { 19 | color: #aaaaaa; 20 | } 21 | 22 | .hljs-strong, 23 | .hljs-emphasis { 24 | color: #a8a8a2; 25 | } 26 | 27 | .hljs-bullet, 28 | .hljs-quote, 29 | .hljs-number, 30 | .hljs-regexp, 31 | .hljs-literal { 32 | color: #ff55ff; 33 | } 34 | 35 | .hljs-code 36 | .hljs-selector-class { 37 | color: #aaaaff; 38 | } 39 | 40 | .hljs-emphasis, 41 | .hljs-stronge, 42 | .hljs-type { 43 | font-style: italic; 44 | } 45 | 46 | .hljs-keyword, 47 | .hljs-selector-tag, 48 | .hljs-function, 49 | .hljs-section, 50 | .hljs-symbol, 51 | .hljs-name { 52 | color: #ffff55; 53 | } 54 | 55 | .hljs-attribute { 56 | color: #ff5555; 57 | } 58 | 59 | .hljs-variable, 60 | .hljs-params, 61 | .hljs-class .hljs-title { 62 | color: #8888ff; 63 | } 64 | 65 | .hljs-string, 66 | .hljs-selector-id, 67 | .hljs-selector-attr, 68 | .hljs-selector-pseudo, 69 | .hljs-type, 70 | .hljs-built_in, 71 | .hljs-builtin-name, 72 | .hljs-template-tag, 73 | .hljs-template-variable, 74 | .hljs-addition, 75 | .hljs-link { 76 | color: #ff55ff; 77 | } 78 | 79 | .hljs-comment, 80 | .hljs-meta, 81 | .hljs-deletion { 82 | color: #55ffff; 83 | } 84 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/qtcreator_light.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Qt Creator light color scheme 4 | 5 | */ 6 | 7 | 8 | .hljs { 9 | display: block; 10 | overflow-x: auto; 11 | padding: 0.5em; 12 | background: #ffffff; 13 | } 14 | 15 | .hljs, 16 | .hljs-subst, 17 | .hljs-tag, 18 | .hljs-title { 19 | color: #000000; 20 | } 21 | 22 | .hljs-strong, 23 | .hljs-emphasis { 24 | color: #000000; 25 | } 26 | 27 | .hljs-bullet, 28 | .hljs-quote, 29 | .hljs-number, 30 | .hljs-regexp, 31 | .hljs-literal { 32 | color: #000080; 33 | } 34 | 35 | .hljs-code 36 | .hljs-selector-class { 37 | color: #800080; 38 | } 39 | 40 | .hljs-emphasis, 41 | .hljs-stronge, 42 | .hljs-type { 43 | font-style: italic; 44 | } 45 | 46 | .hljs-keyword, 47 | .hljs-selector-tag, 48 | .hljs-function, 49 | .hljs-section, 50 | .hljs-symbol, 51 | .hljs-name { 52 | color: #808000; 53 | } 54 | 55 | .hljs-attribute { 56 | color: #800000; 57 | } 58 | 59 | .hljs-variable, 60 | .hljs-params, 61 | .hljs-class .hljs-title { 62 | color: #0055AF; 63 | } 64 | 65 | .hljs-string, 66 | .hljs-selector-id, 67 | .hljs-selector-attr, 68 | .hljs-selector-pseudo, 69 | .hljs-type, 70 | .hljs-built_in, 71 | .hljs-builtin-name, 72 | .hljs-template-tag, 73 | .hljs-template-variable, 74 | .hljs-addition, 75 | .hljs-link { 76 | color: #008000; 77 | } 78 | 79 | .hljs-comment, 80 | .hljs-meta, 81 | .hljs-deletion { 82 | color: #008000; 83 | } 84 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/railscasts.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Railscasts-like style (c) Visoft, Inc. (Damien White) 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: #232323; 12 | color: #e6e1dc; 13 | } 14 | 15 | .hljs-comment, 16 | .hljs-quote { 17 | color: #bc9458; 18 | font-style: italic; 19 | } 20 | 21 | .hljs-keyword, 22 | .hljs-selector-tag { 23 | color: #c26230; 24 | } 25 | 26 | .hljs-string, 27 | .hljs-number, 28 | .hljs-regexp, 29 | .hljs-variable, 30 | .hljs-template-variable { 31 | color: #a5c261; 32 | } 33 | 34 | .hljs-subst { 35 | color: #519f50; 36 | } 37 | 38 | .hljs-tag, 39 | .hljs-name { 40 | color: #e8bf6a; 41 | } 42 | 43 | .hljs-type { 44 | color: #da4939; 45 | } 46 | 47 | 48 | .hljs-symbol, 49 | .hljs-bullet, 50 | .hljs-built_in, 51 | .hljs-builtin-name, 52 | .hljs-attr, 53 | .hljs-link { 54 | color: #6d9cbe; 55 | } 56 | 57 | .hljs-params { 58 | color: #d0d0ff; 59 | } 60 | 61 | .hljs-attribute { 62 | color: #cda869; 63 | } 64 | 65 | .hljs-meta { 66 | color: #9b859d; 67 | } 68 | 69 | .hljs-title, 70 | .hljs-section { 71 | color: #ffc66d; 72 | } 73 | 74 | .hljs-addition { 75 | background-color: #144212; 76 | color: #e6e1dc; 77 | display: inline-block; 78 | width: 100%; 79 | } 80 | 81 | .hljs-deletion { 82 | background-color: #600; 83 | color: #e6e1dc; 84 | display: inline-block; 85 | width: 100%; 86 | } 87 | 88 | .hljs-selector-class { 89 | color: #9b703f; 90 | } 91 | 92 | .hljs-selector-id { 93 | color: #8b98ab; 94 | } 95 | 96 | .hljs-emphasis { 97 | font-style: italic; 98 | } 99 | 100 | .hljs-strong { 101 | font-weight: bold; 102 | } 103 | 104 | .hljs-link { 105 | text-decoration: underline; 106 | } 107 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/rainbow.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Style with support for rainbow parens 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: #474949; 12 | color: #d1d9e1; 13 | } 14 | 15 | 16 | .hljs-comment, 17 | .hljs-quote { 18 | color: #969896; 19 | font-style: italic; 20 | } 21 | 22 | .hljs-keyword, 23 | .hljs-selector-tag, 24 | .hljs-literal, 25 | .hljs-type, 26 | .hljs-addition { 27 | color: #cc99cc; 28 | } 29 | 30 | .hljs-number, 31 | .hljs-selector-attr, 32 | .hljs-selector-pseudo { 33 | color: #f99157; 34 | } 35 | 36 | .hljs-string, 37 | .hljs-doctag, 38 | .hljs-regexp { 39 | color: #8abeb7; 40 | } 41 | 42 | .hljs-title, 43 | .hljs-name, 44 | .hljs-section, 45 | .hljs-built_in { 46 | color: #b5bd68; 47 | } 48 | 49 | .hljs-variable, 50 | .hljs-template-variable, 51 | .hljs-selector-id, 52 | .hljs-class .hljs-title { 53 | color: #ffcc66; 54 | } 55 | 56 | .hljs-section, 57 | .hljs-name, 58 | .hljs-strong { 59 | font-weight: bold; 60 | } 61 | 62 | .hljs-symbol, 63 | .hljs-bullet, 64 | .hljs-subst, 65 | .hljs-meta, 66 | .hljs-link { 67 | color: #f99157; 68 | } 69 | 70 | .hljs-deletion { 71 | color: #dc322f; 72 | } 73 | 74 | .hljs-formula { 75 | background: #eee8d5; 76 | } 77 | 78 | .hljs-attr, 79 | .hljs-attribute { 80 | color: #81a2be; 81 | } 82 | 83 | .hljs-emphasis { 84 | font-style: italic; 85 | } 86 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/routeros.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | highlight.js style for Microtik RouterOS script 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: #F0F0F0; 12 | } 13 | 14 | /* Base color: saturation 0; */ 15 | 16 | .hljs, 17 | .hljs-subst { 18 | color: #444; 19 | } 20 | 21 | .hljs-comment { 22 | color: #888888; 23 | } 24 | 25 | .hljs-keyword, 26 | .hljs-selector-tag, 27 | .hljs-meta-keyword, 28 | .hljs-doctag, 29 | .hljs-name { 30 | font-weight: bold; 31 | } 32 | 33 | .hljs-attribute { 34 | color: #0E9A00; 35 | } 36 | 37 | .hljs-function { 38 | color: #99069A; 39 | } 40 | 41 | .hljs-builtin-name { 42 | color: #99069A; 43 | } 44 | 45 | /* User color: hue: 0 */ 46 | 47 | .hljs-type, 48 | .hljs-string, 49 | .hljs-number, 50 | .hljs-selector-id, 51 | .hljs-selector-class, 52 | .hljs-quote, 53 | .hljs-template-tag, 54 | .hljs-deletion { 55 | color: #880000; 56 | } 57 | 58 | .hljs-title, 59 | .hljs-section { 60 | color: #880000; 61 | font-weight: bold; 62 | } 63 | 64 | .hljs-regexp, 65 | .hljs-symbol, 66 | .hljs-variable, 67 | .hljs-template-variable, 68 | .hljs-link, 69 | .hljs-selector-attr, 70 | .hljs-selector-pseudo { 71 | color: #BC6060; 72 | } 73 | 74 | 75 | /* Language color: hue: 90; */ 76 | 77 | .hljs-literal { 78 | color: #78A960; 79 | } 80 | 81 | .hljs-built_in, 82 | .hljs-bullet, 83 | .hljs-code, 84 | .hljs-addition { 85 | color: #0C9A9A; 86 | } 87 | 88 | 89 | /* Meta color: hue: 200 */ 90 | 91 | .hljs-meta { 92 | color: #1f7199; 93 | } 94 | 95 | .hljs-meta-string { 96 | color: #4d99bf; 97 | } 98 | 99 | 100 | /* Misc effects */ 101 | 102 | .hljs-emphasis { 103 | font-style: italic; 104 | } 105 | 106 | .hljs-strong { 107 | font-weight: bold; 108 | } 109 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/school-book.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | School Book style from goldblog.com.ua (c) Zaripov Yura 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 15px 0.5em 0.5em 30px; 11 | font-size: 11px; 12 | line-height:16px; 13 | background:#f6f6ae url(./school-book.png); 14 | border-top: solid 2px #d2e8b9; 15 | border-bottom: solid 1px #d2e8b9; 16 | } 17 | 18 | .hljs-keyword, 19 | .hljs-selector-tag, 20 | .hljs-literal { 21 | color:#005599; 22 | font-weight:bold; 23 | } 24 | 25 | .hljs, 26 | .hljs-subst { 27 | color: #3e5915; 28 | } 29 | 30 | .hljs-string, 31 | .hljs-title, 32 | .hljs-section, 33 | .hljs-type, 34 | .hljs-symbol, 35 | .hljs-bullet, 36 | .hljs-attribute, 37 | .hljs-built_in, 38 | .hljs-builtin-name, 39 | .hljs-addition, 40 | .hljs-variable, 41 | .hljs-template-tag, 42 | .hljs-template-variable, 43 | .hljs-link { 44 | color: #2c009f; 45 | } 46 | 47 | .hljs-comment, 48 | .hljs-quote, 49 | .hljs-deletion, 50 | .hljs-meta { 51 | color: #e60415; 52 | } 53 | 54 | .hljs-keyword, 55 | .hljs-selector-tag, 56 | .hljs-literal, 57 | .hljs-doctag, 58 | .hljs-title, 59 | .hljs-section, 60 | .hljs-type, 61 | .hljs-name, 62 | .hljs-selector-id, 63 | .hljs-strong { 64 | font-weight: bold; 65 | } 66 | 67 | .hljs-emphasis { 68 | font-style: italic; 69 | } 70 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/school-book.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tulz-app/frontroute/6f13ad036ae6dfb1c5b557e392a9bfda2c2654fe/website/src/main/public/stylesheets/highlightjs/school-book.png -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/shades-of-purple.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Shades of Purple Theme — for Highlightjs. 3 | * 4 | * @author (c) Ahmad Awais 5 | * @link GitHub Repo → https://github.com/ahmadawais/Shades-of-Purple-HighlightJS 6 | * @version 1.5.0 7 | */ 8 | 9 | .hljs { 10 | display: block; 11 | overflow-x: auto; 12 | /* Custom font is optional */ 13 | /* font-family: 'Operator Mono', 'Fira Code', 'Menlo', 'Monaco', 'Courier New', 'monospace'; */ 14 | padding: 0.5em; 15 | background: #2d2b57; 16 | font-weight: normal; 17 | } 18 | 19 | .hljs-title { 20 | color: #fad000; 21 | font-weight: normal; 22 | } 23 | 24 | .hljs-name { 25 | color: #a1feff; 26 | } 27 | 28 | .hljs-tag { 29 | color: #ffffff; 30 | } 31 | 32 | .hljs-attr { 33 | color: #f8d000; 34 | font-style: italic; 35 | } 36 | 37 | .hljs-built_in, 38 | .hljs-selector-tag, 39 | .hljs-section { 40 | color: #fb9e00; 41 | } 42 | 43 | .hljs-keyword { 44 | color: #fb9e00; 45 | } 46 | 47 | .hljs, 48 | .hljs-subst { 49 | color: #e3dfff; 50 | } 51 | 52 | .hljs-string, 53 | .hljs-attribute, 54 | .hljs-symbol, 55 | .hljs-bullet, 56 | .hljs-addition, 57 | .hljs-code, 58 | .hljs-regexp, 59 | .hljs-selector-class, 60 | .hljs-selector-attr, 61 | .hljs-selector-pseudo, 62 | .hljs-template-tag, 63 | .hljs-quote, 64 | .hljs-deletion { 65 | color: #4cd213; 66 | } 67 | 68 | .hljs-meta, 69 | .hljs-meta-string { 70 | color: #fb9e00; 71 | } 72 | 73 | .hljs-comment { 74 | color: #ac65ff; 75 | } 76 | 77 | .hljs-keyword, 78 | .hljs-selector-tag, 79 | .hljs-literal, 80 | .hljs-name, 81 | .hljs-strong { 82 | font-weight: normal; 83 | } 84 | 85 | .hljs-literal, 86 | .hljs-number { 87 | color: #fa658d; 88 | } 89 | 90 | .hljs-emphasis { 91 | font-style: italic; 92 | } 93 | 94 | .hljs-strong { 95 | font-weight: bold; 96 | } 97 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/solarized-dark.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: #002b36; 12 | color: #839496; 13 | } 14 | 15 | .hljs-comment, 16 | .hljs-quote { 17 | color: #586e75; 18 | } 19 | 20 | /* Solarized Green */ 21 | .hljs-keyword, 22 | .hljs-selector-tag, 23 | .hljs-addition { 24 | color: #859900; 25 | } 26 | 27 | /* Solarized Cyan */ 28 | .hljs-number, 29 | .hljs-string, 30 | .hljs-meta .hljs-meta-string, 31 | .hljs-literal, 32 | .hljs-doctag, 33 | .hljs-regexp { 34 | color: #2aa198; 35 | } 36 | 37 | /* Solarized Blue */ 38 | .hljs-title, 39 | .hljs-section, 40 | .hljs-name, 41 | .hljs-selector-id, 42 | .hljs-selector-class { 43 | color: #268bd2; 44 | } 45 | 46 | /* Solarized Yellow */ 47 | .hljs-attribute, 48 | .hljs-attr, 49 | .hljs-variable, 50 | .hljs-template-variable, 51 | .hljs-class .hljs-title, 52 | .hljs-type { 53 | color: #b58900; 54 | } 55 | 56 | /* Solarized Orange */ 57 | .hljs-symbol, 58 | .hljs-bullet, 59 | .hljs-subst, 60 | .hljs-meta, 61 | .hljs-meta .hljs-keyword, 62 | .hljs-selector-attr, 63 | .hljs-selector-pseudo, 64 | .hljs-link { 65 | color: #cb4b16; 66 | } 67 | 68 | /* Solarized Red */ 69 | .hljs-built_in, 70 | .hljs-deletion { 71 | color: #dc322f; 72 | } 73 | 74 | .hljs-formula { 75 | background: #073642; 76 | } 77 | 78 | .hljs-emphasis { 79 | font-style: italic; 80 | } 81 | 82 | .hljs-strong { 83 | font-weight: bold; 84 | } 85 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/solarized-light.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: #fdf6e3; 12 | color: #657b83; 13 | } 14 | 15 | .hljs-comment, 16 | .hljs-quote { 17 | color: #93a1a1; 18 | } 19 | 20 | /* Solarized Green */ 21 | .hljs-keyword, 22 | .hljs-selector-tag, 23 | .hljs-addition { 24 | color: #859900; 25 | } 26 | 27 | /* Solarized Cyan */ 28 | .hljs-number, 29 | .hljs-string, 30 | .hljs-meta .hljs-meta-string, 31 | .hljs-literal, 32 | .hljs-doctag, 33 | .hljs-regexp { 34 | color: #2aa198; 35 | } 36 | 37 | /* Solarized Blue */ 38 | .hljs-title, 39 | .hljs-section, 40 | .hljs-name, 41 | .hljs-selector-id, 42 | .hljs-selector-class { 43 | color: #268bd2; 44 | } 45 | 46 | /* Solarized Yellow */ 47 | .hljs-attribute, 48 | .hljs-attr, 49 | .hljs-variable, 50 | .hljs-template-variable, 51 | .hljs-class .hljs-title, 52 | .hljs-type { 53 | color: #b58900; 54 | } 55 | 56 | /* Solarized Orange */ 57 | .hljs-symbol, 58 | .hljs-bullet, 59 | .hljs-subst, 60 | .hljs-meta, 61 | .hljs-meta .hljs-keyword, 62 | .hljs-selector-attr, 63 | .hljs-selector-pseudo, 64 | .hljs-link { 65 | color: #cb4b16; 66 | } 67 | 68 | /* Solarized Red */ 69 | .hljs-built_in, 70 | .hljs-deletion { 71 | color: #dc322f; 72 | } 73 | 74 | .hljs-formula { 75 | background: #eee8d5; 76 | } 77 | 78 | .hljs-emphasis { 79 | font-style: italic; 80 | } 81 | 82 | .hljs-strong { 83 | font-weight: bold; 84 | } 85 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/srcery.css: -------------------------------------------------------------------------------- 1 | /* 2 | Description: Srcery dark color scheme for highlight.js 3 | Author: Chen Bin 4 | Website: https://srcery-colors.github.io/ 5 | Date: 2020-04-06 6 | */ 7 | 8 | .hljs { 9 | display: block; 10 | overflow-x: auto; 11 | padding: 0.5em; 12 | background: #1C1B19; 13 | color: #FCE8C3; 14 | } 15 | 16 | .hljs-strong, 17 | .hljs-emphasis { 18 | color: #918175; 19 | } 20 | 21 | .hljs-bullet, 22 | .hljs-quote, 23 | .hljs-link, 24 | .hljs-number, 25 | .hljs-regexp, 26 | .hljs-literal { 27 | color: #FF5C8F; 28 | } 29 | 30 | .hljs-code, 31 | .hljs-selector-class { 32 | color: #68A8E4 33 | } 34 | 35 | .hljs-emphasis { 36 | font-style: italic; 37 | } 38 | 39 | .hljs-keyword, 40 | .hljs-selector-tag, 41 | .hljs-section, 42 | .hljs-attribute, 43 | .hljs-variable { 44 | color: #EF2F27; 45 | } 46 | 47 | .hljs-name, 48 | .hljs-title { 49 | color: #FBB829; 50 | } 51 | 52 | .hljs-type, 53 | .hljs-params { 54 | color: #0AAEB3; 55 | } 56 | 57 | .hljs-string { 58 | color: #98BC37; 59 | } 60 | 61 | .hljs-subst, 62 | .hljs-built_in, 63 | .hljs-builtin-name, 64 | .hljs-symbol, 65 | .hljs-selector-id, 66 | .hljs-selector-attr, 67 | .hljs-selector-pseudo, 68 | .hljs-template-tag, 69 | .hljs-template-variable, 70 | .hljs-addition { 71 | color: #C07ABE; 72 | } 73 | 74 | .hljs-comment, 75 | .hljs-deletion, 76 | .hljs-meta { 77 | color: #918175; 78 | } 79 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/stackoverflow-dark.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * StackOverflow.com dark style 3 | * 4 | * @stackoverflow/stacks v0.56.0 5 | * https://github.com/StackExchange/Stacks 6 | */ 7 | 8 | .hljs { 9 | display: block; 10 | overflow-x: auto; 11 | padding: 0.5em; 12 | color: #ffffff; 13 | background: #1c1b1b; 14 | } 15 | 16 | .hljs-comment { 17 | color: #999999; 18 | } 19 | 20 | .hljs-keyword, 21 | .hljs-selector-tag, 22 | .hljs-meta-keyword, 23 | .hljs-doctag, 24 | .hljs-section, 25 | .hljs-selector-class, 26 | .hljs-meta, 27 | .hljs-selector-pseudo, 28 | .hljs-attr { 29 | color: #88aece; 30 | } 31 | 32 | .hljs-attribute { 33 | color: v#c59bc1; 34 | } 35 | 36 | .hljs-name, 37 | .hljs-type, 38 | .hljs-number, 39 | .hljs-selector-id, 40 | .hljs-quote, 41 | .hljs-template-tag, 42 | .hljs-built_in, 43 | .hljs-title, 44 | .hljs-literal { 45 | color: #f08d49; 46 | } 47 | 48 | .hljs-string, 49 | .hljs-regexp, 50 | .hljs-symbol, 51 | .hljs-variable, 52 | .hljs-template-variable, 53 | .hljs-link, 54 | .hljs-selector-attr, 55 | .hljs-meta-string { 56 | color: #b5bd68; 57 | } 58 | 59 | .hljs-bullet, 60 | .hljs-code { 61 | color: #cccccc; 62 | } 63 | 64 | .hljs-deletion { 65 | color: #de7176; 66 | } 67 | 68 | .hljs-addition { 69 | color: #76c490; 70 | } 71 | 72 | .hljs-emphasis { 73 | font-style: italic; 74 | } 75 | 76 | .hljs-strong { 77 | font-weight: bold; 78 | } 79 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/stackoverflow-light.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * StackOverflow.com light style 3 | * 4 | * @stackoverflow/stacks v0.56.0 5 | * https://github.com/StackExchange/Stacks 6 | */ 7 | 8 | .hljs { 9 | display: block; 10 | overflow-x: auto; 11 | padding: 0.5em; 12 | color: #2f3337; 13 | background: #f6f6f6; 14 | } 15 | 16 | .hljs-comment { 17 | color: #656e77; 18 | } 19 | 20 | .hljs-keyword, 21 | .hljs-selector-tag, 22 | .hljs-meta-keyword, 23 | .hljs-doctag, 24 | .hljs-section, 25 | .hljs-selector-class, 26 | .hljs-meta, 27 | .hljs-selector-pseudo, 28 | .hljs-attr { 29 | color: #015692; 30 | } 31 | 32 | .hljs-attribute { 33 | color: #803378; 34 | } 35 | 36 | .hljs-name, 37 | .hljs-type, 38 | .hljs-number, 39 | .hljs-selector-id, 40 | .hljs-quote, 41 | .hljs-template-tag, 42 | .hljs-built_in, 43 | .hljs-title, 44 | .hljs-literal { 45 | color: #b75501; 46 | } 47 | 48 | .hljs-string, 49 | .hljs-regexp, 50 | .hljs-symbol, 51 | .hljs-variable, 52 | .hljs-template-variable, 53 | .hljs-link, 54 | .hljs-selector-attr, 55 | .hljs-meta-string { 56 | color: #54790d; 57 | } 58 | 59 | .hljs-bullet, 60 | .hljs-code { 61 | color: #535a60; 62 | } 63 | 64 | .hljs-deletion { 65 | color: #c02d2e; 66 | } 67 | 68 | .hljs-addition { 69 | color: #2f6f44; 70 | } 71 | 72 | .hljs-emphasis { 73 | font-style: italic; 74 | } 75 | 76 | .hljs-strong { 77 | font-weight: bold; 78 | } 79 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/sunburst.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Sunburst-like style (c) Vasily Polovnyov 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: #000; 12 | color: #f8f8f8; 13 | } 14 | 15 | .hljs-comment, 16 | .hljs-quote { 17 | color: #aeaeae; 18 | font-style: italic; 19 | } 20 | 21 | .hljs-keyword, 22 | .hljs-selector-tag, 23 | .hljs-type { 24 | color: #e28964; 25 | } 26 | 27 | .hljs-string { 28 | color: #65b042; 29 | } 30 | 31 | .hljs-subst { 32 | color: #daefa3; 33 | } 34 | 35 | .hljs-regexp, 36 | .hljs-link { 37 | color: #e9c062; 38 | } 39 | 40 | .hljs-title, 41 | .hljs-section, 42 | .hljs-tag, 43 | .hljs-name { 44 | color: #89bdff; 45 | } 46 | 47 | .hljs-class .hljs-title, 48 | .hljs-doctag { 49 | text-decoration: underline; 50 | } 51 | 52 | .hljs-symbol, 53 | .hljs-bullet, 54 | .hljs-number { 55 | color: #3387cc; 56 | } 57 | 58 | .hljs-params, 59 | .hljs-variable, 60 | .hljs-template-variable { 61 | color: #3e87e3; 62 | } 63 | 64 | .hljs-attribute { 65 | color: #cda869; 66 | } 67 | 68 | .hljs-meta { 69 | color: #8996a8; 70 | } 71 | 72 | .hljs-formula { 73 | background-color: #0e2231; 74 | color: #f8f8f8; 75 | font-style: italic; 76 | } 77 | 78 | .hljs-addition { 79 | background-color: #253b22; 80 | color: #f8f8f8; 81 | } 82 | 83 | .hljs-deletion { 84 | background-color: #420e09; 85 | color: #f8f8f8; 86 | } 87 | 88 | .hljs-selector-class { 89 | color: #9b703f; 90 | } 91 | 92 | .hljs-selector-id { 93 | color: #8b98ab; 94 | } 95 | 96 | .hljs-emphasis { 97 | font-style: italic; 98 | } 99 | 100 | .hljs-strong { 101 | font-weight: bold; 102 | } 103 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/tomorrow-night-blue.css: -------------------------------------------------------------------------------- 1 | /* Tomorrow Night Blue Theme */ 2 | /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ 3 | /* Original theme - https://github.com/chriskempson/tomorrow-theme */ 4 | /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ 5 | 6 | /* Tomorrow Comment */ 7 | .hljs-comment, 8 | .hljs-quote { 9 | color: #7285b7; 10 | } 11 | 12 | /* Tomorrow Red */ 13 | .hljs-variable, 14 | .hljs-template-variable, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-selector-id, 18 | .hljs-selector-class, 19 | .hljs-regexp, 20 | .hljs-deletion { 21 | color: #ff9da4; 22 | } 23 | 24 | /* Tomorrow Orange */ 25 | .hljs-number, 26 | .hljs-built_in, 27 | .hljs-builtin-name, 28 | .hljs-literal, 29 | .hljs-type, 30 | .hljs-params, 31 | .hljs-meta, 32 | .hljs-link { 33 | color: #ffc58f; 34 | } 35 | 36 | /* Tomorrow Yellow */ 37 | .hljs-attribute { 38 | color: #ffeead; 39 | } 40 | 41 | /* Tomorrow Green */ 42 | .hljs-string, 43 | .hljs-symbol, 44 | .hljs-bullet, 45 | .hljs-addition { 46 | color: #d1f1a9; 47 | } 48 | 49 | /* Tomorrow Blue */ 50 | .hljs-title, 51 | .hljs-section { 52 | color: #bbdaff; 53 | } 54 | 55 | /* Tomorrow Purple */ 56 | .hljs-keyword, 57 | .hljs-selector-tag { 58 | color: #ebbbff; 59 | } 60 | 61 | .hljs { 62 | display: block; 63 | overflow-x: auto; 64 | background: #002451; 65 | color: white; 66 | padding: 0.5em; 67 | } 68 | 69 | .hljs-emphasis { 70 | font-style: italic; 71 | } 72 | 73 | .hljs-strong { 74 | font-weight: bold; 75 | } 76 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/tomorrow-night-bright.css: -------------------------------------------------------------------------------- 1 | /* Tomorrow Night Bright Theme */ 2 | /* Original theme - https://github.com/chriskempson/tomorrow-theme */ 3 | /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ 4 | 5 | /* Tomorrow Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #969896; 9 | } 10 | 11 | /* Tomorrow Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-tag, 15 | .hljs-name, 16 | .hljs-selector-id, 17 | .hljs-selector-class, 18 | .hljs-regexp, 19 | .hljs-deletion { 20 | color: #d54e53; 21 | } 22 | 23 | /* Tomorrow Orange */ 24 | .hljs-number, 25 | .hljs-built_in, 26 | .hljs-builtin-name, 27 | .hljs-literal, 28 | .hljs-type, 29 | .hljs-params, 30 | .hljs-meta, 31 | .hljs-link { 32 | color: #e78c45; 33 | } 34 | 35 | /* Tomorrow Yellow */ 36 | .hljs-attribute { 37 | color: #e7c547; 38 | } 39 | 40 | /* Tomorrow Green */ 41 | .hljs-string, 42 | .hljs-symbol, 43 | .hljs-bullet, 44 | .hljs-addition { 45 | color: #b9ca4a; 46 | } 47 | 48 | /* Tomorrow Blue */ 49 | .hljs-title, 50 | .hljs-section { 51 | color: #7aa6da; 52 | } 53 | 54 | /* Tomorrow Purple */ 55 | .hljs-keyword, 56 | .hljs-selector-tag { 57 | color: #c397d8; 58 | } 59 | 60 | .hljs { 61 | display: block; 62 | overflow-x: auto; 63 | background: black; 64 | color: #eaeaea; 65 | padding: 0.5em; 66 | } 67 | 68 | .hljs-emphasis { 69 | font-style: italic; 70 | } 71 | 72 | .hljs-strong { 73 | font-weight: bold; 74 | } 75 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/tomorrow-night-eighties.css: -------------------------------------------------------------------------------- 1 | /* Tomorrow Night Eighties Theme */ 2 | /* Original theme - https://github.com/chriskempson/tomorrow-theme */ 3 | /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ 4 | 5 | /* Tomorrow Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #999999; 9 | } 10 | 11 | /* Tomorrow Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-tag, 15 | .hljs-name, 16 | .hljs-selector-id, 17 | .hljs-selector-class, 18 | .hljs-regexp, 19 | .hljs-deletion { 20 | color: #f2777a; 21 | } 22 | 23 | /* Tomorrow Orange */ 24 | .hljs-number, 25 | .hljs-built_in, 26 | .hljs-builtin-name, 27 | .hljs-literal, 28 | .hljs-type, 29 | .hljs-params, 30 | .hljs-meta, 31 | .hljs-link { 32 | color: #f99157; 33 | } 34 | 35 | /* Tomorrow Yellow */ 36 | .hljs-attribute { 37 | color: #ffcc66; 38 | } 39 | 40 | /* Tomorrow Green */ 41 | .hljs-string, 42 | .hljs-symbol, 43 | .hljs-bullet, 44 | .hljs-addition { 45 | color: #99cc99; 46 | } 47 | 48 | /* Tomorrow Blue */ 49 | .hljs-title, 50 | .hljs-section { 51 | color: #6699cc; 52 | } 53 | 54 | /* Tomorrow Purple */ 55 | .hljs-keyword, 56 | .hljs-selector-tag { 57 | color: #cc99cc; 58 | } 59 | 60 | .hljs { 61 | display: block; 62 | overflow-x: auto; 63 | background: #2d2d2d; 64 | color: #cccccc; 65 | padding: 0.5em; 66 | } 67 | 68 | .hljs-emphasis { 69 | font-style: italic; 70 | } 71 | 72 | .hljs-strong { 73 | font-weight: bold; 74 | } 75 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/tomorrow-night.css: -------------------------------------------------------------------------------- 1 | /* Tomorrow Night Theme */ 2 | /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ 3 | /* Original theme - https://github.com/chriskempson/tomorrow-theme */ 4 | /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ 5 | 6 | /* Tomorrow Comment */ 7 | .hljs-comment, 8 | .hljs-quote { 9 | color: #969896; 10 | } 11 | 12 | /* Tomorrow Red */ 13 | .hljs-variable, 14 | .hljs-template-variable, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-selector-id, 18 | .hljs-selector-class, 19 | .hljs-regexp, 20 | .hljs-deletion { 21 | color: #cc6666; 22 | } 23 | 24 | /* Tomorrow Orange */ 25 | .hljs-number, 26 | .hljs-built_in, 27 | .hljs-builtin-name, 28 | .hljs-literal, 29 | .hljs-type, 30 | .hljs-params, 31 | .hljs-meta, 32 | .hljs-link { 33 | color: #de935f; 34 | } 35 | 36 | /* Tomorrow Yellow */ 37 | .hljs-attribute { 38 | color: #f0c674; 39 | } 40 | 41 | /* Tomorrow Green */ 42 | .hljs-string, 43 | .hljs-symbol, 44 | .hljs-bullet, 45 | .hljs-addition { 46 | color: #b5bd68; 47 | } 48 | 49 | /* Tomorrow Blue */ 50 | .hljs-title, 51 | .hljs-section { 52 | color: #81a2be; 53 | } 54 | 55 | /* Tomorrow Purple */ 56 | .hljs-keyword, 57 | .hljs-selector-tag { 58 | color: #b294bb; 59 | } 60 | 61 | .hljs { 62 | display: block; 63 | overflow-x: auto; 64 | background: #1d1f21; 65 | color: #c5c8c6; 66 | padding: 0.5em; 67 | } 68 | 69 | .hljs-emphasis { 70 | font-style: italic; 71 | } 72 | 73 | .hljs-strong { 74 | font-weight: bold; 75 | } 76 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/tomorrow.css: -------------------------------------------------------------------------------- 1 | /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ 2 | 3 | /* Tomorrow Comment */ 4 | .hljs-comment, 5 | .hljs-quote { 6 | color: #8e908c; 7 | } 8 | 9 | /* Tomorrow Red */ 10 | .hljs-variable, 11 | .hljs-template-variable, 12 | .hljs-tag, 13 | .hljs-name, 14 | .hljs-selector-id, 15 | .hljs-selector-class, 16 | .hljs-regexp, 17 | .hljs-deletion { 18 | color: #c82829; 19 | } 20 | 21 | /* Tomorrow Orange */ 22 | .hljs-number, 23 | .hljs-built_in, 24 | .hljs-builtin-name, 25 | .hljs-literal, 26 | .hljs-type, 27 | .hljs-params, 28 | .hljs-meta, 29 | .hljs-link { 30 | color: #f5871f; 31 | } 32 | 33 | /* Tomorrow Yellow */ 34 | .hljs-attribute { 35 | color: #eab700; 36 | } 37 | 38 | /* Tomorrow Green */ 39 | .hljs-string, 40 | .hljs-symbol, 41 | .hljs-bullet, 42 | .hljs-addition { 43 | color: #718c00; 44 | } 45 | 46 | /* Tomorrow Blue */ 47 | .hljs-title, 48 | .hljs-section { 49 | color: #4271ae; 50 | } 51 | 52 | /* Tomorrow Purple */ 53 | .hljs-keyword, 54 | .hljs-selector-tag { 55 | color: #8959a8; 56 | } 57 | 58 | .hljs { 59 | display: block; 60 | overflow-x: auto; 61 | background: white; 62 | color: #4d4d4c; 63 | padding: 0.5em; 64 | } 65 | 66 | .hljs-emphasis { 67 | font-style: italic; 68 | } 69 | 70 | .hljs-strong { 71 | font-weight: bold; 72 | } 73 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/vs.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Visual Studio-like style based on original C# coloring by Jason Diamond 4 | 5 | */ 6 | .hljs { 7 | display: block; 8 | overflow-x: auto; 9 | padding: 0.5em; 10 | background: white; 11 | color: black; 12 | } 13 | 14 | .hljs-comment, 15 | .hljs-quote, 16 | .hljs-variable { 17 | color: #008000; 18 | } 19 | 20 | .hljs-keyword, 21 | .hljs-selector-tag, 22 | .hljs-built_in, 23 | .hljs-name, 24 | .hljs-tag { 25 | color: #00f; 26 | } 27 | 28 | .hljs-string, 29 | .hljs-title, 30 | .hljs-section, 31 | .hljs-attribute, 32 | .hljs-literal, 33 | .hljs-template-tag, 34 | .hljs-template-variable, 35 | .hljs-type, 36 | .hljs-addition { 37 | color: #a31515; 38 | } 39 | 40 | .hljs-deletion, 41 | .hljs-selector-attr, 42 | .hljs-selector-pseudo, 43 | .hljs-meta { 44 | color: #2b91af; 45 | } 46 | 47 | .hljs-doctag { 48 | color: #808080; 49 | } 50 | 51 | .hljs-attr { 52 | color: #f00; 53 | } 54 | 55 | .hljs-symbol, 56 | .hljs-bullet, 57 | .hljs-link { 58 | color: #00b0e8; 59 | } 60 | 61 | 62 | .hljs-emphasis { 63 | font-style: italic; 64 | } 65 | 66 | .hljs-strong { 67 | font-weight: bold; 68 | } 69 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/xcode.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | XCode style (c) Angel Garcia 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: #fff; 12 | color: black; 13 | } 14 | 15 | /* Gray DOCTYPE selectors like WebKit */ 16 | .xml .hljs-meta { 17 | color: #c0c0c0; 18 | } 19 | 20 | .hljs-comment, 21 | .hljs-quote { 22 | color: #007400; 23 | } 24 | 25 | .hljs-tag, 26 | .hljs-attribute, 27 | .hljs-keyword, 28 | .hljs-selector-tag, 29 | .hljs-literal, 30 | .hljs-name { 31 | color: #aa0d91; 32 | } 33 | 34 | .hljs-variable, 35 | .hljs-template-variable { 36 | color: #3F6E74; 37 | } 38 | 39 | .hljs-code, 40 | .hljs-string, 41 | .hljs-meta-string { 42 | color: #c41a16; 43 | } 44 | 45 | .hljs-regexp, 46 | .hljs-link { 47 | color: #0E0EFF; 48 | } 49 | 50 | .hljs-title, 51 | .hljs-symbol, 52 | .hljs-bullet, 53 | .hljs-number { 54 | color: #1c00cf; 55 | } 56 | 57 | .hljs-section, 58 | .hljs-meta { 59 | color: #643820; 60 | } 61 | 62 | 63 | .hljs-class .hljs-title, 64 | .hljs-type, 65 | .hljs-built_in, 66 | .hljs-builtin-name, 67 | .hljs-params { 68 | color: #5c2699; 69 | } 70 | 71 | .hljs-attr { 72 | color: #836C28; 73 | } 74 | 75 | .hljs-subst { 76 | color: #000; 77 | } 78 | 79 | .hljs-formula { 80 | background-color: #eee; 81 | font-style: italic; 82 | } 83 | 84 | .hljs-addition { 85 | background-color: #baeeba; 86 | } 87 | 88 | .hljs-deletion { 89 | background-color: #ffc8bd; 90 | } 91 | 92 | .hljs-selector-id, 93 | .hljs-selector-class { 94 | color: #9b703f; 95 | } 96 | 97 | .hljs-doctag, 98 | .hljs-strong { 99 | font-weight: bold; 100 | } 101 | 102 | .hljs-emphasis { 103 | font-style: italic; 104 | } 105 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/xt256.css: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | xt256.css 4 | 5 | Contact: initbar [at] protonmail [dot] ch 6 | : github.com/initbar 7 | */ 8 | 9 | .hljs { 10 | display: block; 11 | overflow-x: auto; 12 | color: #eaeaea; 13 | background: #000; 14 | padding: 0.5em; 15 | } 16 | 17 | .hljs-subst { 18 | color: #eaeaea; 19 | } 20 | 21 | .hljs-emphasis { 22 | font-style: italic; 23 | } 24 | 25 | .hljs-strong { 26 | font-weight: bold; 27 | } 28 | 29 | .hljs-builtin-name, 30 | .hljs-type { 31 | color: #eaeaea; 32 | } 33 | 34 | .hljs-params { 35 | color: #da0000; 36 | } 37 | 38 | .hljs-literal, 39 | .hljs-number, 40 | .hljs-name { 41 | color: #ff0000; 42 | font-weight: bolder; 43 | } 44 | 45 | .hljs-comment { 46 | color: #969896; 47 | } 48 | 49 | .hljs-selector-id, 50 | .hljs-quote { 51 | color: #00ffff; 52 | } 53 | 54 | .hljs-template-variable, 55 | .hljs-variable, 56 | .hljs-title { 57 | color: #00ffff; 58 | font-weight: bold; 59 | } 60 | 61 | .hljs-selector-class, 62 | .hljs-keyword, 63 | .hljs-symbol { 64 | color: #fff000; 65 | } 66 | 67 | .hljs-string, 68 | .hljs-bullet { 69 | color: #00ff00; 70 | } 71 | 72 | .hljs-tag, 73 | .hljs-section { 74 | color: #000fff; 75 | } 76 | 77 | .hljs-selector-tag { 78 | color: #000fff; 79 | font-weight: bold; 80 | } 81 | 82 | .hljs-attribute, 83 | .hljs-built_in, 84 | .hljs-regexp, 85 | .hljs-link { 86 | color: #ff00ff; 87 | } 88 | 89 | .hljs-meta { 90 | color: #fff; 91 | font-weight: bolder; 92 | } 93 | -------------------------------------------------------------------------------- /website/src/main/public/stylesheets/highlightjs/zenburn.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Zenburn style from voldmar.ru (c) Vladimir Epifanov 4 | based on dark.css by Ivan Sagalaev 5 | 6 | */ 7 | 8 | .hljs { 9 | display: block; 10 | overflow-x: auto; 11 | padding: 0.5em; 12 | background: #3f3f3f; 13 | color: #dcdcdc; 14 | } 15 | 16 | .hljs-keyword, 17 | .hljs-selector-tag, 18 | .hljs-tag { 19 | color: #e3ceab; 20 | } 21 | 22 | .hljs-template-tag { 23 | color: #dcdcdc; 24 | } 25 | 26 | .hljs-number { 27 | color: #8cd0d3; 28 | } 29 | 30 | .hljs-variable, 31 | .hljs-template-variable, 32 | .hljs-attribute { 33 | color: #efdcbc; 34 | } 35 | 36 | .hljs-literal { 37 | color: #efefaf; 38 | } 39 | 40 | .hljs-subst { 41 | color: #8f8f8f; 42 | } 43 | 44 | .hljs-title, 45 | .hljs-name, 46 | .hljs-selector-id, 47 | .hljs-selector-class, 48 | .hljs-section, 49 | .hljs-type { 50 | color: #efef8f; 51 | } 52 | 53 | .hljs-symbol, 54 | .hljs-bullet, 55 | .hljs-link { 56 | color: #dca3a3; 57 | } 58 | 59 | .hljs-deletion, 60 | .hljs-string, 61 | .hljs-built_in, 62 | .hljs-builtin-name { 63 | color: #cc9393; 64 | } 65 | 66 | .hljs-addition, 67 | .hljs-comment, 68 | .hljs-quote, 69 | .hljs-meta { 70 | color: #7f9f7f; 71 | } 72 | 73 | 74 | .hljs-emphasis { 75 | font-style: italic; 76 | } 77 | 78 | .hljs-strong { 79 | font-weight: bold; 80 | } 81 | -------------------------------------------------------------------------------- /website/src/main/resources/doc/examples/index.md: -------------------------------------------------------------------------------- 1 | [Basic routing](/examples/basic-routing/live) 2 | 3 | [Path matching](/examples/path-matching/live) 4 | 5 | [Recursive path matching](/examples/recursive-path-matching/live) 6 | 7 | [Query parameters](/examples/query-parameters/live) 8 | 9 | [Custom directives](/examples/custom-directives/live) 10 | 11 | [Signal](/examples/signal/live) 12 | 13 | [Auth](/examples/auth/live) 14 | 15 | [Tabs](/examples/tabs/live) 16 | 17 | [Nested](/examples/nested/live) 18 | -------------------------------------------------------------------------------- /website/src/main/resources/doc/getting-started/drafts.md: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | Under the hood, a route is defined by a function, with a signature that approximately looks like 5 | this: `Signal[Location] => Option[Element]` 6 | (the actual signature is a bit more complicated, but that is an implementation detail, and we will not be dealing with 7 | it directly). `Location` is an equivalent of the 8 | [Window.location](https://developer.mozilla.org/en-US/docs/Web/API/Window/location). Because we're in a single page 9 | application, and `Window.location` can change dynamically, the "current location" is modeled as a `Signal[Location]`. 10 | 11 |
12 | 13 | --- 14 | 15 |
16 | 17 | This looks and behaves very similar to nested routes: 18 | 19 | ```scala 20 | pathPrefix("posts") { 21 | div( 22 | path(segment) { 23 | postId 24 | div("Post ID: $postId") 25 | } 26 | ) 27 | } 28 | ``` 29 | 30 | The difference is that in case of "nested directives", there will be a single modifier applied to the element and a 31 | single subscription to the location signal that will drive the whole "tree of routes". 32 |
33 | 34 | 35 | -------------------------------------------------------------------------------- /website/src/main/resources/doc/getting-started/index.md: -------------------------------------------------------------------------------- 1 | [Laminar basics](/getting-started/laminar-basics) 2 | 3 | A quick intro into Laminar. 4 | 5 | [First routes](/getting-started/first-routes) 6 | 7 | First steps and main concepts. 8 | 9 | [Handling 'Not Found'](/getting-started/handling-not-found) 10 | 11 | Displaying an element when none of the routes matches. 12 | 13 | [Links and Navigation](/getting-started/links-and-navigation) 14 | 15 | Single-page app navigation. 16 | 17 | [Building routes](/getting-started/building-routes) 18 | 19 | Use-cases and examples. 20 | 21 | [Nested routes](/getting-started/nested-routes) 22 | 23 | Splitting the routes across nested components. -------------------------------------------------------------------------------- /website/src/main/resources/doc/reference/conjunction.md: -------------------------------------------------------------------------------- 1 | # Conjunction 2 | 3 | Directives can be combined using the `&` operator. 4 | 5 | The resulting directive will match only if both the combined directives match. 6 | 7 | The resulting directive will provide the values provided by the combined directives 8 | in a tuple (except `Unit`s) 9 | 10 | If only one of the combined directives provides a non-`Unit` value, and it's a scalar – the conjunction will provide 11 | a scalar as well (it will not wrap it into a 1-tuple). 12 | 13 | If both combined directives provide a `Unit` — the conjunction will provide a `Unit` as well. 14 | 15 | See the [tuplez](https://github.com/tulz-app/tuplez/) library for more details. 16 | 17 | ```scala 18 | (path("page-1") & param("param-1") & param("param-2")) { (param2, param2) => 19 | ??? 20 | } 21 | ``` 22 | 23 | Equivalent to "nesting": 24 | 25 | ```scala 26 | path("page-1") { 27 | param("param-1") { param1 => 28 | param("param-2") { param2 => 29 | ??? 30 | } 31 | } 32 | } 33 | 34 | ``` 35 | -------------------------------------------------------------------------------- /website/src/main/resources/doc/reference/custom-directives.md: -------------------------------------------------------------------------------- 1 | `TODO` 2 | 3 | 4 | ### `reject` 5 | 6 | ```scala 7 | val reject: Route 8 | ``` 9 | 10 | Returns a `Route` that always rejects. 11 | 12 | 13 | 14 | 15 | # Custom directives 16 | 17 | In order to create a custom directive, you should start with an existing one and build 18 | your directive using the combinators that directives provide: 19 | 20 | * `map[R](f: L => R): Directive[R]` 21 | * `flatMap[R](next: L => Directive[R]): Directive[R]` 22 | * `collect[R](f: PartialFunction[L, R]): Directive[R]` 23 | * `filter(predicate: L => Boolean): Directive[L]` 24 | 25 | ## Example 26 | 27 | Say, you wanted to check if the next segment in the path is a number. 28 | 29 | Let's create an `asNumber` directive which we will use like this: 30 | 31 | ```scala 32 | path("user" / segment) { userId => 33 | asNumber(userId) { userIdAsInt => 34 | userByIdPage(userId) 35 | } 36 | } 37 | ``` 38 | 39 |
40 | For this particular case, using the `long` path matcher would make much more sense, but let's try this anyway, 41 | to keep things simple. 42 |
43 | 44 | ```scala 45 | def asNumber(s: String): Directive[Int] = 46 | Try(s.toInt) match { 47 | case Success(int) => provide(int) 48 | case Failure(_) => reject 49 | } 50 | ``` 51 | 52 |
53 | This is an extremely simple example, but most directives, no matter how complicated, can be 54 | derived as easily from the more powerful existing directives and more powerful combinators (like, for example, 55 | the `signal` directive or the `flatMap` combinator). 56 |
57 | 58 | [Live example](/examples/custom-directives) 59 | -------------------------------------------------------------------------------- /website/src/main/resources/doc/reference/disjunction.md: -------------------------------------------------------------------------------- 1 | # Disjunction 2 | 3 | Directives can be combined using the `|` operator. 4 | 5 | The resulting directive will match if any of the combined directives match. 6 | 7 | The resulting directive will provide the value provided by the first of the combined directives 8 | that matches (the remaining directives are not evaluated). 9 | 10 | ```scala 11 | (path("page-1") | path("page-1-alternative")) { 12 | ??? 13 | } 14 | ``` 15 | 16 | ```scala 17 | (param("param-1") | param("param-2") | param("param-3")) { valueFromParam1or2or3 => 18 | ??? 19 | } 20 | ``` 21 | -------------------------------------------------------------------------------- /website/src/main/resources/doc/reference/first-match.md: -------------------------------------------------------------------------------- 1 | # `firstMatch` 2 | 3 | `firstMatch` takes a list of routes and returns a new route which tries to apply the alternatives in the order 4 | they are provided, until one of them matches. Rejects if all the alternatives reject. 5 | 6 | ```scala 7 | firstMatch( 8 | pathEnd { /*...*/ }, 9 | pathPrefix("pages") { 10 | firstMatch( 11 | path("page-1") { /*...*/ }, 12 | path("page-2") { /*...*/ } 13 | ) 14 | } 15 | ) 16 | ``` 17 | -------------------------------------------------------------------------------- /website/src/main/resources/doc/reference/index.md: -------------------------------------------------------------------------------- 1 | # Directives 2 | 3 | * [Built-in directives](/reference/directives) 4 | * [.signal directive](/reference/signal-directive) 5 | * [Injecting external signal](/reference/injecting-external-signal) 6 | * [Conjunction (&)](/reference/conjunction) 7 | * [Disjunction (|)](/reference/disjunction) 8 | 9 | # Path matchers 10 | 11 | * [Built-in path matchers](/reference/path-matchers) 12 | -------------------------------------------------------------------------------- /website/src/main/resources/doc/reference/navigation.md: -------------------------------------------------------------------------------- 1 | # Navigation 2 | 3 | `BrowserNavigation` object contains a set of utility methods for programmatic navigation. 4 | 5 | 6 | 7 | ### pushState / replaceState 8 | 9 | ```scala 10 | def pushState( 11 | data: js.Any = js.undefined, 12 | title: String = "", 13 | url: js.UndefOr[String] = js.undefined, 14 | popStateEvent: Boolean = true 15 | ): Unit 16 | 17 | def replaceState( 18 | url: js.UndefOr[String] = js.undefined, 19 | title: String = "", 20 | data: js.Any = js.undefined, 21 | popStateEvent: Boolean = true 22 | ): Unit 23 | ``` 24 | 25 | These methods should be used for navigation instead of directly calling `window.history.pushState` / `window.history.replaceState`. 26 | 27 | If `popStateEvent` is `true`, `emitPopStateEvent` will be invoked as well (the browser does not emit this event in case of 28 | programmatic history push/replace). 29 | 30 | 31 | 32 | ### emitPopStateEvent 33 | 34 | ```scala 35 | def emitPopStateEvent(): Unit 36 | ``` 37 | 38 | Emits (`dom.window.dispatchEvent`) a `popstate` event. 39 | 40 | 41 | ### preserveScroll 42 | 43 | ```scala 44 | def preserveScroll(keep: Boolean): Unit 45 | ``` 46 | 47 | Configures whether `BrowserNavigation` should preserve the window scroll location (in the history state) when pushing state (`pushState`). 48 | 49 | 50 | ## restoreScroll 51 | 52 | ```scala 53 | def restoreScroll(): Unit 54 | ``` 55 | 56 | If scroll position is available in the current history state — scrolls the window to that position. You might want to use this after you render your content and want the `back`/`forward` buttons 57 | to get the user to the position on the page where they used to be before navigation. 58 | -------------------------------------------------------------------------------- /website/src/main/resources/doc/reference/signal-directive.md: -------------------------------------------------------------------------------- 1 | # .signal 2 | 3 | ```scala 4 | (d: Directive[L]).signal: Directive[Signal[L]] 5 | ``` 6 | 7 | Transforms a `Directive[L]` into a `Directive[Signal[L]]`. 8 | 9 | Whenever you have a directive, you can call the `.signal` function on it. 10 | 11 | ```scala 12 | param("param-name").signal { (paramSignal: Signal[String]) => 13 | /* ... */ 14 | } 15 | ``` 16 | 17 | ## When would this be useful? 18 | 19 | Consider the following example: 20 | 21 | ```scala 22 | def MyPage(selectedTab: String): Element = ??? 23 | 24 | pathPrefix("dashboard") { 25 | maybeParam("tab").map(_.getOrElse("summary")) { (selectedTab: String) => 26 | MyPage(selectedTab) 27 | } 28 | } 29 | ``` 30 | 31 | In this case, whenever the query string changes to have a different value for the `tab` parameter, the route will 32 | be re-evaluated and `MyPage(selectedTab)` will be called again. 33 | 34 | For example, you might not want to re-render the whole page from scratch whenever `selectedTab` 35 | changes. Rather, you might want to keep the rendered page with all the DOM and state, and only change a visibility of 36 | some elements on the page according to the `selectedTab` parameter. 37 | 38 | To achieve that, you can use the `.signal` combinator: 39 | 40 | ```scala 41 | def MyPage(selectedTab: Signal[String]): Element = ??? 42 | 43 | pathPrefix("dashboard") { 44 | maybeParam("tab").map(_.getOrElse("summary")).signal { (selectedTab: Signal[String]) => 45 | MyPage(selectedTab) 46 | } 47 | } 48 | ``` 49 | 50 | The `selectedTab` is now a `Signal[String]` (not a `String`), and when the `tab` parameter changes, 51 | `MyPage` will not be called again — rather, the value inside the 52 | `selectedTab` signal will change, and you can react to it in your rendering logic. 53 | -------------------------------------------------------------------------------- /website/src/main/resources/doc/reference/under-the-hood/route.md: -------------------------------------------------------------------------------- 1 | # Route 2 | 3 | `Route` is a `Modifier`, which wraps a function that accepts the current location, 4 | the previous routing state and the current routing state: 5 | 6 | ```scala 7 | trait Route extends ((RouteLocation, RoutingState, RoutingState) => Signal[RouteResult]) with Mod[HtmlElement] 8 | ``` 9 | 10 | The result of the `Route` function is either a match or a rejection. 11 | 12 | ```scala 13 | object RouteResult { 14 | 15 | final case class Matched(state: RoutingState, location: RouteLocation, result: () => Signal[Element]) extends RouteResult 16 | 17 | case object Rejected extends RouteResult 18 | 19 | } 20 | ``` 21 | 22 | When a route matches, it returns the remaining part of the location (which can subsequently be used in the 23 | nested routes), the updated `RoutingState`, and the `Element` to be rendered (inside a `Signal`). 24 | 25 | A `Route` acts like the `child.maybe <-- ...` modifier. When a `Route` is mounted, it subscribes to the relevant `Signal[Location]` 26 | and reacts to changes in it: 27 | 28 | * if it's a match, the `Route` inserts the result into the parent element; 29 | * if it's a rejection, it removes the previous result (if any) from the parent element; 30 | 31 | There is a top-level location signal, which is derived directly from `window.location`, and changes 32 | whenever a [popstate event](https://developer.mozilla.org/en-US/docs/Web/API/Window/popstate_event) 33 | is emitted. Top-level routes will be subscribing to this signal. 34 | 35 | Routes can (and often do) "consume" parts of the path in the location, leaving the remaining path for 36 | the nested routes. Nested routes do not subscribe to the top-level location signal: rather, they get their own signals 37 | with a location that may have been partially "consumed" by the parent routes. 38 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/Page.scala: -------------------------------------------------------------------------------- 1 | package frontroute.site 2 | 3 | import com.raquo.laminar.api.L.* 4 | 5 | final class Page private ( 6 | val path: String, 7 | val link: String, 8 | val title: String, 9 | val render: () => Element 10 | ) 11 | 12 | object Page { 13 | 14 | def apply( 15 | path: String, 16 | link: String, 17 | title: String, 18 | render: => Element 19 | ): Page = new Page( 20 | path, 21 | link, 22 | title, 23 | () => render 24 | ) 25 | 26 | } 27 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/SiteModule.scala: -------------------------------------------------------------------------------- 1 | package frontroute.site 2 | 3 | class SiteModule private ( 4 | val path: String, 5 | val title: String, 6 | val index: Page, 7 | val navigation: Seq[(String, Seq[Page])] 8 | ) { 9 | 10 | def findPage(path: String): Option[Page] = { 11 | navigation.flatMap(_._2).find(_.path == path) 12 | } 13 | 14 | } 15 | 16 | object SiteModule { 17 | 18 | def apply( 19 | path: String, 20 | title: String, 21 | index: Page, 22 | navigation: (String, Seq[Page])* 23 | ): SiteModule = new SiteModule(path, title, index, navigation) 24 | 25 | } 26 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/SsrContext.scala: -------------------------------------------------------------------------------- 1 | package frontroute.site 2 | 3 | case class SsrContext( 4 | ssr: Boolean 5 | ) 6 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/Wiring.scala: -------------------------------------------------------------------------------- 1 | package frontroute.site 2 | 3 | import org.scalajs.dom 4 | 5 | class Wiring( 6 | val ssrContext: SsrContext, 7 | val routes: Routes 8 | ) 9 | 10 | object Wiring { 11 | 12 | def apply(): Wiring = { 13 | new Wiring( 14 | ssrContext = SsrContext( 15 | ssr = dom.window.navigator.userAgent == "frontroute/ssr" 16 | ), 17 | routes = new Routes 18 | ) 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/components/DocumentationDisplay.scala: -------------------------------------------------------------------------------- 1 | package frontroute.site.components 2 | 3 | import io.laminext.highlight.Highlight 4 | import com.raquo.laminar.api.L.* 5 | import io.laminext.syntax.dangerous.* 6 | 7 | object DocumentationDisplay { 8 | 9 | def apply(title: String, markdown: String): Element = 10 | div( 11 | cls := "space-y-4", 12 | h1( 13 | cls := "font-display text-3xl font-bold text-gray-900 tracking-wider md:hidden", 14 | title 15 | ), 16 | div( 17 | cls := "prose prose-blue max-w-none", 18 | unsafeInnerHtml := markdown, 19 | onMountCallback { ctx => 20 | ctx.thisNode.ref.querySelectorAll("pre > code").foreach { codeElement => 21 | Highlight.highlightElement(codeElement) 22 | } 23 | } 24 | ) 25 | ) 26 | 27 | } 28 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/examples/CodeExample.scala: -------------------------------------------------------------------------------- 1 | package frontroute.site.examples 2 | 3 | import com.raquo.laminar.api.L.* 4 | 5 | abstract class CodeExample( 6 | val id: String, 7 | val title: String, 8 | val description: String, 9 | val links: Seq[String] 10 | )( 11 | _code: sourcecode.Text[() => Element] 12 | ) { 13 | 14 | val code: sourcecode.Text[() => Element] = _code 15 | 16 | } 17 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/examples/ex_advanced_params/AdvancedParamsExample.scala: -------------------------------------------------------------------------------- 1 | package frontroute.site.examples.ex_advanced_params 2 | 3 | import com.yurique.embedded.FileAsString 4 | import frontroute.site.examples.CodeExample 5 | 6 | object AdvancedParamsExample 7 | extends CodeExample( 8 | id = "advanced-query-parameters", 9 | title = "Advanced query parameters", 10 | description = FileAsString("description.md"), 11 | links = Seq( 12 | "/", 13 | "/movies", 14 | "/movies?page=1", 15 | "/movies?page=2", 16 | "/movies?page=3", 17 | ) 18 | )(() => { 19 | import com.raquo.laminar.api.L.* 20 | import frontroute.* 21 | import scala.util.Try 22 | 23 | /* */ 24 | def intParam(name: String): Directive[Int] = 25 | param(name).emap { string => 26 | Try(string.toInt).toEither 27 | } 28 | /* */ 29 | 30 | routes( 31 | div( 32 | cls := "p-4 min-h-[300px]", 33 | pathEnd { 34 | div(cls := "text-2xl", "Index page.") 35 | }, 36 | /* */ 37 | (path("movies") & intParam("page").opt.default(0)) { movieId => 38 | /* */ 39 | div(div(cls := "text-2xl", "Movie page."), div(s"Movies, page: $movieId")) 40 | /* */ 41 | }, 42 | /* */ 43 | (noneMatched & extractUnmatchedPath) { unmatched => 44 | div( 45 | div(cls := "text-2xl", "Not Found"), 46 | div(unmatched.mkString("/", "/", "")) 47 | ) 48 | } 49 | ) 50 | ) 51 | }) 52 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/examples/ex_advanced_params/description.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/examples/ex_auth/description.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/examples/ex_basic/description.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/examples/ex_custom_directives/CustomDirectivesExample.scala: -------------------------------------------------------------------------------- 1 | package frontroute.site 2 | package examples 3 | package ex_custom_directives 4 | 5 | import com.yurique.embedded.FileAsString 6 | 7 | object CustomDirectivesExample 8 | extends CodeExample( 9 | id = "custom-directives", 10 | title = "Custom directives", 11 | description = FileAsString("description.md"), 12 | links = Seq( 13 | "/", 14 | "/movie?id=1", 15 | "/movie?id=2", 16 | "/movie?id=not-long" 17 | ) 18 | )(() => { 19 | import com.raquo.laminar.api.L.* 20 | import frontroute.* 21 | import scala.util.* 22 | 23 | def longParam(paramName: String): Directive[Long] = 24 | /* */ 25 | param(paramName).flatMap { paramValue => 26 | Try(paramValue.toLong).fold( 27 | _ => reject, 28 | parsed => provide(parsed) 29 | ) 30 | } 31 | /* */ 32 | 33 | routes( 34 | div( 35 | cls := "p-4 min-h-[300px]", 36 | pathEnd { 37 | div(cls := "text-2xl", "Index page.") 38 | }, 39 | ( 40 | path("movie") & 41 | /* */ 42 | longParam("id") 43 | /* */ 44 | ) { movieId => 45 | div(div(cls := "text-2xl", "Movie page."), div(s"Movie ID (long): $movieId")) 46 | }, 47 | (noneMatched & extractUnmatchedPath) { unmatched => 48 | div( 49 | div(cls := "text-2xl", "Not Found"), 50 | div(unmatched.mkString("/", "/", "")) 51 | ) 52 | } 53 | ) 54 | ) 55 | }) 56 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/examples/ex_custom_directives/description.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/examples/ex_effect/EffectExample.scala: -------------------------------------------------------------------------------- 1 | package frontroute.site.examples.ex_effect 2 | 3 | import frontroute.site.examples.CodeExample 4 | import com.yurique.embedded.FileAsString 5 | 6 | object EffectExample 7 | extends CodeExample( 8 | id = "run-effect", 9 | title = "Run Effect", 10 | description = FileAsString("description.md"), 11 | links = Seq( 12 | "/", 13 | "/effect-1", 14 | "/effect-2", 15 | "/some-page" 16 | ) 17 | )(() => { 18 | import frontroute.* 19 | 20 | import com.raquo.laminar.api.L.* 21 | import org.scalajs.dom 22 | 23 | routes( 24 | div( 25 | cls := "p-4 min-h-[300px]", 26 | /* */ 27 | pathEnd { 28 | /* */ 29 | div(cls := "text-2xl", "Index page.") 30 | /* */ 31 | }, 32 | path("effect-1") { 33 | runEffect { 34 | dom.console.log("effect 1") 35 | } 36 | }, 37 | path("effect-2") { 38 | runEffect { 39 | dom.console.log("effect 2") 40 | } 41 | }, 42 | /* */ 43 | (noneMatched & extractUnmatchedPath) { unmatched => 44 | div( 45 | div(cls := "text-2xl", "Not Found"), 46 | div(unmatched.mkString("/", "/", "")) 47 | ) 48 | } 49 | ) 50 | ) 51 | }) 52 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/examples/ex_effect/description.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/examples/ex_execute/ExecuteExample.scala: -------------------------------------------------------------------------------- 1 | package frontroute.site.examples.ex_execute 2 | 3 | import frontroute.site.examples.CodeExample 4 | import com.yurique.embedded.FileAsString 5 | 6 | object ExecuteExample 7 | extends CodeExample( 8 | id = "execute", 9 | title = "Execute", 10 | description = FileAsString("description.md"), 11 | links = Seq( 12 | "/", 13 | "/execute-1", 14 | "/execute-2", 15 | "/execute-2/sub-1", 16 | "/execute-2/sub-2", 17 | "/execute-2/sub-2/sub-sub-1", 18 | "/execute-2/sub-2/sub-sub-2", 19 | "/some-page" 20 | ) 21 | )(() => { 22 | import frontroute.* 23 | import com.raquo.laminar.api.L.* 24 | import org.scalajs.dom 25 | 26 | routes( 27 | div( 28 | cls := "p-4 min-h-[300px]", 29 | pathEnd.execute { 30 | dom.console.log("root") 31 | }, 32 | path("execute-1").execute { 33 | dom.console.log("execute-1") 34 | }, 35 | pathPrefix("execute-2") { 36 | firstMatch( 37 | pathEnd.execute { 38 | dom.console.log("execute-2") 39 | }, 40 | path(segment).execute { s => 41 | dom.console.log(s"execute-2/${s}") 42 | }, 43 | path(segment / segment).execute { case (s1, s2) => 44 | dom.console.log(s"execute-2/${s1}/${s2}") 45 | }, 46 | ) 47 | }, 48 | (noneMatched & extractUnmatchedPath) { unmatched => 49 | div( 50 | div(cls := "text-2xl", "Not Found"), 51 | div(unmatched.mkString("/", "/", "")) 52 | ) 53 | } 54 | ) 55 | ) 56 | }) 57 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/examples/ex_execute/description.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/examples/ex_extract_matched_path/description.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/examples/ex_matched_path/description.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/examples/ex_multiparams/MultiParamsExample.scala: -------------------------------------------------------------------------------- 1 | package frontroute.site.examples.ex_multiparams 2 | 3 | import com.yurique.embedded.FileAsString 4 | import frontroute.site.examples.CodeExample 5 | 6 | object MultiParamsExample 7 | extends CodeExample( 8 | id = "multi-parameters", 9 | title = "Query multi-parameters", 10 | description = FileAsString("description.md"), 11 | links = Seq( 12 | "/", 13 | "/movies/search?director=cameron&director=spielberg&year=1991&year=1992&year=1993", 14 | "/movies/search?director=cameron&director=quentin", 15 | "/movies/search?year=1991&year=1992&year=1994&year=1995" 16 | ) 17 | )(() => { 18 | import com.raquo.laminar.api.L.* 19 | import frontroute.* 20 | 21 | routes( 22 | div( 23 | cls := "p-4 min-h-[300px]", 24 | pathEnd { 25 | div(cls := "text-2xl", "Index page.") 26 | }, 27 | /* */ 28 | ( 29 | path("movies" / "search") & 30 | multiParam("director") & 31 | multiParam("year") 32 | ) { (maybeDirector, maybeYear) => 33 | /* */ 34 | div(div(cls := "text-2xl", "Movie search page."), div(s"Director: $maybeDirector"), div(s"Year: $maybeYear")) 35 | /* */ 36 | }, 37 | /* */ 38 | (noneMatched & extractUnmatchedPath) { unmatched => 39 | div( 40 | div(cls := "text-2xl", "Not Found"), 41 | div(unmatched.mkString("/", "/", "")) 42 | ) 43 | } 44 | ) 45 | ) 46 | }) 47 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/examples/ex_multiparams/description.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/examples/ex_navigate/description.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/examples/ex_navmod/description.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/examples/ex_nested/description.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/examples/ex_params/ParamsExample.scala: -------------------------------------------------------------------------------- 1 | package frontroute.site 2 | package examples 3 | package ex_params 4 | 5 | import com.yurique.embedded.FileAsString 6 | 7 | object ParamsExample 8 | extends CodeExample( 9 | id = "query-parameters", 10 | title = "Query parameters", 11 | description = FileAsString("description.md"), 12 | links = Seq( 13 | "/", 14 | "/movie?id=2356777", 15 | "/movie?id=0306414", 16 | "/movies/search?director=cameron&year=1991", 17 | "/movies/search?director=cameron", 18 | "/movies/search?year=1991" 19 | ) 20 | )(() => { 21 | import com.raquo.laminar.api.L.* 22 | import frontroute.* 23 | 24 | routes( 25 | div( 26 | cls := "p-4 min-h-[300px]", 27 | pathEnd { 28 | div(cls := "text-2xl", "Index page.") 29 | }, 30 | /* */ 31 | (path("movie") & param("id")) { movieId => 32 | /* */ 33 | div(div(cls := "text-2xl", "Movie page."), div(s"Movie ID: $movieId")) 34 | /* */ 35 | }, 36 | /* */ 37 | /* */ 38 | ( 39 | path("movies" / "search") & 40 | maybeParam("director") & 41 | maybeParam("year") 42 | ) { (maybeDirector, maybeYear) => 43 | /* */ 44 | div(div(cls := "text-2xl", "Movie search page."), div(s"Director: $maybeDirector"), div(s"Year: $maybeYear")) 45 | /* */ 46 | }, 47 | /* */ 48 | (noneMatched & extractUnmatchedPath) { unmatched => 49 | div( 50 | div(cls := "text-2xl", "Not Found"), 51 | div(unmatched.mkString("/", "/", "")) 52 | ) 53 | } 54 | ) 55 | ) 56 | }) 57 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/examples/ex_params/description.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/examples/ex_path_matching/description.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/examples/ex_recursive_path_matching/RecursivePathMatchingExample.scala: -------------------------------------------------------------------------------- 1 | package frontroute.site 2 | package examples 3 | package ex_recursive_path_matching 4 | 5 | import com.yurique.embedded.FileAsString 6 | 7 | object RecursivePathMatchingExample 8 | extends CodeExample( 9 | id = "recursive-path-matching", 10 | title = "Recursive path matching", 11 | description = FileAsString("description.md"), 12 | links = Seq( 13 | "/", 14 | "/recursive", 15 | "/recursive/1", 16 | "/recursive/1/2", 17 | "/recursive/1/2/3", 18 | "/recursive/1/2/3/4", 19 | "/recursive/1/2/3/4/5" 20 | ) 21 | )(() => { 22 | import com.raquo.laminar.api.L.* 23 | import frontroute.* 24 | 25 | def recursivePathMatch: Directive[List[String]] = 26 | /* */ 27 | pathEnd.mapTo(List.empty[String]) | pathPrefix(segment).flatMap { head => 28 | recursivePathMatch.map { rest => 29 | head :: rest 30 | } 31 | } 32 | /* */ 33 | 34 | routes( 35 | div( 36 | cls := "p-4 min-h-[300px]", 37 | pathEnd { 38 | div(cls := "text-2xl", "Index page.") 39 | }, 40 | ( 41 | pathPrefix("recursive") & 42 | /* */ 43 | recursivePathMatch 44 | /* */ 45 | ) { segments => 46 | div(div(cls := "text-2xl", "Recursive page."), div(s"Segments: ${segments.mkString(", ")}")) 47 | }, 48 | (noneMatched & extractUnmatchedPath) { unmatched => 49 | div( 50 | div(cls := "text-2xl", "Not Found"), 51 | div(unmatched.mkString("/", "/", "")) 52 | ) 53 | } 54 | ) 55 | ) 56 | }) 57 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/examples/ex_recursive_path_matching/description.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/examples/ex_tabs/description.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/examples/package.scala: -------------------------------------------------------------------------------- 1 | package frontroute.site 2 | 3 | import com.raquo.laminar.api.L.* 4 | 5 | package object examples { 6 | 7 | type TitledExample[E <: Element] = (String, sourcecode.Text[E]) 8 | 9 | } 10 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/layout/PageFooter.scala: -------------------------------------------------------------------------------- 1 | package frontroute.site.layout 2 | 3 | import com.raquo.laminar.api.L.* 4 | import com.raquo.laminar.nodes.ReactiveHtmlElement 5 | 6 | object PageFooter { 7 | 8 | def apply( 9 | ): ReactiveHtmlElement.Base = 10 | div( 11 | cls := "hidden bg-gray-900 text-white p-4" 12 | ) 13 | 14 | } 15 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/layout/PageWrap.scala: -------------------------------------------------------------------------------- 1 | package frontroute.site.layout 2 | 3 | import frontroute.site.Page 4 | import frontroute.site.Site 5 | import frontroute.site.SiteModule 6 | import frontroute.site.Styles 7 | import com.raquo.laminar.api.L.* 8 | import io.laminext.syntax.core.* 9 | import io.laminext.syntax.tailwind.* 10 | import com.raquo.laminar.nodes.ReactiveHtmlElement 11 | 12 | object PageWrap { 13 | 14 | def apply( 15 | $page: Signal[Option[(SiteModule, Page)]], 16 | menuObserver: Observer[Option[ModalContent]] 17 | ): ReactiveHtmlElement.Base = { 18 | div( 19 | linkTag( 20 | rel := "stylesheet", 21 | href <-- Styles.highlightStyle.signal.map(s => Site.thisVersionHref(s"/stylesheets/highlightjs/${s}.css")) 22 | ), 23 | div( 24 | cls := "h-screen flex flex-col", 25 | PageHeader($page, menuObserver), 26 | noScriptTag( 27 | div( 28 | cls := "max-w-5xl border-l-4 border-red-400 bg-red-50 text-red-900 mx-auto p-4 font-condensed", 29 | "Your browser does not support JavaScript: some features of this site may not work properly." 30 | ) 31 | ), 32 | div( 33 | cls := "flex-1 flex overflow-hidden", 34 | PageNavigation($page).hiddenIf($page.optionMap(_._1).optionContains(Site.indexModule)), 35 | div( 36 | cls := "flex-1 bg-gray-200 overflow-auto md:p-4", 37 | div( 38 | cls := "lg:container lg:mx-auto lg:max-w-4xl lg:p-8 p-4 bg-white min-h-full flex flex-col", 39 | child.maybe <-- $page.optionMap { case (_, page) => page.render() } 40 | ) 41 | ) 42 | ), 43 | PageFooter() 44 | ) 45 | ) 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/pages/CodeExamplePage.scala: -------------------------------------------------------------------------------- 1 | package frontroute.site.pages 2 | 3 | import com.raquo.laminar.api.L.* 4 | import frontroute.site.components.CodeExampleDisplay 5 | import frontroute.site.examples.CodeExample 6 | 7 | object CodeExamplePage { 8 | 9 | def apply(example: CodeExample): Element = page(example.title) { 10 | CodeExampleDisplay(example) 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/pages/DocumentationPage.scala: -------------------------------------------------------------------------------- 1 | package frontroute.site.pages 2 | 3 | import com.raquo.laminar.api.L.* 4 | import frontroute.site.components.DocumentationDisplay 5 | 6 | object DocumentationPage { 7 | 8 | def apply(title: String, markdown: String): Element = page(title) { 9 | DocumentationDisplay(title, markdown) 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/pages/NotFoundPage.scala: -------------------------------------------------------------------------------- 1 | package frontroute.site.pages 2 | 3 | import com.raquo.laminar.api.L.* 4 | import frontroute.site.components.DocumentationDisplay 5 | 6 | object NotFoundPage { 7 | 8 | def apply(title: String, markdown: String): Element = page(title) { 9 | DocumentationDisplay(title, markdown) 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /website/src/main/scala/frontroute/site/pages/package.scala: -------------------------------------------------------------------------------- 1 | package frontroute.site 2 | 3 | import com.raquo.laminar.api.L.* 4 | import frontroute.* 5 | 6 | package object pages { 7 | 8 | def page( 9 | title: String, 10 | description: Option[String] = None, 11 | keywords: Option[String] = None, 12 | status: PageStatusCode = PageStatusCode.Ok 13 | )( 14 | content: => Element 15 | ): Element = 16 | content.amend( 17 | onMountCallback { _ => 18 | DocumentMeta.set( 19 | title = title, 20 | description = description, 21 | keywords = keywords, 22 | status = status 23 | ) 24 | } 25 | ) 26 | 27 | } 28 | -------------------------------------------------------------------------------- /website/src/main/static/fonts/Inter-VariableFont_slnt,wght.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tulz-app/frontroute/6f13ad036ae6dfb1c5b557e392a9bfda2c2654fe/website/src/main/static/fonts/Inter-VariableFont_slnt,wght.ttf -------------------------------------------------------------------------------- /website/src/main/static/fonts/JetBrainsMono-VariableFont_wght.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tulz-app/frontroute/6f13ad036ae6dfb1c5b557e392a9bfda2c2654fe/website/src/main/static/fonts/JetBrainsMono-VariableFont_wght.ttf -------------------------------------------------------------------------------- /website/src/main/static/fonts/Oxanium-VariableFont_wght.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tulz-app/frontroute/6f13ad036ae6dfb1c5b557e392a9bfda2c2654fe/website/src/main/static/fonts/Oxanium-VariableFont_wght.ttf -------------------------------------------------------------------------------- /website/src/main/static/stylesheets/fonts.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Inter'; 3 | src: url('../fonts/Inter-VariableFont_slnt,wght.ttf') format('truetype supports variations'), 4 | url('../fonts/Inter-VariableFont_slnt,wght.ttf') format('truetype-variations'); 5 | font-weight: 100 1000; 6 | font-stretch: 25% 151%; 7 | } 8 | @font-face { 9 | font-family: 'JetBrains Mono'; 10 | src: url('../fonts/JetBrainsMono-VariableFont_wght.ttf') format('truetype supports variations'), 11 | url('../fonts/JetBrainsMono-VariableFont_wght.ttf') format('truetype-variations'); 12 | font-weight: 100 1000; 13 | font-stretch: 25% 151%; 14 | } 15 | @font-face { 16 | font-family: 'Oxanium'; 17 | src: url('../fonts/Oxanium-VariableFont_wght.ttf') format('truetype supports variations'), 18 | url('../fonts/Oxanium-VariableFont_wght.ttf') format('truetype-variations'); 19 | font-weight: 100 1000; 20 | font-stretch: 25% 151%; 21 | } 22 | -------------------------------------------------------------------------------- /website/src/main/static/stylesheets/index.css: -------------------------------------------------------------------------------- 1 | @import './tailwind.css'; 2 | @import './fonts.css'; 3 | @import './markdown.css'; 4 | @import './buttons.css'; 5 | 6 | 7 | @layer base { 8 | 9 | body { 10 | @apply font-serif; 11 | } 12 | 13 | [type='text'], 14 | [type='email'], 15 | [type='url'], 16 | [type='password'], 17 | [type='number'], 18 | [type='date'], 19 | [type='datetime-local'], 20 | [type='month'], 21 | [type='search'], 22 | [type='tel'], 23 | [type='time'], 24 | [type='week'], 25 | [multiple], 26 | textarea, 27 | select { 28 | @apply shadow-sm focus:ring-blue-500 focus:border-blue-500 block w-full p-1 border-blue-300 rounded-md bg-blue-50 text-blue-700 placeholder-blue-400 font-mono; 29 | } 30 | 31 | } 32 | 33 | -------------------------------------------------------------------------------- /website/src/main/static/stylesheets/markdown.css: -------------------------------------------------------------------------------- 1 | .prose code:not(.hljs) { 2 | @apply bg-blue-50 !important; 3 | @apply hover:bg-blue-200 !important; 4 | @apply text-blue-900 !important; 5 | @apply px-1 !important; 6 | @apply rounded !important; 7 | } 8 | 9 | .prose code:not(.hljs):before { 10 | content: "" !important; 11 | } 12 | 13 | .prose code:not(.hljs):after { 14 | content: "" !important; 15 | } 16 | 17 | -------------------------------------------------------------------------------- /website/src/main/static/stylesheets/tailwind.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | @tailwind screens; 5 | -------------------------------------------------------------------------------- /website/stylelint.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: ['stylelint-config-recommended'], 3 | rules: { 4 | 'at-rule-no-unknown': [ true, { 5 | ignoreAtRules: [ 6 | 'tailwind', 7 | 'apply', 8 | 'variants', 9 | 'responsive', 10 | 'screen' 11 | ] 12 | }], 13 | 'declaration-block-trailing-semicolon': false, 14 | 'no-descending-specificity': null, 15 | 'max-nesting-depth': 10, 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /website/vite.config.js: -------------------------------------------------------------------------------- 1 | import {resolve} from 'path' 2 | import {createHtmlPlugin} from 'vite-plugin-html' 3 | import commonjs from '@rollup/plugin-commonjs'; 4 | import viteCompression from 'vite-plugin-compression'; 5 | import fs from 'fs' 6 | 7 | import scalaVersion from './scala-version' 8 | 9 | const frontrouteVersion = fs.readFileSync('.frontroute-version') 10 | 11 | // https://vitejs.dev/config/ 12 | export default ({mode}) => { 13 | const mainJS = `target/scala-${scalaVersion}/website-${mode === 'production' ? 'opt' : 'fastopt'}/main.js` 14 | const script = `` 15 | 16 | /** @type {import('vite').UserConfig} */ 17 | return { 18 | server: { 19 | port: 6080, 20 | }, 21 | base: `/v/${frontrouteVersion}/`, 22 | publicDir: './src/main/public', 23 | build: { 24 | outDir: `dist/v/${frontrouteVersion}`, 25 | }, 26 | optimizeDeps: { 27 | disabled: mode === 'production', 28 | }, 29 | plugins: [ 30 | ...(mode === 'production' ? [ 31 | commonjs(), 32 | viteCompression({ 33 | filter: /\.(js|css|html)$/i, 34 | algorithm: 'gzip' 35 | }), 36 | viteCompression({ 37 | filter: /\.(js|css|html)$/i, 38 | algorithm: 'brotliCompress' 39 | }), 40 | ] : []), 41 | createHtmlPlugin({ 42 | minify: mode === 'production', 43 | inject: { 44 | data: { 45 | script, 46 | pl: mode === 'production' ? '' : '' 47 | }, 48 | }, 49 | }), 50 | ], 51 | resolve: { 52 | alias: { 53 | 'stylesheets': resolve(__dirname, './src/main/static/stylesheets'), 54 | 'svg': resolve(__dirname, './src/main/static/svg'), 55 | } 56 | } 57 | } 58 | } 59 | --------------------------------------------------------------------------------