diff --git a/archetypes/default.md b/archetypes/default.md new file mode 100644 index 0000000..00e77bd --- /dev/null +++ b/archetypes/default.md @@ -0,0 +1,6 @@ +--- +title: "{{ replace .Name "-" " " | title }}" +date: {{ .Date }} +draft: true +--- + diff --git a/config.toml b/config.toml new file mode 100644 index 0000000..bc73855 --- /dev/null +++ b/config.toml @@ -0,0 +1,30 @@ +baseURL = 'http://restapitutorial.org/' +languageCode = 'en-us' +title = 'REST API Tutorial' +uglyURLs = true +# +# Change the default theme to hugo-theme-relearn +theme = "relearn" + +# For search functionality +[outputs] +home = [ "HTML", "RSS", "JSON"] + +[[menu.shortcuts]] +name = " GitHub repo" +identifier = "ds" +url = "https://github.com/McShelby/hugo-theme-relearn" +weight = 10 + +[[menu.shortcuts]] +name = " Tags" +url = "tags/" +weight = 40 + +[params] + editURL = "https://github.com/McShelby/hugo-theme-relearn/edit/main/exampleSite/content/" + description = "Learn REST API Design" + author = "Todd Fredrich" + collapsibleMenu = true + titleSeparator = " - " + themeVariant = [ "relearn-light", "relearn-dark" ] diff --git a/content/_index.md b/content/_index.md new file mode 100644 index 0000000..24c90eb --- /dev/null +++ b/content/_index.md @@ -0,0 +1,8 @@ +# Learn REST API Design + +Keyword-rich introductory content goes here. + +## Get Started + +1. Click the arrow in the upper-right corner to progress to the next section or +2. Use the left-hand menu to begin with [Chapter 1. The Basics](/basics) \ No newline at end of file diff --git a/content/advanced/_index.md b/content/advanced/_index.md new file mode 100644 index 0000000..7fd3dff --- /dev/null +++ b/content/advanced/_index.md @@ -0,0 +1,11 @@ ++++ +chapter = true +pre = "2. " +title = "Advanced API Design" +weight = 10 ++++ + +### Chapter 2 + +# The Seven Pillars of API Design +We Begin Our Journey in Designing Exquisite RESTful APIs. \ No newline at end of file diff --git a/content/basics/_index.md b/content/basics/_index.md new file mode 100644 index 0000000..f23c3f6 --- /dev/null +++ b/content/basics/_index.md @@ -0,0 +1,16 @@ ++++ +chapter = true +pre = "1. " +title = "The Basics" +weight = 5 ++++ + +### Chapter 1 + +# Learn REST API Basics +Quickly learn the basics of what REST is and the core concepts behind it. + +{{% notice style="tip" title="Here's a Quick Tip!" icon="exclamation-circle" %}} +Be on the lookout for Quick Tips in boxes like this throughout the course. They'll provide a jump-start to your super-powers +(or at least give you a leg up on getting your job done)! +{{% /notice %}} diff --git a/content/basics/httpmethods.md b/content/basics/httpmethods.md new file mode 100644 index 0000000..94830f7 --- /dev/null +++ b/content/basics/httpmethods.md @@ -0,0 +1,84 @@ +--- +title: "HTTP Methods" +date: 2022-06-07T16:31:51-06:00 +weight: 30 +--- +The HTTP verbs (or methods, as they are formally called) comprise a major portion of our “uniform interface” constraint and provide us the action counterpart to the noun-based resource. The primary or most-commonly-used HTTP verbs are POST, GET, PUT, PATCH, and DELETE. These correspond to create, read, update, and delete (or CRUD) operations, respectively. There are a number of other verbs, too, but are utilized less frequently. Of those less-frequent methods, OPTIONS and HEAD are used more often than others. + +Below is a table summarizing recommended return values of the primary HTTP methods in combination with the resource URIs: + +| Method | CRUD | Entire Collection (e.g. /customers) | Specific Item (e.g. /customers/{id}) | +| --------- | ---- | ----------------------------------- | ------------------------------------ | +| POST | Create | 201 (Created), 'Location' header with link to /customers/{id} containing new ID. | 404 (Not Found), 409 (Conflict) if resource already exists. | +| GET | Read | 200 (OK), list of customers. Use pagination, sorting and filtering to navigate big lists. | 200 (OK), single customer. 404 (Not Found), if ID not found or invalid. | +| PUT | Update/Replace | 405 (Method Not Allowed), unless you want to update/replace every resource in the entire collection. | 200 (OK) or 204 (No Content). 404 (Not Found), if ID not found or invalid. | +| PATCH | Update/Modify 405 (Method Not Allowed), unless you want to modify the collection itself. Which is possible if operating on the collection as a whole. | 200 (OK) or 204 (No Content). 404 (Not Found), if ID not found or invalid. | +| DELETE | Delete | 405 (Method Not Allowed), unless you want to delete the whole collection—not often desirable. | 200 (OK). 404 (Not Found), if ID not found or invalid. | + +Below is a more-detailed discussion of the main HTTP methods. +### POST +The POST verb is most-often utilized to *create* new a resource. In particular, it's used to create subordinate resources. That is, subordinate to some other (e.g. parent) resource. In other words, when creating a new resource, POST to the parent and the service takes care of associating the new resource with the parent, assigning an ID (new resource URI), etc. + +On successful creation, return HTTP status 201, returning a Location header with a link to the newly-created resource with the 201 HTTP status. + +POST is neither safe nor idempotent. It is therefore recommended for non-idempotent resource requests. Making two identical POST requests will most-likely result in two resources containing the same information. + +__Examples:__ +* POST http://www.example.com/customers +* POST http://www.example.com/customers/12345/orders + +### GET +The HTTP GET method is used to **read** (or retrieve) a representation of a resource. In the “happy” (or non-error) path, GET returns a representation in XML or JSON and an HTTP response code of 200 (OK). In an error case, it most often returns a 404 (NOT FOUND) or 400 (BAD REQUEST). + +According to the design of the HTTP specification, GET (along with HEAD) requests are used only to read data and not change it. Therefore, when used this way, they are considered safe. That is, they can be called without risk of data modification or corruption—calling it once has the same effect as calling it 10 times, or none at all. Additionally, GET (and HEAD) is idempotent, which means that making multiple identical requests ends up having the same result as a single request. + +Do not expose unsafe operations via GET—it should never modify any resources on the server. + +__Examples:__ +* GET http://www.example.com/customers/12345 +* GET http://www.example.com/customers/12345/orders +* GET http://www.example.com/buckets/sample + +### PUT +PUT is most-often utilized for *update* capabilities, PUT-ing to a known resource URI with the request body containing the newly-updated representation of the original resource. + +However, PUT can also be used to create a resource in the case where the resource ID is chosen by the client instead of by the server. In other words, if the PUT is to a URI that contains the value of a non-existent resource ID. Again, the request body contains a resource representation. Many feel this is convoluted and confusing. Consequently, this method of creation should be used sparingly, if at all. + +Alternatively, use POST to create new resources and provide the client-defined ID in the body representation—presumably to a URI that doesn't include the ID of the resource (see POST below). + +On successful update, return 200 (or 204 if not returning any content in the body) from a PUT. If using PUT for create, return HTTP status 201 on successful creation. A body in the response is optional—providing one consumes more bandwidth. It is not necessary to return a link via a Location header in the creation case since the client already set the resource ID. + +PUT is not a safe operation, in that it modifies (or creates) state on the server, but it is idempotent. In other words, if you create or update a resource using PUT and then make that same call again, the resource is still there and still has the same state as it did with the first call. + +If, for instance, calling PUT on a resource increments a counter within the resource, the call is no longer idempotent. Sometimes that happens and it may be enough to document that the call is not idempotent. However, it's recommended to keep PUT requests idempotent. It is strongly recommended to use POST for non-idempotent requests. + +__Examples:__ +* PUT http://www.example.com/customers/12345 +* PUT http://www.example.com/customers/12345/orders/98765 +* PUT http://www.example.com/buckets/secret_stuff + +### PATCH +PATCH is used for *modify* capabilities. The PATCH request only needs to contain the changes to the resource, not the complete resource. + +This resembles PUT, but the body contains a set of instructions describing how a resource currently residing on the server should be modified to produce a new version. This means that the PATCH body should not just be a modified part of the resource, but in some kind of patch language like JSON Patch or XML Patch. + +PATCH is neither safe nor idempotent. However, a PATCH request can be issued in such a way as to be idempotent, which also helps prevent bad outcomes from collisions between two PATCH requests on the same resource in a similar time frame. Collisions from multiple PATCH requests may be more dangerous than PUT collisions because some patch formats need to operate from a known base-point or else they will corrupt the resource. Clients using this kind of patch application should use a conditional request such that the request will fail if the resource has been updated since the client last accessed the resource. For example, the client can use a strong ETag in an If-Match header on the PATCH request. + +__Examples:__ +* PATCH http://www.example.com/customers/12345 +* PATCH http://www.example.com/customers/12345/orders/98765 +* PATCH http://www.example.com/buckets/secret_stuff + +### DELETE +DELETE is pretty easy to understand. It is used to *delete* a resource identified by a URI. + +On successful deletion, return HTTP status 200 (OK) along with a response body, perhaps the representation of the deleted item (often demands too much bandwidth), or a wrapped response (see Return Values below). Either that or return HTTP status 204 (NO CONTENT) with no response body. In other words, a 204 status with no body, or the JSEND-style response and HTTP status 200 are the recommended responses. + +HTTP-spec-wise, DELETE operations are idempotent. If you DELETE a resource, it's removed. Repeatedly calling DELETE on that resource ends up the same: the resource is gone. If calling DELETE say, decrements a counter (within the resource), the DELETE call is no longer idempotent. As mentioned previously, usage statistics and measurements may be updated while still considering the service idempotent as long as no resource data is changed. Using POST for non-idempotent resource requests is recommended. + +There is a caveat about DELETE idempotence, however. Calling DELETE on a resource a second time will often return a 404 (NOT FOUND) since it was already removed and therefore is no longer findable. This, by some opinions, makes DELETE operations no longer idempotent, however, the end-state of the resource is the same. Returning a 404 is acceptable and communicates accurately the status of the call. + +__Examples:__ +* DELETE http://www.example.com/customers/12345 +* DELETE http://www.example.com/customers/12345/orders +* DELETE http://www.example.com/bucket/sample diff --git a/content/basics/idempotence.md b/content/basics/idempotence.md new file mode 100644 index 0000000..b1b6686 --- /dev/null +++ b/content/basics/idempotence.md @@ -0,0 +1,14 @@ +--- +title: "Idempotence" +date: 2022-06-08T15:35:13-06:00 +weight: 50 +--- +{{< youtube 6dVNdFwqeKs >}} + +Idempotence is a funky word that often hooks people. Idempotence is sometimes a confusing concept, at least from the academic definition. + +From a RESTful service standpoint, for an operation (or service call) to be idempotent, clients can make that same call repeatedly while producing the same result. In other words, making multiple identical requests has the same effect as making a single request. Note that while idempotent operations produce the same result on the server (no side effects), the response itself may not be the same (e.g. a resource's state may change between requests). + +The PUT and DELETE methods are defined to be idempotent. However, there is a caveat on DELETE. The problem with DELETE, which if successful would normally return a 200 (OK) or 204 (No Content), will often return a 404 (Not Found) on subsequent calls, unless the service is configured to "mark" resources for deletion without actually deleting them. However, when the service actually deletes the resource, the next call will not find the resource to delete it and return a 404. However, the state on the server is the same after each DELETE call, but the response is different. + +GET, HEAD, OPTIONS and TRACE methods are defined as safe, meaning they are only intended for retrieving data. This makes them idempotent as well since multiple, identical requests will behave the same. \ No newline at end of file diff --git a/content/basics/resourcenaming.md b/content/basics/resourcenaming.md new file mode 100644 index 0000000..1e23409 --- /dev/null +++ b/content/basics/resourcenaming.md @@ -0,0 +1,77 @@ +--- +title: "Resource Naming" +date: 2022-06-07T16:44:49-06:00 +weight: 40 +--- +In addition to utilizing the HTTP verbs appropriately, resource naming is arguably the most debated and most important concept to grasp when creating an understandable, easily leveraged Web service API. When resources are named well, an API is intuitive and easy to use. Done poorly, that same API can feel klutzy and be difficult to use and understand. Below are a few tips to get you going when creating the resource URIs for your new API. + +Essentially, a RESTful API ends up being simply a collection of URIs, HTTP calls to those URIs and some JSON and/or XML representations of resources, many of which will contain relational links. The RESTful principal of addressability is covered by the URIs. Each resource has its own address or URI—every interesting piece of information the server can provide is exposed as a resource. The constraint of uniform interface is partially addressed by the combination of URIs and HTTP verbs, and using them in line with the standards and conventions. + +In deciding what resources are within your system, name them as nouns as opposed to verbs or actions. In other words, a RESTful URI should refer to a resource that is a thing instead of referring to an action. Nouns have properties as verbs do not, just another distinguishing factor. + +Some example resources are: +* Users of the system. +* Courses in which a student is enrolled. +* A user's timeline of posts. +* The users that follow another user. +* An article about horseback riding. + +Each resource in a service suite will have at least one URI identifying it. And it's best when that URI makes sense and adequately describes the resource. URIs should follow a predictable, hierarchical structure to enhance understandability and, therefore, usability: predictable in the sense that they're consistent, hierarchical in the sense that data has structure—relationships. This is not a REST rule or constraint, but it enhances the API. + +RESTful APIs are written for consumers. The name and structure of URIs should convey meaning to those consumers. It's often difficult to know what the data boundaries should be, but with understanding of your data, you most-likely are equipped to take a stab and what makes sense to return as a representation to your clients. Design for your clients, not for your data. + +Let's say we're describing an order system with customers, orders, line items, products, etc. Consider the URIs involved in describing the resources in this service suite: + +## Resource URI Examples +### Customers +To insert (create) a new customer in the system, we might use: +* POST http://www.example.com/customers + +To read a customer with Customer ID# 33245: +* GET http://www.example.com/customers/33245 + +The same URI would be used for PUT and DELETE, to update and delete, respectively. + +### Products +Here are proposed URIs for products: +* For creating a new product: + * POST http://www.example.com/products +* For reading, replacing, updating, deleting product ID 66432, respectively: + * GET http://www.example.com/products/66432 + * PUT http://www.example.com/products/66432 + * PATCH http://www.example.com/products/66432 + * DELETE http://www.example.com/products/66432 + +### Orders +Now, here is where it gets fun... What about creating a new order for a customer? One option might be: +* POST http://www.example.com/orders +And that could work to create an order, but it's arguably outside the context of a customer. + +Because we want to create an order for a customer (note the relationship), this URI perhaps is not as intuitive as it could be. It could be argued that the following URI would offer better clarity: +* POST http://www.example.com/customers/33245/orders +Now we know we're creating an order for customer ID# 33245. + +Now what would the following return? +* GET http://www.example.com/customers/33245/orders +Probably a list of orders that customer #33245 has created or owns. Note: we may choose to not support DELETE or PUT for that url since it's operating on the entire collection of a cutomer's orders. + +Now, to continue the hierarchical concept, what about the following URI? +* POST http://www.example.com/customers/33245/orders/8769/lineitems +That might add a line item to order #8769 (which is for customer #33245). Right! GET for that URI might return all the line items for that order. However, if line items don't make sense only in customer context or also make sense outside the context of a customer, we would offer a: +* POST www.example.com/orders/8769/lineitems URI. + +Along those lines, because there may be multiple URIs for a given resource, we might also offer a +* GET http://www.example.com/orders/8769 +URI that supports retrieving an order by number without having to know the customer number. + +To go one layer deeper in the hierarchy: +* GET http://www.example.com/customers/33245/orders/8769/lineitems/1 +Might return only the first line item in that same order. + +By now you can see how the hierarchy concept works. There aren't any hard and fast rules, only make sure the imposed structure makes sense to consumers of your services. As with everything in the craft of Software Development, naming is critical to success. + +### Other Example APIs +Look at some widely used APIs to get the hang of this and leverage the intuition of your teammates to refine your API resource URIs. Some example APIs are: +* Twitter: https://developer.twitter.com/en/docs/api-reference-index +* Facebook: https://developers.facebook.com/docs/reference/api/ +* LinkedIn: https://developer.linkedin.com/apis diff --git a/content/basics/restcontstraints.md b/content/basics/restcontstraints.md new file mode 100644 index 0000000..4e04ef2 --- /dev/null +++ b/content/basics/restcontstraints.md @@ -0,0 +1,53 @@ +--- +title: "The Six Constraints" +date: 2022-06-07T08:22:06-06:00 +weight: 15 +--- +{{< youtube llpr5924N7E >}} + +The REST architectural style describes six constraints. These constraints, applied to the architecture, were originally communicated by Roy Fielding in his doctoral dissertation (see https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm) and defines the basis of RESTful-style. + +The six constraints are as follows: +## 1. Uniform Interface +The uniform interface constraint defines the interface between clients and servers. It simplifies and decouples the architecture, which enables each part to evolve independently. The four guiding principles of the uniform interface are: + +### 1.a. Resource-Based +Individual resources are identified in requests using URIs as resource identifiers. The resources themselves are conceptually separate from the representations that are returned to the client. For example, the server does not send its database, but rather, some HTML, XML or JSON that represents some database records expressed, for instance, in Finnish and encoded in UTF-8, depending on the details of the request and the server implementation. + +### 1.b. Manipulation of Resources Through Representations +When a client holds a representation of a resource, including any metadata attached, it has enough information to modify or delete the resource on the server, provided it has permission to do so. + +### 1.c. Self-descriptive Messages +Each message includes enough information to describe how to process the message. For example, which parser to invoke may be specified by an Internet media type (previously known as a MIME type). Responses also explicitly indicate their cache-ability. + +### 1.d. Hypermedia as the Engine of Application State (HATEOAS) +Clients deliver state via body contents, query-string parameters, request headers and the requested URI (the resource name). Services deliver state to clients via body content, response codes, and response headers. This is technically referred-to as hypermedia (or hyperlinks within hypertext). + +Aside from the description above, HATEOS also means that, where necessary, links are contained in the returned body (or headers) to supply the URI for retrieval of the object itself or related objects. We'll talk about this in more detail later. + +The uniform interface that any REST services must provide is fundamental to its design. + +## 2. Stateless +As REST is an acronym for REpresentational State Transfer, statelessness is key. Essentially, what this means is that the necessary state to handle the request is contained within the request itself, whether as part of the URI, query-string parameters, body, or headers. The URI uniquely identifies the resource and the body contains the state (or state change) of that resource. Then after the server does it's processing, the appropriate state, or the piece(s) of state that matter, are communicated back to the client via headers, status and response body. + +Most of us who have been in the industry for a while are accustomed to programming within a container which provides us with the concept of “session” which maintains state across multiple HTTP requests. In REST, the client must include all information for the server to fulfill the request, resending state as necessary if that state must span multiple requests. Statelessness enables greater scalability since the server does not have to maintain, update or communicate that session state. Additionally, load balancers don't have to worry about session affinity for stateless systems. + +So what's the difference between state and a resource? State, or application state, is that which the server cares about to fulfill a request—data necessary for the current session or request. A resource, or resource state, is the data that defines the resource representation—the data stored in the database, for instance. Consider application state to be data that could vary by client, and per request. Resource state, on the other hand, is constant across every client who requests it. + +Ever had back-button issues with a web application where it went AWOL at a certain point because it expected you to do things in a certain order? That's because it violated the statelessness principle. There are cases that don't honor the statelessness principle, such as three-legged OAuth, API call rate limiting, etc. However, make every effort to ensure that application state doesn't span multiple requests of your service(s). + +## 3. Cacheable +As on the World Wide Web, clients can cache responses. Responses must therefore, implicitly or explicitly, define themselves as cacheable, or not, to prevent clients reusing stale or inappropriate data in response to further requests. Well-managed caching partially or completely eliminates some client–server interactions, further improving scalability and performance. + +## 4. Client-Server +The uniform interface separates clients from servers. This separation of concerns means that, for example, clients are not concerned with data storage, which remains internal to each server, so that the portability of client code is improved. Servers are not concerned with the user interface or user state, so that servers can be simpler and more scalable. Servers and clients may also be replaced and developed independently, as long as the interface is not altered. + +## 5. Layered System +A client cannot ordinarily tell whether it is connected directly to the end server, or to an intermediary along the way. Intermediary servers may improve system scalability by enabling load-balancing and by providing shared caches. Layers may also enforce security policies. + +## 6. Code on Demand (optional) +Servers are able to temporarily extend or customize the functionality of a client by transferring logic to it that it can execute. Examples of this may include compiled components such as Java applets and client-side scripts such as JavaScript. + +Complying with these constraints, and thus conforming to the REST architectural style, will enable any kind of distributed hypermedia system to have desirable emergent properties, such as performance, scalability, simplicity, modifiability, visibility, portability and reliability. + +NOTE: The only optional constraint of REST architecture is code on demand. If a service violates any other constraint, it cannot strictly be referred to as RESTful. diff --git a/content/basics/restquicktips.md b/content/basics/restquicktips.md new file mode 100644 index 0000000..9cf0391 --- /dev/null +++ b/content/basics/restquicktips.md @@ -0,0 +1,81 @@ +--- +title: "REST Quick Tips" +date: 2022-06-06T16:58:56-06:00 +weight: 20 +--- +Whether it's technically RESTful or not (according to the six constraints mentioned previously), here are a few recommended REST-like concepts. These six quick tips will result in better, more usable services. + +## Use HTTP Methods to Make Requests Mean Something +API consumers are capable of sending GET, POST, PUT, PATCH and DELETE methods (or verbs), which greatly enhance the clarity of a given request. + +Generally, the five primary HTTP methods are used as follows: + +| Method | Description | +| ---- | ----------- | +| GET | Read a specific resource (by an identifier) or a collection of resources.| +| PUT | Replace a specific resource (by an identifier) or a collection of resources. Can also be used to create a specific resource if the resource identifier is known before-hand.| +| PATCH | Update a specific resource (by an identifier) or a collection of resources. This can be thought of in some ways as a 'partial update' vs the replace that PUT performs.| +| DELETE | Remove/delete a specific resource by an identifier. | +| POST | Create a new resource. Also a catch-all verb for operations that don't fit into the other categories. | + +__Note__: GET requests MUST not change any underlying resource data. Measurements and tracking which update data may still occur, but the resource identified by the URI MUST not change. + +## Provide Sensible Resource Names +Producing a great API is 80% art and 20% science. Creating a URL hierarchy representing sensible resources is the art part. Having sensible resource names (which are just URL paths, such as /customers/12345/orders) improves the clarity of what a given request does. As humans are involved in understanding an API, this clarity counts. + +Appropriate resource names provide context for a service request, increasing understandability of the API. Resources are viewed hierarchically via their URI names, offering consumers a friendly, easily-understood hierarchy of resources to leverage in their applications. + +Here are some quick-hit rules for URL path (resource name) design: +* Use identifiers in your URLs instead of in the query-string. Using URL query-string parameters is fantastic for filtering, but not for resource names. + * Good: /users/12345 + * Poor: /api?type=user&id=23 +* Leverage the hierarchical nature of the URL to imply structure. +* Design for your clients, not for your data. +* Resource names should be nouns. Avoid verbs as resource names, to improve clarity. Use the HTTP methods to specify the verb portion of the request. +* Use plurals in URL segments to keep your API URIs consistent across all HTTP methods, using the collection metaphor. + * Recommended: /customers/33245/orders/8769/lineitems/1 + * Not: /customer/33245/order/8769/lineitem/1 +* Avoid using collection verbiage in URLs. For example 'customer_list' as a resource. Use pluralization to indicate the collection metaphor (e.g. customers vs. customer_list). +* Use lower-case in URL segments, separating words with underscores ('_') or hyphens ('-'). Some servers ignore case so it's best to be clear. +* Keep URLs as short as possible, with as few segments as makes sense. + +## Use HTTP Response Codes to Indicate Status +Response status codes are part of the HTTP specification. There are quite a number of them to address the most common situations. In the spirit of having our RESTful services embrace the HTTP specification, our Web APIs should return relevant HTTP status codes. For example, when a resource is successfully created (e.g. from a POST request), the API should return HTTP status code 201. A list of valid HTTP status codes is available here which lists detailed descriptions of each. + +Suggested usages for the "Top 10" HTTP Response Status Codes are as follows: + +| Status Code | Description | +| ----------- | ----------- | +| 200 OK | General success status code. This is the most common code. Used to indicate success. | +| 201 CREATED | Successful creation occurred (via either POST or PUT). Set the Location header to contain a link to the newly-created resource (on POST). Response body content may or may not be present. | +| 204 NO CONTENT | Indicates success but nothing is in the response body, often used for DELETE and PUT operations. | +| 400 BAD REQUEST | General error for when fulfilling the request would cause an invalid state. Domain validation errors, missing data, etc. are some examples. | +| 401 UNAUTHORIZED | Error code response for missing or invalid authentication token. | +| 403 FORBIDDEN | Error code for when the user is not authorized to perform the operation or the resource is unavailable for some reason (e.g. time constraints, etc.). | +| 404 NOT FOUND | Used when the requested resource is not found, whether it doesn't exist or if there was a 401 or 403 that, for security reasons, the service wants to mask. | +| 405 METHOD NOT ALLOWED | Used to indicate that the requested URL exists, but the requested HTTP method is not applicable. For example, POST /users/12345 where the API doesn't support creation of resources this way (with a provided ID). The Allow HTTP header must be set when returning a 405 to indicate the HTTP methods that are supported. In the previous case, the header would look like "Allow: GET, PUT, DELETE" | +| 409 CONFLICT | Whenever a resource conflict would be caused by fulfilling the request. Duplicate entries, such as trying to create two customers with the same information, and deleting root objects when cascade-delete is not supported are a couple of examples. | +| 500 INTERNAL SERVER ERROR | __Never return this intentionally.__ The general catch-all error when the server-side throws an exception. Use this only for errors that the consumer cannot address from their end. | + +## Support JSON +Favor JSON support unless you're in a highly-standardized and regulated industry that requires XML, schema validation and namespaces. If you must provide both JSON and XML let consumers switch between formats using the HTTP Accept header: application/json or application/xml. + +Be aware that as soon as we start talking about XML support, we start talking about schemas for validation, namespaces, etc. Unless required by your industry, avoid supporting all that complexity initially, if ever. JSON is designed to be simple, terse and functional. + +## Create Fine-Grained Resources +When starting out, it's best to create APIs that mimic the underlying application domain or database architecture of your system. Eventually, you'll want aggregate services that utilize multiple underlying resources to reduce chattiness. However, it's much easier to create larger resources later from individual resources than it is to create fine-grained or individual resources from larger aggregates. Make it easy on yourself and start with small, easily defined resources, providing CRUD functionality on those. You can create those use-case-oriented, chattiness-reducing resources later. + +## Consider Connectedness +One of the principles of REST is connectedness—via hypermedia links (search HATEOAS). While services are still useful without them, APIs become more self-descriptive and discoverable when links are returned in the response. At the very least, a 'self' link reference informs clients how the data was or can be retrieved. Additionally, utilize the HTTP Location header to contain a link on resource creation via POST (or PUT). For collections returned in a response that support pagination, 'first', 'last', 'next' and 'prev' links at a minimum are very helpful. + +Regarding linking formats, there are many. The HTTP Web Linking Specification (RFC5988) explains a link as follows: + +> a link is a typed connection between two resources that are identified by Internationalised Resource Identifiers (IRIs) [RFC3987], and is comprised of: +> * A context IRI, +> * a link relation type +> * a target IRI, and +> * optionally, target attributes. +> +> A link can be viewed as a statement of the form "{context IRI} has a {relation type} resource at {target IRI}, which has {target attributes}." + +At the very least, place links in the HTTP Link header as recommended in the specification, or embrace a JSON representation of this HTTP link style (such as Atom-style links, see: RFC4287) in your JSON representations. Later, you can layer in more complex linking styles such as HAL+JSON, Siren, Collection+JSON, and/or JSON-LD, etc. as your REST APIs become more mature. \ No newline at end of file diff --git a/content/basics/whatisrest.md b/content/basics/whatisrest.md new file mode 100644 index 0000000..4e6fa49 --- /dev/null +++ b/content/basics/whatisrest.md @@ -0,0 +1,140 @@ +--- +title: "What is REST?" +date: 2022-06-06T16:35:40-06:00 +weight: 10 +--- +The term RESTful APIs or RESTful services is a hot topic. So what is REST? And how do we create a so-called RESTful API? Good question! Let's talk about this often misunderstood phrase... + +{{% notice style="tip" title="Here's a Quick Tip!" icon="exclamation-circle" %}} +When someone says, "REST service," "REST API" or "RESTful API" they more-than-likely mean an HTTP or Web-based server that accepts requests over HTTP and responds in human-readable JSON. + +Yep, that really is it. But there are a lot of nuances--read on to discover more details! +{{% /notice %}} + +Technically, REST is an acronym for "REpresentational State Transfer" which is simply an architectural style originally written about by Roy Fielding in his doctoral dissertation (see https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm). You can read more details about the six contraints here, but first I want to give you a brief overview of what people mean when they say "REST." + +To be clear, the constraints in Roy Fielding's dissertation MUST be met in order for a service to be technically RESTful. And the REST constraints do not specify a communication protocol. However, at this point the term is used very loosely and in today's Internet world, RESTful almost always means an HTTP-based API. That means it operates in a request-response fashion over HTTP, usually using JSON as the data format in the request and response bodies. Though there are a lot of nuances, it's really just that simple! + +In other words, the caller (or client): +* Makes an HTTP request to a URL... + * Using one of the standard HTTP methods (GET, PUT, POST, PATCH, DELETE, etc.)... + * With some content (usually JSON) in the body... +* And waits for a response, which: + * Indicates status via an HTTP response code + * And usually has more JSON in the body. + +For example, say we wanted to search iTunes for RadioHead songs. We would call the iTunes Search API (See: https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/iTuneSearchAPI/index.html). + +We can use 'curl' on the command-line as follows. In this case all the query-string paremeters on the URL are simply telling the search API what term to search for (radiohead), how many results we want returned (3), and the type of media (music): +```bash +curl -i 'https://itunes.apple.com/search?term=radiohead&media=music&limit=3' +``` + +Which returns the following JSON response: + +```json +{ + "resultCount":3, + "results":[ + { + "wrapperType":"track", + "kind":"song", + "artistId":657515, + "collectionId":1109714933, + "trackId":1109715066, + "artistName":"Radiohead", + "collectionName":"In Rainbows", + "trackName":"15 Step", + "collectionCensoredName":"In Rainbows", + "trackCensoredName":"15 Step", + "artistViewUrl":"https://music.apple.com/us/artist/radiohead/657515?uo=4", + "collectionViewUrl":"https://music.apple.com/us/album/15-step/1109714933?i=1109715066&uo=4", + "trackViewUrl":"https://music.apple.com/us/album/15-step/1109714933?i=1109715066&uo=4", + "previewUrl":"https://audio-ssl.itunes.apple.com/itunes-assets/AudioPreview125/v4/af/72/85/af728523-8048-4a8b-9e13-e8f4f64e9d69/mzaf_8205306206851675436.plus.aac.p.m4a", + "artworkUrl30":"https://is2-ssl.mzstatic.com/image/thumb/Music115/v4/9a/4f/8a/9a4f8a4b-0254-d5ab-74b5-ebe39bbbe85d/634904032463.png/30x30bb.jpg", + "artworkUrl60":"https://is2-ssl.mzstatic.com/image/thumb/Music115/v4/9a/4f/8a/9a4f8a4b-0254-d5ab-74b5-ebe39bbbe85d/634904032463.png/60x60bb.jpg", + "artworkUrl100":"https://is2-ssl.mzstatic.com/image/thumb/Music115/v4/9a/4f/8a/9a4f8a4b-0254-d5ab-74b5-ebe39bbbe85d/634904032463.png/100x100bb.jpg", + "collectionPrice":9.99, + "trackPrice":1.29, + "releaseDate":"2007-10-10T07:00:00Z", + "collectionExplicitness":"notExplicit", + "trackExplicitness":"notExplicit", + "discCount":1, + "discNumber":1, + "trackCount":10, + "trackNumber":1, + "trackTimeMillis":237293, + "country":"USA", + "currency":"USD", + "primaryGenreName":"Alternative", + "isStreamable":true + }, + { + "wrapperType":"track", + "kind":"song", + "artistId":657515, + "collectionId":1109714933, + "trackId":1109715161, + "artistName":"Radiohead", + "collectionName":"In Rainbows", + "trackName":"Bodysnatchers", + "collectionCensoredName":"In Rainbows", + "trackCensoredName":"Bodysnatchers", + "artistViewUrl":"https://music.apple.com/us/artist/radiohead/657515?uo=4", + "collectionViewUrl":"https://music.apple.com/us/album/bodysnatchers/1109714933?i=1109715161&uo=4", + "trackViewUrl":"https://music.apple.com/us/album/bodysnatchers/1109714933?i=1109715161&uo=4", + "previewUrl":"https://audio-ssl.itunes.apple.com/itunes-assets/AudioPreview115/v4/ba/e4/ac/bae4ac59-3bfa-e4b9-4f4c-03f667324fc0/mzaf_14837742185575446625.plus.aac.p.m4a", + "artworkUrl30":"https://is2-ssl.mzstatic.com/image/thumb/Music115/v4/9a/4f/8a/9a4f8a4b-0254-d5ab-74b5-ebe39bbbe85d/634904032463.png/30x30bb.jpg", + "artworkUrl60":"https://is2-ssl.mzstatic.com/image/thumb/Music115/v4/9a/4f/8a/9a4f8a4b-0254-d5ab-74b5-ebe39bbbe85d/634904032463.png/60x60bb.jpg", + "artworkUrl100":"https://is2-ssl.mzstatic.com/image/thumb/Music115/v4/9a/4f/8a/9a4f8a4b-0254-d5ab-74b5-ebe39bbbe85d/634904032463.png/100x100bb.jpg", + "collectionPrice":9.99, + "trackPrice":1.29, + "releaseDate":"2007-10-10T07:00:00Z", + "collectionExplicitness":"notExplicit", + "trackExplicitness":"notExplicit", + "discCount":1, + "discNumber":1, + "trackCount":10, + "trackNumber":2, + "trackTimeMillis":242293, + "country":"USA", + "currency":"USD", + "primaryGenreName":"Alternative", + "isStreamable":true + }, + { + "wrapperType":"track", + "kind":"song", + "artistId":657515, + "collectionId":1109714933, + "trackId":1109715168, + "artistName":"Radiohead", + "collectionName":"In Rainbows", + "trackName":"Weird Fishes / Arpeggi", + "collectionCensoredName":"In Rainbows", + "trackCensoredName":"Weird Fishes / Arpeggi", + "artistViewUrl":"https://music.apple.com/us/artist/radiohead/657515?uo=4", + "collectionViewUrl":"https://music.apple.com/us/album/weird-fishes-arpeggi/1109714933?i=1109715168&uo=4", + "trackViewUrl":"https://music.apple.com/us/album/weird-fishes-arpeggi/1109714933?i=1109715168&uo=4", + "previewUrl":"https://audio-ssl.itunes.apple.com/itunes-assets/AudioPreview115/v4/6c/e9/79/6ce9792e-c06a-b49b-6efe-60b96a690af8/mzaf_5478326228427438939.plus.aac.p.m4a", + "artworkUrl30":"https://is2-ssl.mzstatic.com/image/thumb/Music115/v4/9a/4f/8a/9a4f8a4b-0254-d5ab-74b5-ebe39bbbe85d/634904032463.png/30x30bb.jpg", + "artworkUrl60":"https://is2-ssl.mzstatic.com/image/thumb/Music115/v4/9a/4f/8a/9a4f8a4b-0254-d5ab-74b5-ebe39bbbe85d/634904032463.png/60x60bb.jpg", + "artworkUrl100":"https://is2-ssl.mzstatic.com/image/thumb/Music115/v4/9a/4f/8a/9a4f8a4b-0254-d5ab-74b5-ebe39bbbe85d/634904032463.png/100x100bb.jpg", + "collectionPrice":9.99, + "trackPrice":1.29, + "releaseDate":"2007-10-10T07:00:00Z", + "collectionExplicitness":"notExplicit", + "trackExplicitness":"notExplicit", + "discCount":1, + "discNumber":1, + "trackCount":10, + "trackNumber":4, + "trackTimeMillis":318187, + "country":"USA", + "currency":"USD", + "primaryGenreName":"Alternative", + "isStreamable":true + } + ] +} +``` \ No newline at end of file diff --git a/content/httpstatuscodes/_index.md b/content/httpstatuscodes/_index.md new file mode 100644 index 0000000..cd175b7 --- /dev/null +++ b/content/httpstatuscodes/_index.md @@ -0,0 +1,53 @@ ++++ +title = "HTTP Status Codes" +weight = 40 ++++ + +## {{% expand title="1xx Informational" %}} +This class of status code indicates a provisional response, consisting only of the Status-Line and optional headers, and is terminated by an empty line. There are no required headers for this class of status code. Since HTTP/1.0 did not define any 1xx status codes, servers MUST NOT send a 1xx response to an HTTP/1.0 client except under experimental conditions. + +A client MUST be prepared to accept one or more 1xx status responses prior to a regular response, even if the client does not expect a 100 (Continue) status message. Unexpected 1xx status responses MAY be ignored by a user agent. + +Proxies MUST forward 1xx responses, unless the connection between the proxy and its client has been closed, or unless the proxy itself requested the generation of the 1xx response. (For example, if a proxy adds a "Expect: 100-continue" field when it forwards a request, then it need not forward the corresponding 100 (Continue) response(s).) + +### Wikipedia +Request received, continuing process. + +This class of status code indicates a provisional response, consisting only of the Status-Line and optional headers, and is terminated by an empty line. Since HTTP/1.0 did not define any 1xx status codes, servers must not send a 1xx response to an HTTP/1.0 client except under experimental conditions. +{{% /expand %}} + +## {{% expand title="2xx Success" %}} +This class of status code indicates that the client's request was successfully received, understood, and accepted. + +### Wikipedia +This class of status codes indicates the action requested by the client was received, understood, accepted and processed successfully. +{{% /expand %}} + +## {{% expand title="3xx Redirection" %}} +This class of status code indicates that further action needs to be taken by the user agent in order to fulfill the request. The action required MAY be carried out by the user agent without interaction with the user if and only if the method used in the second request is GET or HEAD. A client SHOULD detect infinite redirection loops, since such loops generate network traffic for each redirection. + +> __Note:__ previous versions of this specification recommended a maximum of five redirections. Content developers should be aware that there might be clients that implement such a fixed limitation. + +### Wikipedia +The client must take additional action to complete the request. + +This class of status code indicates that further action needs to be taken by the user agent in order to fulfil the request. The action required may be carried out by the user agent without interaction with the user if and only if the method used in the second request is GET or HEAD. A user agent should not automatically redirect a request more than five times, since such redirections usually indicate an infinite loop. +{{% /expand %}} + +## {{% expand title="4xx Client Error" %}} +The 4xx class of status code is intended for cases in which the client seems to have erred. Except when responding to a HEAD request, the server SHOULD include an entity containing an explanation of the error situation, and whether it is a temporary or permanent condition. These status codes are applicable to any request method. User agents SHOULD display any included entity to the user. + +If the client is sending data, a server implementation using TCP SHOULD be careful to ensure that the client acknowledges receipt of the packet(s) containing the response, before the server closes the input connection. If the client continues sending data to the server after the close, the server's TCP stack will send a reset packet to the client, which may erase the client's unacknowledged input buffers before they can be read and interpreted by the HTTP application. + +### Wikipedia +The 4xx class of status code is intended for cases in which the client seems to have erred. Except when responding to a HEAD request, the server should include an entity containing an explanation of the error situation, and whether it is a temporary or permanent condition. These status codes are applicable to any request method. User agents should display any included entity to the user. +{{% /expand %}} + +## {{% expand title="5xx Server Error" %}} +Response status codes beginning with the digit "5" indicate cases in which the server is aware that it has erred or is incapable of performing the request. Except when responding to a HEAD request, the server SHOULD include an entity containing an explanation of the error situation, and whether it is a temporary or permanent condition. User agents SHOULD display any included entity to the user. These response codes are applicable to any request method. + +### Wikipedia +The server failed to fulfill an apparently valid request. + +Response status codes beginning with the digit "5" indicate cases in which the server is aware that it has encountered an error or is otherwise incapable of performing the request. Except when responding to a HEAD request, the server should include an entity containing an explanation of the error situation, and indicate whether it is a temporary or permanent condition. Likewise, user agents should display any included entity to the user. These response codes are applicable to any request method. +{{% /expand %}} diff --git a/content/resources/_index.md b/content/resources/_index.md new file mode 100644 index 0000000..f67956f --- /dev/null +++ b/content/resources/_index.md @@ -0,0 +1,28 @@ ++++ +title = "Resources" +weight = 50 ++++ + +# REST API Resources +## Translations +* [Russian](http://www.restapitutorial.ru/) + +## REST API Cheat Sheets +* [API Design Cheat Sheet](https://github.com/RestCheatSheet/api-cheat-sheet#api-design-cheat-sheet) - This GitHub repository outlines important tips to consider when designing APIs that developers love. +* [Platform-Building Cheat Sheet](https://github.com/RestCheatSheet/platform-cheat-sheet#platform-building-cheat-sheet) - Everyone wants to build a platform. This GitHub repository is a public receptical of ground rules when building a platform. + +## REST API Best Practices +Get the RESTful Design Best Practices guide (choose your format). This guide reduces the world of RESTful services design into easy-to-follow principles. It also provides several cookbook type recipes in critical areas to increase service usability, reduce confusion during implemenation, as well as improve consistency. + +* [PDF](https://github.com/tfredrich/RestApiTutorial.com/raw/master/media/RESTful%20Best%20Practices-v1_2.pdf) (~306KB) +* [ePub](https://github.com/tfredrich/RestApiTutorial.com/raw/master/media/RESTful%20Best%20Practices-v1_2.epub) (~46KB). Works on iPad, iPhone, B&N Nook and most other readers. +* [Mobi](https://github.com/tfredrich/RestApiTutorial.com/raw/master/media/RESTful%20Best%20Practices-v1_2.mobi) (~86KB). Works on Kindle, Kindle Reader Apps +* [Source Document in Libre/Open Office format](https://github.com/tfredrich/RestApiTutorial.com/raw/master/media/RESTful%20Best%20Practices-v1_2.odt) (~48KB) + +## Building REST APIs in Java +[RestExpress](https://github.com/RestExpress/RestExpress) (GitHub). A lightweight microservices framework for Java, RestExpress composes best-of-breed tools to form a lightweight, minimalist Java framework for quickly creating RESTful APIs. + +## Web Resources +* [REST API Tutorial YouTube Channel](https://www.youtube.com/user/restapitutorial) - The companion channel where all of the videos for this site live. +* [Sascha Preibisch YouTube Channel](https://www.youtube.com/channel/UCBSlXL7WCE-MR8uuwurqVKA) - A great resource on Security; Particularly Oauth2 and OpenID Connect (OIDC). +* [Todd Fredrich's Blog](http://www.toddfredrich.com/) \ No newline at end of file diff --git a/httpmethods.html b/httpmethods.html deleted file mode 100644 index f3ccf2d..0000000 --- a/httpmethods.html +++ /dev/null @@ -1,30 +0,0 @@ - - - Moved to new URL: https://www.restapitutorial.com/lessons/httpmethods.html - - - - - - - - -

This page has been moved to https://www.restapitutorial.com/lessons/httpmethods.html

-

If your browser doesn't redirect you to the new location please - click here, - sorry for the hassles!

- - diff --git a/images/API Consulting Banner.psd b/images/API Consulting Banner.psd deleted file mode 100644 index a01fdb0..0000000 Binary files a/images/API Consulting Banner.psd and /dev/null differ diff --git a/images/api-consulting-banner1.png b/images/api-consulting-banner1.png deleted file mode 100644 index 43c101d..0000000 Binary files a/images/api-consulting-banner1.png and /dev/null differ diff --git a/images/api-consulting-banner2.png b/images/api-consulting-banner2.png deleted file mode 100644 index b8eb3c5..0000000 Binary files a/images/api-consulting-banner2.png and /dev/null differ diff --git a/images/banner1.odg b/images/banner1.odg deleted file mode 100644 index 7d723c4..0000000 Binary files a/images/banner1.odg and /dev/null differ diff --git a/images/banner1.xcf b/images/banner1.xcf deleted file mode 100644 index 3bc740e..0000000 Binary files a/images/banner1.xcf and /dev/null differ diff --git a/index.html b/index.html deleted file mode 100644 index 2b8fc37..0000000 --- a/index.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - REST API Tutorial - - - - - - - - - - - - - - - -
-
- -
-
- - -
-
-

Learn REST: A RESTful Tutorial

-

Hey, Fellow REST API Designer!

-

Building RESTful web services, like other programming skills is part art, part science. As the Internet industry progresses, creating a REST API becomes more concrete with emerging best practices. As RESTful web services don't follow a prescribed standard except for HTTP, it's important to build your RESTful API in accordance with industry best practices to ease development and increase client adoption.

-

Presently, there aren't a lot of REST API guides to help the lonely developer. RestApiTutorial.com is dedicated to tracking REST API best practices and making resources available to enable quick reference and self education for the development crafts-person. We'll discuss both the art and science of creating REST Web services.

-

—Todd Fredrich, The REST API Tutor

-

Jump in with What Is REST?, an overview of concepts and constraints of the RESTful architecture.

-

Next »

-
-
- -
-
-
- - - - - - Fork me on GitHub - - diff --git a/lessons/httpmethods.html b/lessons/httpmethods.html deleted file mode 100644 index 44b620b..0000000 --- a/lessons/httpmethods.html +++ /dev/null @@ -1,240 +0,0 @@ - - - - - HTTP Methods for RESTful Services - - - - - - - - - - - - - - - -
-
- -
-
-
-

Using HTTP Methods for RESTful Services

-
-
- -
-
-
-
-

The HTTP verbs comprise a major portion of our “uniform interface” constraint and provide us the action counterpart to the noun-based resource. The primary or most-commonly-used HTTP verbs (or methods, as they are properly called) are POST, GET, PUT, PATCH, and DELETE. These correspond to create, read, update, and delete (or CRUD) operations, respectively. There are a number of other verbs, too, but are utilized less frequently. Of those less-frequent methods, OPTIONS and HEAD are used more often than others.

-

Below is a table summarizing recommended return values of the primary HTTP methods in combination with the resource URIs:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
HTTP VerbCRUDEntire Collection (e.g. /customers)Specific Item (e.g. /customers/{id})
POSTCreate201 (Created), 'Location' header with link to /customers/{id} containing new ID.404 (Not Found), 409 (Conflict) if resource already exists..
GETRead/Retrieve200 (OK), list of customers. Use pagination, sorting and filtering to navigate big lists.200 (OK), single customer. 404 (Not Found), if ID not found or invalid.
PUTUpdate/Replace405 (Method Not Allowed), unless you want to update/replace every resource in the entire collection.200 (OK) or 204 (No Content). 404 (Not Found), if ID not found or invalid.
PATCHUpdate/Modify405 (Method Not Allowed), unless you want to modify the collection itself.200 (OK) or 204 (No Content). 404 (Not Found), if ID not found or invalid.
DELETEDelete405 (Method Not Allowed), unless you want to delete the whole collection—not often desirable.200 (OK). 404 (Not Found), if ID not found or invalid.
-
-
-
-
-

Below is a more-detailed discussion of the main HTTP methods. Click on a tab for more information about the desired HTTP method.

- -
-
-

The POST verb is most-often utilized to **create** new resources. In particular, it's used to create subordinate resources. That is, subordinate to some other (e.g. parent) resource. In other words, when creating a new resource, POST to the parent and the service takes care of associating the new resource with the parent, assigning an ID (new resource URI), etc.

-

On successful creation, return HTTP status 201, returning a Location header with a link to the newly-created resource with the 201 HTTP status.

-

POST is neither safe nor idempotent. It is therefore recommended for non-idempotent resource requests. Making two identical POST requests will most-likely result in two resources containing the same information.

-

Examples:

-
    -
  • POST http://www.example.com/customers
  • -
  • POST http://www.example.com/customers/12345/orders
  • -
-
-
-

The HTTP GET method is used to **read** (or retrieve) a representation of a resource. In the “happy” (or non-error) path, GET returns a representation in XML or JSON and an HTTP response code of 200 (OK). In an error case, it most often returns a 404 (NOT FOUND) or 400 (BAD REQUEST).

-

According to the design of the HTTP specification, GET (along with HEAD) requests are used only to read data and not change it. Therefore, when used this way, they are considered safe. That is, they can be called without risk of data modification or corruption—calling it once has the same effect as calling it 10 times, or none at all. Additionally, GET (and HEAD) is idempotent, which means that making multiple identical requests ends up having the same result as a single request.

-

Do not expose unsafe operations via GET—it should never modify any resources on the server.

-

Examples:

-
    -
  • GET http://www.example.com/customers/12345
  • -
  • GET http://www.example.com/customers/12345/orders
  • -
  • GET http://www.example.com/buckets/sample
  • -
-
-
-

PUT is most-often utilized for **update** capabilities, PUT-ing to a known resource URI with the request body containing the newly-updated representation of the original resource.

-

However, PUT can also be used to create a resource in the case where the resource ID is chosen by the client instead of by the server. In other words, if the PUT is to a URI that contains the value of a non-existent resource ID. Again, the request body contains a resource representation. Many feel this is convoluted and confusing. Consequently, this method of creation should be used sparingly, if at all.

-

Alternatively, use POST to create new resources and provide the client-defined ID in the body representation—presumably to a URI that doesn't include the ID of the resource (see POST below).

-

On successful update, return 200 (or 204 if not returning any content in the body) from a PUT. If using PUT for create, return HTTP status 201 on successful creation. A body in the response is optional—providing one consumes more bandwidth. It is not necessary to return a link via a Location header in the creation case since the client already set the resource ID.

-

PUT is not a safe operation, in that it modifies (or creates) state on the server, but it is idempotent. In other words, if you create or update a resource using PUT and then make that same call again, the resource is still there and still has the same state as it did with the first call.

-

If, for instance, calling PUT on a resource increments a counter within the resource, the call is no longer idempotent. Sometimes that happens and it may be enough to document that the call is not idempotent. However, it's recommended to keep PUT requests idempotent. It is strongly recommended to use POST for non-idempotent requests.

-

Examples:

-
    -
  • PUT http://www.example.com/customers/12345
  • -
  • PUT http://www.example.com/customers/12345/orders/98765
  • -
  • PUT http://www.example.com/buckets/secret_stuff
  • -
-
-
-

PATCH is used for **modify** capabilities. The PATCH request only needs to contain the changes to the resource, not the complete resource.

-

This resembles PUT, but the body contains a set of instructions describing how a resource currently residing on the server should be modified to produce a new version. This means that the PATCH body should not just be a modified part of the resource, but in some kind of patch language like JSON Patch or XML Patch.

-

PATCH is neither safe nor idempotent. However, a PATCH request can be issued in such a way as to be idempotent, which also helps prevent bad outcomes from collisions between two PATCH requests on the same resource in a similar time frame. Collisions from multiple PATCH requests may be more dangerous than PUT collisions because some patch formats need to operate from a known base-point or else they will corrupt the resource. Clients using this kind of patch application should use a conditional request such that the request will fail if the resource has been updated since the client last accessed the resource. For example, the client can use a strong ETag in an If-Match header on the PATCH request.

- -

Examples:

-
    -
  • PATCH http://www.example.com/customers/12345
  • -
  • PATCH http://www.example.com/customers/12345/orders/98765
  • -
  • PATCH http://www.example.com/buckets/secret_stuff
  • -
-
-
-

DELETE is pretty easy to understand. It is used to **delete** a resource identified by a URI. -

On successful deletion, return HTTP status 200 (OK) along with a response body, perhaps the representation of the deleted item (often demands too much bandwidth), or a wrapped response (see Return Values below). Either that or return HTTP status 204 (NO CONTENT) with no response body. In other words, a 204 status with no body, or the JSEND-style response and HTTP status 200 are the recommended responses.

-

HTTP-spec-wise, DELETE operations are idempotent. If you DELETE a resource, it's removed. Repeatedly calling DELETE on that resource ends up the same: the resource is gone. If calling DELETE say, decrements a counter (within the resource), the DELETE call is no longer idempotent. As mentioned previously, usage statistics and measurements may be updated while still considering the service idempotent as long as no resource data is changed. Using POST for non-idempotent resource requests is recommended.

-

There is a caveat about DELETE idempotence, however. Calling DELETE on a resource a second time will often return a 404 (NOT FOUND) since it was already removed and therefore is no longer findable. This, by some opinions, makes DELETE operations no longer idempotent, however, the end-state of the resource is the same. Returning a 404 is acceptable and communicates accurately the status of the call.

-

Examples:

-
    -
  • DELETE http://www.example.com/customers/12345
  • -
  • DELETE http://www.example.com/customers/12345/orders
  • -
  • DELETE http://www.example.com/bucket/sample
  • -
-
-
-
-
-
- -
- - - - - - Fork me on GitHub - - diff --git a/lessons/idempotency.html b/lessons/idempotency.html deleted file mode 100644 index 92c3fc2..0000000 --- a/lessons/idempotency.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - What is Idempotency? - - - - - - - - - - - - - - - -
-
- -
-
-
-

What Is Idempotence?

-
- -
-
- -
-
-
- -
-
-
-
-

Idempotence

-
-
-

Idempotence is a funky word that often hooks people. Idempotence is sometimes a confusing concept, at least from the academic definition.

-

From a RESTful service standpoint, for an operation (or service call) to be idempotent, clients can make that same call repeatedly while producing the same result. In other words, making multiple identical requests has the same effect as making a single request. Note that while idempotent operations produce the same result on the server (no side effects), the response itself may not be the same (e.g. a resource's state may change between requests).

-

The PUT and DELETE methods are defined to be idempotent. However, there is a caveat on DELETE. The problem with DELETE, which if successful would normally return a 200 (OK) or 204 (No Content), will often return a 404 (Not Found) on subsequent calls, unless the service is configured to "mark" resources for deletion without actually deleting them. However, when the service actually deletes the resource, the next call will not find the resource to delete it and return a 404. However, the state on the server is the same after each DELETE call, but the response is different.

-

GET, HEAD, OPTIONS and TRACE methods are defined as safe, meaning they are only intended for retrieving data. This makes them idempotent as well since multiple, identical requests will behave the same.

-
-
-
- -
- - - - - - Fork me on GitHub - - diff --git a/lessons/restfulresourcenaming.html b/lessons/restfulresourcenaming.html deleted file mode 100644 index 20265d2..0000000 --- a/lessons/restfulresourcenaming.html +++ /dev/null @@ -1,213 +0,0 @@ - - - - - RESTful Resource Naming - - - - - - - - - - - - - - - -
-
- -
-
-
-

Resource Naming

-
-
- -
-
-
-
-

In addition to utilizing the HTTP verbs appropriately, resource naming is arguably the most debated and most important concept to grasp when creating an understandable, easily leveraged Web service API. When resources are named well, an API is intuitive and easy to use. Done poorly, that same API can feel klutzy and be difficult to use and understand. Below are a few tips to get you going when creating the resource URIs for your new API.

-

Essentially, a RESTful API ends up being simply a collection of URIs, HTTP calls to those URIs and some JSON and/or XML representations of resources, many of which will contain relational links. The RESTful principal of addressability is covered by the URIs. Each resource has its own address or URI—every interesting piece of information the server can provide is exposed as a resource. The constraint of uniform interface is partially addressed by the combination of URIs and HTTP verbs, and using them in line with the standards and conventions.

-

In deciding what resources are within your system, name them as nouns as opposed to verbs or actions. In other words, a RESTful URI should refer to a resource that is a thing instead of referring to an action. Nouns have properties as verbs do not, just another distinguishing factor.

-

Some example resources are:

-
    -
  • Users of the system.
  • -
  • Courses in which a student is enrolled.
  • -
  • A user's timeline of posts.
  • -
  • The users that follow another user.
  • -
  • An article about horseback riding.
  • -
-

Each resource in a service suite will have at least one URI identifying it. And it's best when that URI makes sense and adequately describes the resource. URIs should follow a predictable, hierarchical structure to enhance understandability and, therefore, usability: predictable in the sense that they're consistent, hierarchical in the sense that data has structure—relationships. This is not a REST rule or constraint, but it enhances the API.

-

RESTful APIs are written for consumers. The name and structure of URIs should convey meaning to those consumers. It's often difficult to know what the data boundaries should be, but with understanding of your data, you most-likely are equipped to take a stab and what makes sense to return as a representation to your clients. Design for your clients, not for your data.

-

Let's say we're describing an order system with customers, orders, line items, products, etc. Consider the URIs involved in describing the resources in this service suite:

-
-
-
-
- -
-
-

To insert (create) a new customer in the system, we might use:
- POST http://www.example.com/customers

-

To read a customer with Customer ID# 33245:
- GET http://www.example.com/customers/33245 - The same URI would be used for PUT and DELETE, to update and delete, respectively.

-

Here are proposed URIs for products:
- POST http://www.example.com/products - for creating a new product.

-

GET|PUT|DELETE http://www.example.com/products/66432
- for reading, updating, deleting product 66432, respectively.

-

Now, here is where it gets fun... What about creating a new order for a customer? One option might be: POST http://www.example.com/orders And that could work to create an order, but it's arguably outside the context of a customer.

-

Because we want to create an order for a customer (note the relationship), this URI perhaps is not as intuitive as it could be. It could be argued that the following URI would offer better clarity: POST http://www.example.com/customers/33245/orders Now we know we're creating an order for customer ID# 33245.

-

Now what would the following return?
- GET http://www.example.com/customers/33245/orders
- Probably a list of orders that customer #33245 has created or owns. Note: we may choose to not support DELETE or PUT for that url since it's operating on a collection.

-

Now, to continue the hierarchical concept, what about the following URI?
- POST http://www.example.com/customers/33245/orders/8769/lineitems
- That might add a line item to order #8769 (which is for customer #33245). Right! GET for that URI might return all the line items for that order. However, if line items don't make sense only in customer context or also make sense outside the context of a customer, we would offer a POST www.example.com/orders/8769/lineitems URI.

-

Along those lines, because there may be multiple URIs for a given resource, we might also offer a GET http://www.example.com/orders/8769 URI that supports retrieving an order by number without having to know the customer number.

-

To go one layer deeper in the hierarchy:
- GET http://www.example.com/customers/33245/orders/8769/lineitems/1
- Might return only the first line item in that same order.

-

By now you can see how the hierarchy concept works. There aren't any hard and fast rules, only make sure the imposed structure makes sense to consumers of your services. As with everything in the craft of Software Development, naming is critical to success.

-

Look at some widely used APIs to get the hang of this and leverage the intuition of your teammates to refine your API resource URIs. Some example APIs are:

-
    -
  • Twitter: https://developer.twitter.com/en/docs/api-reference-index
  • -
  • Facebook: https://developers.facebook.com/docs/reference/api/
  • -
  • LinkedIn: https://developer.linkedin.com/apis
  • -
-
- -
-

While we've discussed some examples of appropriate resource names, sometimes it's informative to see some anti-patterns. Below are some examples of poor RESTful resource URIs seen in the "wild." These are examples of what not to do!

-

First up, often services use a single URI to specify the service interface, using query-string parameters to specify the requested operation and/or HTTP verb. For example to update customer with ID 12345, the request for a JSON body might be:

-

GET http://api.example.com/services?op=update_customer&id=12345&format=json

-

By now, you're above doing this. Even though the 'services' URL node is a noun, this URL is not self- descriptive as the URI hierarchy is the same for all requests. Plus, it uses GET as the HTTP verb even though we're performing an update. This is counter-intuitive and is painful (even dangerous) to use as a client.

-

Here's another example following the same operation of updating a customer:

-

GET http://api.example.com/update_customer/12345

-

And its evil twin:

-

GET http://api.example.com/customers/12345/update

-

You'll see this one a lot as you visit other developer's service suites. Note that the developer is attempting to create RESTful resource names and has made some progress. But you're better than this —able to identify the verb phrase in the URL. Notice that we don't need to use the 'update' verb phrase in the URL because we can rely on the HTTP verb to inform that operation. Just to clarify, the following resource URL is redundant:

-

PUT http://api.example.com/customers/12345/update

-

With both PUT and 'update' in the request, we're offering to confuse our service consumers! Is 'update' the resource? So, we've spent some time beating the horse at this point. I'm certain you understand...

-
-
-

Let's talk about the debate between the pluralizers and the "singularizers"... Haven't heard of that debate? It does exist. Essentially, it boils down to this question...

-

Should URI nodes in your hierarchy be named using singular or plural nouns? For example, should your URI for retrieving a representation of a customer resource look like this:

-

GET http://www.example.com/customer/33245 or: - GET http://www.example.com/customers/33245

-

There are good arguments on both sides, but the commonly-accepted practice is to always use plurals in node names to keep your API URIs consistent across all HTTP methods. The reasoning is based on the concept that customers are a collection within the service suite and the ID (e.g. 33245) refers to one of those customers in the collection.

-

Using this rule, an example multi-node URI using pluralization would look like (emphasis added):

-

GET http://www.example.com/customers/33245/orders/8769/lineitems/1

-

with 'customers', 'orders', and 'lineitems' URI nodes all being their plural forms.

-

This implies that you only really need two base URLs for each root resource. One for creation of the resource within a collection and the second for reading, updating and deleting the resource by its identifier. For example the creation case, using customers as the example, is handled by the following URL:

-

POST http://www.example.com/customers

-

And the read, update and delete cases are handled by the following:

-

GET|PUT|DELETE http://www.example.com/customers/{id}

-

As mentioned earlier, there may be multiple URIs for a given resource, but as a minimum full CRUD capabilities are aptly handled with two simple URIs.

-

You ask if there is a case where pluralization doesn't make sense. Well, yes, in fact there is. When there isn't a collection concept in play. In other words, it's acceptable to use a singularized resource name when there can only be one of the resource—it's a singleton resource. For example, if there was a single, overarching configuration resource, you might use a singularized noun to represent that:

-

GET|PUT|DELETE http://www.example.com/configuration

-

Note the lack of a configuration ID and usage of POST verb. And say that there was only one configuration per customer, then the URL might be:

-

GET|PUT|DELETE http://www.example.com/customers/12345/configuration

-

Again, no ID for the configuration and no POST verb usage. Although, I'm sure that in both of these cases POST usage might be argued to be valid. Well... OK.

-
-
-
-
-
- -
- - - - - - Fork me on GitHub - - diff --git a/lessons/restquicktips.html b/lessons/restquicktips.html deleted file mode 100644 index b2d848a..0000000 --- a/lessons/restquicktips.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - RESTful Services Quick Tips - - - - - - - - - - - - - - - -
-
- -
-
-
-

REST API Quick Tips

-
-
- -
-
-
-
-

Whether it's technically RESTful or not (according to the six constraints mentioned previously), here are a few recommended REST-like concepts. These six quick tips will result in better, more usable services.

-

Use HTTP Verbs to Make Your Requests Mean Something

-

API consumers are capable of sending GET, POST, PUT, and DELETE verbs, which greatly enhance the clarity of a given request.

-

Generally, the four primary HTTP verbs are used as follows: -

-
GET
-
Read a specific resource (by an identifier) or a collection of resources.
-
PUT
-
Update a specific resource (by an identifier) or a collection of resources. Can also be used to create a specific resource if the resource identifier is known before-hand.
-
DELETE
-
Remove/delete a specific resource by an identifier.
-
POST
-
Create a new resource. Also a catch-all verb for operations that don't fit into the other categories.
-
-

-

Note

-

- GET requests must not change any underlying resource data. Measurements and tracking which update data may still occur, but the resource data identified by the URI should not change. -

-

Provide Sensible Resource Names

-

Producing a great API is 80% art and 20% science. Creating a URL hierarchy representing sensible resources is the art part. Having sensible resource names (which are just URL paths, such as /customers/12345/orders) improves the clarity of what a given request does.

-

Appropriate resource names provide context for a service request, increasing understandability of the API. Resources are viewed hierarchically via their URI names, offering consumers a friendly, easily-understood hierarchy of resources to leverage in their applications.

-

Here are some quick-hit rules for URL path (resource name) design: -

    -
  • Use identifiers in your URLs instead of in the query-string. Using URL query-string parameters is fantastic for filtering, but not for resource names. -
    • Good: /users/12345
    • Poor: /api?type=user&id=23
  • -
  • Leverage the hierarchical nature of the URL to imply structure.
  • -
  • Design for your clients, not for your data.
  • -
  • Resource names should be nouns. Avoid verbs as resource names, to improve clarity. Use the HTTP methods to specify the verb portion of the request.
  • -
  • Use plurals in URL segments to keep your API URIs consistent across all HTTP methods, using the collection metaphor. -
    • Recommended: /customers/33245/orders/8769/lineitems/1
    • Not: /customer/33245/order/8769/lineitem/1
  • -
  • Avoid using collection verbiage in URLs. For example 'customer_list' as a resource. Use pluralization to indicate the collection metaphor (e.g. customers vs. customer_list).
  • -
  • Use lower-case in URL segments, separating words with underscores ('_') or hyphens ('-'). Some servers ignore case so it's best to be clear.
  • -
  • Keep URLs as short as possible, with as few segments as makes sense.
  • -
-

-

Use HTTP Response Codes to Indicate Status

-

Response status codes are part of the HTTP specification. There are quite a number of them to address the most common situations. In the spirit of having our RESTful services embrace the HTTP specification, our Web APIs should return relevant HTTP status codes. For example, when a resource is successfully created (e.g. from a POST request), the API should return HTTP status code 201. A list of valid HTTP status codes is available here which lists detailed descriptions of each.

-

Suggested usages for the "Top 10" HTTP Response Status Codes are as follows: -

-
200 OK
-
General success status code. This is the most common code. Used to indicate success.
-
201 CREATED
-
Successful creation occurred (via either POST or PUT). Set the Location header to contain a link to the newly-created resource (on POST). Response body content may or may not be present.
-
204 NO CONTENT
-
Indicates success but nothing is in the response body, often used for DELETE and PUT operations.
-
400 BAD REQUEST
-
General error for when fulfilling the request would cause an invalid state. Domain validation errors, missing data, etc. are some examples.
-
401 UNAUTHORIZED
-
Error code response for missing or invalid authentication token.
-
403 FORBIDDEN
-
Error code for when the user is not authorized to perform the operation or the resource is unavailable for some reason (e.g. time constraints, etc.).
-
404 NOT FOUND
-
Used when the requested resource is not found, whether it doesn't exist or if there was a 401 or 403 that, for security reasons, the service wants to mask.
-
405 METHOD NOT ALLOWED
-
Used to indicate that the requested URL exists, but the requested HTTP method is not applicable. For example, POST /users/12345 where the API doesn't support creation of resources this way (with a provided ID). The Allow HTTP header must be set when returning a 405 to indicate the HTTP methods that are supported. In the previous case, the header would look like "Allow: GET, PUT, DELETE"
-
409 CONFLICT
-
Whenever a resource conflict would be caused by fulfilling the request. Duplicate entries, such as trying to create two customers with the same information, and deleting root objects when cascade-delete is not supported are a couple of examples.
-
500 INTERNAL SERVER ERROR
-
Never return this intentionally. The general catch-all error when the server-side throws an exception. Use this only for errors that the consumer cannot address from their end.
-
-

-

Offer Both JSON and XML

-

Favor JSON support unless you're in a highly-standardized and regulated industry that requires XML, schema validation and namespaces, and offer both JSON and XML unless the costs are staggering. Ideally, let consumers switch between formats using the HTTP Accept header, or by just changing an extension from .xml to .json on the URL.

-

Be aware that as soon as we start talking about XML support, we start talking about schemas for validation, namespaces, etc. Unless required by your industry, avoid supporting all that complexity initially, if ever. JSON is designed to be simple, terse and functional. Make your XML look like that if you can.

-

In other words, make the XML that is returned more JSON-like — simple and easy to read, without the schema and namespace details present, just data and links. If it ends up being more complex than this, the cost of XML will be staggering. In my experience no one has used XML responses anyway for the last several years, it's just too expensive to consume.

-

Note that JSON-Schema offers schema-style validation capabilities, if you need that sort of thing.

-

Create Fine-Grained Resources

-

When starting out, it's best to create APIs that mimic the underlying application domain or database architecture of your system. Eventually, you'll want aggregate services that utilize multiple underlying resources to reduce chattiness. However, it's much easier to create larger resources later from individual resources than it is to create fine-grained or individual resources from larger aggregates. Make it easy on yourself and start with small, easily defined resources, providing CRUD functionality on those. You can create those use-case-oriented, chattiness-reducing resources later.

-

Consider Connectedness

-

One of the principles of REST is connectedness—via hypermedia links (search HATEOAS). While services are still useful without them, APIs become more self-descriptive and discoverable when links are returned in the response. At the very least, a 'self' link reference informs clients how the data was or can be retrieved. Additionally, utilize the HTTP Location header to contain a link on resource creation via POST (or PUT). For collections returned in a response that support pagination, 'first', 'last', 'next' and 'prev' links at a minimum are very helpful.

-

Regarding linking formats, there are many. The HTTP Web Linking Specification (RFC5988) explains a link as follows: -

a link is a typed connection between two - resources that are identified by Internationalised Resource - Identifiers (IRIs) [RFC3987], and is comprised of: -
    -
  • A context IRI,
  • -
  • a link relation type
  • -
  • a target IRI, and
  • -
  • optionally, target attributes.
  • -
- A link can be viewed as a statement of the form "{context IRI} has a - {relation type} resource at {target IRI}, which has {target - attributes}."

-

At the very least, place links in the HTTP Link header as recommended in the specification, or embrace a JSON representation of this HTTP link style (such as Atom-style links, see: RFC4287) in your JSON representations. Later, you can layer in more complex linking styles such as HAL+JSON, Siren, Collection+JSON, and/or JSON-LD, etc. as your REST APIs become more mature.

-
-
-
- -
- - - - - - Fork me on GitHub - - diff --git a/lessons/whatisrest.html b/lessons/whatisrest.html deleted file mode 100644 index 84d24d1..0000000 --- a/lessons/whatisrest.html +++ /dev/null @@ -1,182 +0,0 @@ - - - - - What is REST? - - - - - - - - - - - - - - - -
-
- -
-
-
-

What Is REST?

-
-
- -
-
-
- -
-
-
- -
-
-
-
-

The REST architectural style describes six constraints. These constraints, applied to the architecture, were originally communicated by Roy Fielding in his doctoral dissertation (see https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm) and defines the basis of RESTful-style.

-

The six constraints are: (click the constraint to read more)

-
    -
  • Uniform Interface -
    -

    The uniform interface constraint defines the interface between clients and servers. It simplifies and decouples the architecture, which enables each part to evolve independently. The four guiding principles of the uniform interface are:

    -

    Resource-Based

    -

    Individual resources are identified in requests using URIs as resource identifiers. The resources themselves are conceptually separate from the representations that are returned to the client. For example, the server does not send its database, but rather, some HTML, XML or JSON that represents some database records expressed, for instance, in Finnish and encoded in UTF-8, depending on the details of the request and the server implementation.

    -

    Manipulation of Resources Through Representations

    -

    When a client holds a representation of a resource, including any metadata attached, it has enough information to modify or delete the resource on the server, provided it has permission to do so.

    -

    Self-descriptive Messages

    -

    Each message includes enough information to describe how to process the message. For example, which parser to invoke may be specified by an Internet media type (previously known as a MIME type). Responses also explicitly indicate their cache-ability.

    -

    Hypermedia as the Engine of Application State (HATEOAS)

    -

    Clients deliver state via body contents, query-string parameters, request headers and the requested URI (the resource name). Services deliver state to clients via body content, response codes, and response headers. This is technically referred-to as hypermedia (or hyperlinks within hypertext).

    -

    Aside from the description above, HATEOS also means that, where necessary, links are contained in the returned body (or headers) to supply the URI for retrieval of the object itself or related objects. We'll talk about this in more detail later.

    -

    The uniform interface that any REST services must provide is fundamental to its design.

    -
    -
  • -
  • Stateless -
    -

    As REST is an acronym for REpresentational State Transfer, statelessness is key. Essentially, what this means is that the necessary state to handle the request is contained within the request itself, whether as part of the URI, query-string parameters, body, or headers. The URI uniquely identifies the resource and the body contains the state (or state change) of that resource. Then after the server does it's processing, the appropriate state, or the piece(s) of state that matter, are communicated back to the client via headers, status and response body.

    -

    Most of us who have been in the industry for a while are accustomed to programming within a container which provides us with the concept of “session” which maintains state across multiple HTTP requests. In REST, the client must include all information for the server to fulfill the request, resending state as necessary if that state must span multiple requests. Statelessness enables greater scalability since the server does not have to maintain, update or communicate that session state. Additionally, load balancers don't have to worry about session affinity for stateless systems.

    -

    So what's the difference between state and a resource? State, or application state, is that which the server cares about to fulfill a request—data necessary for the current session or request. A resource, or resource state, is the data that defines the resource representation—the data stored in the database, for instance. Consider application state to be data that could vary by client, and per request. Resource state, on the other hand, is constant across every client who requests it.

    -

    Ever had back-button issues with a web application where it went AWOL at a certain point because it expected you to do things in a certain order? That's because it violated the statelessness principle. There are cases that don't honor the statelessness principle, such as three-legged OAuth, API call rate limiting, etc. However, make every effort to ensure that application state doesn't span multiple requests of your service(s).

    -
    -
  • -
  • Cacheable -
    -

    As on the World Wide Web, clients can cache responses. Responses must therefore, implicitly or explicitly, define themselves as cacheable, or not, to prevent clients reusing stale or inappropriate data in response to further requests. Well-managed caching partially or completely eliminates some client–server interactions, further improving scalability and performance.

    -
    -
  • -
  • Client-Server -
    -

    The uniform interface separates clients from servers. This separation of concerns means that, for example, clients are not concerned with data storage, which remains internal to each server, so that the portability of client code is improved. Servers are not concerned with the user interface or user state, so that servers can be simpler and more scalable. Servers and clients may also be replaced and developed independently, as long as the interface is not altered.

    -
    -
  • -
  • Layered System -
    -

    A client cannot ordinarily tell whether it is connected directly to the end server, or to an intermediary along the way. Intermediary servers may improve system scalability by enabling load-balancing and by providing shared caches. Layers may also enforce security policies.

    -
    -
  • -
  • Code on Demand (optional) -
    -

    Servers are able to temporarily extend or customize the functionality of a client by transferring logic to it that it can execute. Examples of this may include compiled components such as Java applets and client-side scripts such as JavaScript.

    -

    Complying with these constraints, and thus conforming to the REST architectural style, will enable any kind of distributed hypermedia system to have desirable emergent properties, such as performance, scalability, simplicity, modifiability, visibility, portability and reliability.

    -

    NOTE: The only optional constraint of REST architecture is code on demand. If a service violates any other constraint, it cannot strictly be referred to as RESTful.

    -
    -
  • -
-
-
-
- -
- - - - - - Fork me on GitHub - - diff --git a/resources.html b/resources.html deleted file mode 100644 index 65aa1af..0000000 --- a/resources.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - RESTful Web Services Resources - - - - - - - - - - - - - - - -
-
- -
-
-
-

REST API Resources

-

Translations

-
-
Russian
-
http://www.restapitutorial.ru/
-
-

REST API Cheat Sheets

-
    -
  • API Design Cheat Sheet - This GitHub repository outlines important tips to consider when designing APIs that developers love.
  • -
  • Platform-Building Cheat Sheet - Everyone wants to build a platform. This GitHub repository is a public receptical of ground rules when building a platform.
  • -
-

REST API Best Practices

-

Get the RESTful Design Best Practices guide (choose your format). This guide reduces the world of RESTful services design into easy-to-follow principles. It also provides several cookbook type recipes in critical areas to increase service usability, reduce confusion during implemenation, as well as improve consistency.

- -

Building REST APIs in Java

-

RestExpress (GitHub). A lightweight microservices framework for Java, RestExpress composes best-of-breed tools to form a lightweight, minimalist Java framework for quickly creating RESTful APIs.

-

Web Resources

- -
-
-
- -
- - - - - - Fork me on GitHub - - diff --git a/restapiwebinar.html b/restapiwebinar.html deleted file mode 100644 index 5c85729..0000000 --- a/restapiwebinar.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - REST API Questions - - - - - - - - - - - - - - - - -
-
-
-

What's Your Most Burning REST API Question?

-

Hey Fellow REST-afarian!

-

I'm creating a FREE Webinar about REST API Design and want to answer your most-pressing REST API question.

-

Enter your question in the form to the right, along with your email address and I'll answer your questions via the Webinar.

-

REST well,
- Todd Fredrich, The REST API Tutor

-
-
- -
-
-
-

Submit it Now!

-
* indicates required
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- Additional Preferences -
  • -
  • -
-
-
- - -
- -
-
-
-
- - -
-
-
- -
- - - - - - Fork me on GitHub - - diff --git a/restquicktips.html b/restquicktips.html deleted file mode 100644 index 4bb5f63..0000000 --- a/restquicktips.html +++ /dev/null @@ -1,30 +0,0 @@ - - - Moved to new URL: https://www.restapitutorial.com/lessons/restquicktips.html - - - - - - - - -

This page has been moved to https://www.restapitutorial.com/lessons/restquicktips.html

-

If your browser doesn't redirect you to the new location please - click here, - sorry for the hassles!

- - diff --git a/themes/relearn/.editorconfig b/themes/relearn/.editorconfig new file mode 100644 index 0000000..7849b09 --- /dev/null +++ b/themes/relearn/.editorconfig @@ -0,0 +1,19 @@ +# https://editorconfig.org + +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +trim_trailing_whitespace = true + +[*.css] +indent_size = 4 + +[*.js] +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false diff --git a/themes/relearn/.github/actions/build_site/action.yaml b/themes/relearn/.github/actions/build_site/action.yaml new file mode 100644 index 0000000..38f1b81 --- /dev/null +++ b/themes/relearn/.github/actions/build_site/action.yaml @@ -0,0 +1,14 @@ +name: Build site +description: Builds the Hugo exampleSite for later deploy on GitHub-Pages +runs: + using: composite + steps: + - name: Setup Hugo + uses: peaceiris/actions-hugo@v2 + with: + hugo-version: 'latest' + + - name: Build site + shell: bash + run: | + hugo --source ${GITHUB_WORKSPACE}/exampleSite --destination ${GITHUB_WORKSPACE}/../public --cleanDestinationDir --gc --baseURL https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/ --theme ${GITHUB_WORKSPACE} diff --git a/themes/relearn/.github/actions/check_milestone/action.yaml b/themes/relearn/.github/actions/check_milestone/action.yaml new file mode 100644 index 0000000..2dda0ec --- /dev/null +++ b/themes/relearn/.github/actions/check_milestone/action.yaml @@ -0,0 +1,73 @@ +name: Check milestone +description: Checks if the given milestone and its according tag are valid to be released +inputs: + milestone: + description: Milestone for this release + required: true + github_token: + description: Secret GitHub token + required: true +outputs: + outcome: + description: Result of the check, success or failure + value: ${{ steps.outcome.outputs.outcome }} +runs: + using: composite + steps: + - name: Get tag uniqueness + id: unique_tag + uses: mukunku/tag-exists-action@v1.0.0 + with: + tag: ${{ env.MILESTONE }} + env: + MILESTONE: ${{ inputs.milestone }} + GITHUB_TOKEN: ${{ inputs.github_token }} + + - name: Get closed issues for milestone + id: closed_issues + uses: octokit/graphql-action@v2.x + with: + query: | + query { + search(first: 1, type: ISSUE, query: "user:${{ github.repository_owner }} repo:${{ github.event.repository.name }} milestone:${{ env.MILESTONE }} state:closed") { + issueCount + } + } + env: + MILESTONE: ${{ inputs.milestone }} + GITHUB_TOKEN: ${{ inputs.github_token }} + + - name: Get open issues for milestone + id: open_issues + uses: octokit/graphql-action@v2.x + with: + query: | + query { + search(first: 1, type: ISSUE, query: "user:${{ github.repository_owner }} repo:${{ github.event.repository.name }} milestone:${{ env.MILESTONE }} state:open") { + issueCount + } + } + env: + MILESTONE: ${{ inputs.milestone }} + GITHUB_TOKEN: ${{ inputs.github_token }} + + - name: Set outcome + id: outcome + shell: bash + run: | + if [ "${{ fromJSON(steps.closed_issues.outputs.data).search.issueCount > 0 && fromJSON(steps.open_issues.outputs.data).search.issueCount == 0 && steps.unique_tag.outputs.exists == 'false' }}" = "true" ]; then + echo "::set-output name=outcome::success" + else + echo "::set-output name=outcome::failure" + fi + + - name: Log results and exit + shell: bash + run: | + echo outcome : ${{ steps.outcome.outputs.outcome }} + echo has unique tag : ${{ steps.unique_tag.outputs.exists == 'false' }} + echo has closed issues: ${{ fromJSON(steps.closed_issues.outputs.data).search.issueCount > 0 }} + echo has open issues : ${{ fromJSON(steps.open_issues.outputs.data).search.issueCount > 0 }} + if [ "${{ steps.outcome.outputs.outcome }}" = "failure" ]; then + exit 1 + fi diff --git a/themes/relearn/.github/actions/deploy_site/action.yaml b/themes/relearn/.github/actions/deploy_site/action.yaml new file mode 100644 index 0000000..b03cae0 --- /dev/null +++ b/themes/relearn/.github/actions/deploy_site/action.yaml @@ -0,0 +1,17 @@ +name: Deploy site +description: Deploys a built site on GitHub-Pages +inputs: + github_token: + description: Secret GitHub token + required: true +runs: + using: composite + steps: + - name: Deploy site + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ env.GITHUB_TOKEN }} + publish_dir: ${{ env.GITHUB_WORKSPACE }}/../public + env: + GITHUB_TOKEN: ${{ inputs.github_token }} + GITHUB_WORKSPACE: ${{ github.workspace }} diff --git a/themes/relearn/.github/actions/release_milestone/action.yaml b/themes/relearn/.github/actions/release_milestone/action.yaml new file mode 100644 index 0000000..901b2c2 --- /dev/null +++ b/themes/relearn/.github/actions/release_milestone/action.yaml @@ -0,0 +1,77 @@ +name: Release milestone +description: Creates a release with changelog and tag out of a given milestone +inputs: + milestone: + description: Milestone for this release + required: true + github_token: + description: Secret GitHub token + required: true +runs: + using: composite + steps: + - name: Setup node + uses: actions/setup-node@v2 + with: + node-version: '16' + + - name: Close milestone + uses: Akkjon/close-milestone@v2 + with: + milestone_name: ${{ env.MILESTONE }} + env: + MILESTONE: ${{ inputs.milestone }} + GITHUB_TOKEN: ${{ inputs.github_token }} + + - name: Create provisionary tag + shell: bash + env: + MILESTONE: ${{ inputs.milestone }} + GITHUB_TOKEN: ${{ inputs.github_token }} + run: | + git config user.name "GitHub Actions Bot" + git config user.email "<>" + git tag --message "" "$MILESTONE" + git push origin "$MILESTONE" + + - name: Update changelog + shell: bash + env: + MILESTONE: ${{ inputs.milestone }} + GITHUB_TOKEN: ${{ inputs.github_token }} + GREN_GITHUB_TOKEN: ${{ inputs.github_token }} + run: | + echo "$MILESTONE" > layouts/partials/version.html + npx github-release-notes@0.17.1 changelog --generate --override --tags=all + git add * + git commit --message "Ship tag $MILESTONE" + git push origin main + + - name: Create final tag + shell: bash + env: + MILESTONE: ${{ inputs.milestone }} + GITHUB_TOKEN: ${{ inputs.github_token }} + run: | + git tag --force --message "" "$MILESTONE" + git push --force origin "$MILESTONE" + + - name: Publish release + shell: bash + env: + MILESTONE: ${{ inputs.milestone }} + GREN_GITHUB_TOKEN: ${{ inputs.github_token }} + run: | + npx github-release-notes@0.17.1 release --tags "$MILESTONE" + + - name: Update version number to mark non-release version + shell: bash + env: + MILESTONE: ${{ inputs.milestone }} + GITHUB_TOKEN: ${{ inputs.github_token }} + GREN_GITHUB_TOKEN: ${{ inputs.github_token }} + run: | + echo "$MILESTONE+tip" > layouts/partials/version.html + git add * + git commit --message "Mark non-release version" + git push origin main diff --git a/themes/relearn/.github/contributing.md b/themes/relearn/.github/contributing.md new file mode 100644 index 0000000..0bcbe39 --- /dev/null +++ b/themes/relearn/.github/contributing.md @@ -0,0 +1,28 @@ +# Guidelines + +## For Development + +- help us putting your code into production by opening a meaningful issue +- stay simple for the user by focusing on the mantra "convention over configuration" +- at installation the site should work reasonable without (m)any configuration +- stay close to the Hugo way +- don't use npm or any preprocessing, our contributors may not be front-end developers +- document new features in exampleSite +- don't break existing features if you don't have to +- remove reported issue from the browser's console +- be compatible to IE11, at least for main functionality, for Javascript this means: + - test in IE11 + - check caniuse.com + - don't use arrow functions + - don't use template literals + - don't use other fancy new ES5/6 stuff + +## For Release + +- create releases following [semver policy](https://semver.org/) +- we are using GitHub actions to create new releases +- a release is based on a milestone named like the release itself - just the version number, eg: 1.1.0 +- remember that there have to be at least one closed issue assigned to the milestone +- the release action only runs successfully if all assigned issues for this milestone are closed +- the milestone itself will be closed during execution of the action +- a once released milestone can not be released again diff --git a/themes/relearn/.github/workflows/build.yaml b/themes/relearn/.github/workflows/build.yaml new file mode 100644 index 0000000..fd9ce5c --- /dev/null +++ b/themes/relearn/.github/workflows/build.yaml @@ -0,0 +1,20 @@ +name: Build + +on: + push: # Build on all pushes but only deploy for main branch + pull_request: # Build on all PRs regardless what branch + workflow_dispatch: # Allow this task to be manually started (you'll never know) + +jobs: + ci: + name: Run build + runs-on: ubuntu-latest + if: github.event_name != 'push' || (github.event_name == 'push' && github.ref != 'refs/heads/main') + steps: + - name: Checkout repo + uses: actions/checkout@v2 + with: + submodules: true # Fetch Hugo themes (true OR recursive) + + - name: Build site + uses: ./.github/actions/build_site diff --git a/themes/relearn/.github/workflows/deploy.yaml b/themes/relearn/.github/workflows/deploy.yaml new file mode 100644 index 0000000..2434748 --- /dev/null +++ b/themes/relearn/.github/workflows/deploy.yaml @@ -0,0 +1,25 @@ +name: Deploy + +on: + push: # Build on all pushes but only deploy for main branch + workflow_dispatch: # Allow this task to be manually started (you'll never know) + +jobs: + deploy: + name: Run deploy + runs-on: ubuntu-latest + if: github.event_name != 'push' || (github.event_name == 'push' && github.ref == 'refs/heads/main') + steps: + - name: Checkout repo + uses: actions/checkout@v2 + with: + submodules: true # Fetch Hugo themes (true OR recursive) + fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod + + - name: Build site + uses: ./.github/actions/build_site + + - name: Deploy site + uses: ./.github/actions/deploy_site + with: + github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/themes/relearn/.github/workflows/release.yaml b/themes/relearn/.github/workflows/release.yaml new file mode 100644 index 0000000..1d32b59 --- /dev/null +++ b/themes/relearn/.github/workflows/release.yaml @@ -0,0 +1,42 @@ +name: Release + +on: + workflow_dispatch: + inputs: + milestone: + description: 'Milestone for this release' + required: true + +jobs: + release: + name: Run release + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v2 + with: + submodules: true # Fetch Hugo themes (true OR recursive) + fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod + + - name: Check milestone + id: check + uses: ./.github/actions/check_milestone + with: + milestone: ${{ github.event.inputs.milestone }} + github_token: ${{ secrets.GITHUB_TOKEN }} + + - name: Create release + if: ${{ steps.check.outputs.outcome == 'success' }} + uses: ./.github/actions/release_milestone + with: + milestone: ${{ github.event.inputs.milestone }} + github_token: ${{ secrets.GITHUB_TOKEN }} + + # We need to deploy the site again to show the updated changelog + - name: Build site + uses: ./.github/actions/build_site + + - name: Deploy site + uses: ./.github/actions/deploy_site + with: + github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/themes/relearn/.gitignore b/themes/relearn/.gitignore new file mode 100644 index 0000000..70c1c35 --- /dev/null +++ b/themes/relearn/.gitignore @@ -0,0 +1,5 @@ +.DS_Store +public/ +exampleSite/public +exampleSite/hugo*.exe +.hugo_build.lock diff --git a/themes/relearn/.grenrc.js b/themes/relearn/.grenrc.js new file mode 100644 index 0000000..96ba718 --- /dev/null +++ b/themes/relearn/.grenrc.js @@ -0,0 +1,38 @@ +module.exports = { + changelogFilename: "exampleSite/content/basics/CHANGELOG.md", + dataSource: "milestones", + groupBy: { + "Enhancements": [ + "feature", + ], + "Fixes": [ + "bug" + ], + "Maintenance": [ + "task", + ], + "Uncategorised": [ + "closed", + ], + }, + ignoreLabels: [ + "hugo", + ], + ignoreIssuesWith: [ + "discussion", + "documentation", + "duplicate", + "invalid", + "support", + "wontfix", + ], + ignoreTagsWith: [ + "Relearn", + ], + milestoneMatch: "{{tag_name}}", + onlyMilestones: true, + template: { + group: "\n### {{heading}}\n", + release: ({ body, date, release }) => `## ${release} (` + date.replace( /(\d+)\/(\d+)\/(\d+)/, '$3-$2-$1' ) + `)\n${body}`, + }, +}; diff --git a/themes/relearn/.issuetracker b/themes/relearn/.issuetracker new file mode 100644 index 0000000..6beb6e7 --- /dev/null +++ b/themes/relearn/.issuetracker @@ -0,0 +1,7 @@ +# Integration with Issue Tracker +# +# (note that '\' need to be escaped). + +[issuetracker "GitHub Rule"] + regex = "#(\\d+)" + url = "https://github.com/McShelby/hugo-theme-relearn/issues/$1" diff --git a/themes/relearn/LICENSE b/themes/relearn/LICENSE new file mode 100644 index 0000000..ce8a3bd --- /dev/null +++ b/themes/relearn/LICENSE @@ -0,0 +1,23 @@ +The MIT License (MIT) + +Copyright (c) 2021 Sören Weber +Copyright (c) 2017 Valere JEANTET +Copyright (c) 2016 MATHIEU CORNIC +Copyright (c) 2014 Grav + +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: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +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. diff --git a/themes/relearn/README.md b/themes/relearn/README.md new file mode 100644 index 0000000..e265fca --- /dev/null +++ b/themes/relearn/README.md @@ -0,0 +1,63 @@ +# Hugo Relearn Theme + +A theme for [Hugo](https://gohugo.io/) designed for documentation. + +![Overview](https://github.com/McShelby/hugo-theme-relearn/raw/main/images/screenshot.png) + +## Motivation + +The theme is a fork of the great [Learn theme](https://github.com/matcornic/hugo-theme-learn) with the aim of fixing long outstanding bugs and adepting to latest Hugo features. As far as possible this theme tries to be a drop-in replacement for the Learn theme. + +## Main features + +- Usable offline, no external dependencies +- Support for Internet Explorer 11 +- Responsive design +- Configurable hidden pages +- Automatic next/prev buttons to navigate through menu entries +- Automatic Search +- Print whole chapters or even the complete site +- Multilingual mode for English, Arabic, Simplified Chinese, Traditional Chinesse, Dutch, French, German, Hindi, Indonesian, Italian, Japanese, Korean, Polish, Portuguese, Russian, Spanish, Turkish, Vietnamese +- Unrestricted menu configuration relating to amount of items and level of nesting +- Font Awesome icons +- Tagging support +- Image resizing, shadow… +- Syntax highlighting +- Attachments files +- List child pages +- Mermaid diagrams for flowcharts, sequences, gantts, pie, etc. +- Swagger UI for OpenAPI Specifications +- Customizable look and feel +- Predefined (light, dark) and customizable color variants +- Buttons +- Tip/Note/Info/Warning boxes +- Expand +- Tabs +- File inclusion +## Installation + +Visit the [installation instructions](https://mcshelby.github.io/hugo-theme-relearn/basics/installation) to learn how to setup the theme in your Hugo installation. + +## Usage + +Visit the [documentation](https://mcshelby.github.io/hugo-theme-relearn/) to learn about all available features and how to use them. + +## Changelog + +See the [changelog](https://mcshelby.github.io/hugo-theme-relearn/basics/history) for a complete list of releases. + +## Contribution + +You are most welcome to contribute to the source code but please visit the [contribution guidelines](https://github.com/McShelby/hugo-theme-relearn/blob/main/.github/contributing.md) first. + +## License + +This theme is licensed under the [MIT License](https://github.com/McShelby/hugo-theme-relearn/blob/main/LICENSE). + +## Credits + +Special thanks to [everyone who has contributed](https://github.com/McShelby/hugo-theme-relearn/graphs/contributors) to this project. + +Many thanks to [Mathieu Cornic](https://github.com/matcornic) for his work on porting the [Learn theme](https://github.com/matcornic/hugo-theme-learn) to Hugo. + +Many thanks to [Andy Miller](https://github.com/rhukster) for initially creating the [Learn theme](https://github.com/getgrav/grav-theme-learn2) for Grav. diff --git a/themes/relearn/archetypes/chapter.md b/themes/relearn/archetypes/chapter.md new file mode 100644 index 0000000..6669355 --- /dev/null +++ b/themes/relearn/archetypes/chapter.md @@ -0,0 +1,12 @@ ++++ +chapter = true +pre = "X. " +title = "{{ replace .Name "-" " " | title }}" +weight = 5 ++++ + +### Chapter X + +# Some Chapter title + +Lorem Ipsum. \ No newline at end of file diff --git a/themes/relearn/archetypes/default.md b/themes/relearn/archetypes/default.md new file mode 100644 index 0000000..0af9e21 --- /dev/null +++ b/themes/relearn/archetypes/default.md @@ -0,0 +1,6 @@ ++++ +title = "{{ replace .Name "-" " " | title }}" +weight = 5 ++++ + +Lorem Ipsum. \ No newline at end of file diff --git a/themes/relearn/config.toml b/themes/relearn/config.toml new file mode 100644 index 0000000..bdbf019 --- /dev/null +++ b/themes/relearn/config.toml @@ -0,0 +1,12 @@ +[module] + [module.hugoVersion] + min = "0.93.0" + +[outputFormats] + [outputFormats.PRINT] + name= "PRINT" + baseName = "index" + path = "_print" + isHTML = true + mediaType = 'text/html' + permalinkable = false diff --git a/themes/relearn/exampleSite/config.toml b/themes/relearn/exampleSite/config.toml new file mode 100644 index 0000000..45a9cfe --- /dev/null +++ b/themes/relearn/exampleSite/config.toml @@ -0,0 +1,162 @@ +# this is a required setting for this theme to appear on https://themes.gohugo.io/ +# change this to a value appropriate for you +baseURL = "https://example.com" +# as the official Hugo documentation recommends, we turn this off for this +# showcase; this allows the published site to be served by both http and https +canonifyURLs = false +# required for official documentation served from subfolder +relativeURLs = false + +# the directory where Hugo reads the themes from; this is specific to your +# installation and most certainly needs be deleted or changed +themesdir = "../.." +# yeah, well, obviously a mandatory setting for your site, if you want to +# use this theme ;-) +theme = "hugo-theme-relearn" + +# the main language of this site; also an automatic pirrrate translation is +# available in this showcase +languageCode = "en" +defaultContentLanguage = "en" +# if you want to get rrrid o' ourrr pirrrates nonsense uncomment th' next line +# disableLanguages = ['pir'] + +# the site's title of this showcase; you should change this ;-) +title = "Hugo Relearn Documentation" + +# settings specific to this theme's features; choose to your likings and +# consult this documentation for explaination +[params] + editURL = "https://github.com/McShelby/hugo-theme-relearn/edit/main/exampleSite/content/" + description = "Documentation for Hugo Relearn Theme" + author = "Sören Weber" + showVisitedLinks = true + collapsibleMenu = true + disableBreadcrumb = false + disableNextPrev = false + disableLandingPageButton = true + titleSeparator = "::" + themeVariant = [ "relearn-light", "relearn-dark", "learn", "neon", "blue", "green", "red" ] + disableSeoHiddenPages = true + # this is for the stylesheet genertor to allow for interactivity in mermaid + # graphs; you usually will not need it and you should remove this for + # security reasons + mermaidInitialize = "{ \"securityLevel\": \"loose\" }" + +[outputs] + # add JSON to the home to support lunr search; This is a mandatory setting + # for the search functionality + # add PRINT to home, section and page to activate feature to print whole + # chapters + home = ["HTML", "RSS", "PRINT", "JSON"] + section = ["HTML", "RSS", "PRINT"] + page = ["HTML", "RSS", "PRINT"] + +[markup] + [markup.highlight] + # if `guessSyntax = true`, there will be no unstyled code even if no language + # was given BUT mermaid code fences will not work anymore! So this is a mandatory + # setting for your site + guessSyntax = false + + # here in this showcase we use our own modified chroma syntax highlightning style + # which is imported in theme-relearn-light.css / theme-relearn-dark.css; + # if you want to use a predefined style instead: + # - remove the following `noClasses` + # - set the following `style` to a predefined style name + # - remove the `@import` of the self-defined chroma stylesheet from your CSS files + # (here eg.: theme-relearn-light.css / theme-relearn-dark.css) + noClasses = false + # style = "tango" + + [markup.goldmark.renderer] + # activated for this showcase to use HTML and JavaScript; decide on your own needs; + # if in doubt, remove this line + unsafe = true + +# allows `hugo server` to display this showcase in IE11; this is used for testing, as we +# are still supporting IE11 - although with degraded experience; if you don't care about +# `hugo server` or browsers of ancient times, fell free to remove this whole block +[server] + [[server.headers]] + for = "**.html" + [server.headers.values] + X-UA-Compatible = "IE=edge" + +# showcase of the menu shortcuts; you can use relative URLs linking +# to your content or use fully-quallified URLs to link outside of +# your project +[Languages] + [Languages.en] + title = "Hugo Relearn Theme" + weight = 1 + languageName = "English" + landingPageURL = "/" + landingPageName = " Home" + + [[Languages.en.menu.shortcuts]] + name = " GitHub repo" + identifier = "ds" + url = "https://github.com/McShelby/hugo-theme-relearn" + weight = 10 + + [[Languages.en.menu.shortcuts]] + name = " Showcases" + url = "more/showcase/" + weight = 11 + + [[Languages.en.menu.shortcuts]] + name = " Hugo Documentation" + identifier = "hugodoc" + url = "https://gohugo.io/" + weight = 20 + + [[Languages.en.menu.shortcuts]] + name = " Credits" + url = "more/credits/" + weight = 30 + + [[Languages.en.menu.shortcuts]] + name = " Tags" + url = "tags/" + weight = 40 + + # this is ourrr way t' showcase th' multilang settings by + # doing autotrrranlat'n of th' english content; we are + # lazy and don't supporrt furrrther trrranslations; arrr, + # don't take it t' serrrious, fello'; it's prrretty hacky and: + # NOT MEANT FOR PRRRODUCTION! ARRR! + + [Languages.pir] + title = "Cap'n Hugo Relearrrn Theme" + weight = 1 + languageName = "Arrr! ☠ Pirrrates ☠" + landingPageURL = "/pir/" + landingPageName = " Arrr! Home" + + [[Languages.pir.menu.shortcuts]] + name = " GitHub repo" + identifier = "ds" + url = "https://github.com/McShelby/hugo-theme-relearn" + weight = 10 + + [[Languages.pir.menu.shortcuts]] + name = " Showcases" + url = "more/showcase/" + weight = 11 + + [[Languages.pir.menu.shortcuts]] + name = " Cap'n Hugo Documentat'n" + identifier = "hugodoc" + url = "https://gohugo.io/" + weight = 20 + + [[Languages.pir.menu.shortcuts]] + name = " Crrredits" + url = "more/credits/" + weight = 30 + + [[Languages.pir.menu.shortcuts]] + name = " Arrr! Tags" + url = "tags/" + weight = 40 diff --git a/themes/relearn/exampleSite/content/_index.en.md b/themes/relearn/exampleSite/content/_index.en.md new file mode 100644 index 0000000..201c72b --- /dev/null +++ b/themes/relearn/exampleSite/content/_index.en.md @@ -0,0 +1,60 @@ ++++ +title = "Hugo Relearn Theme" ++++ + +# Hugo Relearn Theme + +The [Relearn theme](http://github.com/McShelby/hugo-theme-relearn) is a theme for [Hugo](https://gohugo.io/), a static website generator written in Go. Where Hugo is often used for blogs, this theme is designed with documentation in mind. + +{{% notice info %}} +The theme is a fork of the great [Learn theme](https://github.com/matcornic/hugo-theme-learn) with the aim of fixing long outstanding bugs and adepting to latest Hugo features. As far as possible this theme tries to be a drop-in replacement for the Learn theme. +{{% /notice %}} + +## Main features + +{{% notice tip %}} +See [what's new]({{% relref "basics/migration" %}}) within the latest update. +{{% /notice %}} + +- Usable offline, no external dependencies +- Support for Internet Explorer 11 +- Responsive design +- Configurable hidden pages +- Automatic next/prev buttons to navigate through menu entries +- [Automatic Search]({{%relref "basics/configuration#activate-search" %}}) +- [Print]({{%relref "basics/configuration#activate-print-support" %}}) whole chapters or even the complete site +- [Multilingual mode]({{%relref "cont/i18n" %}}) for English, Arabic, Simplified Chinese, Traditional Chinesse, Dutch, French, German, Hindi, Indonesian, Italian, Japanese, Korean, Polish, Portuguese, Russian, Spanish, Turkish, Vietnamese +- [Unrestricted menu configuration]({{%relref "cont/menushortcuts" %}}) relating to amount of items and level of nesting +- [Font Awesome icons]({{%relref "cont/icons" %}}) +- [Tagging support]({{%relref "cont/tags" %}}) +- [Image resizing, shadow...]({{%relref "cont/markdown#images" %}}) +- [Syntax highlighting]({{%relref "cont/syntaxhighlight" %}}) +- [Attachments files]({{%relref "shortcodes/attachments" %}}) +- [List child pages]({{%relref "shortcodes/children" %}}) +- [Mermaid diagrams]({{%relref "shortcodes/mermaid" %}}) for flowcharts, sequences, gantts, pie, etc. +- [Swagger UI]({{%relref "shortcodes/swagger" %}}) for OpenAPI Specifications +- [Customizable look and feel]({{%relref "basics/customization"%}}) +- [Predefined (light, dark) and customizable color variants]({{%relref "basics/generator" %}}) +- [Buttons]({{%relref "shortcodes/button" %}}) +- [Tip/Note/Info/Warning boxes]({{%relref "shortcodes/notice" %}}) +- [Expand]({{%relref "shortcodes/expand" %}}) +- [Tabs]({{%relref "shortcodes/tabs" %}}) +- [File inclusion]({{%relref "shortcodes/include" %}}) + +## Getting support + +To get support, feel free to open a new [discussion topic](https://github.com/McShelby/hugo-theme-relearn/discussions) or [issue](https://github.com/McShelby/hugo-theme-relearn/issues) in the official repository on GitHub. + +## Become a contributor + +Feel free to update this documentation by just clicking the **Edit** link displayed on top right of each page. Your changes will be deployed automatically once they were reviewed. + +You are most welcome to contribute bugfixes or even new features to the source code by making pull requests to the [official repository](https://github.com/McShelby/hugo-theme-relearn) via GitHub. Please visit the [contribution guidelines](https://github.com/McShelby/hugo-theme-relearn/blob/main/.github/contributing.md) first. + +## License + +This theme is licensed under the [MIT License](https://github.com/McShelby/hugo-theme-relearn/blob/main/LICENSE). + +## Credits + +This theme would not be possible without the work of many others. See the [credits]({{%relref "more/credits" %}}) for a detailed list. diff --git a/themes/relearn/exampleSite/content/_index.pir.md b/themes/relearn/exampleSite/content/_index.pir.md new file mode 100644 index 0000000..daad3e0 --- /dev/null +++ b/themes/relearn/exampleSite/content/_index.pir.md @@ -0,0 +1,4 @@ ++++ +title = "Cap'n Hugo Relearrrn Theme" ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/basics/CHANGELOG.md b/themes/relearn/exampleSite/content/basics/CHANGELOG.md new file mode 100644 index 0000000..6f07176 --- /dev/null +++ b/themes/relearn/exampleSite/content/basics/CHANGELOG.md @@ -0,0 +1,548 @@ +# Changelog + +## 4.0.3 (2022-06-05) + +### Enhancements + +- [**feature**] toc: add scrollbar [#262](https://github.com/McShelby/hugo-theme-relearn/issues/262) + +--- + +## 4.0.2 (2022-06-05) + +### Fixes + +- [**bug**] theme: let browser scroll page on CTRL+f [#242](https://github.com/McShelby/hugo-theme-relearn/issues/242) + +--- + +## 4.0.1 (2022-06-05) +*No changelog for this release.* + +--- + +## 4.0.0 (2022-06-05) + +### Enhancements + +- [**feature**] shortcodes: add named parameter if missing [#260](https://github.com/McShelby/hugo-theme-relearn/issues/260) +- [**feature**][**breaking**] theme: remove --MAIN-ANCHOR-color from stylesheet [#256](https://github.com/McShelby/hugo-theme-relearn/issues/256) +- [**feature**] i18n: add italian translation [#254](https://github.com/McShelby/hugo-theme-relearn/issues/254) +- [**feature**] attachments: support for brand colors [#252](https://github.com/McShelby/hugo-theme-relearn/issues/252) +- [**feature**] notice: support for brand colors [#251](https://github.com/McShelby/hugo-theme-relearn/issues/251) +- [**feature**][**breaking**] config: remove custom_css [#248](https://github.com/McShelby/hugo-theme-relearn/issues/248) +- [**feature**] theme: use proper file extension for page-meta.go [#246](https://github.com/McShelby/hugo-theme-relearn/issues/246) +- [**feature**] variant: add support for brand color variables [#239](https://github.com/McShelby/hugo-theme-relearn/issues/239) +- [**feature**] i18n: add polish translation [#237](https://github.com/McShelby/hugo-theme-relearn/issues/237) + +### Fixes + +- [**bug**] shortcodes: accept boolean parameters if given as string [#261](https://github.com/McShelby/hugo-theme-relearn/issues/261) +- [**bug**] print: adjust button and tab size [#259](https://github.com/McShelby/hugo-theme-relearn/issues/259) +- [**bug**] print: show Mermaid if requested in frontmatter [#255](https://github.com/McShelby/hugo-theme-relearn/issues/255) +- [**bug**] theme: adjust thin scrollbar slider [#244](https://github.com/McShelby/hugo-theme-relearn/issues/244) +- [**bug**] mobile: fix broken scrollbar [#243](https://github.com/McShelby/hugo-theme-relearn/issues/243) +- [**bug**] theme: fix display of tooltip for heading anchor [#241](https://github.com/McShelby/hugo-theme-relearn/issues/241) + +--- + +## 3.4.1 (2022-04-03) + +### Fixes + +- [**bug**] theme: fix IE11 incompatiblities [#234](https://github.com/McShelby/hugo-theme-relearn/issues/234) + +--- + +## 3.4.0 (2022-04-03) + +### Enhancements + +- [**feature**] i18n: add traditional chinese translation [#233](https://github.com/McShelby/hugo-theme-relearn/issues/233) +- [**feature**] menu: expand/collapse menu items without navigation [#231](https://github.com/McShelby/hugo-theme-relearn/issues/231) +- [**feature**] print: add option to print whole chapter [#230](https://github.com/McShelby/hugo-theme-relearn/issues/230) +- [**feature**][**breaking**] theme: apply user supplied content footer below content [#229](https://github.com/McShelby/hugo-theme-relearn/issues/229) + +### Fixes + +- [**bug**] theme: scroll to heading on initial load [#232](https://github.com/McShelby/hugo-theme-relearn/issues/232) + +--- + +## 3.3.0 (2022-03-28) + +### Enhancements + +- [**feature**] theme: add CSS font variables [#227](https://github.com/McShelby/hugo-theme-relearn/issues/227) +- [**feature**] swagger: add support for oas/swagger documentation [#226](https://github.com/McShelby/hugo-theme-relearn/issues/226) + +### Fixes + +- [**bug**] variant: make variant switch work on slow networks [#228](https://github.com/McShelby/hugo-theme-relearn/issues/228) + +--- + +## 3.2.1 (2022-03-25) + +### Fixes + +- [**bug**] print: fix minor inconsistencies [#225](https://github.com/McShelby/hugo-theme-relearn/issues/225) +- [**bug**] print: show more than just the title page [#224](https://github.com/McShelby/hugo-theme-relearn/issues/224) +- [**bug**] theme: align content scrollbar to the right on big screens [#223](https://github.com/McShelby/hugo-theme-relearn/issues/223) + +--- + +## 3.2.0 (2022-03-19) + +### Enhancements + +- [**feature**][**change**] mermaid: support differing themes for color variant switch [#219](https://github.com/McShelby/hugo-theme-relearn/issues/219) +- [**feature**] mermaid: load javascript on demand [#218](https://github.com/McShelby/hugo-theme-relearn/issues/218) + +### Maintenance + +- [**task**] mermaid: update to 8.14.0 [#220](https://github.com/McShelby/hugo-theme-relearn/issues/220) + +--- + +## 3.1.1 (2022-03-16) + +### Enhancements + +- [**feature**] i18n: add korean translation [#217](https://github.com/McShelby/hugo-theme-relearn/issues/217) + +--- + +## 3.1.0 (2022-03-15) + +### Enhancements + +- [**feature**] notice: add icon parameter [#212](https://github.com/McShelby/hugo-theme-relearn/issues/212) +- [**feature**] mobile: remove breadcrumb ellipsis [#211](https://github.com/McShelby/hugo-theme-relearn/issues/211) + +### Fixes + +- [**bug**] theme: make storage of multiple Hugo sites on same server distinct [#214](https://github.com/McShelby/hugo-theme-relearn/issues/214) +- [**bug**] variant: switch breadcrumb color in Chrome [#213](https://github.com/McShelby/hugo-theme-relearn/issues/213) +- [**bug**] mobile: improve behavior of sidebar menu [#210](https://github.com/McShelby/hugo-theme-relearn/issues/210) + +--- + +## 3.0.4 (2022-02-24) + +### Enhancements + +- [**feature**] theme: improve font loading [#201](https://github.com/McShelby/hugo-theme-relearn/issues/201) +- [**feature**][**change**] variant: fix inconsistent color variable naming [#200](https://github.com/McShelby/hugo-theme-relearn/issues/200) + +### Fixes + +- [**bug**] variant: fix occasional fail when resetting generator [#208](https://github.com/McShelby/hugo-theme-relearn/issues/208) +- [**bug**] docs: don't move header on logo hover in IE11 [#207](https://github.com/McShelby/hugo-theme-relearn/issues/207) +- [**bug**] variant: avoid flash of menu header when non default variant is active [#206](https://github.com/McShelby/hugo-theme-relearn/issues/206) +- [**bug**] theme: fix wrong HTML closing tag order in chapters [#205](https://github.com/McShelby/hugo-theme-relearn/issues/205) +- [**bug**] theme: adjust breadcrumb and title for empty home page titles [#202](https://github.com/McShelby/hugo-theme-relearn/issues/202) + +--- + +## 3.0.3 (2022-02-23) + +### Enhancements + +- [**feature**] tags: show tag count in taxonomy list [#195](https://github.com/McShelby/hugo-theme-relearn/issues/195) + +### Fixes + +- [**bug**] theme: remove Hugo build warning if page is not file based [#197](https://github.com/McShelby/hugo-theme-relearn/issues/197) +- [**bug**] tags: adhere to titleSeparator [#196](https://github.com/McShelby/hugo-theme-relearn/issues/196) +- [**bug**] theme: hide footer divider and variant selector in IE11 [#194](https://github.com/McShelby/hugo-theme-relearn/issues/194) + +--- + +## 3.0.2 (2022-02-23) + +### Enhancements + +- [**feature**] tags: sort by name [#193](https://github.com/McShelby/hugo-theme-relearn/issues/193) + +--- + +## 3.0.1 (2022-02-23) + +### Enhancements + +- [**feature**] children: set containerstyle automatically according to style [#192](https://github.com/McShelby/hugo-theme-relearn/issues/192) + +### Fixes + +- [**bug**] theme: revert fontawsome to version 5 for IE11 compat [#191](https://github.com/McShelby/hugo-theme-relearn/issues/191) + +--- + +## 3.0.0 (2022-02-22) + +### Enhancements + +- [**feature**] variant: build a variant generator [#188](https://github.com/McShelby/hugo-theme-relearn/issues/188) +- [**feature**] nav: only show toc if the page has headings [#182](https://github.com/McShelby/hugo-theme-relearn/issues/182) +- [**feature**][**breaking**] theme: change default colors to Relearn defaults [#181](https://github.com/McShelby/hugo-theme-relearn/issues/181) +- [**feature**] variant: add a variant selector [#178](https://github.com/McShelby/hugo-theme-relearn/issues/178) +- [**feature**][**breaking**] menu: rework footer UX [#177](https://github.com/McShelby/hugo-theme-relearn/issues/177) +- [**feature**] theme: support for dark mode [#175](https://github.com/McShelby/hugo-theme-relearn/issues/175) +- [**feature**] docs: use light syntax highlightning theme [#174](https://github.com/McShelby/hugo-theme-relearn/issues/174) +- [**feature**] notice: tweak dull colors [#173](https://github.com/McShelby/hugo-theme-relearn/issues/173) +- [**feature**] theme: rework header UX [#151](https://github.com/McShelby/hugo-theme-relearn/issues/151) + +### Fixes + +- [**bug**] search: remove additional X in filled out search box in IE11 [#190](https://github.com/McShelby/hugo-theme-relearn/issues/190) +- [**bug**] clipboard: localize tooltips [#186](https://github.com/McShelby/hugo-theme-relearn/issues/186) +- [**bug**] print: hide sidebar on Mac [#183](https://github.com/McShelby/hugo-theme-relearn/issues/183) +- [**bug**] menu: fix scrollbar height [#180](https://github.com/McShelby/hugo-theme-relearn/issues/180) +- [**bug**][**change**] search: fix color change for icons on hover [#176](https://github.com/McShelby/hugo-theme-relearn/issues/176) + +--- + +## 2.9.6 (2022-02-07) + +### Fixes + +- [**bug**] menu: remove debug output [#171](https://github.com/McShelby/hugo-theme-relearn/issues/171) + +--- + +## 2.9.5 (2022-02-07) + +### Fixes + +- [**bug**] menu: let arrow navigation respect ordersectionsby configuration [#170](https://github.com/McShelby/hugo-theme-relearn/issues/170) + +--- + +## 2.9.4 (2022-02-06) + +### Fixes + +- [**bug**] exampleSite: fix links in official documentation [#168](https://github.com/McShelby/hugo-theme-relearn/issues/168) + +--- + +## 2.9.3 (2022-02-06) + +### Fixes + +- [**bug**] menu: invalid URL when the shortcut is an internal link [#163](https://github.com/McShelby/hugo-theme-relearn/issues/163) + +--- + +## 2.9.2 (2021-11-26) + +### Enhancements + +- [**feature**] theme: add theme version info to head [#158](https://github.com/McShelby/hugo-theme-relearn/issues/158) + +### Fixes + +- [**bug**] theme: fix selection of *.ico files as favicons [#160](https://github.com/McShelby/hugo-theme-relearn/issues/160) + +--- + +## 2.9.1 (2021-11-22) + +### Fixes + +- [**bug**] menu: fix significantly low performance for collecting of meta info [#157](https://github.com/McShelby/hugo-theme-relearn/issues/157) + +--- + +## 2.9.0 (2021-11-19) + +### Fixes + +- [**bug**][**breaking**] relref: fix inconsistent behavior [#156](https://github.com/McShelby/hugo-theme-relearn/issues/156) +- [**bug**] search: make dropdown stick to search field when scrolling [#155](https://github.com/McShelby/hugo-theme-relearn/issues/155) +- [**bug**] menu: align long text properly [#154](https://github.com/McShelby/hugo-theme-relearn/issues/154) +- [**bug**] copyToClipBoard: add missing right border for inline code if `disableInlineCopyToClipBoard=true` [#153](https://github.com/McShelby/hugo-theme-relearn/issues/153) +- [**bug**] menu: show hidden sibling pages reliably [#152](https://github.com/McShelby/hugo-theme-relearn/issues/152) +- [**bug**] menu: bring active item in sight for large menus [#149](https://github.com/McShelby/hugo-theme-relearn/issues/149) + +--- + +## 2.8.3 (2021-11-09) + +### Fixes + +- [**bug**] mermaid: let zoom reset to initial size [#145](https://github.com/McShelby/hugo-theme-relearn/issues/145) +- [**bug**] mermaid: remove whitespace from big graphs [#143](https://github.com/McShelby/hugo-theme-relearn/issues/143) + +--- + +## 2.8.2 (2021-11-08) + +### Fixes + +- [**bug**] mermaid: always load javascript to avoid break if code fences are used [#142](https://github.com/McShelby/hugo-theme-relearn/issues/142) + +--- + +## 2.8.1 (2021-11-04) + +### Fixes + +- [**bug**] search: don't break JS in multilang setup if search is disabled [#140](https://github.com/McShelby/hugo-theme-relearn/issues/140) + +--- + +## 2.8.0 (2021-11-03) + +### Enhancements + +- [**feature**] toc: make disableTOC globally available via config.toml [#133](https://github.com/McShelby/hugo-theme-relearn/issues/133) +- [**feature**] mermaid: only load javascript if necessary [#95](https://github.com/McShelby/hugo-theme-relearn/issues/95) +- [**feature**][**change**] theme: switch font [#83](https://github.com/McShelby/hugo-theme-relearn/issues/83) +- [**feature**] theme: make favicon configurable [#2](https://github.com/McShelby/hugo-theme-relearn/issues/2) + +### Fixes + +- [**bug**] mermaid: assert that window.mermaid is actually mermaid [#136](https://github.com/McShelby/hugo-theme-relearn/issues/136) +- [**bug**] menu: remove usage of Hugos UniqueID [#131](https://github.com/McShelby/hugo-theme-relearn/issues/131) +- [**bug**] theme: reduce margin for children shortcode [#130](https://github.com/McShelby/hugo-theme-relearn/issues/130) +- [**bug**] theme: left-align h3 in chapters [#129](https://github.com/McShelby/hugo-theme-relearn/issues/129) +- [**bug**] theme: align copy link to clipboard [#128](https://github.com/McShelby/hugo-theme-relearn/issues/128) + +--- + +## 2.7.0 (2021-10-24) + +### Enhancements + +- [**feature**] notice: support custom titles [#124](https://github.com/McShelby/hugo-theme-relearn/issues/124) + +--- + +## 2.6.0 (2021-10-21) + +### Fixes + +- [**bug**] theme: generate correct links if theme served from subdirectory [#120](https://github.com/McShelby/hugo-theme-relearn/issues/120) + +--- + +## 2.5.1 (2021-10-12) + +### Fixes + +- [**bug**] security: fix XSS for malicioius image URLs [#117](https://github.com/McShelby/hugo-theme-relearn/issues/117) + +--- + +## 2.5.0 (2021-10-08) + +### Enhancements + +- [**feature**][**change**] syntax highlight: provide default colors for unknown languages [#113](https://github.com/McShelby/hugo-theme-relearn/issues/113) + +### Fixes + +- [**bug**] security: fix XSS for malicioius URLs [#114](https://github.com/McShelby/hugo-theme-relearn/issues/114) +- [**bug**] menu: write correct local shortcut links [#112](https://github.com/McShelby/hugo-theme-relearn/issues/112) + +--- + +## 2.4.1 (2021-10-07) + +### Fixes + +- [**bug**] theme: remove runtime styles from print [#111](https://github.com/McShelby/hugo-theme-relearn/issues/111) + +--- + +## 2.4.0 (2021-10-07) + +### Enhancements + +- [**feature**] lang: add vietnamese translation [#109](https://github.com/McShelby/hugo-theme-relearn/issues/109) +- [**feature**][**change**] theme: simplify stylesheet for color variants [#107](https://github.com/McShelby/hugo-theme-relearn/issues/107) +- [**feature**] hidden pages: remove from RSS feed, JSON, taxonomy etc [#102](https://github.com/McShelby/hugo-theme-relearn/issues/102) +- [**feature**] theme: announce alternative content in header [#101](https://github.com/McShelby/hugo-theme-relearn/issues/101) +- [**feature**] menu: frontmatter option to change sort predicate [#98](https://github.com/McShelby/hugo-theme-relearn/issues/98) +- [**feature**] menu: add default setting for menu expansion [#97](https://github.com/McShelby/hugo-theme-relearn/issues/97) +- [**feature**] theme: improve print style [#93](https://github.com/McShelby/hugo-theme-relearn/issues/93) +- [**feature**] theme: improve style [#92](https://github.com/McShelby/hugo-theme-relearn/issues/92) + +### Fixes + +- [**bug**] include: don't generate additional HTML if file should be displayed "as is" [#110](https://github.com/McShelby/hugo-theme-relearn/issues/110) +- [**bug**] attachments: fix broken links if multilang config is used [#105](https://github.com/McShelby/hugo-theme-relearn/issues/105) +- [**bug**] theme: fix sticky header to remove horizontal scrollbar [#82](https://github.com/McShelby/hugo-theme-relearn/issues/82) + +### Maintenance + +- [**task**] chore: update fontawesome [#94](https://github.com/McShelby/hugo-theme-relearn/issues/94) + +--- + +## 2.3.2 (2021-09-20) + +### Fixes + +- [**bug**] docs: rename history pirate translation [#91](https://github.com/McShelby/hugo-theme-relearn/issues/91) + +--- + +## 2.3.1 (2021-09-20) + +### Fixes + +- [**bug**] docs: rename english pirate translation to avoid crash on rendering [#90](https://github.com/McShelby/hugo-theme-relearn/issues/90) + +--- + +## 2.3.0 (2021-09-13) + +### Fixes + +- [**bug**] theme: fix usage of section element [#88](https://github.com/McShelby/hugo-theme-relearn/issues/88) + +### Maintenance + +- [**task**] theme: ensure IE11 compatiblity [#89](https://github.com/McShelby/hugo-theme-relearn/issues/89) +- [**task**] docs: Arrr! showcase multilang featurrre [#87](https://github.com/McShelby/hugo-theme-relearn/issues/87) + +--- + +## 2.2.0 (2021-09-09) + +### Enhancements + +- [**feature**] sitemap: hide hidden pages from sitemap and SEO indexing [#85](https://github.com/McShelby/hugo-theme-relearn/issues/85) + +### Fixes + +- [**bug**] theme: fix showVisitedLinks in case Hugo is configured to modify relative URLs [#86](https://github.com/McShelby/hugo-theme-relearn/issues/86) + +### Maintenance + +- [**task**] theme: switch from data-vocabulary to schema [#84](https://github.com/McShelby/hugo-theme-relearn/issues/84) + +--- + +## 2.1.0 (2021-09-07) + +### Enhancements + +- [**feature**] search: open expand if it contains search term [#80](https://github.com/McShelby/hugo-theme-relearn/issues/80) +- [**feature**] menu: scroll active item into view [#79](https://github.com/McShelby/hugo-theme-relearn/issues/79) +- [**feature**] search: disable search in hidden pages [#76](https://github.com/McShelby/hugo-theme-relearn/issues/76) +- [**feature**] search: improve readablility of index.json [#75](https://github.com/McShelby/hugo-theme-relearn/issues/75) +- [**feature**] search: increase performance [#74](https://github.com/McShelby/hugo-theme-relearn/issues/74) +- [**feature**] search: improve search context preview [#73](https://github.com/McShelby/hugo-theme-relearn/issues/73) + +### Fixes + +- [**bug**][**change**] search: hide non-site content [#81](https://github.com/McShelby/hugo-theme-relearn/issues/81) +- [**bug**] menu: always hide hidden sub pages [#77](https://github.com/McShelby/hugo-theme-relearn/issues/77) + +--- + +## 2.0.0 (2021-08-28) + +### Enhancements + +- [**feature**] tabs: enhance styling [#65](https://github.com/McShelby/hugo-theme-relearn/issues/65) +- [**feature**] theme: improve readability [#64](https://github.com/McShelby/hugo-theme-relearn/issues/64) +- [**feature**] menu: show hidden pages if accessed directly [#60](https://github.com/McShelby/hugo-theme-relearn/issues/60) +- [**feature**][**change**] theme: treat pages without title as hidden [#59](https://github.com/McShelby/hugo-theme-relearn/issues/59) +- [**feature**] search: show search results if field gains focus [#58](https://github.com/McShelby/hugo-theme-relearn/issues/58) +- [**feature**] theme: add partial templates for pre/post menu entries [#56](https://github.com/McShelby/hugo-theme-relearn/issues/56) +- [**feature**] theme: make chapter archetype more readable [#55](https://github.com/McShelby/hugo-theme-relearn/issues/55) +- [**feature**] children: add parameter for container style [#53](https://github.com/McShelby/hugo-theme-relearn/issues/53) +- [**feature**] theme: make content a template [#50](https://github.com/McShelby/hugo-theme-relearn/issues/50) +- [**feature**] menu: control menu expansion with alwaysopen parameter [#49](https://github.com/McShelby/hugo-theme-relearn/issues/49) +- [**feature**] include: new shortcode to include other files [#43](https://github.com/McShelby/hugo-theme-relearn/issues/43) +- [**feature**] theme: adjust print styles [#35](https://github.com/McShelby/hugo-theme-relearn/issues/35) +- [**feature**][**change**] code highligher: switch to standard hugo highlighter [#32](https://github.com/McShelby/hugo-theme-relearn/issues/32) + +### Fixes + +- [**bug**][**change**] arrow-nav: default sorting ignores ordersectionsby [#63](https://github.com/McShelby/hugo-theme-relearn/issues/63) +- [**bug**][**change**] children: default sorting ignores ordersectionsby [#62](https://github.com/McShelby/hugo-theme-relearn/issues/62) +- [**bug**][**change**] arrow-nav: fix broken links on (and below) hidden pages [#61](https://github.com/McShelby/hugo-theme-relearn/issues/61) +- [**bug**] theme: remove superflous singular taxonomy from taxonomy title [#46](https://github.com/McShelby/hugo-theme-relearn/issues/46) +- [**bug**][**change**] theme: missing --MENU-HOME-LINK-HOVER-color in documentation [#45](https://github.com/McShelby/hugo-theme-relearn/issues/45) +- [**bug**] theme: fix home link when base URL has some path [#44](https://github.com/McShelby/hugo-theme-relearn/issues/44) + +### Maintenance + +- [**task**] docs: include changelog in exampleSite [#33](https://github.com/McShelby/hugo-theme-relearn/issues/33) + +--- + +## 1.2.0 (2021-07-26) + +### Enhancements + +- [**feature**] theme: adjust copy-to-clipboard [#29](https://github.com/McShelby/hugo-theme-relearn/issues/29) +- [**feature**] attachments: adjust style between notice boxes and attachments [#28](https://github.com/McShelby/hugo-theme-relearn/issues/28) +- [**feature**] theme: adjust blockquote contrast [#27](https://github.com/McShelby/hugo-theme-relearn/issues/27) +- [**feature**] expand: add option to open on page load [#25](https://github.com/McShelby/hugo-theme-relearn/issues/25) +- [**feature**] expand: rework styling [#24](https://github.com/McShelby/hugo-theme-relearn/issues/24) +- [**feature**] attachments: sort output [#23](https://github.com/McShelby/hugo-theme-relearn/issues/23) +- [**feature**] notice: make restyling of notice boxes more robust [#20](https://github.com/McShelby/hugo-theme-relearn/issues/20) +- [**feature**] notice: fix contrast issues [#19](https://github.com/McShelby/hugo-theme-relearn/issues/19) +- [**feature**] notice: align box colors to common standards [#18](https://github.com/McShelby/hugo-theme-relearn/issues/18) +- [**feature**] notice: use distinct icons for notice box type [#17](https://github.com/McShelby/hugo-theme-relearn/issues/17) + +### Fixes + +- [**bug**] attachments: support i18n for attachment size [#21](https://github.com/McShelby/hugo-theme-relearn/issues/21) +- [**bug**] notice: support i18n for box labels [#16](https://github.com/McShelby/hugo-theme-relearn/issues/16) +- [**bug**] notice: support multiple blocks in one box [#15](https://github.com/McShelby/hugo-theme-relearn/issues/15) + +### Maintenance + +- [**task**] dependency: upgrade jquery to 3.6.0 [#30](https://github.com/McShelby/hugo-theme-relearn/issues/30) + +--- + +## 1.1.1 (2021-07-04) + +### Maintenance + +- [**task**] theme: prepare for new hugo theme registration [#13](https://github.com/McShelby/hugo-theme-relearn/issues/13) + +--- + +## 1.1.0 (2021-07-02) + +### Enhancements + +- [**feature**] mermaid: expose options in config.toml [#4](https://github.com/McShelby/hugo-theme-relearn/issues/4) + +### Fixes + +- [**bug**] mermaid: config option for CDN url not used [#12](https://github.com/McShelby/hugo-theme-relearn/issues/12) +- [**bug**] mermaid: only highlight text in HTML elements [#10](https://github.com/McShelby/hugo-theme-relearn/issues/10) +- [**bug**] mermaid: support pan & zoom for graphs [#9](https://github.com/McShelby/hugo-theme-relearn/issues/9) +- [**bug**] mermaid: code fences not always rendered [#6](https://github.com/McShelby/hugo-theme-relearn/issues/6) +- [**bug**] mermaid: search term on load may bomb chart [#5](https://github.com/McShelby/hugo-theme-relearn/issues/5) + +### Maintenance + +- [**task**] mermaid: update to 8.10.2 [#7](https://github.com/McShelby/hugo-theme-relearn/issues/7) + +--- + +## 1.0.1 (2021-07-01) + +### Maintenance + +- [**task**] Prepare for hugo showcase [#3](https://github.com/McShelby/hugo-theme-relearn/issues/3) + +--- + +## 1.0.0 (2021-07-01) + +### Maintenance + +- [**task**] Fork project [#1](https://github.com/McShelby/hugo-theme-relearn/issues/1) diff --git a/themes/relearn/exampleSite/content/basics/_index.en.md b/themes/relearn/exampleSite/content/basics/_index.en.md new file mode 100755 index 0000000..4d67f9b --- /dev/null +++ b/themes/relearn/exampleSite/content/basics/_index.en.md @@ -0,0 +1,11 @@ ++++ +chapter = true +title = "Basics" +weight = 1 ++++ + +### Chapter 1 + +# Basics + +Discover what this Hugo theme is all about and the core-concepts behind it. diff --git a/themes/relearn/exampleSite/content/basics/_index.pir.md b/themes/relearn/exampleSite/content/basics/_index.pir.md new file mode 100644 index 0000000..3ffb2d4 --- /dev/null +++ b/themes/relearn/exampleSite/content/basics/_index.pir.md @@ -0,0 +1,6 @@ ++++ +chapter = true +title = "Basics" +weight = 1 ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/basics/configuration/_index.en.md b/themes/relearn/exampleSite/content/basics/configuration/_index.en.md new file mode 100644 index 0000000..c43c445 --- /dev/null +++ b/themes/relearn/exampleSite/content/basics/configuration/_index.en.md @@ -0,0 +1,160 @@ ++++ +title = "Configuration" +weight = 20 ++++ + +## Global site parameters + +On top of [Hugo global configuration](https://gohugo.io/overview/configuration/), the Relearn theme lets you define the following parameters in your `config.toml` (here, values are default). + +Note that some of these parameters are explained in details in other sections of this documentation. + +```toml +[params] + # This controls whether submenus will be expanded (true), or collapsed (false) in the + # menu; if no setting is given, the first menu level is set to false, all others to true; + # this can be overridden in the pages frontmatter + alwaysopen = true + # Prefix URL to edit current page. Will display an "Edit" button on top right hand corner of every page. + # Useful to give opportunity to people to create merge request for your doc. + # See the config.toml file from this documentation site to have an example. + editURL = "" + # Author of the site, will be used in meta information + author = "" + # Description of the site, will be used in meta information + description = "" + # Shows a checkmark for visited pages on the menu + showVisitedLinks = false + # Disable search function. It will hide search bar + disableSearch = false + # Disable search in hidden pages, otherwise they will be shown in search box + disableSearchHiddenPages = false + # Disables hidden pages from showing up in the sitemap and on Google (et all), otherwise they may be indexed by search engines + disableSeoHiddenPages = false + # Disables hidden pages from showing up on the tags page although the tag term will be displayed even if all pages are hidden + disableTagHiddenPages = false + # Javascript and CSS cache are automatically busted when new version of site is generated. + # Set this to true to disable this behavior (some proxies don't handle well this optimization) + disableAssetsBusting = false + # Set this to true to disable copy-to-clipboard button for inline code. + disableInlineCopyToClipBoard = false + # A title for shortcuts in menu is set by default. Set this to true to disable it. + disableShortcutsTitle = false + # If set to false, a Home button will appear below the search bar on the menu. + # It is redirecting to the landing page of the current language if specified. (Default is "/") + disableLandingPageButton = true + # When using mulitlingual website, disable the switch language button. + disableLanguageSwitchingButton = false + # Hide breadcrumbs in the header and only show the current page title + disableBreadcrumb = true + # If set to true, hide table of contents menu in the header of all pages + disableToc = false + # If set to false, load the Mermaid module on every page regardless if a Mermaid shortcode or Mermaid codefence is present + disableMermaid = false + # Specifies the remote location of the Mermaid js + customMermaidURL = "https://unpkg.com/mermaid/dist/mermaid.min.js" + # Initialization parameter for Mermaid, see Mermaid documentation + mermaidInitialize = "{ \"theme\": \"default\" }" + # If set to false, load the Swagger module on every page regardless if a Swagger shortcode is present + disableSwagger = false + # Specifies the remote location of the RapiDoc js + customSwaggerURL = ""https://unpkg.com/rapidoc/dist/rapidoc-min.js" + # Initialization parameter for Swagger, see RapiDoc documentation + swaggerInitialize = "{ \"theme\": \"light\" }" + # Hide Next and Previous page buttons normally displayed full height beside content + disableNextPrev = true + # Order sections in menu by "weight" or "title". Default to "weight"; + # this can be overridden in the pages frontmatter + ordersectionsby = "weight" + # Change default color scheme with a variant one. Eg. can be "red", "blue", "green" or an array like [ "blue", "green" ]. + themeVariant = "relearn-light" + # Change the title separator. Default to "::". + titleSeparator = "-" + # If set to true, the menu in the sidebar will be displayed in a collapsible tree view. + collapsibleMenu = false +``` + +## A word on running your site in a subfolder + +The theme runs best if your site is installed in the root of your webserver. If your site is served from a subfolder, eg. `https://example.com/mysite/`, you have to set the following lines to your `config.toml` + +````toml +baseURL = "https://example.com/mysite/" +canonifyURLs = true +```` + +Without `canonifyURLs=true` URLs in sublemental pages (like `sitemap.xml`, `rss.xml`) will be generated falsly while your HTML files will still work. See https://github.com/gohugoio/hugo/issues/5226. + +## Activate search + +If not already present, add the follow lines in the same `config.toml` file. + +```toml +[outputs] + home = ["HTML", "RSS", "JSON"] +``` + +Relearn theme uses the last improvement available in hugo version 20+ to generate a json index file ready to be consumed by lunr.js javascript search engine. + +> Hugo generate lunrjs index.json at the root of public folder. +> When you build the site with `hugo server`, hugo generates it internally and of course it doesn’t show up in the filesystem + +## Activate print support + +You can activate print support to add the capability to print whole chapters or even the complete site. Just add the `PRINT` output format to your home, section and page in your `config.toml` as seen below: + +```toml +[outputs] + home = ["HTML", "RSS", "PRINT", "JSON"] + section = ["HTML", "RSS", "PRINT"] + page = ["HTML", "RSS", "PRINT"] +``` + +This will add a little printer icon in the top bar. It will switch the page to print preview when clicked. You can then send this page to the printer by using your browser's usual print functionality. + +{{% notice note %}} +While colors of your chosen color variant are reset to the theme's light standard values for printing, this does not apply for Mermaid diagrams and Swagger/OpenAPI Specification. Those will still use the colors of your chosen color variant which may cause a non coherent look on paper. +{{% /notice %}} + +## Mermaid + +The Mermaid configuration parameters can also be set on a specific page. In this case, the global parameter would be overwritten by the local one. See [Mermaid]({{< relref "shortcodes/mermaid" >}}) for additional documentation. + +> Example: +> +> Mermaid is globally disabled. By default it won't be loaded by any page. +> On page "Architecture" you need a class diagram. You can set the Mermaid parameters locally to only load mermaid on this page (not on the others). + +You also can disable Mermaid for specific pages while globally enabled. + +## Home Button Configuration + +If the `disableLandingPageButton` option is set to `false`, a Home button will appear +on the left menu. It is an alternative for clicking on the logo. To edit the +appearance, you will have to configure two parameters for the defined languages: + +```toml +[Languages] +[Languages.en] +... +landingPageURL = "/" +landingPageName = " Home" +... +[Languages.pir] +... +landingPageURL = "/pir/" +landingPageName = " Arrr! Homme" +... +``` + +If those params are not configured for a specific language, they will get their +default values: + +```toml +landingPageURL = "/" +landingPageName = " Home" +``` + +The home button is going to look like this: + +![Default Home Button](images/home_button_defaults.png?classes=shadow&width=300px) diff --git a/themes/relearn/exampleSite/content/basics/configuration/_index.pir.md b/themes/relearn/exampleSite/content/basics/configuration/_index.pir.md new file mode 100644 index 0000000..5849920 --- /dev/null +++ b/themes/relearn/exampleSite/content/basics/configuration/_index.pir.md @@ -0,0 +1,5 @@ ++++ +title = "Configurrrat'n" +weight = 20 ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/basics/configuration/images/home_button_defaults.png b/themes/relearn/exampleSite/content/basics/configuration/images/home_button_defaults.png new file mode 100644 index 0000000..ef63acb Binary files /dev/null and b/themes/relearn/exampleSite/content/basics/configuration/images/home_button_defaults.png differ diff --git a/themes/relearn/exampleSite/content/basics/customization/_index.en.md b/themes/relearn/exampleSite/content/basics/customization/_index.en.md new file mode 100644 index 0000000..f05ed60 --- /dev/null +++ b/themes/relearn/exampleSite/content/basics/customization/_index.en.md @@ -0,0 +1,81 @@ ++++ +title = "Customization" +weight = 25 ++++ + +The Relearn theme has been built to be as configurable as possible by defining multiple [partials](https://gohugo.io/templates/partials/) + +In `themes/hugo-theme-relearn/layouts/partials/`, you will find all the partials defined for this theme. If you need to overwrite something, don't change the code directly. Instead [follow this page](https://gohugo.io/themes/customizing/). You'd create a new partial in the `layouts/partials` folder of your local project. This partial will have the priority. + +This theme defines the following partials : + +- `header.html`: the header of the page. _Not meant to be overwritten_ +- `footer.html`: the footer of the page._Not meant to be overwritten_ +- `menu.html`: left menu. _Not meant to be overwritten_ +- `search.html`: search box. _Not meant to be overwritten_ +- `custom-header.html`: custom headers in page. Meant to be overwritten when adding CSS imports. Don't forget to include `style` HTML tag directive in your file. +- `custom-footer.html`: custom footer in page. Meant to be overwritten when adding Javacript. Don't forget to include `javascript` HTML tag directive in your file. +- `favicon.html`: the favicon +- `logo.html`: the logo, on top left hand corner +- `meta.html`: HTML meta tags, if you want to change default behavior +- `menu-pre.html`: side-wide configuration to prepend to menu items. If you override this, it is your responsiblity to take the page's `pre` setting into account. +- `menu-post.html`: side-wide configuration to append to menu items. If you override this, it is your responsiblity to take the page's `post` setting into account. +- `menu-footer.html`: footer of the the left menu +- `toc.html`: table of contents +- `content.html`: the content page itself. This can be overridden if you wan't to display page's meta data above or below the content. +- `content-footer`: footer below the content, has a default implementation but you can overwrite it if you don't like it. +## Change the logo + +Create a new file in `layouts/partials/` named `logo.html`. Then write any HTML you want. +You could use an `img` HTML tag and reference an image created under the *static* folder, or you could paste a SVG definition! + +{{% notice note %}} +The size of the logo will adapt automatically +{{% /notice %}} + +## Change the favicon + +If your favicon is a SVG, PNG or ICO, just drop off your image in your local `static/images/` folder and name it `favicon.svg`, `favicon.png` or `favicon.ico` respectivly. + +If no favicon file is found, the theme will lookup the alternative filename `logo` in the same location and will repeat the search for the list of supported file types. + +If you need to change this default behavior, create a new file in `layouts/partials/` named `favicon.html`. Then write something like this: + +```html + +``` + +## Change the colors {#theme-variant} + +The Relearn theme lets you choose between some predefined color variants in light or dark mode, but feel free to add one yourself! + +You can preview the shipped variants by changing them in the variant selector at the bottom of the menu. + +### Single variant + +Set the `themeVariant` value with the name of your theme file. That's it! + +```toml +[params] + themeVariant = "relearn-light" +``` + +In the above exaple your theme file has to be named `theme-relearn-light.css` + +### Multiple variants + +You can also set multiple variants. In this case, the first variant is the default choosen on first view and a variant switch will be shown in the menu footer. + +```toml +[params] + # Change default color scheme with a variant one. + themeVariant = [ "relearn-light", "relearn-dark" ] +``` + +{{% notice tip %}} +If you want to switch the syntax highlightning theme together with your color variant, generate a syntax highlighting stylesheet and configure your installation [according to Hugo's documentation](https://gohugo.io/content-management/syntax-highlighting/), and `@import` this stylesheet in your color variant stylesheet. For an example, take a look into `theme-relearn-light.css` and `config.toml` of the exampleSite. +{{% /notice %}} + +### Roll your own + +If you are not happy with the shipped variants you can either copy one of the shipped files, edit them in a text editor and configure the `themeVariant` parameter in your `config.toml` or just use the [interactive variant generator]({{%relref "basics/generator" %}}). diff --git a/themes/relearn/exampleSite/content/basics/customization/_index.pir.md b/themes/relearn/exampleSite/content/basics/customization/_index.pir.md new file mode 100644 index 0000000..03cd9da --- /dev/null +++ b/themes/relearn/exampleSite/content/basics/customization/_index.pir.md @@ -0,0 +1,5 @@ ++++ +title = "Customizat'n" +weight = 25 ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/basics/generator/_index.en.md b/themes/relearn/exampleSite/content/basics/generator/_index.en.md new file mode 100644 index 0000000..af8b3e7 --- /dev/null +++ b/themes/relearn/exampleSite/content/basics/generator/_index.en.md @@ -0,0 +1,37 @@ ++++ +disableMermaid = false +title = "Stylesheet generator" +weight = 26 ++++ + +This interactive tool may help you to generate your own color variant stylesheet. + +To get started, first select a color variant from the variant switch that fits you best as a starting point. + +The graph is interactive and reflect the current colors. You can click on any of the colored boxes to adjust the respective color. The graph and the page will update accordingly. + +The arrowed lines reflects how colors are inherited thru different parts of the theme if the descendent isn't overwritten. If you want to delete a color and let it inherit from its parent, just delete the value from the input field. + +To better understand this select the `neon` variant and modify the differnet heading colors. There, colors for the heading `h2`, `h3` and `h4` are explicitly set. `h5` is not set and inherits its value from `h4`. `h6` is also not set and inherits its value from `h5`. + +Once you've changed a color, the variant switch will show a "My custom variant" entry and your changes are stored in the browser. You can change pages and even close the browser without losing your changes. + +Once you are satisfied, you can download the new variants file and install it in your site. + +{{% notice note %}} +This only works in modern browsers. +{{% /notice %}} + +## Variant generator + + Download variant + Reset variant + +
Graph
+ + Download variant + Reset variant + + diff --git a/themes/relearn/exampleSite/content/basics/generator/_index.pir.md b/themes/relearn/exampleSite/content/basics/generator/_index.pir.md new file mode 100644 index 0000000..1a2af5a --- /dev/null +++ b/themes/relearn/exampleSite/content/basics/generator/_index.pir.md @@ -0,0 +1,5 @@ ++++ +title = "Stylesheet generrrat'r" +weight = 26 ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/basics/history/_index.en.md b/themes/relearn/exampleSite/content/basics/history/_index.en.md new file mode 100644 index 0000000..736b119 --- /dev/null +++ b/themes/relearn/exampleSite/content/basics/history/_index.en.md @@ -0,0 +1,6 @@ ++++ +disableToc = false +title = "History" +weight = 30 ++++ +{{% include "basics/CHANGELOG.md" false %}} diff --git a/themes/relearn/exampleSite/content/basics/history/_index.pir.md b/themes/relearn/exampleSite/content/basics/history/_index.pir.md new file mode 100644 index 0000000..bbedda9 --- /dev/null +++ b/themes/relearn/exampleSite/content/basics/history/_index.pir.md @@ -0,0 +1,6 @@ ++++ +disableToc = false +title = "Historrry" +weight = 30 ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/basics/installation/_index.en.md b/themes/relearn/exampleSite/content/basics/installation/_index.en.md new file mode 100644 index 0000000..e540e30 --- /dev/null +++ b/themes/relearn/exampleSite/content/basics/installation/_index.en.md @@ -0,0 +1,102 @@ ++++ +title = "Installation" +weight = 15 ++++ + +The following steps are here to help you initialize your new website. If you don't know Hugo at all, we strongly suggest you learn more about it by following this [great documentation for beginners](https://gohugo.io/overview/quickstart/). + +## Create your project + +Hugo provides a `new` command to create a new website. + +``` +hugo new site +``` + +## Install the theme + +Install the Relearn theme by following [this documentation](https://gohugo.io/getting-started/quick-start/#step-3-add-a-theme) + +This theme's repository is: https://github.com/McShelby/hugo-theme-relearn.git + +Alternatively, you can [download the theme as .zip](https://github.com/McShelby/hugo-theme-relearn/archive/main.zip) file and extract it in the `themes` directory + +## Basic configuration + +When building the website, you can set a theme by using `--theme` option. However, we suggest you modify the configuration file (`config.toml`) and set the theme as the default. You can also add the `[outputs]` section to enable the search functionality. + +```toml +# Change the default theme to be use when building the site with Hugo +theme = "hugo-theme-relearn" + +# For search functionality +[outputs] +home = [ "HTML", "RSS", "JSON"] +``` + +## Create your first chapter page + +Chapters are pages that contain other child pages. It has a special layout style and usually just contains a _chapter name_, the _title_ and a _brief abstract_ of the section. + +```markdown +### Chapter 1 + +# Basics + +Discover what this Hugo theme is all about and the core concepts behind it. +``` + +renders as + +![A Chapter](images/chapter.png?classes=shadow&width=60pc) + +The Relearn theme provides archetypes to create skeletons for your website. Begin by creating your first chapter page with the following command + +```shell +hugo new --kind chapter basics/_index.md +``` + +By opening the given file, you should see the property `chapter=true` on top, meaning this page is a _chapter_. + +By default all chapters and pages are created as a draft. If you want to render these pages, remove the property `draft: true` from the metadata. + +## Create your first content pages + +Then, create content pages inside the previously created chapter. Here are two ways to create content in the chapter: + +```shell +hugo new basics/first-content.md +hugo new basics/second-content/_index.md +``` + +Feel free to edit those files by adding some sample content and replacing the `title` value in the beginning of the files. + +## Launching the website locally + +Launch by using the following command: + +```shell +hugo serve +``` + +Go to `http://localhost:1313` + +You should notice three things: + +1. You have a left-side **Basics** menu, containing two submenus with names equal to the `title` properties in the previously created files. +2. The home page explains how to customize it by following the instructions. +3. When you run `hugo serve`, when the contents of the files change, the page automatically refreshes with the changes. Neat! + +## Build the website + +When your site is ready to deploy, run the following command: + +```shell +hugo +``` + +A `public` folder will be generated, containing all static content and assets for your website. It can now be deployed on any web server. + +{{% notice note %}} +This website can be automatically published and hosted with [Netlify](https://www.netlify.com/) (Read more about [Automated HUGO deployments with Netlify](https://www.netlify.com/blog/2015/07/30/hosting-hugo-on-netlifyinsanely-fast-deploys/)). Alternatively, you can use [GitHub pages](https://gohugo.io/hosting-and-deployment/hosting-on-github/) +{{% /notice %}} diff --git a/themes/relearn/exampleSite/content/basics/installation/_index.pir.md b/themes/relearn/exampleSite/content/basics/installation/_index.pir.md new file mode 100644 index 0000000..c23fc58 --- /dev/null +++ b/themes/relearn/exampleSite/content/basics/installation/_index.pir.md @@ -0,0 +1,5 @@ ++++ +title = "Installat'n" +weight = 15 ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/basics/installation/images/chapter.png b/themes/relearn/exampleSite/content/basics/installation/images/chapter.png new file mode 100644 index 0000000..21ca9ad Binary files /dev/null and b/themes/relearn/exampleSite/content/basics/installation/images/chapter.png differ diff --git a/themes/relearn/exampleSite/content/basics/migration/_index.en.md b/themes/relearn/exampleSite/content/basics/migration/_index.en.md new file mode 100644 index 0000000..ff429b3 --- /dev/null +++ b/themes/relearn/exampleSite/content/basics/migration/_index.en.md @@ -0,0 +1,247 @@ ++++ +disableToc = false +title = "What's new" +weight = 2 ++++ + +This document shows you what's new in the latest release. For a detailed list of changes, see the [history page]({{%relref "basics/history" %}}). + +**Breaking**: A change that requires action by you after upgrading to assure the site is still functional. + +**Change**: A change in default behavior. This may requires action by you / may or may not be revertable by configuration. + +**New**: Marks new behavior you might find interesting or comes configurable. + +--- + +## 4.0.0 + +- **Breaking**: The `custom_css` config parameter was removed from the configuration. If used in an existing installation, it can be achieved by overriding the `custom-header.html` template in a much more generic manner. + +- **Breaking**: Because anchor hover color was not configurable without introducing more complexitity to the variant stylesheets, we decided to remove `--MAIN-ANCHOR-color` instead. You don't need to change anything in your custom color stylesheet as the anchors now get their colors from `--MAIN-LINK-color` and `--MAIN-ANCHOR-HOVER-color` respectivley. + +- **New**: All shortcodes now support named parameter. The positional parameter are still supported but will not be enhanced with new features, so you don't need to change anything in your installation. + + This applies to [`expand`]({{% relref "shortcodes/expand" %}}) , [`include`]({{% relref "shortcodes/include" %}}) , [`notice`]({{% relref "shortcodes/notice" %}}) and [`siteparam`]({{% relref "shortcodes/siteparam" %}}) . + +- **New**: The [`button`]({{% relref "shortcodes/button" %}}) shortcode received some love and now has a parameter for the color style similar to other shortcodes. + +- **New**: New colors `--PRIMARY-color` and `--SECONDARY-color` were added to provide easier modification of your custom style. Shortcodes with a color style can now have `primary` or `secondary` as additional values. + + These two colors are the default for other, more specific color variables. You don't need to change anything in your existing custom color stylesheets as those variables get reasonable default values. + +- **New**: The documentation for all shortcodes were revised. + +--- + +## 3.4.0 + +- **Breaking**: If you had previously overwritten the `custom-footer.html` partial to add visual elements below the content of your page, you have to move this content to the new partial `content-footer.html`. `custom-footer.html` was never meant to contain HTML other than additional styles and JavaScript. + +- **New**: If you prefer expandable/collapsible menu items, you can now set `collapsibleMenu=true` in your `config.toml`. This will add arrows to all menu items that contain sub menus. The menu will expand/collapse without navigation if you click on an arrow. + +- **New**: You can activate [print support]({{%relref "basics/configuration#activate-print-support" %}}) in your `config.toml` to add the capability to print whole chapters or even the complete site. + +- **New**: Translation for Traditional Chinese. + +--- + +## 3.3.0 + +- **New**: Introduction of new CSS variables to set the font. The theme distinguishs between `--MAIN-font` for all content text and `--CODE-font` for inline or block code. There are additional overrides for all headings. See the [theme variant generator]({{%relref "basics/generator" %}}) of the exampleSite for all available variables. + +- **New**: The new shortcode `swagger` is available to include a UI for REST OpenAPI Specifications. See the [documentation]({{% relref "shortcodes/swagger" %}}) for available features. This feature will not work with Internet Explorer 11. + +--- + +## 3.2.0 + +- **Change**: In this release the Mermaid JavaScript library will only be loaded on demand if the page contains a Mermaid shortcode or is using Mermaid codefences. This changes the behavior of `disableMermaid` config option as follows: If a Mermaid shortcode or codefence is found, the option will be ignored and Mermaid will be loaded regardlessly. + + The option is still useful in case you are using scripting to set up your graph. In this case no shortcode or codefence is involved and the library is not loaded by default. In this case you can set `disableMermaid=false` in your frontmatter to force the library to be loaded. See the [theme variant generator]({{%relref "basics/generator" %}}) of the exampleSite for an example. + + **This change requires at least Hugo 0.93.0 to be used**. The minimum requirement will be reported during build on the console if not met. + +- **New**: Additional color variant variable `--MERMAID-theme` to set the variant's Mermaid theme. This causes the Mermaid theme to switch with the color variant if it defers from the setting of the formerly selected color variant. + +--- + +## 3.1.0 + +- **New**: [`attachment`]({{% relref "shortcodes/attachments" %}}) and [`notice`]({{% relref "shortcodes/notice" %}}) shortcodes have a new parameter to override the default icon. Allowed values are all [Font Awesome 5 Free](https://fontawesome.com/v5/search?m=free) icons. + +--- + +## 3.0.0 + +- **Breaking**: We made changes to the menu footer. If you have your `menu-footer.html` [partial overridden]({{%relref "basics/customization" %}}), you may have to review the styling (eg. margins/paddings) in your partial. For a reference take a look into the `menu-footer.html` partial that is coming with the exampleSite. + + This change was made to allow your own menu footer to be placed right after the so called prefooter that comes with the theme (containing the language switch and *Clear history* functionality). + +- **Breaking**: We have changed the default colors from the original Learn theme (the purple menu header) to the Relearn defaults (the light green menu header) as used in the official documentation. + + This change will only affect your installation if you've not set the `themeVariant` parameter in your `config.toml`. [If you still want to use the Learn color variant]({{%relref "basics/customization/#theme-variant" %}}), you have to explicitly set `themeVariant="learn"` in your `config.toml`. + + Note, that this will also affect your site if viewed with Internet Explorer 11 but in this case it can not be reconfigured as Internet Explorer does not support CSS variables. + +- **Change**: Due to a bug, that we couldn't fix in a general manner for color variants, we decided to remove `--MENU-SEARCH-BOX-ICONS-color` and introduced `--MENU-SEARCH-color` instead. You don't need to change anything in your custom color stylesheet as the old name will be used as a fallback. + +- **Change**: For consistency reasons, we renamed `--MENU-SEARCH-BOX-color` to `--MENU-SEARCH-BORDER-color`. You don't need to change anything in your custom color stylesheet as the old name will be used as a fallback. + +- **New**: With this release you are now capable to define your own *dark mode* variants. + + To make this possible, we have introduced a lot more color variables you can use in [your color variants]({{%relref "basics/customization/#theme-variant" %}}). Your old variants will still work and don't need to be changed as apropriate fallback values are used by the theme. Nevertheless, the new colors allow for much more customization. + + To see what's now possible, see the new variants `relearn-dark` and `neon` that are coming with this release. + +- **New**: To make the creation of new variants easier for you, we've added a new interactive [theme variant generator]({{%relref "basics/generator" %}}). This feature will not work with Internet Explorer 11. + +- **New**: You can now configure multiple color variants in your `config.toml`. In this case, the first variant is the default chosen on first view and a variant switch will be shown in the menu footer. See the [documentation]({{%relref "basics/customization/#multiple-variants" %}}) for configuration. + + Note, that the new variant switch will not work with Internet Explorer 11 as it does not support CSS variables. Therefore, the variant switcher will not be displayed with Internet Explorer 11. + +--- + +## 2.9.0 + +- **Breaking**: This release removes the themes implementation of `ref`/`relref` in favor for Hugos standard implementation. This is because of inconsistencies with the themes implementation. In advantage, your project becomes standard complient and exchanging this theme in your project to some other theme will be effortless. + + In a standard complient form you must not link to the `*.md` file but to its logical name. You'll see, referencing other pages becomes much easier. All three types result in the same reference: + + | Type | Non-Standard | Standard | + | ------------- | -------------------------------- | ---------------------- | + | Branch bundle | `basics/configuration/_index.md` | `basics/configuration` | + | Leaf bundle | `basics/configuration/index.md` | `basics/configuration` | + | Page | `basics/configuration.md` | `basics/configuration` | + + If you've linked from a page of one language to a page of another language, conversion is a bit more difficult but [Hugo got you covered](https://gohugo.io/content-management/cross-references/#link-to-another-language-version) as well. + + Also, the old themes implementation allowed refs to non-existing content. This will cause Hugos implementation to show the error below and abort the generation. If your project relies on this old behavior, you can [reconfigure the error handling](https://gohugo.io/content-management/cross-references/#link-to-another-language-version) of Hugos implementation. + + In the best case your usage of the old implementation is already standard complient and you don't need to change anything. You'll notice this very easily once you've started `hugo server` after an upgrade and no errors are written to the console. + + You may see errors on the console after the update in the form: + + ````sh + ERROR 2021/11/19 22:29:10 [en] REF_NOT_FOUND: Ref "basics/configuration/_index.md": "hugo-theme-relearn\exampleSite\content\_index.en.md:19:22": page not found + ```` + + In this case, you must apply one of two options: + + 1. Copy the old implementation files `theme/hugo-theme-relearn/layouts/shortcode/ref.html` and `theme/hugo-theme-relearn/layouts/shortcode/relref.html` to your own projects `layouts/shortcode/ref.html` and `layouts/shortcode/relref.html` respectively. **This is not recommended** as your project will still rely on non-standard behavior afterwards. + + 2. Start up a text editor with regular expression support for search and replace. Apply the following conversions in the given order on all `*.md` files. **This is the recommended choice**. + + | Type | Search | Replace by | + | ------------- | ---------------------------- | ---------- | + | Branch bundle | `(ref\s+"[^"]*)/_index\.md"` | `$1"` | + | Leaf bundle | `(ref\s+"[^"]*)/index\.md"` | `$1"` | + | Page | `(ref\s+"[^"]*)\.md"` | `$1"` | + +--- + +## 2.8.0 + +- **Change**: Although never officially documented, this release removes the font `Novacento`/`Novecento`. If you use it in an overwritten CSS please replace it with `Work Sans`. This change was necessary as Novacento did not provide all Latin special characters and lead to mixed styled character text eg. for czech. + +- **New**: The theme now supports favicons served from `static/images/` named as `favicon` or `logo` in SVG, PNG or ICO format [out of the box]({{% relref "basics/customization/#change-the-favicon" %}}). An overridden partial `layouts/partials/favicon.html` may not be necessary anymore in most cases. + +- **New**: You can hide the table of contents menu for the whole site by setting the `disableToc` option in your `config.toml`. For an example see [the example configuration]({{%relref "basics/configuration/#global-site-parameters" %}}). + +--- + +## 2.7.0 + +- **New**: Optional second parameter for [`notice`]({{% relref "shortcodes/notice" %}}) shortcode to set title in box header. + +--- + +## 2.6.0 + +- **New**: Your site can now be served from a subfolder if you set `baseURL` and `canonifyURLs=true` in your `config.toml`. See the [documentation]({{% relref "basics/configuration/#a-word-on-running-your-site-in-a-subfolder" %}}) for a detailed example. + +--- + +## 2.5.0 + +- **Change**: New colors `--CODE-BLOCK-color` and `--CODE-BLOCK-BG-color` were added to provide a fallback for Hugos syntax highlightning in case `guessSyntax=true` is set. Ideally the colors are set to the same values as the ones from your chosen chroma style. + +--- + +## 2.4.0 + +- **Change**: Creation of customized stylesheets was simplified down to only contain the CSS variables. Everything else can and should be deleted from your custom stylesheet to assure everything works fine. For the predefined stylesheet variants, this change is already included. + +- **New**: Hidden pages are displayed by default in their according tags page. You can now turn off this behavior by setting `disableTagHiddenPages=true` in your `config.toml`. + +- **New**: You can define the expansion state of your menus for the whole site by setting the `alwaysopen` option in your `config.toml`. Please see further [documentation]({{%relref "cont/pages/#override-expand-state-rules-for-menu-entries" %}}) for possible values and default behavior. + +- **New**: New frontmatter `ordersectionsby` option to change immediate children sorting in menu and `children` shortcode. Possible values are `title` or `weight`. + +- **New**: Alternate content of a page is now advertised in the HTML meta tags. See [Hugo documentation](https://gohugo.io/templates/rss/#reference-your-rss-feed-in-head). + +--- + +## 2.3.0 + +- **New**: Showcase multilanguage features by provding a documentation translation "fer us pirrrates". There will be no other translations besides the original English one and the Pirates one due to maintenance constraints. + +--- + +## 2.2.0 + +- **New**: Hidden pages are displayed by default in the sitemap generated by Hugo and are therefore visible for search engine indexing. You can now turn off this behavior by setting `disableSeoHiddenPages=true` in your `config.toml`. + +--- + +## 2.1.0 + +- **Change**: In case the site's structure contains addional *.md files not part of the site (eg files that are meant to be included by site pages - see `CHANGELOG.md` in the exampleSite), they will now be ignored by the search. + +- **New**: Hidden pages are indexed for the site search by default. You can now turn off this behavior by setting `disableSearchHiddenPages=true` in your `config.toml`. + +- **New**: If a search term is found in an `expand` shortcode, the expand will be opened. + +- **New**: The menu will scroll the active item into view on load. + +--- + +## 2.0.0 + +- **Change**: Syntaxhighlightning was switched to the [built in Hugo mechanism](https://gohugo.io/content-management/syntax-highlighting/). You may need to configure a new stylesheet or decide to roll you own as described on in the Hugo documentation + +- **Change**: In the predefined stylesheets there was a typo and `--MENU-HOME-LINK-HOVERED-color` must be changed to `--MENU-HOME-LINK-HOVER-color`. You don't need to change anything in your custom color stylesheet as the old name will be used as a fallback. + +- **Change**: `--MENU-HOME-LINK-color` and `--MENU-HOME-LINK-HOVER-color` were missing in the documentation. You should add them to your custom stylesheets if you want to override the defaults. + +- **Change**: Arrow navigation and `children` shortcode were ignoring setting for `ordersectionsby`. This is now changed and may result in different sorting order of your sub pages. + +- **Change**: If hidden pages are accessed directly by typing their URL, they will be exposed in the menu. + +- **Change**: A page without a `title` will be treated as `hidden=true`. + +- **New**: You can define the expansion state of your menus in the frontmatter. Please see further [documentation]({{%relref "cont/pages/#override-expand-state-rules-for-menu-entries" %}}) for possible values and default behavior. + +- **New**: New partials for defining pre/post content for menu items and the content. See [documentation]({{% relref "basics/customization" %}}) for further reading. + +- **New**: Shortcode [`children`]({{% relref "shortcodes/children" %}}) with new parameter `containerstyle`. + +- **New**: New shortcode [`include`]({{% relref "shortcodes/include" %}}) to include arbitrary file content into a page. + +--- + +## 1.2.0 + +- **New**: Shortcode [`expand`]({{% relref "shortcodes/expand" %}}) with new parameter to open on page load. + +--- + +## 1.1.0 + +- **New**: [`Mermaid`]({{% relref "shortcodes/mermaid#configuration" %}}) config options can be set in `config.toml`. + +--- + +## 1.0.0 + +- **New**: Initial fork of the [Learn theme](https://github.com/matcornic/hugo-theme-learn) based on Learn 2.5.0 on 2021-07-01. This introduces no new features besides a global rename to `Relearn` and a new logo. For the reasons behind forking the Learn theme, see [this comment](https://github.com/matcornic/hugo-theme-learn/issues/442#issuecomment-907863495) in the Learn issues. diff --git a/themes/relearn/exampleSite/content/basics/migration/_index.pir.md b/themes/relearn/exampleSite/content/basics/migration/_index.pir.md new file mode 100644 index 0000000..cfd18a2 --- /dev/null +++ b/themes/relearn/exampleSite/content/basics/migration/_index.pir.md @@ -0,0 +1,6 @@ ++++ +disableToc = false +title = "Migrrrat'n" +weight = 17 ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/basics/requirements/_index.en.md b/themes/relearn/exampleSite/content/basics/requirements/_index.en.md new file mode 100755 index 0000000..65500c4 --- /dev/null +++ b/themes/relearn/exampleSite/content/basics/requirements/_index.en.md @@ -0,0 +1,11 @@ ++++ +disableToc = true +title = "Requirements" +weight = 10 ++++ + +Thanks to the simplicity of Hugo, this page is as empty as this theme needs requirements. + +Just download latest version of [Hugo binary](https://gohugo.io/getting-started/installing/) for your OS (Windows, Linux, Mac) : it's that simple. + +![Magic](images/magic.gif?classes=shadow) diff --git a/themes/relearn/exampleSite/content/basics/requirements/_index.pir.md b/themes/relearn/exampleSite/content/basics/requirements/_index.pir.md new file mode 100644 index 0000000..312e87c --- /dev/null +++ b/themes/relearn/exampleSite/content/basics/requirements/_index.pir.md @@ -0,0 +1,6 @@ ++++ +disableToc = true +title = "Requirrrements" +weight = 10 ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/basics/requirements/images/magic.gif b/themes/relearn/exampleSite/content/basics/requirements/images/magic.gif new file mode 100644 index 0000000..235c4ed Binary files /dev/null and b/themes/relearn/exampleSite/content/basics/requirements/images/magic.gif differ diff --git a/themes/relearn/exampleSite/content/cont/_index.en.md b/themes/relearn/exampleSite/content/cont/_index.en.md new file mode 100755 index 0000000..c0152a6 --- /dev/null +++ b/themes/relearn/exampleSite/content/cont/_index.en.md @@ -0,0 +1,11 @@ ++++ +chapter = true +title = "Content" +weight = 2 ++++ + +### Chapter 2 + +# Content + +Find out how to create and organize your content quickly and intuitively. diff --git a/themes/relearn/exampleSite/content/cont/_index.pir.md b/themes/relearn/exampleSite/content/cont/_index.pir.md new file mode 100644 index 0000000..4a040d6 --- /dev/null +++ b/themes/relearn/exampleSite/content/cont/_index.pir.md @@ -0,0 +1,6 @@ ++++ +chapter = true +title = "Rambl'n" +weight = 2 ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/cont/archetypes.en.md b/themes/relearn/exampleSite/content/cont/archetypes.en.md new file mode 100644 index 0000000..044b63c --- /dev/null +++ b/themes/relearn/exampleSite/content/cont/archetypes.en.md @@ -0,0 +1,58 @@ ++++ +title = "Archetypes" +weight = 10 ++++ + +Using the command: `hugo new [relative new content path]`, you can start a content file with the date and title automatically set. While this is a welcome feature, active writers need more: [archetypes](https://gohugo.io/content/archetypes/). + +It is pre-configured skeleton pages with default front matter. Please refer to the documentation for types of page to understand the differences. + +## Chapter {#archetypes-chapter} + +To create a Chapter page, run the following commands + +```shell +hugo new --kind chapter /_index.md +``` + +It will create a page with predefined Front-Matter: + +```toml ++++ +chapter = true +pre = "X. " +title = "{{ replace .Name "-" " " | title }}" +weight = 5 ++++ + +### Chapter X + +# Some Chapter title + +Lorem Ipsum. +``` + +## Default + +To create a default page, run either one of the following commands either + +```shell +hugo new //_index.md +``` + +or + +```shell +hugo new /.md +``` + +It will create a page with predefined Front-Matter: + +```toml ++++ +title = "{{ replace .Name "-" " " | title }}" +weight = 5 ++++ + +Lorem Ipsum. +``` diff --git a/themes/relearn/exampleSite/content/cont/archetypes.pir.md b/themes/relearn/exampleSite/content/cont/archetypes.pir.md new file mode 100644 index 0000000..26ef304 --- /dev/null +++ b/themes/relearn/exampleSite/content/cont/archetypes.pir.md @@ -0,0 +1,5 @@ ++++ +title = "Arrrchetypes" +weight = 10 ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/cont/i18n/_index.en.md b/themes/relearn/exampleSite/content/cont/i18n/_index.en.md new file mode 100644 index 0000000..932d434 --- /dev/null +++ b/themes/relearn/exampleSite/content/cont/i18n/_index.en.md @@ -0,0 +1,71 @@ ++++ +title = "Multilingual and i18n" +weight = 30 ++++ + +The Relearn theme is fully compatible with Hugo multilingual mode. + +It provides: + +- Translation strings for default values (English, Piratized English, Arabic, Simplified Chinese, Traditional Chinesse, Dutch, French, German, Hindi, Indonesian, Italian, Japanese, Korean, Polish, Portuguese, Russian, Spanish, Turkish, Vietnamese). Feel free to contribute! +- Automatic menu generation from multilingual content +- In-browser language switching + +![I18n menu](images/i18n-menu.gif?classes=shadow&width=300px) + +## Basic configuration + +After learning [how Hugo handle multilingual websites](https://gohugo.io/content-management/multilingual), define your languages in your `config.toml` file. + +For example with current English and Piratized English website. + +```toml +# English is the default language +defaultContentLanguage = "en" + +[Languages] +[Languages.en] +title = "Hugo Relearn Theme" +weight = 1 +languageName = "English" + +[Languages.pir] +title = "Cap'n Hugo Relearrrn Theme" +weight = 2 +languageName = "Arrr! Pirrrates" +``` + +Then, for each new page, append the *id* of the language to the file. + +- Single file `my-page.md` is split in two files: + - in English: `my-page.md` + - in Piratized English: `my-page.pir.md` +- Single file `_index.md` is split in two files: + - in English: `_index.md` + - in Piratized English: `_index.pir.md` + +{{% notice info %}} +Be aware that only translated pages are displayed in menu. It's not replaced with default language content. +{{% /notice %}} + +{{% notice tip %}} +Use [slug](https://gohugo.io/content-management/multilingual/#translate-your-content) Front Matter parameter to translate urls too. +{{% /notice %}} + +## Overwrite translation strings + +Translations strings are used for common default values used in the theme (*Edit* button, *Search placeholder* and so on). Translations are available in English and Piratized English but you may use another language or want to override default values. + +To override these values, create a new file in your local i18n folder `i18n/.toml` and inspire yourself from the theme `themes/hugo-theme-relearn/i18n/en.toml` + +## Disable language switching + +Switching the language in the browser is a great feature, but for some reasons you may want to disable it. + +Just set `disableLanguageSwitchingButton=true` in your `config.toml` + +```toml +[params] + # When using mulitlingual website, disable the switch language button. + disableLanguageSwitchingButton = true +``` diff --git a/themes/relearn/exampleSite/content/cont/i18n/_index.pir.md b/themes/relearn/exampleSite/content/cont/i18n/_index.pir.md new file mode 100644 index 0000000..9976e08 --- /dev/null +++ b/themes/relearn/exampleSite/content/cont/i18n/_index.pir.md @@ -0,0 +1,5 @@ ++++ +title = "Multilingual an' i18n" +weight = 30 ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/cont/i18n/images/i18n-menu.gif b/themes/relearn/exampleSite/content/cont/i18n/images/i18n-menu.gif new file mode 100644 index 0000000..dd5d002 Binary files /dev/null and b/themes/relearn/exampleSite/content/cont/i18n/images/i18n-menu.gif differ diff --git a/themes/relearn/exampleSite/content/cont/icons.en.md b/themes/relearn/exampleSite/content/cont/icons.en.md new file mode 100644 index 0000000..013bf8c --- /dev/null +++ b/themes/relearn/exampleSite/content/cont/icons.en.md @@ -0,0 +1,41 @@ ++++ +title = "Icons and logos" +weight = 27 ++++ + +The Relearn theme for Hugo loads the [**Font Awesome**](https://fontawesome.com) library, allowing you to easily display any icon or logo available in the Font Awesome free collection. + +## Finding an icon + +Browse through the available icons in the [Font Awesome Gallery](https://fontawesome.com/v5/search?m=free). Notice that the **free** filter is enabled, as only the free icons are available by default. + +Once on the Font Awesome page for a specific icon, for example the page for the [heart](https://fontawesome.com/v5/icons/heart?s=solid), copy the HTML reference and paste into the Markdown content. + +The HTML to include the heart icon is: + +```html + +``` + +## Including in markdown + +Paste the `` HTML into markup and Font Awesome will load the relevant icon. + +```html +Built with by Relearn and Hugo +``` + +Which appears as + +Built with by Relearn and Hugo + +## Customising icons + +Font Awesome provides many ways to modify the icon + +* Change color (by default the icon will inherit the parent color) +* Increase or decrease size +* Rotate +* Combine with other icons + +Check the full documentation on [web fonts with CSS](https://fontawesome.com/how-to-use/web-fonts-with-css) for more. diff --git a/themes/relearn/exampleSite/content/cont/icons.pir.md b/themes/relearn/exampleSite/content/cont/icons.pir.md new file mode 100644 index 0000000..dc6dada --- /dev/null +++ b/themes/relearn/exampleSite/content/cont/icons.pir.md @@ -0,0 +1,5 @@ ++++ +title = "Ay'cons an' logos" +weight = 27 ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/cont/markdown.en.md b/themes/relearn/exampleSite/content/cont/markdown.en.md new file mode 100644 index 0000000..ac9d588 --- /dev/null +++ b/themes/relearn/exampleSite/content/cont/markdown.en.md @@ -0,0 +1,696 @@ ++++ +title = "Markdown syntax" +weight = 15 ++++ + +Let's face it: Writing content for the Web is tiresome. WYSIWYG editors help alleviate this task, but they generally result in horrible code, or worse yet, ugly web pages. + +**Markdown** is a better way to write **HTML**, without all the complexities and ugliness that usually accompanies it. + +Some of the key benefits are: + +1. Markdown is simple to learn, with minimal extra characters so it's also quicker to write content. +2. Less chance of errors when writing in Markdown. +3. Produces valid XHTML output. +4. Keeps the content and the visual display separate, so you cannot mess up the look of your site. +5. Write in any text editor or Markdown application you like. +6. Markdown is a joy to use! + +John Gruber, the author of Markdown, puts it like this: + +> The overriding design goal for Markdown’s formatting syntax is to make it as readable as possible. The idea is that a Markdown-formatted document should be publishable as-is, as plain text, without looking like it’s been marked up with tags or formatting instructions. While Markdown’s syntax has been influenced by several existing text-to-HTML filters, the single biggest source of inspiration for Markdown’s syntax is the format of plain text email. +> John Gruber + +Without further delay, let us go over the main elements of Markdown and what the resulting HTML looks like: + +{{% notice info %}} + Bookmark this page and the [official Commonmark reference](https://commonmark.org/help/) for easy future reference! +{{% /notice %}} + +## Headings + +Headings from `h1` through `h6` are constructed with a `#` for each level: + +```markdown +# h1 Heading +## h2 Heading +### h3 Heading +#### h4 Heading +##### h5 Heading +###### h6 Heading +``` + +Renders to: + +# h1 Heading + + +## h2 Heading + +### h3 Heading + +#### h4 Heading + +##### h5 Heading + +###### h6 Heading + +HTML: + +```html +

h1 Heading

+

h2 Heading

+

h3 Heading

+

h4 Heading

+
h5 Heading
+
h6 Heading
+``` + +## Comments + +Comments should be HTML compatible + +```html + +``` + +Comment below should **NOT** be seen: + + + +## Horizontal Rules + +The HTML `
` element is for creating a "thematic break" between paragraph-level elements. In Markdown, you can create a `
` with `---` - three consecutive dashes + +renders to: + +--- + +## Paragraphs + +Any text not starting with a special sign is written as normal, plain text and will be wrapped within `

` tags in the rendered HTML. + +So this body copy: + +```markdown +Lorem ipsum dolor sit amet, graecis denique ei vel, at duo primis mandamus. Et legere ocurreret pri, animal tacimates complectitur ad cum. Cu eum inermis inimicus efficiendi. Labore officiis his ex, soluta officiis concludaturque ei qui, vide sensibus vim ad. +``` + +renders to this HTML: + +```html +

Lorem ipsum dolor sit amet, graecis denique ei vel, at duo primis mandamus. Et legere ocurreret pri, animal tacimates complectitur ad cum. Cu eum inermis inimicus efficiendi. Labore officiis his ex, soluta officiis concludaturque ei qui, vide sensibus vim ad.

+``` + +## Text Markers + +### Bold + +For emphasizing a snippet of text with a heavier font-weight. + +The following snippet of text is **rendered as bold text**. + +```markdown +**rendered as bold text** +``` + +renders to: + + +**rendered as bold text** + + +and this HTML + +```html +rendered as bold text +``` + +### Italics + +For emphasizing a snippet of text with italics. + +The following snippet of text is _rendered as italicized text_. + +```markdown +_rendered as italicized text_ +``` + +renders to: + + +_rendered as italicized text_ + + +and this HTML: + +```html +rendered as italicized text +``` + +### Strikethrough + +In GFM (GitHub flavored Markdown) you can do strikethroughs. + +```markdown +~~Strike through this text.~~ +``` + +Which renders to: + +~~Strike through this text.~~ + +HTML: + +```html +Strike through this text. +``` + +## Blockquotes + +For quoting blocks of content from another source within your document. + +Add `>` before any text you want to quote. + +```markdown +> **Fusion Drive** combines a hard drive with a flash storage (solid-state drive) and presents it as a single logical volume with the space of both drives combined. +``` + +Renders to: + +> **Fusion Drive** combines a hard drive with a flash storage (solid-state drive) and presents it as a single logical volume with the space of both drives combined. + +and this HTML: + +```html +
+

Fusion Drive combines a hard drive with a flash storage (solid-state drive) and presents it as a single logical volume with the space of both drives combined.

+
+``` + +Blockquotes can also be nested: + +```markdown +> Donec massa lacus, ultricies a ullamcorper in, fermentum sed augue. Nunc augue augue, aliquam non hendrerit ac, commodo vel nisi. +> +> > Sed adipiscing elit vitae augue consectetur a gravida nunc vehicula. Donec auctor odio non est accumsan facilisis. Aliquam id turpis in dolor tincidunt mollis ac eu diam. +> +> Mauris sit amet ligula egestas, feugiat metus tincidunt, luctus libero. Donec congue finibus tempor. Vestibulum aliquet sollicitudin erat, ut aliquet purus posuere luctus. +``` + +Renders to: + +> Donec massa lacus, ultricies a ullamcorper in, fermentum sed augue. Nunc augue augue, aliquam non hendrerit ac, commodo vel nisi. +> +> > Sed adipiscing elit vitae augue consectetur a gravida nunc vehicula. Donec auctor odio non est accumsan facilisis. Aliquam id turpis in dolor tincidunt mollis ac eu diam. +> +> Mauris sit amet ligula egestas, feugiat metus tincidunt, luctus libero. Donec congue finibus tempor. Vestibulum aliquet sollicitudin erat, ut aliquet purus posuere luctus. + +## Lists + +### Unordered + +A list of items in which the order of the items does not explicitly matter. + +You may use any of the following symbols to denote bullets for each list item: + +```markdown +* valid bullet +- valid bullet ++ valid bullet +``` + +For example + +```markdown ++ Lorem ipsum dolor sit amet ++ Consectetur adipiscing elit ++ Integer molestie lorem at massa ++ Facilisis in pretium nisl aliquet ++ Nulla volutpat aliquam velit + - Phasellus iaculis neque + - Purus sodales ultricies + - Vestibulum laoreet porttitor sem + - Ac tristique libero volutpat at ++ Faucibus porta lacus fringilla vel ++ Aenean sit amet erat nunc ++ Eget porttitor lorem +``` + +Renders to: + + ++ Lorem ipsum dolor sit amet ++ Consectetur adipiscing elit ++ Integer molestie lorem at massa ++ Facilisis in pretium nisl aliquet ++ Nulla volutpat aliquam velit + - Phasellus iaculis neque + - Purus sodales ultricies + - Vestibulum laoreet porttitor sem + - Ac tristique libero volutpat at ++ Faucibus porta lacus fringilla vel ++ Aenean sit amet erat nunc ++ Eget porttitor lorem + + +And this HTML + +```html +
    +
  • Lorem ipsum dolor sit amet
  • +
  • Consectetur adipiscing elit
  • +
  • Integer molestie lorem at massa
  • +
  • Facilisis in pretium nisl aliquet
  • +
  • Nulla volutpat aliquam velit +
      +
    • Phasellus iaculis neque
    • +
    • Purus sodales ultricies
    • +
    • Vestibulum laoreet porttitor sem
    • +
    • Ac tristique libero volutpat at
    • +
    +
  • +
  • Faucibus porta lacus fringilla vel
  • +
  • Aenean sit amet erat nunc
  • +
  • Eget porttitor lorem
  • +
+``` + +### Ordered + +A list of items in which the order of items does explicitly matter. + +```markdown +1. Lorem ipsum dolor sit amet +4. Consectetur adipiscing elit +2. Integer molestie lorem at massa +8. Facilisis in pretium nisl aliquet +4. Nulla volutpat aliquam velit +99. Faucibus porta lacus fringilla vel +21. Aenean sit amet erat nunc +6. Eget porttitor lorem +``` + +Renders to: + +1. Lorem ipsum dolor sit amet +2. Consectetur adipiscing elit +3. Integer molestie lorem at massa +4. Facilisis in pretium nisl aliquet +5. Nulla volutpat aliquam velit +6. Faucibus porta lacus fringilla vel +7. Aenean sit amet erat nunc +8. Eget porttitor lorem + +And this HTML: + +```html +
    +
  1. Lorem ipsum dolor sit amet
  2. +
  3. Consectetur adipiscing elit
  4. +
  5. Integer molestie lorem at massa
  6. +
  7. Facilisis in pretium nisl aliquet
  8. +
  9. Nulla volutpat aliquam velit
  10. +
  11. Faucibus porta lacus fringilla vel
  12. +
  13. Aenean sit amet erat nunc
  14. +
  15. Eget porttitor lorem
  16. +
+``` + +{{% notice tip %}} +If you just use `1.` for each number, Markdown will automatically number each item. For example: +{{% /notice %}} + +```markdown +1. Lorem ipsum dolor sit amet +1. Consectetur adipiscing elit +1. Integer molestie lorem at massa +1. Facilisis in pretium nisl aliquet +1. Nulla volutpat aliquam velit +1. Faucibus porta lacus fringilla vel +1. Aenean sit amet erat nunc +1. Eget porttitor lorem +``` + +Renders to: + +1. Lorem ipsum dolor sit amet +2. Consectetur adipiscing elit +3. Integer molestie lorem at massa +4. Facilisis in pretium nisl aliquet +5. Nulla volutpat aliquam velit +6. Faucibus porta lacus fringilla vel +7. Aenean sit amet erat nunc +8. Eget porttitor lorem + +## Code + +### Inline code + +Wrap inline snippets of code with `` ` ``. + +```markdown +In this example, `
` should be wrapped as **code**. +``` + +Renders to: + +In this example, `
` should be wrapped as **code**. + +HTML: + +```html +

In this example, <div></div> should be wrapped as code.

+``` + +### Indented code + +Or indent several lines of code by at least two spaces, as in: + +```markdown + // Some comments + line 1 of code + line 2 of code + line 3 of code +``` + +Renders to: + + + // Some comments + line 1 of code + line 2 of code + line 3 of code + + +HTML: + +```html +
+  
+    // Some comments
+    line 1 of code
+    line 2 of code
+    line 3 of code
+  
+
+``` + +### Block code "fences" + +Use "fences" ```` ``` ```` to block in multiple lines of code. + +````plaintext +``` +Sample text here... +``` +```` + +HTML: + +```html +
+  Sample text here...
+
+``` + +### Syntax highlighting + +GFM, or "GitHub Flavored Markdown" also supports syntax highlighting. To activate it, usually you simply add the file extension of the language you want to use directly after the first code "fence", ` ```js `, and syntax highlighting will automatically be applied in the rendered HTML. + +See [Code Highlighting]({{% relref "syntaxhighlight" %}}) for additional documentation. + +For example, to apply syntax highlighting to JavaScript code: + +````plaintext +```js +grunt.initConfig({ + assemble: { + options: { + assets: 'docs/assets', + data: 'src/data/*.{json,yml}', + helpers: 'src/custom-helpers.js', + partials: ['src/partials/**/*.{hbs,md}'] + }, + pages: { + options: { + layout: 'default.hbs' + }, + files: { + './': ['src/templates/pages/index.hbs'] + } + } + } +}; +``` +```` + +Renders to: + +```js +grunt.initConfig({ + assemble: { + options: { + assets: 'docs/assets', + data: 'src/data/*.{json,yml}', + helpers: 'src/custom-helpers.js', + partials: ['src/partials/**/*.{hbs,md}'] + }, + pages: { + options: { + layout: 'default.hbs' + }, + files: { + './': ['src/templates/pages/index.hbs'] + } + } + } +}; +``` + +## Tables + +Tables are created by adding pipes as dividers between each cell, and by adding a line of dashes (also separated by bars) beneath the header. Note that the pipes do not need to be vertically aligned. + +```markdown +| Option | Description | +| ------ | ----------- | +| data | path to data files to supply the data that will be passed into templates. | +| engine | engine to be used for processing templates. Handlebars is the default. | +| ext | extension to be used for dest files. | +``` + +Renders to: + +| Option | Description | +| ------ | ----------- | +| data | path to data files to supply the data that will be passed into templates. | +| engine | engine to be used for processing templates. Handlebars is the default. | +| ext | extension to be used for dest files. | + +And this HTML: + +```html + + + + + + + + + + + + + + + + + +
OptionDescription
datapath to data files to supply the data that will be passed into templates.
engineengine to be used for processing templates. Handlebars is the default.
extextension to be used for dest files.
+``` + +### Right aligned text + +Adding a colon on the right side of the dashes below any heading will right align text for that column. + +```markdown +| Option | Description | +| ------:| -----------:| +| data | path to data files to supply the data that will be passed into templates. | +| engine | engine to be used for processing templates. Handlebars is the default. | +| ext | extension to be used for dest files. | +``` + +| Option | Description | +| ------:| -----------:| +| data | path to data files to supply the data that will be passed into templates. | +| engine | engine to be used for processing templates. Handlebars is the default. | +| ext | extension to be used for dest files. | + +### Two tables adjacent + +| Option | Description | +| ------ | ----------- | +| ext | extension to be used for dest files. | + +| Option | Description | +| ------ | ----------- | +| ext | extension to be used for dest files. | + +## Links + +### Basic link + +```markdown +[Assemble](http://assemble.io) +``` + +Renders to (hover over the link, there is no tooltip): + +[Assemble](http://assemble.io) + +HTML: + +```html +Assemble +``` + +### Add a tooltip + +```markdown +[Upstage](https://github.com/upstage/ "Visit Upstage!") +``` + +Renders to (hover over the link, there should be a tooltip): + +[Upstage](https://github.com/upstage/ "Visit Upstage!") + +HTML: + +```html +Upstage +``` + +### Named Anchors + +Named anchors enable you to jump to the specified anchor point on the same page. For example, each of these chapters: + +```markdown +# Table of Contents + * [Chapter 1](#chapter-1) + * [Chapter 2](#chapter-2) + * [Chapter 3](#chapter-3) +``` + +will jump to these sections: + +```markdown +## Chapter 1 +Content for chapter one. + +## Chapter 2 +Content for chapter one. + +## Chapter 3 +Content for chapter one. +``` +**NOTE** that specific placement of the anchor tag seems to be arbitrary. They are placed inline here since it seems to be unobtrusive, and it works. + +## Images {#images} +Images have a similar syntax to links but include a preceding exclamation point. + +```markdown +![Minion](https://octodex.github.com/images/minion.png) +``` + +![Minion](https://octodex.github.com/images/minion.png) + +or + +```markdown +![Alt text](https://octodex.github.com/images/stormtroopocat.jpg "The Stormtroopocat") +``` + +![Alt text](https://octodex.github.com/images/stormtroopocat.jpg "The Stormtroopocat") + +Like links, Images also have a footnote style syntax + +### Alternative usage : note images + +```markdown +![Alt text][id] +``` + +![Alt text][id] + +With a reference later in the document defining the URL location: + +[id]: https://octodex.github.com/images/dojocat.jpg "The Dojocat" + + [id]: https://octodex.github.com/images/dojocat.jpg "The Dojocat" + +### Further image formatting + +The Hugo Markdown parser supports additional non-standard functionality. + +#### Resizing image + +Add HTTP parameters `width` and/or `height` to the link image to resize the image. Values are CSS values (default is `auto`). + +```markdown +![Minion](https://octodex.github.com/images/minion.png?width=20pc) +``` + +![Minion](https://octodex.github.com/images/minion.png?width=20pc) + +![stormtroopocat](https://octodex.github.com/images/stormtroopocat.png?width=20pc) + +```markdown +![Minion](https://octodex.github.com/images/minion.png?height=50px) +``` + +![Minion](https://octodex.github.com/images/minion.png?height=50px) + +```markdown +![Minion](https://octodex.github.com/images/minion.png?height=50px&width=300px) +``` + +![Minion](https://octodex.github.com/images/minion.png?height=50px&width=300px) + +#### Add CSS classes + +Add a HTTP `classes` parameter to the link image to add CSS classes. `shadow`and `border` are available but you could define other ones. + +```markdown +![stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg?classes=shadow) +``` + +![stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg?width=40pc&classes=shadow) + +```markdown +![stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg?classes=border) +``` + +![stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg?width=40pc&classes=border) + +```markdown +![stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg?classes=border,shadow) +``` + +![stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg?width=40pc&classes=border,shadow) + +#### Lightbox + +Add a HTTP `featherlight` parameter to the link image to disable lightbox. By default lightbox is enabled using the featherlight.js plugin. You can disable this by defining `featherlight` to `false`. + +```markdown +![Minion](https://octodex.github.com/images/minion.png?featherlight=false) +``` + +![Minion](https://octodex.github.com/images/minion.png?featherlight=false) diff --git a/themes/relearn/exampleSite/content/cont/markdown.pir.md b/themes/relearn/exampleSite/content/cont/markdown.pir.md new file mode 100644 index 0000000..64e826d --- /dev/null +++ b/themes/relearn/exampleSite/content/cont/markdown.pir.md @@ -0,0 +1,5 @@ ++++ +title = "Marrrkdown rules" +weight = 15 ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/cont/menushortcuts.en.md b/themes/relearn/exampleSite/content/cont/menushortcuts.en.md new file mode 100644 index 0000000..1fc75f9 --- /dev/null +++ b/themes/relearn/exampleSite/content/cont/menushortcuts.en.md @@ -0,0 +1,132 @@ ++++ +title = "Menu extra shortcuts" +weight = 25 ++++ + +You can define additional menu entries or shortcuts in the navigation menu without any link to content. + +## Basic configuration + +Edit the website configuration `config.toml` and add a `[[menu.shortcuts]]` entry for each link your want to add. + +Example from the current website: + +````toml +[[menu.shortcuts]] +name = " GitHub repo" +identifier = "ds" +url = "https://github.com/McShelby/hugo-theme-relearn" +weight = 10 + +[[menu.shortcuts]] +name = " Showcases" +url = "more/showcase/" +weight = 11 + +[[menu.shortcuts]] +name = " Hugo Documentation" +identifier = "hugodoc" +url = "https://gohugo.io/" +weight = 20 + +[[menu.shortcuts]] +name = " Credits" +url = "more/credits/" +weight = 30 + +[[menu.shortcuts]] +name = " Tags" +url = "tags/" +weight = 40 +```` + +By default, shortcuts are preceded by a title. This title can be disabled by setting `disableShortcutsTitle=true`. +However, if you want to keep the title but change its value, it can be overriden by changing your local i18n translation string configuration. + +For example, in your local `i18n/en.toml` file, add the following content + +````toml +[Shortcuts-Title] +other = "" +```` + +Read more about [hugo menu](https://gohugo.io/extras/menus/) and [hugo i18n translation strings](https://gohugo.io/content-management/multilingual/#translation-of-strings) + +## Configuration for Multilingual mode {#i18n} + +When using a multilingual website, you can set different menus for each language. In the `config.toml` file, prefix your menu configuration by `Languages.`. + +Example from the current website: + +````toml +[Languages] + [Languages.en] + title = "Hugo Relearn Theme" + weight = 1 + languageName = "English" + landingPageURL = "/" + landingPageName = " Home" + + [[Languages.en.menu.shortcuts]] + name = " GitHub repo" + identifier = "ds" + url = "https://github.com/McShelby/hugo-theme-relearn" + weight = 10 + + [[Languages.en.menu.shortcuts]] + name = " Showcases" + url = "more/showcase/" + weight = 11 + + [[Languages.en.menu.shortcuts]] + name = " Hugo Documentation" + identifier = "hugodoc" + url = "https://gohugo.io/" + weight = 20 + + [[Languages.en.menu.shortcuts]] + name = " Credits" + url = "more/credits/" + weight = 30 + + [[Languages.en.menu.shortcuts]] + name = " Tags" + url = "tags/" + weight = 40 + + [Languages.pir] + title = "Cap'n Hugo Relearrrn Theme" + weight = 1 + languageName = "Arrr! Pirrrates" + landingPageURL = "/pir/" + landingPageName = " Arrr! Home" + + [[Languages.pir.menu.shortcuts]] + name = " GitHub repo" + identifier = "ds" + url = "https://github.com/McShelby/hugo-theme-relearn" + weight = 10 + + [[Languages.pir.menu.shortcuts]] + name = " Showcases" + url = "more/showcase/" + weight = 11 + + [[Languages.pir.menu.shortcuts]] + name = " Cap'n Hugo Documentat'n" + identifier = "hugodoc" + url = "https://gohugo.io/" + weight = 20 + + [[Languages.pir.menu.shortcuts]] + name = " Crrredits" + url = "more/credits/" + weight = 30 + + [[Languages.pir.menu.shortcuts]] + name = " Arrr! Tags" + url = "tags/" + weight = 40 +```` + +Read more about [hugo menu](https://gohugo.io/extras/menus/) and [hugo multilingual menus](https://gohugo.io/content-management/multilingual/#menus) \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/cont/menushortcuts.pir.md b/themes/relearn/exampleSite/content/cont/menushortcuts.pir.md new file mode 100644 index 0000000..0520e5c --- /dev/null +++ b/themes/relearn/exampleSite/content/cont/menushortcuts.pir.md @@ -0,0 +1,5 @@ ++++ +title = "Menu extrrra shorrrtcuts" +weight = 25 ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/cont/pages/_index.en.md b/themes/relearn/exampleSite/content/cont/pages/_index.en.md new file mode 100644 index 0000000..c1973d1 --- /dev/null +++ b/themes/relearn/exampleSite/content/cont/pages/_index.en.md @@ -0,0 +1,191 @@ ++++ +title = "Pages organization" +weight = 5 ++++ + +In **Hugo**, pages are the core of your site. Once it is configured, pages are definitely the added value to your documentation site. + +## Folders + +Organize your site like [any other Hugo project](https://gohugo.io/content/organization/). Typically, you will have a *content* folder with all your pages. + +````plaintext +content +├── level-one +│ ├── level-two +│ │ ├── level-three +│ │ │ ├── level-four +│ │ │ │ ├── _index.md <-- /level-one/level-two/level-three/level-four +│ │ │ │ ├── page-4-a.md <-- /level-one/level-two/level-three/level-four/page-4-a +│ │ │ │ ├── page-4-b.md <-- /level-one/level-two/level-three/level-four/page-4-b +│ │ │ │ └── page-4-c.md <-- /level-one/level-two/level-three/level-four/page-4-c +│ │ │ ├── _index.md <-- /level-one/level-two/level-three +│ │ │ ├── page-3-a.md <-- /level-one/level-two/level-three/page-3-a +│ │ │ ├── page-3-b.md <-- /level-one/level-two/level-three/page-3-b +│ │ │ └── page-3-c.md <-- /level-one/level-two/level-three/page-3-c +│ │ ├── _index.md <-- /level-one/level-two +│ │ ├── page-2-a.md <-- /level-one/level-two/page-2-a +│ │ ├── page-2-b.md <-- /level-one/level-two/page-2-b +│ │ └── page-2-c.md <-- /level-one/level-two/page-2-c +│ ├── _index.md <-- /level-one +│ ├── page-1-a.md <-- /level-one/page-1-a +│ ├── page-1-b.md <-- /level-one/page-1-b +│ └── page-1-c.md <-- /level-one/page-1-c +├── _index.md <-- / +└── page-top.md <-- /page-top +```` + +{{% notice note %}} +`_index.md` is required in each folder, it’s your “folder home page” +{{% /notice %}} + +## Types + +The Relearn theme defines two types of pages. *Default* and *Chapter*. Both can be used at any level of the documentation, the only difference being layout display. + +### Chapter {#chapter-style} + +A **Chapter** displays a page meant to be used as introduction for a set of child pages. Commonly, it contains a simple title and a catch line to define content that can be found under it. + +You can define any HTML as prefix for the menu. In the example below, it's just a number but that could be an [icon](https://fortawesome.github.io/Font-Awesome/). + +![Chapter page](images/pages-chapter.png?classes=shadow&width=60pc) + +```markdown ++++ +chapter = true +pre = "1. " +title = "Basics" +weight = 5 ++++ + +### Chapter 1 + +# Basics + +Discover what this Hugo theme is all about and the core-concepts behind it. +``` + +To tell the Relearn theme to consider a page as a chapter, set `chapter=true` in the Front Matter of the page. + +### Default + +A **Default** page is any other content page. + +![Default page](images/pages-default.png?classes=shadow&width=60pc) + +```toml ++++ +title = "Installation" +weight = 15 ++++ +``` + +The following steps are here to help you initialize your new website. If you don't know Hugo at all, we strongly suggest you to train by following this [great documentation for beginners](https://gohugo.io/overview/quickstart/). + +## Create your project + +Hugo provides a `new` command to create a new website. + +```shell +hugo new site +``` + +The Relearn theme provides [archetypes]({{%relref "cont/archetypes" %}}) to help you create this kind of pages. + +## Front Matter configuration + +Each Hugo page has to define a [Front Matter](https://gohugo.io/content/front-matter/) in *toml*, *yaml* or *json*. This site will use *toml* in all cases. + +The Relearn theme uses the following parameters on top of Hugo ones : + +```toml ++++ +# Table of contents (toc) is enabled by default. Set this parameter to true to disable it. +# Note: Toc is always disabled for chapter pages +disableToc = false +# If set, this will be used for the page's menu entry (instead of the `title` attribute) +menuTitle = "" +# If set, this will explicitly override common rules for the expand state of a page's menu entry +alwaysopen = true +# If set, this will explicitly override common rules for the sorting order of a page's submenu entries +ordersectionsby = "title" +# The title of the page in menu will be prefixed by this HTML content +pre = "" +# The title of the page in menu will be postfixed by this HTML content +post = "" +# Set the page as a chapter, changing the way it's displayed +chapter = false +# Hide a menu entry by setting this to true +hidden = false +# Display name of this page modifier. If set, it will be displayed in the footer. +LastModifierDisplayName = "" +# Email of this page modifier. If set with LastModifierDisplayName, it will be displayed in the footer +LastModifierEmail = "" ++++ +``` + +### Add icon to a menu entry + +In the page frontmatter, add a `pre` param to insert any HTML code before the menu label. The example below uses the GitHub icon. + +```toml ++++ +title = "GitHub repo" +pre = " " ++++ +``` + +![Title with icon](images/frontmatter-icon.png?classes=shadow&width=300px) + +### Ordering sibling menu/page entries + +Hugo provides a [flexible way](https://gohugo.io/content/ordering/) to handle order for your pages. + +The simplest way is to set `weight` parameter to a number. + +```toml ++++ +title = "My page" +weight = 5 ++++ +``` + +### Using a custom title for menu entries + +By default, the Relearn theme will use a page's `title` attribute for the menu item (or `linkTitle` if defined). + +But a page's title has to be descriptive on its own while the menu is a hierarchy. +We've added the `menuTitle` parameter for that purpose: + +For example (for a page named `content/install/linux.md`): + +```toml ++++ +title = "Install on Linux" +menuTitle = "Linux" ++++ +``` + +### Override expand state rules for menu entries + +You can change how the theme expands menu entries on the side of the content with the `alwaysopen` setting on a per page basis. If `alwaysopen=false` for any given entry, its children will not be shown in the menu as long as it is not necessary for the sake of navigation. + +The theme generates the menu based on the following rules: + +- all parent entries of the active page including their siblings are shown regardless of any settings +- immediate children entries of the active page are shown regardless of any settings +- if not overridden, all other first level entries behave like they would have been given `alwaysopen=false` +- if not overridden, all other entries of levels besides the first behave like they would have been given `alwaysopen=true` +- all visible entries show their immediate children entries if `alwaysopen=true`; this proceeds recursivley +- all remaining entries are not shown + +You can see this feature in action on the example page for [children shortcode]({{< relref "shortcodes/children" >}}) and its children pages. + +## Your Page + +To configure your page, you basically have three choices: + +1. Create an `_index.md` document in `content` folder and fill the file with *Markdown content* +2. Create an `index.html` file in the `static` folder and fill the file with *HTML content* +3. Configure your server to automatically redirect home page to one your documentation page diff --git a/themes/relearn/exampleSite/content/cont/pages/_index.pir.md b/themes/relearn/exampleSite/content/cont/pages/_index.pir.md new file mode 100644 index 0000000..718ff7c --- /dev/null +++ b/themes/relearn/exampleSite/content/cont/pages/_index.pir.md @@ -0,0 +1,5 @@ ++++ +title = "Planks orrrganizat'n" +weight = 5 ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/cont/pages/images/frontmatter-icon.png b/themes/relearn/exampleSite/content/cont/pages/images/frontmatter-icon.png new file mode 100644 index 0000000..8614767 Binary files /dev/null and b/themes/relearn/exampleSite/content/cont/pages/images/frontmatter-icon.png differ diff --git a/themes/relearn/exampleSite/content/cont/pages/images/pages-chapter.png b/themes/relearn/exampleSite/content/cont/pages/images/pages-chapter.png new file mode 100644 index 0000000..dd340fa Binary files /dev/null and b/themes/relearn/exampleSite/content/cont/pages/images/pages-chapter.png differ diff --git a/themes/relearn/exampleSite/content/cont/pages/images/pages-default.png b/themes/relearn/exampleSite/content/cont/pages/images/pages-default.png new file mode 100644 index 0000000..071b43a Binary files /dev/null and b/themes/relearn/exampleSite/content/cont/pages/images/pages-default.png differ diff --git a/themes/relearn/exampleSite/content/cont/syntaxhighlight.en.md b/themes/relearn/exampleSite/content/cont/syntaxhighlight.en.md new file mode 100644 index 0000000..50d741d --- /dev/null +++ b/themes/relearn/exampleSite/content/cont/syntaxhighlight.en.md @@ -0,0 +1,66 @@ ++++ +title = "Code highlighting" +weight = 16 ++++ + +The Relearn theme uses [Hugo's built-in syntax highlighting](https://gohugo.io/content-management/syntax-highlighting/) for code. + +## Markdown syntax + +Wrap the code block with three backticks and the name of the language. Highlight will try to auto detect the language if one is not provided. + + +````plaintext +```json +[ + { + "title": "apples", + "count": [12000, 20000], + "description": {"text": "...", "sensitive": false} + }, + { + "title": "oranges", + "count": [17500, null], + "description": {"text": "...", "sensitive": false} + } +] +``` +```` + + +Renders to: + +```json +[ + { + "title": "apples", + "count": [12000, 20000], + "description": {"text": "...", "sensitive": false} + }, + { + "title": "oranges", + "count": [17500, null], + "description": {"text": "...", "sensitive": false} + } +] +``` + +## Supported languages + +Hugo comes with a [remarkable list](https://gohugo.io/content-management/syntax-highlighting/#list-of-chroma-highlighting-languages) of supported languages. + +## Recommended configuration + +You can choose a color theme from the [list of supported themes](https://xyproto.github.io/splash/docs/all.html) and add it in your `config.toml` + +````toml +[markup] + [markup.highlight] + # if set to `guessSyntax = true`, there will be no unstyled code even if no language + # was given BUT mermaid code fences will not work anymore! So this is a mandatory + # setting for your site + guessSyntax = false + + # choose a color theme or create your own + style = "base16-snazzy" +```` diff --git a/themes/relearn/exampleSite/content/cont/syntaxhighlight.pir.md b/themes/relearn/exampleSite/content/cont/syntaxhighlight.pir.md new file mode 100644 index 0000000..8abebf9 --- /dev/null +++ b/themes/relearn/exampleSite/content/cont/syntaxhighlight.pir.md @@ -0,0 +1,5 @@ ++++ +title = "Code highlight'n" +weight = 16 ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/cont/tags.en.md b/themes/relearn/exampleSite/content/cont/tags.en.md new file mode 100644 index 0000000..2df22e5 --- /dev/null +++ b/themes/relearn/exampleSite/content/cont/tags.en.md @@ -0,0 +1,36 @@ ++++ +tags = ["documentation", "tutorial"] +title = "Tags" +weight = 40 ++++ + +The Relearn theme supports one default taxonomy of Hugo: the *tag* feature. + +## Configuration + +Just add tags to any page: + +```toml ++++ +tags = ["tutorial", "theme"] +title = "Theme tutorial" +weight = 15 ++++ +``` + +## Behavior + +The tags are displayed at the top of the page, in their insertion order. + +Each tag is a link to a *Taxonomy* page displaying all the articles with the given tag. + +## List all the tags + +In the `config.toml` file you can add a shortcut to display all the tags + +```toml +[[menu.shortcuts]] +name = " Tags" +url = "/tags" +weight = 30 +``` \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/cont/tags.pir.md b/themes/relearn/exampleSite/content/cont/tags.pir.md new file mode 100644 index 0000000..20a7ee0 --- /dev/null +++ b/themes/relearn/exampleSite/content/cont/tags.pir.md @@ -0,0 +1,6 @@ ++++ +tags = ["documentat'n", "tutorrrial"] +title = "Tags" +weight = 40 ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/more/_index.en.md b/themes/relearn/exampleSite/content/more/_index.en.md new file mode 100644 index 0000000..8f92b7a --- /dev/null +++ b/themes/relearn/exampleSite/content/more/_index.en.md @@ -0,0 +1,9 @@ ++++ +title = "More" +[_build] + render = "never" + list = "never" + publishResources = false ++++ + +{{%children containerstyle="div" style="h2" description="true" %}} diff --git a/themes/relearn/exampleSite/content/more/_index.pir.md b/themes/relearn/exampleSite/content/more/_index.pir.md new file mode 100644 index 0000000..c59c6b7 --- /dev/null +++ b/themes/relearn/exampleSite/content/more/_index.pir.md @@ -0,0 +1,8 @@ ++++ +title = "Morrre" +[_build] + render = "never" + list = "never" + publishResources = false ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/more/credits/_index.en.md b/themes/relearn/exampleSite/content/more/credits/_index.en.md new file mode 100644 index 0000000..bc7b8c8 --- /dev/null +++ b/themes/relearn/exampleSite/content/more/credits/_index.en.md @@ -0,0 +1,31 @@ ++++ +disableToc = true +title = "Credits" ++++ + +## Contributors + +Special thanks to [everyone who has contributed](https://github.com/McShelby/hugo-theme-relearn/graphs/contributors) to this project. + +Many thanks to [Mathieu Cornic](https://github.com/matcornic) for his work on porting the [Learn theme](https://github.com/matcornic/hugo-theme-learn) to Hugo. + +Many thanks to [Andy Miller](https://github.com/rhukster) for initially creating the [Learn theme](https://github.com/getgrav/grav-theme-learn2) for Grav. + +## Packages and libraries + +* [autoComplete](https://github.com/Pixabay/JavaScript-autoComplete) - A lightweight and powerful vanilla JavaScript completion suggester +* [clipboard.js](https://clipboardjs.com) - A modern approach to copy text to clipboard +* [Featherlight](https://noelboss.github.io/featherlight) - A lightweight jQuery lightbox plugin +* [Font Awesome](https://fontawesome.com) - The internet's icon library and toolkit +* [jQuery](https://jquery.com) - The "Write less, do more" JavaScript library +* [jquery-svg-zoom-pan](https://github.com/DanielHoffmann/jquery-svg-pan-zoom) - A jQuery plugin to enable pan and zoom in SVG images +* [Lunr](https://lunrjs.com) - Enables a great search experience without the need for external, server-side, search services +* [Mermaid](https://mermaid-js.github.io/mermaid) - Generation of diagram and flowchart from text in a similar manner as markdown +* [Perfect Scrollbar](https://perfectscrollbar.com) - A minimalistic but perfect custom scrollbar plugin +* [RapiDoc](https://mrin9.github.io/RapiDoc) - Create beautiful, customizable, interactive API documentation from OpenAPI Specifications + +## Tooling + +* [GitHub](https://github.com) - Continuous deployement, testing and hosting of this project's sources and its documentation +* [gren](https://github.com/github-tools/github-release-notes) - A releasenotes generator for GitHub +* [Hugo](https://gohugo.io/) - The static site generator of your choice diff --git a/themes/relearn/exampleSite/content/more/credits/_index.pir.md b/themes/relearn/exampleSite/content/more/credits/_index.pir.md new file mode 100644 index 0000000..3a218c2 --- /dev/null +++ b/themes/relearn/exampleSite/content/more/credits/_index.pir.md @@ -0,0 +1,5 @@ ++++ +disableToc = true +title = "Crrredits" ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/more/showcase/_index.en.md b/themes/relearn/exampleSite/content/more/showcase/_index.en.md new file mode 100644 index 0000000..e102424 --- /dev/null +++ b/themes/relearn/exampleSite/content/more/showcase/_index.en.md @@ -0,0 +1,15 @@ ++++ +title = "Showcase" ++++ + +## [GoboLinux Wiki](https://wiki.gobolinux.org/) by NEONsys.org + +![GoboLinux image](images/gobolinux.png?width=60pc&classes=shadow) + +## [BITS](https://bits-training.de/training/) by Dr. Lutz Gollan + +![BITS image](images/bits-train.png?width=60pc&classes=shadow) + +## [Pamasol Electrics](https://pamasol.github.io/de/) by Pamasol – Swiss Aerosol Solutions + +![Pamasol Electrics](images/pamasol-electrics-portal.png?width=60pc&classes=shadow) diff --git a/themes/relearn/exampleSite/content/more/showcase/_index.pir.md b/themes/relearn/exampleSite/content/more/showcase/_index.pir.md new file mode 100644 index 0000000..c13c887 --- /dev/null +++ b/themes/relearn/exampleSite/content/more/showcase/_index.pir.md @@ -0,0 +1,4 @@ ++++ +title = "Showcase" ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/more/showcase/images/bits-train.png b/themes/relearn/exampleSite/content/more/showcase/images/bits-train.png new file mode 100644 index 0000000..870c072 Binary files /dev/null and b/themes/relearn/exampleSite/content/more/showcase/images/bits-train.png differ diff --git a/themes/relearn/exampleSite/content/more/showcase/images/gobolinux.png b/themes/relearn/exampleSite/content/more/showcase/images/gobolinux.png new file mode 100644 index 0000000..35d04fd Binary files /dev/null and b/themes/relearn/exampleSite/content/more/showcase/images/gobolinux.png differ diff --git a/themes/relearn/exampleSite/content/more/showcase/images/pamasol-electrics-portal.png b/themes/relearn/exampleSite/content/more/showcase/images/pamasol-electrics-portal.png new file mode 100644 index 0000000..3dd311e Binary files /dev/null and b/themes/relearn/exampleSite/content/more/showcase/images/pamasol-electrics-portal.png differ diff --git a/themes/relearn/exampleSite/content/shortcodes/INCLUDE_ME.md b/themes/relearn/exampleSite/content/shortcodes/INCLUDE_ME.md new file mode 100644 index 0000000..2953e0c --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/INCLUDE_ME.md @@ -0,0 +1,13 @@ +You can add standard markdown syntax: + +- multiple paragraphs +- bullet point lists +- _emphasized_, **bold** and even **_bold emphasized_** text +- [links](https://example.com) +- etc. + +```plaintext +...and even source code +``` + +> the possiblities are endless (almost - including other shortcodes may or may not work) (almost - including other shortcodes may or may not work) diff --git a/themes/relearn/exampleSite/content/shortcodes/_index.en.md b/themes/relearn/exampleSite/content/shortcodes/_index.en.md new file mode 100644 index 0000000..11fb2bb --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/_index.en.md @@ -0,0 +1,19 @@ ++++ +chapter = true +title = "Shortcodes" +weight = 3 ++++ + +### Chapter 3 + +# Shortcodes + +Hugo uses Markdown for its simple content format. However, there are a lot of things that Markdown doesn’t support well. You could use pure HTML to expand possibilities. + +But this happens to be a bad idea. Everyone uses Markdown because it's pure and simple to read even non-rendered. You should avoid HTML to keep it as simple as possible. + +To avoid this limitations, Hugo created [shortcodes](https://gohugo.io/extras/shortcodes/). A shortcode is a simple snippet inside a page. + +The Relearn theme provides multiple shortcodes on top of existing ones. + +{{%children containerstyle="div" style="h2" description="true" %}} diff --git a/themes/relearn/exampleSite/content/shortcodes/_index.pir.md b/themes/relearn/exampleSite/content/shortcodes/_index.pir.md new file mode 100644 index 0000000..b427972 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/_index.pir.md @@ -0,0 +1,6 @@ ++++ +chapter = true +title = "Shorrrtcodes" +weight = 3 ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/shortcodes/attachments.en.files/BachGavotteShort.mp3 b/themes/relearn/exampleSite/content/shortcodes/attachments.en.files/BachGavotteShort.mp3 new file mode 100644 index 0000000..94e3d0e Binary files /dev/null and b/themes/relearn/exampleSite/content/shortcodes/attachments.en.files/BachGavotteShort.mp3 differ diff --git a/themes/relearn/exampleSite/content/shortcodes/attachments.en.files/Carroll_AliceAuPaysDesMerveilles.pdf b/themes/relearn/exampleSite/content/shortcodes/attachments.en.files/Carroll_AliceAuPaysDesMerveilles.pdf new file mode 100644 index 0000000..97377e9 Binary files /dev/null and b/themes/relearn/exampleSite/content/shortcodes/attachments.en.files/Carroll_AliceAuPaysDesMerveilles.pdf differ diff --git a/themes/relearn/exampleSite/content/shortcodes/attachments.en.files/adivorciarsetoca00cape.pdf b/themes/relearn/exampleSite/content/shortcodes/attachments.en.files/adivorciarsetoca00cape.pdf new file mode 100644 index 0000000..e589c73 Binary files /dev/null and b/themes/relearn/exampleSite/content/shortcodes/attachments.en.files/adivorciarsetoca00cape.pdf differ diff --git a/themes/relearn/exampleSite/content/shortcodes/attachments.en.files/hugo.png b/themes/relearn/exampleSite/content/shortcodes/attachments.en.files/hugo.png new file mode 100644 index 0000000..48acf34 Binary files /dev/null and b/themes/relearn/exampleSite/content/shortcodes/attachments.en.files/hugo.png differ diff --git a/themes/relearn/exampleSite/content/shortcodes/attachments.en.files/hugo.txt b/themes/relearn/exampleSite/content/shortcodes/attachments.en.files/hugo.txt new file mode 100644 index 0000000..19b69f4 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/attachments.en.files/hugo.txt @@ -0,0 +1 @@ +This is a small text \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/shortcodes/attachments.en.files/movieselectricsheep-flock-244-32500-2.mp4 b/themes/relearn/exampleSite/content/shortcodes/attachments.en.files/movieselectricsheep-flock-244-32500-2.mp4 new file mode 100644 index 0000000..9f1fe56 Binary files /dev/null and b/themes/relearn/exampleSite/content/shortcodes/attachments.en.files/movieselectricsheep-flock-244-32500-2.mp4 differ diff --git a/themes/relearn/exampleSite/content/shortcodes/attachments.en.md b/themes/relearn/exampleSite/content/shortcodes/attachments.en.md new file mode 100644 index 0000000..e5e3075 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/attachments.en.md @@ -0,0 +1,70 @@ ++++ +description = "List of files attached to a page" +title = "Attachments" ++++ + +The `attachments` shortcode displays a list of files attached to a page with adjustable color, title and icon. + +{{% attachments /%}} + +## Usage + +````go +{{%/* attachments /*/%}} +```` + +The shortcurt lists files found in a specific folder. + +Currently, it supports two implementations for pages + +1. If your page is a Markdown file, attachements must be placed in a folder named like your page and ending with `.files`. + + > * content + > * _index.md + > * **page.files** + > * attachment.pdf + > * page.md + +2. If your page is a folder, attachements must be placed in a nested `files` folder. + + > * content + > * _index.md + > * page + > * index.md + > * **files** + > * attachment.pdf + +Be aware that if you use a multilingual website, you will need to have as many folders as languages. + + +### Parameter + +| Name | Default | Notes | +|:------------|:--------------|:------------| +| **style** | `transparent` | The color scheme used to highlight the box content.

- by severity: `info`, `note`, `tip`, `warning`- by color: `blue`, `green`, `grey`, `orange`, `red`
- by special color: `default`,t` | +| **title** | see notes | Arbitray text for the box title. Depending on the **style** there may be a default title. Any given value will overwault.

- for severity styles: the matching title for the severity
- for all other colors: `Attachments`

If you wa you have to set this parameter to `" "` (a non empty string filled with spaces) | +| **icon** | see notes | [Font Awesome icon name]({{%relref "cont/icons#finding-an-icon" %}}) set to the left of the title. Depending le** there may be a default icon. Any given value will overwrite the default.

- for severity styles: a nice matching iseverity
- for all other colors: `paperclip`

If you want no icon, you have to set this parameter to `" "` (a non empty d with spaces) | +| **sort** | `asc` | Sorting the output in `asc`ending or `desc`ending order. | +| **pattern** | `.*` | A [regular expressions](https://en.wikipedia.org/wiki/Regular_expression), used to filter the attachments by file name. For example:

- to match a file suffix of 'jpg', use `.*jpg` (not `*.jpg`)
- to match file names ending in `jpg` or `png`, use `.*(jpg\|png)` | + +## Examples + +### Custom Title, List of Attachments Ending in pdf or mp4 + +````go +{{%/* attachments title="Related files" pattern=".*(pdf|mp4)" /*/%}} +```` + +{{% attachments title="Related files" pattern=".*(pdf|mp4)" /%}} + +### Info Styled Box, Descending Sort Order + +````go +{{%/* attachments style="info" sort="desc" /*/%}} +```` + +{{% attachments style="info" sort="desc" /%}} + +### Style and Icons + +For further examples for **style**, **title** and **icon**, see the [`notice` shortcode]({{% relref "shortcodes/notice" %}}) documentation. The parameter are working the same way for both shortcodes, besides having different defaults. diff --git a/themes/relearn/exampleSite/content/shortcodes/attachments.pir.files/NoTreasure.txt b/themes/relearn/exampleSite/content/shortcodes/attachments.pir.files/NoTreasure.txt new file mode 100644 index 0000000..f7b9fda --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/attachments.pir.files/NoTreasure.txt @@ -0,0 +1 @@ +Harrr, nothn' to see herre \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/shortcodes/attachments.pir.md b/themes/relearn/exampleSite/content/shortcodes/attachments.pir.md new file mode 100644 index 0000000..9022bbb --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/attachments.pir.md @@ -0,0 +1,7 @@ ++++ +descrption = "Th' Attachments shorrrtcode displays a list o' files attached t' a plank" +title = "Attachments" ++++ +{{% attachments /%}} + +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/shortcodes/button.en.md b/themes/relearn/exampleSite/content/shortcodes/button.en.md new file mode 100644 index 0000000..6a51cda --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/button.en.md @@ -0,0 +1,119 @@ ++++ +description = "Clickable buttons" +title = "Button" ++++ + +The `button` shortcode displays a clickable button with adjustable color, title and icon. + +{{% button href="https://gohugo.io/" %}}Get Hugo{{% /button %}} +{{% button href="https://gohugo.io/" style="warning" icon="dragon" %}}Get Hugo{{% /button %}} + +## Usage + +````go +{{%/* button href="https://gohugo.io/" %}}Get Hugo{{% /button */%}} +{{%/* button href="https://gohugo.io/" style="warning" icon="dragon" %}}Get Hugo{{% /button */%}} +```` + +Once the button is clicked, it opens another browser tab for the given URL. + +### Parameter + +| Name | Default | Notes | +|:----------------------|:----------------|:------------| +| **href** | _<empty>_ | The destination URL for the button. If this parameter is not set, the button will do nothing but is still displayed as clickable. | +| **style** | `transparent` | The color scheme used to paint the button.

- by severity: `info`, `note`, `tip`, `warning`
- by brand color: `primary`, `secondary`
- by color: `blue`, `green`, `grey`, `orange`, `red`
- by special color: `default`, `transparent` | +| **icon** | see notes | [Font Awesome icon name]({{%relref "cont/icons#finding-an-icon" %}}) set to the left of the title. Depending on the **style** there may be a default icon. Any given value will overwrite the default.

- for severity styles: a nice matching icon for the severity
- for all other colors: _<empty>_

If you want no icon for a severity style, you have to set this parameter to `" "` (a non empty string filled with spaces) | +| **iconposition** | `left` | Places the icon to the `left` or `right` of the title. | +| _**<content>**_ | see notes | Arbitray text for the button title. Depending on the **style** there may be a default title. Any given value will overwrite the default.

- for severity styles: the matching title for the severity
- for all other colors: _<empty>_

If you want no title for a severity style, you have to set this parameter to `" "` (a non empty string filled with spaces) | + +## Examples + +### Style + +#### By Severity + +````go +{{%/* button href="https://gohugo.io/" style="info" %}}Get Hugo{{% /button */%}} +{{%/* button href="https://gohugo.io/" style="note" %}}Get Hugo{{% /button */%}} +{{%/* button href="https://gohugo.io/" style="tip" %}}Get Hugo{{% /button */%}} +{{%/* button href="https://gohugo.io/" style="warning" %}}Get Hugo{{% /button */%}} +```` + +{{% button href="https://gohugo.io/" style="info" %}}Get Hugo{{% /button %}} +{{% button href="https://gohugo.io/" style="note" %}}Get Hugo{{% /button %}} +{{% button href="https://gohugo.io/" style="tip" %}}Get Hugo{{% /button %}} +{{% button href="https://gohugo.io/" style="warning" %}}Get Hugo{{% /button %}} + + +#### By Brand Colors + +````go +{{%/* button href="https://gohugo.io/" style="primary" %}}Get Hugo{{% /button */%}} +{{%/* button href="https://gohugo.io/" style="secondary" %}}Get Hugo{{% /button */%}} +```` + +{{% button href="https://gohugo.io/" style="primary" %}}Get Hugo{{% /button %}} +{{% button href="https://gohugo.io/" style="secondary" %}}Get Hugo{{% /button %}} + +#### By Color + +````go +{{%/* button href="https://gohugo.io/" style="blue" %}}Get Hugo{{% /button */%}} +{{%/* button href="https://gohugo.io/" style="green" %}}Get Hugo{{% /button */%}} +{{%/* button href="https://gohugo.io/" style="grey" %}}Get Hugo{{% /button */%}} +{{%/* button href="https://gohugo.io/" style="orange" %}}Get Hugo{{% /button */%}} +{{%/* button href="https://gohugo.io/" style="red" %}}Get Hugo{{% /button */%}} +```` + +{{% button href="https://gohugo.io/" style="blue" %}}Get Hugo{{% /button %}} +{{% button href="https://gohugo.io/" style="green" %}}Get Hugo{{% /button %}} +{{% button href="https://gohugo.io/" style="grey" %}}Get Hugo{{% /button %}} +{{% button href="https://gohugo.io/" style="orange" %}}Get Hugo{{% /button %}} +{{% button href="https://gohugo.io/" style="red" %}}Get Hugo{{% /button %}} + +#### By Special Color + +````go +{{%/* button href="https://gohugo.io/" style="default" %}}Get Hugo{{% /button */%}} +{{%/* button href="https://gohugo.io/" style="transparent" %}}Get Hugo{{% /button */%}} +```` + +{{% button href="https://gohugo.io/" style="default" %}}Get Hugo{{% /button %}} +{{% button href="https://gohugo.io/" style="transparent" %}}Get Hugo{{% /button %}} + +### Icon + +#### To the Left + +````go +{{%/* button href="https://gohugo.io/" icon="download" %}}Get Hugo{{% /button */%}} +```` + +{{% button href="https://gohugo.io/" icon="download" %}}Get Hugo{{% /button %}} + +#### To the Right + +````go +{{%/* button href="https://gohugo.io/" icon="download" icon-position="right" %}}Get Hugo{{% /button */%}} +```` + +{{% button href="https://gohugo.io/" icon="download" icon-position="right" %}}Get Hugo{{% /button %}} + +#### Override for Severity + +````go +{{%/* button href="https://gohugo.io/" icon="dragon" style="warning" %}}Get Hugo{{% /button */%}} +```` + +{{% button href="https://gohugo.io/" icon="dragon" style="warning" %}}Get Hugo{{% /button %}} + +### Other + +#### Severity Style with all Defaults + +````go +{{%/* button href="https://gohugo.io/" style="tip" %}}{{% /button */%}} +```` + +{{% button href="https://gohugo.io/" style="tip" %}}{{% /button %}} diff --git a/themes/relearn/exampleSite/content/shortcodes/button.pir.md b/themes/relearn/exampleSite/content/shortcodes/button.pir.md new file mode 100644 index 0000000..3bd0149 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/button.pir.md @@ -0,0 +1,5 @@ ++++ +descrption = "Nice buttons on yer plank" +title = "Button" ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/shortcodes/children/_index.en.md b/themes/relearn/exampleSite/content/shortcodes/children/_index.en.md new file mode 100644 index 0000000..a5a7eb8 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/_index.en.md @@ -0,0 +1,67 @@ ++++ +alwaysopen = false +description = "List the child pages of a page" +title = "Children" ++++ + +The `children` shortcode lists the child pages of a page and its descendants . + +## Usage + +````go +{{%/* children */%}} +```` + +### Parameter + +| Name | Default | Notes | +|:-------------------|:------------------|:------------| +| **page** | _<current>_ | Specify the page name (section name) to display children for. | +| **containerstyle** | `ul` | Choose the style used to group all children. It could be any HTML tag name. | +| **style** | `li` | Choose the style used to display each descendant. It could be any HTML tag name. | +| **showhidden** | `false` | When `true`, child pages hidden from the menu will be displayed aswell. | +| **description** | `false` | When `true` shows a short text under each page in the list. When no description or summary exists for the page, the first 70 words of the content is taken - [read more info about summaries on gohugo.io](https://gohugo.io/content/summaries/). | +| **depth** | `1` | The depth of descendants to display. For example, if the value is `2`, the shortcode will display two levels of child pages. To get all descendants, set this value to a high number eg. `999`. | +| **sort** | see notes | The sort order of the displayed list.

If not set it is sorted by the [`ordersectionsby`]({{% relref "basics/configuration#global-site-parameters" %}}) setting of the site and the pages frontmatter

- `weight`: to sort on menu order
- `title`: to sort alphabetically on menu label. | + +## Examples + +### All Default + +````go +{{%/* children */%}} +```` + +{{% children %}} + +### With Description + +````go +{{%/* children description="true" */%}} +```` + +{{%children description="true" %}} + +### Infinte Depth and Hidden Pages + +````go +{{%/* children depth="999" showhidden="true" */%}} +```` + +{{% children depth="999" showhidden="true" %}} + +### Heading Styles for Container and Elements + +````go +{{%/* children containerstyle="div" style="h2" depth="3" description="true" */%}} +```` + +{{% children containerstyle="div" style="h2" depth="3" description="true" %}} + +### Divs for Group and Element Styles + +````go +{{%/* children containerstyle="div" style="div" depth="3" */%}} +```` + +{{% children containerstyle="div" style="div" depth="3" %}} diff --git a/themes/relearn/exampleSite/content/shortcodes/children/_index.pir.md b/themes/relearn/exampleSite/content/shortcodes/children/_index.pir.md new file mode 100644 index 0000000..fe8f598 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/_index.pir.md @@ -0,0 +1,6 @@ ++++ +alwaysopen = false +descrption = "List th' child planks on a plank" +title = "Children" ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/shortcodes/children/children-1/_index.en.md b/themes/relearn/exampleSite/content/shortcodes/children/children-1/_index.en.md new file mode 100644 index 0000000..83b2f9d --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/children-1/_index.en.md @@ -0,0 +1,13 @@ ++++ +alwaysopen = false +description = "This is a demo child page" +tags = ["children", "non-hidden"] +title = "page 1" +weight = 10 ++++ + +This is a demo child page. + +## Subpages of this page + +{{% children showhidden="true" %}} diff --git a/themes/relearn/exampleSite/content/shortcodes/children/children-1/_index.pir.md b/themes/relearn/exampleSite/content/shortcodes/children/children-1/_index.pir.md new file mode 100644 index 0000000..76b5a01 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/children-1/_index.pir.md @@ -0,0 +1,8 @@ ++++ +alwaysopen = false +descrption = "This be a demo child plank" +tags = ["children", "non-hidden"] +title = "Plank 1" +weight = 10 ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/_index.en.md b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/_index.en.md new file mode 100644 index 0000000..1140472 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/_index.en.md @@ -0,0 +1,12 @@ ++++ +alwaysopen = true +description = "This is a demo child page" +tags = ["children", "non-hidden"] +title = "page 1-1" ++++ + +This is a demo child page with a hidden child. You can still access the hidden child [directly]({{% relref "shortcodes/children/children-1/children-1-1/children-1-1-1" %}}) or via the search. + +## Subpages of this page + +{{% children showhidden="true" %}} diff --git a/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/_index.pir.md b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/_index.pir.md new file mode 100644 index 0000000..c4a9d49 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/_index.pir.md @@ -0,0 +1,7 @@ ++++ +alwaysopen = true +descrption = "This be a demo child plank" +tags = ["children", "non-hidden"] +title = "Plank 1-1" ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/_index.en.md b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/_index.en.md new file mode 100644 index 0000000..506a115 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/_index.en.md @@ -0,0 +1,12 @@ ++++ +description = "This is a hidden demo child page" +hidden = true +tags = ["children", "hidden"] +title = "page 1-1-1 (hidden)" ++++ + +This is a **hidden** demo child page. This page and all its children are hidden in the menu, arrow navigation and children shortcode as long as you aren't viewing this page or its children directly. + +## Subpages of this page + +{{% children showhidden="true" %}} diff --git a/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/_index.pir.md b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/_index.pir.md new file mode 100644 index 0000000..17761c4 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/_index.pir.md @@ -0,0 +1,7 @@ ++++ +descrption = "This be a hidden demo child plank" +hidden = true +tags = ["children", "hidden"] +title = "Plank 1-1-1 (hidden)" ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/_index.en.md b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/_index.en.md new file mode 100644 index 0000000..d5667ff --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/_index.en.md @@ -0,0 +1,11 @@ ++++ +description = "This is a non-hidden demo child page of a hidden parent page" +tags = ["children", "hidden"] +title = "page 1-1-1-1" ++++ + +This is a **non-hidden** demo child page of a hidden parent page with a hidden child. You can still access the hidden child [directly]({{% relref "shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1" %}}) or via the search. + +## Subpages of this page + +{{% children showhidden="true" %}} diff --git a/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/_index.pir.md b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/_index.pir.md new file mode 100644 index 0000000..45e61de --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/_index.pir.md @@ -0,0 +1,6 @@ ++++ +descrption = "This be a non-hidden demo child plank o' a hidden parrrent plank" +tags = ["children", "hidden"] +title = "Plank 1-1-1-1" ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/_index.en.md b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/_index.en.md new file mode 100644 index 0000000..a1581a6 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/_index.en.md @@ -0,0 +1,12 @@ ++++ +description = "This is a hidden demo child page" +hidden = true +tags = ["children", "hidden"] +title = "page 1-1-1-1-1 (hidden)" ++++ + +This is a **hidden** demo child page. This page and all its children are hidden in the menu, arrow navigation and children shortcode as long as you aren't viewing this page or its children directly. + +## Subpages of this page + +{{% children showhidden="true" %}} diff --git a/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/_index.pir.md b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/_index.pir.md new file mode 100644 index 0000000..3b31af1 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/_index.pir.md @@ -0,0 +1,7 @@ ++++ +descrption = "This be a hidden demo child plank" +hidden = true +tags = ["children", "hidden"] +title = "Plank 1-1-1-1-1 (hidden)" ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/children-1-1-1-1-1-1/_index.en.md b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/children-1-1-1-1-1-1/_index.en.md new file mode 100644 index 0000000..f26d411 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/children-1-1-1-1-1-1/_index.en.md @@ -0,0 +1,7 @@ ++++ +description = "This is a non-hidden demo child page of a hidden parent page" +tags = ["children", "hidden"] +title = "page 1-1-1-1-1-1" ++++ + +This is a **non-hidden** demo child page of a hidden parent page. \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/children-1-1-1-1-1-1/_index.pir.md b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/children-1-1-1-1-1-1/_index.pir.md new file mode 100644 index 0000000..54d6e56 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/children-1-1-1-1-1-1/_index.pir.md @@ -0,0 +1,6 @@ ++++ +descrption = "This be a non-hidden demo child plank on a hidden parrrent plank" +tags = ["children", "hidden"] +title = "Plank 1-1-1-1-1-1" ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/_index.en.md b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/_index.en.md new file mode 100644 index 0000000..85adae8 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/_index.en.md @@ -0,0 +1,11 @@ ++++ +description = "This is a demo child page" +tags = ["children", "non-hidden"] +title = "page 1-1-2" ++++ + +This is a plain demo child page. + +## Subpages of this page + +{{% children showhidden="true" %}} diff --git a/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/_index.pir.md b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/_index.pir.md new file mode 100644 index 0000000..60e299b --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/_index.pir.md @@ -0,0 +1,6 @@ ++++ +descrption = "This be a demo child plank" +tags = ["children", "non-hidden"] +title = "Plank 1-1-2" ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/children-1-1-2-1/_index.en.md b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/children-1-1-2-1/_index.en.md new file mode 100644 index 0000000..74e144d --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/children-1-1-2-1/_index.en.md @@ -0,0 +1,7 @@ ++++ +description = "This is a demo child page" +tags = ["children", "non-hidden"] +title = "page 1-1-2-1" ++++ + +This is a plain demo child page. diff --git a/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/children-1-1-2-1/_index.pir.md b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/children-1-1-2-1/_index.pir.md new file mode 100644 index 0000000..5af0f33 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/children-1-1-2-1/_index.pir.md @@ -0,0 +1,6 @@ ++++ +descrption = "This be a demo child plank" +tags = ["children", "non-hidden"] +title = "Plank 1-1-2-1" ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/children-1-1-2-2/_index.en.md b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/children-1-1-2-2/_index.en.md new file mode 100644 index 0000000..41f730e --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/children-1-1-2-2/_index.en.md @@ -0,0 +1,7 @@ ++++ +description = "This is a demo child page" +tags = ["children", "non-hidden"] +title = "page 1-1-2-2" ++++ + +This is a plain demo child page. diff --git a/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/children-1-1-2-2/_index.pir.md b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/children-1-1-2-2/_index.pir.md new file mode 100644 index 0000000..110c1e9 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/children-1-1-2-2/_index.pir.md @@ -0,0 +1,6 @@ ++++ +descrption = "This be a demo child plank" +tags = ["children", "non-hidden"] +title = "Plank 1-1-2-2" ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-3/_index.en.md b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-3/_index.en.md new file mode 100644 index 0000000..df89045 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-3/_index.en.md @@ -0,0 +1,7 @@ ++++ +description = "This is a demo child page" +tags = ["children", "non-hidden"] +title = "page 1-1-3" ++++ + +This is a plain demo child page. diff --git a/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-3/_index.pir.md b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-3/_index.pir.md new file mode 100644 index 0000000..c5657c2 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-3/_index.pir.md @@ -0,0 +1,6 @@ ++++ +descrption = "This be a demo child plank" +tags = ["children", "non-hidden"] +title = "Plank 1-1-3" ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/shortcodes/children/children-2/_index.en.md b/themes/relearn/exampleSite/content/shortcodes/children/children-2/_index.en.md new file mode 100644 index 0000000..7324027 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/children-2/_index.en.md @@ -0,0 +1,10 @@ ++++ +alwaysopen = false +tags = ["children", "non-hidden"] +title = "page 2" +weight = 20 ++++ + +This is a demo child page with no description. + +So its content is used as description. diff --git a/themes/relearn/exampleSite/content/shortcodes/children/children-2/_index.pir.md b/themes/relearn/exampleSite/content/shortcodes/children/children-2/_index.pir.md new file mode 100644 index 0000000..a715a73 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/children-2/_index.pir.md @@ -0,0 +1,7 @@ ++++ +alwaysopen = false +tags = ["children", "non-hidden"] +title = "Plank 2" +weight = 20 ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/shortcodes/children/children-3/_index.en.md b/themes/relearn/exampleSite/content/shortcodes/children/children-3/_index.en.md new file mode 100644 index 0000000..71b022b --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/children-3/_index.en.md @@ -0,0 +1,13 @@ ++++ +alwaysopen = false +description = "This is a demo child page" +tags = ["children", "non-hidden"] +title = "page 3" +weight = 30 ++++ + +This is a demo child page. + +## Subpages of this page + +{{% children showhidden="true" %}} diff --git a/themes/relearn/exampleSite/content/shortcodes/children/children-3/_index.pir.md b/themes/relearn/exampleSite/content/shortcodes/children/children-3/_index.pir.md new file mode 100644 index 0000000..34f466f --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/children-3/_index.pir.md @@ -0,0 +1,8 @@ ++++ +alwaysopen = false +descrption = "This be a demo child plank" +tags = ["children", "non-hidden"] +title = "Plank 3" +weight = 30 ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/shortcodes/children/children-3/test3.en.md b/themes/relearn/exampleSite/content/shortcodes/children/children-3/test3.en.md new file mode 100644 index 0000000..c8cf6d9 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/children-3/test3.en.md @@ -0,0 +1,7 @@ ++++ +description = "This is a plain page test nested in a parent" +tags = ["children", "non-hidden"] +title = "page 3-1" ++++ + +This is a plain demo child page. diff --git a/themes/relearn/exampleSite/content/shortcodes/children/children-3/test3.pir.md b/themes/relearn/exampleSite/content/shortcodes/children/children-3/test3.pir.md new file mode 100644 index 0000000..853f818 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/children-3/test3.pir.md @@ -0,0 +1,6 @@ ++++ +descrption = "This be a plain plank test nested 'n a parrrent" +tags = ["children", "non-hidden"] +title = "Plank 3-1" ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/shortcodes/children/children-4/_index.en.md b/themes/relearn/exampleSite/content/shortcodes/children/children-4/_index.en.md new file mode 100644 index 0000000..96358d0 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/children-4/_index.en.md @@ -0,0 +1,10 @@ ++++ +alwaysopen = false +description = "This is a hidden demo child page" +hidden = true +tags = ["children", "hidden"] +title = "page 4 (hidden)" +weight = 40 ++++ + +This is a **hidden** demo child page. This page and all its children are hidden in the menu, arrow navigation and children shortcode as long as you aren't viewing this page or its children directly. diff --git a/themes/relearn/exampleSite/content/shortcodes/children/children-4/_index.pir.md b/themes/relearn/exampleSite/content/shortcodes/children/children-4/_index.pir.md new file mode 100644 index 0000000..94b3c77 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/children-4/_index.pir.md @@ -0,0 +1,9 @@ ++++ +alwaysopen = false +descrption = "This be a hidden demo child plank" +hidden = true +tags = ["children", "hidden"] +title = "Plank 4 (hidden)" +weight = 40 ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/shortcodes/children/test.en.md b/themes/relearn/exampleSite/content/shortcodes/children/test.en.md new file mode 100644 index 0000000..24d308c --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/test.en.md @@ -0,0 +1,8 @@ +--- +description: | + This is a plain page test, and the beginning of a YAML multiline description... +title: "page X" +weight: 1 +--- + +This is a plain demo child page. diff --git a/themes/relearn/exampleSite/content/shortcodes/children/test.pir.md b/themes/relearn/exampleSite/content/shortcodes/children/test.pir.md new file mode 100644 index 0000000..a948582 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/children/test.pir.md @@ -0,0 +1,6 @@ ++++ +descrption = "This be a plain plank test" +title = "Plank X" +weight = 1 ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/shortcodes/expand.en.md b/themes/relearn/exampleSite/content/shortcodes/expand.en.md new file mode 100644 index 0000000..9b329d5 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/expand.en.md @@ -0,0 +1,91 @@ ++++ +description = "Expandable/collapsible sections of text" +title = "Expand" ++++ + +The `expand` shortcode displays an expandable/collapsible section of text. + +{{% expand title="Expand me..." %}}Thank you!{{% /expand %}} + +## Usage + +While the examples are using named parameter you are free to use positional aswell. + +{{< tabs groupId="shortcode-parameter">}} +{{% tab name="named" %}} + +````go +{{%/* expand title="Expand me..." */%}}Thank you!{{%/* /expand */%}} +```` + +{{% /tab %}} +{{% tab name="positional" %}} + +````go +{{%/* expand "Expand me..." */%}}Thank you!{{%/* /expand */%}} +```` + +{{% /tab %}} +{{< /tabs >}} + +### Parameter + +| Name | Position | Default | Notes | +|:----------------------|:---------|:-----------------|:------------| +| **title** | 1 | `"Expand me..."` | Arbitray text to appear next to the expand/collapse icon. | +| **open** | 2 | `false` | When `true` the content text will be initially shown as expanded. | +| _**<content>**_ | | _<empty>_ | Arbitray text to be displayed on expand. | + +## Examples + +### All Defaults + +````go +{{%/* expand */%}}Yes, you did it!{{%/* /expand */%}} +```` + +{{% expand %}}Yes, you did it!{{% /expand %}} + +### Initially Expanded + +````go +{{%/* expand title="Expand me..." open="true" */%}}No need to press you!{{%/* /expand */%}} +```` + +{{% expand title="Expand me..." open="true" %}}No need to press you!{{% /expand %}} + +### Arbitrary Text + +````go +{{%/* expand title="Show me almost endless possibilities" */%}} +You can add standard markdown syntax: + +- multiple paragraphs +- bullet point lists +- _emphasized_, **bold** and even **_bold emphasized_** text +- [links](https://example.com) +- etc. + +```plaintext +...and even source code +``` + +> the possiblities are endless (almost - including other shortcodes may or may not work) +{{%/* /expand */%}} +```` + +{{% expand title="Show me almost endless possibilities" %}} +You can add standard markdown syntax: + +- multiple paragraphs +- bullet point lists +- _emphasized_, **bold** and even **_bold emphasized_** text +- [links](https://example.com) +- etc. + +```plaintext +...and even source code +``` + +> the possiblities are endless (almost - including other shortcodes may or may not work) +{{% /expand %}} diff --git a/themes/relearn/exampleSite/content/shortcodes/expand.pir.md b/themes/relearn/exampleSite/content/shortcodes/expand.pir.md new file mode 100644 index 0000000..b86a1a7 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/expand.pir.md @@ -0,0 +1,5 @@ ++++ +descrption = "Displays an expand'ble/collaps'ble sect'n o' text on yer plank" +title = "Expand" ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/shortcodes/include.en.md b/themes/relearn/exampleSite/content/shortcodes/include.en.md new file mode 100644 index 0000000..abd0038 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/include.en.md @@ -0,0 +1,47 @@ ++++ +description = "Displays content from other files" +title = "Include" ++++ + +The `include` shortcode includes other files from your project inside of the current page. + +## Usage + +While the examples are using named parameter you are free to use positional aswell. + +{{< tabs groupId="shortcode-parameter">}} +{{% tab name="named" %}} + + +````go +{{%/* include file="shortcodes/INCLUDE_ME.md" */%}} +```` + +{{% /tab %}} +{{% tab name="positional" %}} + +````go +{{%/* include "shortcodes/INCLUDE_ME.md" */%}} +```` + +{{% /tab %}} +{{< /tabs >}} + +The included files can even contain Markdown and will be taken into account when generating the table of contents. + +### Parameter + +| Name | Position | Default | Notes | +|:---------------------|:---------|:-----------------|:------------| +| **file** | 1 | _<empty>_ | The path to the file to be included. Path resolution adheres to [Hugo's build-in `readFile` function](https://gohugo.io/functions/readfile/) | +| **showfirstheading** | 2 | `true` | When `false` and the included file contains headings, the first heading will be hidden. This comes in handy, eg. if you include otherwise standalone Markdown files. | + +## Examples + +### Arbitray Content + +````go +{{%/* include "shortcodes/INCLUDE_ME.md" */%}} +```` + +{{% include "shortcodes/INCLUDE_ME.md" %}} diff --git a/themes/relearn/exampleSite/content/shortcodes/include.pir.md b/themes/relearn/exampleSite/content/shortcodes/include.pir.md new file mode 100644 index 0000000..8782676 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/include.pir.md @@ -0,0 +1,5 @@ ++++ +descrption = "Displays content from other Marrrkdown files" +title = "Include" ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/shortcodes/mermaid.en.md b/themes/relearn/exampleSite/content/shortcodes/mermaid.en.md new file mode 100644 index 0000000..6a4dfd7 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/mermaid.en.md @@ -0,0 +1,260 @@ ++++ +description = "Generate diagrams and flowcharts from text" +title = "Mermaid" ++++ + +With the [Mermaid](https://mermaidjs.github.io/) library and shortcode, you can generate diagrams and flowcharts from text, in a similar manner as Markdown. + +{{< mermaid >}} +graph LR; + If --> Then + Then --> Else +{{< /mermaid >}} + +{{% notice note %}} +This only works in modern browsers. +{{% /notice %}} + +{{% notice warning %}} +Due to limitations with [Mermaid](https://github.com/mermaid-js/mermaid/issues/1846), it is currently not possible to use Mermaid code fences in an initially collapsed `expand` shortcode. This is a know issue and [can't be fixed by this theme](https://github.com/McShelby/hugo-theme-relearn/issues/187). +{{% /notice %}} + +## Usage + +The generated graphs can be be panned by dragging them and zoomed by using the mousewheel. On mobile devices you can use finger gestures. + +While the examples are using shortcode syntax it is recommended to use codefence syntax instead. This is because more and more other software supports Mermaid codefences (eg. GitHub) and so your markdown becomes more portable. + +{{% notice note %}} +To use codefence syntax you have to turn off `guessSyntax` for the `markup.highlight` setting ([see the configuration section](#configuration)). +{{% /notice %}} + +{{< tabs groupId="shortcode-codefence">}} +{{% tab name="codefence" %}} + +````plaintext +```mermaid +graph LR; + If --> Then + Then --> Else +``` +```` + +{{% /tab %}} +{{% tab name="shortcode" %}} + +````go +{{}} +graph LR; + If --> Then + Then --> Else +{{}} +```` + +{{% /tab %}} +{{< /tabs >}} + +### Parameter + +Parameter are only supported when using shortcode syntax. Defaults are used when using codefence syntax. + +| Name | Default | Notes | +|:----------------------|:-----------------|:------------| +| **align** | `center` | Allowed values are `left`, `center` or `right`. | +| _**<content>**_ | _<empty>_ | Your mermaid graph. | + +## Configuration + +Mermaid is configured with default settings. You can customize Mermaid's default settings for all of your files thru a JSON object in your `config.toml`, override these settings per page thru your pages frontmatter or override these setting per diagramm thru [diagram directives](https://mermaid-js.github.io/mermaid/#/directives?id=directives). + +The JSON object of your `config.toml` / frontmatter is forwarded into Mermaid's `mermaid.initialize()` function. + +See [Mermaid documentation](http://mermaid-js.github.io/mermaid/#/Setup?id=mermaidapi-configuration-defaults) for all allowed settings. + +The `theme` setting can also be set by your used color variant. This will be the sitewide default and can - again - be overridden by your settings in `config.toml`, frontmatter or diagram directives. + +{{% notice note %}} +To use codefence syntax you have to turn off `guessSyntax` for the `markup.highlight` setting. +{{% /notice %}} + +### Global Configuration File + +````toml +[params] + mermaidInitialize = "{ \"theme\": \"dark\" }" + +[markup] + [markup.highlight] + # if set to `guessSyntax = true`, there will be no unstyled code even if no language + # was given BUT mermaid code fences will not work anymore! So this is a mandatory + # setting for your site + guessSyntax = false +```` + +### Page's Frontmatter + +````toml ++++ +mermaidInitialize = "{ \"theme\": \"dark\" }" ++++ +```` + +## Examples + +### Flowchart with Non-Default Mermaid Theme + +````go +{{}} +%%{init:{"theme":"forest"}}%% +graph LR; + A[Hard edge] -->|Link text| B(Round edge) + B --> C{Decision} + C -->|One| D[Result one] + C -->|Two| E[Result two] +{{}} +```` + +{{< mermaid align="left" >}} +%%{init:{"theme":"forest"}}%% +graph LR; + A[Hard edge] -->|Link text| B(Round edge) + B --> C{Decision} + C -->|One| D[Result one] + C -->|Two| E[Result two] +{{< /mermaid >}} + +### Sequence + +````go +{{}} +sequenceDiagram + participant Alice + participant Bob + Alice->>John: Hello John, how are you? + loop Healthcheck + John->John: Fight against hypochondria + end + Note right of John: Rational thoughts
prevail... + John-->Alice: Great! + John->Bob: How about you? + Bob-->John: Jolly good! +{{}} +```` + +{{< mermaid >}} +sequenceDiagram + participant Alice + participant Bob + Alice->>John: Hello John, how are you? + loop Healthcheck + John->John: Fight against hypochondria + end + Note right of John: Rational thoughts
prevail... + John-->Alice: Great! + John->Bob: How about you? + Bob-->John: Jolly good! +{{< /mermaid >}} + +### GANTT + +````go +{{}} +gantt + dateFormat YYYY-MM-DD + title Adding GANTT diagram functionality to Mermaid + section A section + Completed task :done, des1, 2014-01-06,2014-01-08 + Active task :active, des2, 2014-01-09, 3d + Future task : des3, after des2, 5d + Future task2 : des4, after des3, 5d + section Critical tasks + Completed task in the critical line :crit, done, 2014-01-06,24h + Implement parser and jison :crit, done, after des1, 2d + Create tests for parser :crit, active, 3d + Future task in critical line :crit, 5d + Create tests for renderer :2d + Add to Mermaid :1d +{{}} +```` + +{{< mermaid >}} +gantt + dateFormat YYYY-MM-DD + title Adding GANTT diagram functionality to Mermaid + section A section + Completed task :done, des1, 2014-01-06,2014-01-08 + Active task :active, des2, 2014-01-09, 3d + Future task : des3, after des2, 5d + Future task2 : des4, after des3, 5d + section Critical tasks + Completed task in the critical line :crit, done, 2014-01-06,24h + Implement parser and jison :crit, done, after des1, 2d + Create tests for parser :crit, active, 3d + Future task in critical line :crit, 5d + Create tests for renderer :2d + Add to Mermaid :1d +{{< /mermaid >}} + +### Class + +````go +{{}} +classDiagram + Class01 <|-- AveryLongClass : Cool + Class03 *-- Class04 + Class05 o-- Class06 + Class07 .. Class08 + Class09 --> C2 : Where am i? + Class09 --* C3 + Class09 --|> Class07 + Class07 : equals() + Class07 : Object[] elementData + Class01 : size() + Class01 : int chimp + Class01 : int gorilla + Class08 <--> C2: Cool label +{{}} +```` + +{{< mermaid >}} +classDiagram + Class01 <|-- AveryLongClass : Cool + Class03 *-- Class04 + Class05 o-- Class06 + Class07 .. Class08 + Class09 --> C2 : Where am i? + Class09 --* C3 + Class09 --|> Class07 + Class07 : equals() + Class07 : Object[] elementData + Class01 : size() + Class01 : int chimp + Class01 : int gorilla + Class08 <--> C2: Cool label +{{< /mermaid >}} + +### State Diagram with Codefence Syntax + +````go +```mermaid +stateDiagram-v2 + open: Open Door + closed: Closed Door + locked: Locked Door + open --> closed: Close + closed --> locked: Lock + locked --> closed: Unlock + closed --> open: Open +``` +```` + +````mermaid +stateDiagram-v2 + open: Open Door + closed: Closed Door + locked: Locked Door + open --> closed: Close + closed --> locked: Lock + locked --> closed: Unlock + closed --> open: Open +```` diff --git a/themes/relearn/exampleSite/content/shortcodes/mermaid.pir.md b/themes/relearn/exampleSite/content/shortcodes/mermaid.pir.md new file mode 100644 index 0000000..5f20eab --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/mermaid.pir.md @@ -0,0 +1,5 @@ ++++ +descrption = "Generrrat'n o' diagrrram an' flowcharrrt frrrom text 'n a similar manner as Marrrkdown" +title = "Merrrmaid" ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/shortcodes/notice.en.md b/themes/relearn/exampleSite/content/shortcodes/notice.en.md new file mode 100644 index 0000000..2d03d4c --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/notice.en.md @@ -0,0 +1,320 @@ ++++ +description = "Disclaimers to help you structure your page" +title = "Notice" ++++ + +The `notice` shortcode shows various types of disclaimers with adjustable color, title and icon to help you structure your page. + +{{% notice style="primary" title="There may be pirates" icon="skull-crossbones" %}} +It is all about the boxes. +{{% /notice %}} + +## Usage + +While the examples are using named parameter you are free to use positional aswell. + +{{< tabs groupId="shortcode-parameter">}} +{{% tab name="named" %}} + +````go +{{%/* notice style="primary" title="There may be pirates" icon="skull-crossbones" */%}} +It is all about the boxes. +{{%/* /notice */%}} +```` + +{{% /tab %}} +{{% tab name="positional" %}} + +````go +{{%/* notice primary "There may be pirates" "skull-crossbones" */%}} +It is all about the boxes. +{{%/* /notice */%}} +```` + +{{% /tab %}} +{{< /tabs >}} + +### Parameter + +| Name | Position | Default | Notes | +|:----------|:---------|:----------|:------------| +| **style** | 1 | `default` | The color scheme used to highlight the box content.

- by severity: `info`, `note`, `tip`, `warning`
- by brand color: `primary`, `secondary`
- by color: `blue`, `green`, `grey`, `orange`, `red`
- by special color: `default`, `transparent` | +| **title** | 2 | see notes | Arbitray text for the box title. Depending on the **style** there may be a default title. Any given value will overwrite the default.

- for severity styles: the matching title for the severity
- for all other colors: _<empty>_

If you want no title for a severity style, you have to set this parameter to `" "` (a non empty string filled with spaces) | +| **icon** | 3 | see notes | [Font Awesome icon name]({{%relref "cont/icons#finding-an-icon" %}}) set to the left of the title. Depending on the **style** there may be a default icon. Any given value will overwrite the default.

- for severity styles: a nice matching icon for the severity
- for all other colors: _<empty>_

If you want no icon for a severity style, you have to set this parameter to `" "` (a non empty string filled with spaces) | + +## Examples + +### By Severity + +#### Info with markup + +{{% notice style="info" %}} +An **information** disclaimer + +You can add standard markdown syntax: + +- multiple paragraphs +- bullet point lists +- _emphasized_, **bold** and even **_bold emphasized_** text +- [links](https://example.com) +- etc. + +```plaintext +...and even source code +``` + +> the possiblities are endless (almost - including other shortcodes may or may not work) +{{% /notice %}} + +{{% expand "Show markup" %}} + +````go +{{%/* notice style="info" */%}} +An **information** disclaimer + +You can add standard markdown syntax: + +- multiple paragraphs +- bullet point lists +- _emphasized_, **bold** and even ***bold emphasized*** text +- [links](https://example.com) +- etc. + +```plaintext +...and even source code +``` + +> the possiblities are endless (almost - including other shortcodes may or may not work) +{{%/* /notice */%}} +```` + +{{% /expand %}} + +#### Note + +{{% notice style="note" %}} +A **notice** disclaimer +{{% /notice %}} + +{{% expand "Show markup" %}} + +````go +{{%/* notice style="note" */%}} +A **notice** disclaimer +{{%/* /notice */%}} +```` + +{{% /expand %}} + +#### Tip + +{{% notice style="tip" %}} +A **tip** disclaimer +{{% /notice %}} + +{{% expand "Show markup" %}} + +````go +{{%/* notice style="tip" */%}} +A **tip** disclaimer +```` + +{{% /expand %}} + +#### Warning + +{{% notice style="warning" %}} +A **warning** disclaimer +{{% /notice %}} + +{{% expand "Show markup" %}} + +````go +{{%/* notice style="warning" */%}} +A **warning** disclaimer +{{%/* /notice */%}} +```` + +{{% /expand %}} + +#### Warning with Non-Default Title and Icon + +{{% notice style="warning" title="Here are dragons" icon="dragon" %}} +A **warning** disclaimer +{{% /notice %}} + +{{% expand "Show markup" %}} + +````go +{{%/* notice style="warning" title="Here are dragons" icon="dragon" */%}} +A **warning** disclaimer +{{%/* /notice */%}} +```` + +{{% /expand %}} + +#### Warning without a Title and Icon + +{{% notice style="warning" title=" " icon=" " %}} +A **warning** disclaimer +{{% /notice %}} + +{{% expand "Show markup" %}} + +````go +{{%/* notice style="warning" title=" " icon=" " */%}} +A **warning** disclaimer +{{%/* /notice */%}} +```` + +{{% /expand %}} + +### By Brand Colors + +#### Primary with Title only + +{{% notice style="primary" title="Primary" %}} +A **primary** disclaimer +{{% /notice %}} + +{{% expand "Show markup" %}} + +````go +{{%/* notice style="primary" title="Primary" */%}} +A **primary** disclaimer +{{%/* /notice */%}} +```` + +{{% /expand %}} + +#### Secondary with Icon only + +{{% notice style="secondary" icon="stopwatch" %}} +A **secondary** disclaimer +{{% /notice %}} + +{{% expand "Show markup" %}} + +````go +{{%/* notice style="secondary" icon="stopwatch" */%}} +A **secondary** disclaimer +{{%/* /notice */%}} +```` + +{{% /expand %}} + +### By Color + +#### Blue without a Title and Icon + +{{% notice style="blue" %}} +A **blue** disclaimer +{{% /notice %}} + +{{% expand "Show markup" %}} + +````go +{{%/* notice style="blue" */%}} +A **blue** disclaimer +{{%/* /notice */%}} +```` + +{{% /expand %}} + +#### Green with Title only + +{{% notice style="green" title="Green" %}} +A **green** disclaimer +{{% /notice %}} + +{{% expand "Show markup" %}} + +````go +{{%/* notice style="green" title="Green" */%}} +A **green** disclaimer +{{%/* /notice */%}} +```` + +{{% /expand %}} + +#### Grey with Icon only + +{{% notice style="grey" icon="bug" %}} +A **grey** disclaimer +{{% /notice %}} + +{{% expand "Show markup" %}} + +````go +{{%/* notice style="grey" icon="bug" */%}} +A **grey** disclaimer +{{%/* /notice */%}} +```` + +{{% /expand %}} + +#### Orange with Title and Icon + +{{% notice style="orange" title="Orange" icon="bug" %}} +A **orange** disclaimer +{{% /notice %}} + +{{% expand "Show markup" %}} + +````go +{{%/* notice style="orange" title="Orange" icon="bug" */%}} +A **orange** disclaimer +{{%/* /notice */%}} +```` + +{{% /expand %}} + +#### Red + +{{% notice style="red" %}} +A **red** disclaimer +{{% /notice %}} + +{{% expand "Show markup" %}} + +````go +{{%/* notice style="red" */%}} +A **red** disclaimer +{{%/* /notice */%}} +```` + +{{% /expand %}} + +### By Special Color + +#### Default with Title and Icon + +{{% notice default "Pay Attention to this Note!" "skull-crossbones" %}} +Some serious information. +{{% /notice %}} + +{{% expand "Show markup" %}} + +````go +{{%/* notice style="default" title"Pay Attention to this Note!" icon="skull-crossbones" */%}} +Some serious information. +{{%/* /notice */%}} +```` + +{{% /expand %}} + +#### Transparent with Title and Icon + +{{% notice style="transparent" title="Pay Attention to this Note!" icon="skull-crossbones" %}} +Some serious information. +{{% /notice %}} + +{{% expand "Show markup" %}} + +````go +{{%/* notice style="transparent" title"Pay Attention to this Note!" icon="skull-crossbones" */%}} +Some serious information. +{{%/* /notice */%}} +```` + +{{% /expand %}} diff --git a/themes/relearn/exampleSite/content/shortcodes/notice.pir.md b/themes/relearn/exampleSite/content/shortcodes/notice.pir.md new file mode 100644 index 0000000..98c1c43 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/notice.pir.md @@ -0,0 +1,5 @@ ++++ +descrption = "Disclaimerrrs t' help ye strrructurrre yer plank" +title = "Notice" ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/shortcodes/siteparam.en.md b/themes/relearn/exampleSite/content/shortcodes/siteparam.en.md new file mode 100644 index 0000000..4a4f192 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/siteparam.en.md @@ -0,0 +1,44 @@ ++++ +description = "Get value of site params" +title = "Site param" ++++ + +The `siteparam` shortcode prints values of site params. + +## Usage + +While the examples are using named parameter you are free to use positional aswell. + +{{< tabs groupId="shortcode-parameter">}} +{{% tab name="named" %}} + + +````go +{{%/* siteparam name="editURL" */%}} +```` + +{{% /tab %}} +{{% tab name="positional" %}} + +````go +{{%/* siteparam "editURL" */%}} +```` + +{{% /tab %}} +{{< /tabs >}} + +### Parameter + +| Name | Position | Default | Notes | +|:---------------------|:---------|:-----------------|:------------| +| **name** | 1 | _<empty>_ | The name of the site param to be displayed. | + +## Examples + +### `editURL` from `config.toml` + +```go +`editURL` value: {{%/* siteparam name="editURL" */%}} +``` + +`editURL` value: {{% siteparam name="editURL" %}} diff --git a/themes/relearn/exampleSite/content/shortcodes/siteparam.pir.md b/themes/relearn/exampleSite/content/shortcodes/siteparam.pir.md new file mode 100644 index 0000000..084146b --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/siteparam.pir.md @@ -0,0 +1,5 @@ ++++ +descrption = "Get value o' ship parrrams varrriables 'n yer plank" +title = "Ship param" ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/shortcodes/swagger/_index.en.md b/themes/relearn/exampleSite/content/shortcodes/swagger/_index.en.md new file mode 100644 index 0000000..a202923 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/swagger/_index.en.md @@ -0,0 +1,48 @@ +--- +description: "UI for your Swagger / OpenAPI Specifications" +title: "Swagger" +--- + +This shortcode uses the [RapiDoc](https://mrin9.github.io/RapiDoc) library to display your Swagger / OpenAPI Specifications. + +{{% notice note %}} +This only works in modern browsers. +{{% /notice %}} + +## Usage + + +````go +{{}} +```` + +### Parameter + +| Name | Default | Notes | +|:---------------------|:-----------------|:------------| +| **src** | _<empty>_ | The URL to the OpenAPI Specification file. This can be relative to the URL of your page if it is a leaf or branch bundle. | + +## Configuration + +Swagger is configured with default settings. You can customize Swagger's default settings for all of your files thru a JSON object in your `config.toml` or override these settings per page thru your pages frontmatter. + +The JSON object of your `config.toml` / frontmatter is forwarded into Swagger's initialization. At the moment, only the `theme` setting is supported. + +The `theme` setting can also be set by your used color variant. This will be the sitewide default and can - again - be overridden by your settings in `config.toml` or frontmatter. + +### Global Configuration File + +````toml +[params] + swaggerInitialize = "{ \"theme\": \"dark\" }" +```` + +## Example + +### Using Local File + +````go +{{}} +```` + +{{< swagger src="petstore.json" >}} diff --git a/themes/relearn/exampleSite/content/shortcodes/swagger/_index.pir.md b/themes/relearn/exampleSite/content/shortcodes/swagger/_index.pir.md new file mode 100644 index 0000000..c3216db --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/swagger/_index.pir.md @@ -0,0 +1,5 @@ +--- +description: "Adds UI fer yer Swaggerrr / OpenAPI Specificat'ns" +title: "Swaggerrr" +--- +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/shortcodes/swagger/petstore.json b/themes/relearn/exampleSite/content/shortcodes/swagger/petstore.json new file mode 100644 index 0000000..a2dad7f --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/swagger/petstore.json @@ -0,0 +1 @@ +{"openapi":"3.0.2","info":{"title":"Swagger Petstore - OpenAPI 3.0","description":"This is a sample Pet Store Server based on the OpenAPI 3.0 specification. You can find out more about\nSwagger at [http://swagger.io](http://swagger.io). In the third iteration of the pet store, we've switched to the design first approach!\nYou can now help us improve the API whether it's by making changes to the definition itself or to the code.\nThat way, with time, we can improve the API in general, and expose some of the new features in OAS3.\n\nSome useful links:\n- [The Pet Store repository](https://github.com/swagger-api/swagger-petstore)\n- [The source API definition for the Pet Store](https://github.com/swagger-api/swagger-petstore/blob/master/src/main/resources/openapi.yaml)","termsOfService":"http://swagger.io/terms/","contact":{"email":"apiteam@swagger.io"},"license":{"name":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"},"version":"1.0.11"},"externalDocs":{"description":"Find out more about Swagger","url":"http://swagger.io"},"servers":[{"url":"/api/v3"}],"tags":[{"name":"pet","description":"Everything about your Pets","externalDocs":{"description":"Find out more","url":"http://swagger.io"}},{"name":"store","description":"Access to Petstore orders","externalDocs":{"description":"Find out more about our store","url":"http://swagger.io"}},{"name":"user","description":"Operations about user"}],"paths":{"/pet":{"put":{"tags":["pet"],"summary":"Update an existing pet","description":"Update an existing pet by Id","operationId":"updatePet","requestBody":{"description":"Update an existent pet in the store","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pet"}},"application/xml":{"schema":{"$ref":"#/components/schemas/Pet"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Pet"}}},"required":true},"responses":{"200":{"description":"Successful operation","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/Pet"}},"application/json":{"schema":{"$ref":"#/components/schemas/Pet"}}}},"400":{"description":"Invalid ID supplied"},"404":{"description":"Pet not found"},"405":{"description":"Validation exception"}},"security":[{"petstore_auth":["write:pets","read:pets"]}]},"post":{"tags":["pet"],"summary":"Add a new pet to the store","description":"Add a new pet to the store","operationId":"addPet","requestBody":{"description":"Create a new pet in the store","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pet"}},"application/xml":{"schema":{"$ref":"#/components/schemas/Pet"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Pet"}}},"required":true},"responses":{"200":{"description":"Successful operation","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/Pet"}},"application/json":{"schema":{"$ref":"#/components/schemas/Pet"}}}},"405":{"description":"Invalid input"}},"security":[{"petstore_auth":["write:pets","read:pets"]}]}},"/pet/findByStatus":{"get":{"tags":["pet"],"summary":"Finds Pets by status","description":"Multiple status values can be provided with comma separated strings","operationId":"findPetsByStatus","parameters":[{"name":"status","in":"query","description":"Status values that need to be considered for filter","required":false,"explode":true,"schema":{"type":"string","default":"available","enum":["available","pending","sold"]}}],"responses":{"200":{"description":"successful operation","content":{"application/xml":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Pet"}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Pet"}}}}},"400":{"description":"Invalid status value"}},"security":[{"petstore_auth":["write:pets","read:pets"]}]}},"/pet/findByTags":{"get":{"tags":["pet"],"summary":"Finds Pets by tags","description":"Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.","operationId":"findPetsByTags","parameters":[{"name":"tags","in":"query","description":"Tags to filter by","required":false,"explode":true,"schema":{"type":"array","items":{"type":"string"}}}],"responses":{"200":{"description":"successful operation","content":{"application/xml":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Pet"}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Pet"}}}}},"400":{"description":"Invalid tag value"}},"security":[{"petstore_auth":["write:pets","read:pets"]}]}},"/pet/{petId}":{"get":{"tags":["pet"],"summary":"Find pet by ID","description":"Returns a single pet","operationId":"getPetById","parameters":[{"name":"petId","in":"path","description":"ID of pet to return","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"successful operation","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/Pet"}},"application/json":{"schema":{"$ref":"#/components/schemas/Pet"}}}},"400":{"description":"Invalid ID supplied"},"404":{"description":"Pet not found"}},"security":[{"api_key":[]},{"petstore_auth":["write:pets","read:pets"]}]},"post":{"tags":["pet"],"summary":"Updates a pet in the store with form data","description":"","operationId":"updatePetWithForm","parameters":[{"name":"petId","in":"path","description":"ID of pet that needs to be updated","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"name","in":"query","description":"Name of pet that needs to be updated","schema":{"type":"string"}},{"name":"status","in":"query","description":"Status of pet that needs to be updated","schema":{"type":"string"}}],"responses":{"405":{"description":"Invalid input"}},"security":[{"petstore_auth":["write:pets","read:pets"]}]},"delete":{"tags":["pet"],"summary":"Deletes a pet","description":"","operationId":"deletePet","parameters":[{"name":"api_key","in":"header","description":"","required":false,"schema":{"type":"string"}},{"name":"petId","in":"path","description":"Pet id to delete","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"400":{"description":"Invalid pet value"}},"security":[{"petstore_auth":["write:pets","read:pets"]}]}},"/pet/{petId}/uploadImage":{"post":{"tags":["pet"],"summary":"uploads an image","description":"","operationId":"uploadFile","parameters":[{"name":"petId","in":"path","description":"ID of pet to update","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"additionalMetadata","in":"query","description":"Additional Metadata","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"responses":{"200":{"description":"successful operation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"security":[{"petstore_auth":["write:pets","read:pets"]}]}},"/store/inventory":{"get":{"tags":["store"],"summary":"Returns pet inventories by status","description":"Returns a map of status codes to quantities","operationId":"getInventory","responses":{"200":{"description":"successful operation","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"integer","format":"int32"}}}}}},"security":[{"api_key":[]}]}},"/store/order":{"post":{"tags":["store"],"summary":"Place an order for a pet","description":"Place a new order in the store","operationId":"placeOrder","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}},"application/xml":{"schema":{"$ref":"#/components/schemas/Order"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Order"}}}},"responses":{"200":{"description":"successful operation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}}},"405":{"description":"Invalid input"}}}},"/store/order/{orderId}":{"get":{"tags":["store"],"summary":"Find purchase order by ID","description":"For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions.","operationId":"getOrderById","parameters":[{"name":"orderId","in":"path","description":"ID of order that needs to be fetched","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"successful operation","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/Order"}},"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}}},"400":{"description":"Invalid ID supplied"},"404":{"description":"Order not found"}}},"delete":{"tags":["store"],"summary":"Delete purchase order by ID","description":"For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors","operationId":"deleteOrder","parameters":[{"name":"orderId","in":"path","description":"ID of the order that needs to be deleted","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"400":{"description":"Invalid ID supplied"},"404":{"description":"Order not found"}}}},"/user":{"post":{"tags":["user"],"summary":"Create user","description":"This can only be done by the logged in user.","operationId":"createUser","requestBody":{"description":"Created user object","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}},"application/xml":{"schema":{"$ref":"#/components/schemas/User"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/User"}}}},"responses":{"default":{"description":"successful operation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}},"application/xml":{"schema":{"$ref":"#/components/schemas/User"}}}}}}},"/user/createWithList":{"post":{"tags":["user"],"summary":"Creates list of users with given input array","description":"Creates list of users with given input array","operationId":"createUsersWithListInput","requestBody":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/User"}}}}},"responses":{"200":{"description":"Successful operation","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/User"}},"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"default":{"description":"successful operation"}}}},"/user/login":{"get":{"tags":["user"],"summary":"Logs user into the system","description":"","operationId":"loginUser","parameters":[{"name":"username","in":"query","description":"The user name for login","required":false,"schema":{"type":"string"}},{"name":"password","in":"query","description":"The password for login in clear text","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"successful operation","headers":{"X-Rate-Limit":{"description":"calls per hour allowed by the user","schema":{"type":"integer","format":"int32"}},"X-Expires-After":{"description":"date in UTC when token expires","schema":{"type":"string","format":"date-time"}}},"content":{"application/xml":{"schema":{"type":"string"}},"application/json":{"schema":{"type":"string"}}}},"400":{"description":"Invalid username/password supplied"}}}},"/user/logout":{"get":{"tags":["user"],"summary":"Logs out current logged in user session","description":"","operationId":"logoutUser","parameters":[],"responses":{"default":{"description":"successful operation"}}}},"/user/{username}":{"get":{"tags":["user"],"summary":"Get user by user name","description":"","operationId":"getUserByName","parameters":[{"name":"username","in":"path","description":"The name that needs to be fetched. Use user1 for testing. ","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"successful operation","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/User"}},"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"400":{"description":"Invalid username supplied"},"404":{"description":"User not found"}}},"put":{"tags":["user"],"summary":"Update user","description":"This can only be done by the logged in user.","operationId":"updateUser","parameters":[{"name":"username","in":"path","description":"name that need to be deleted","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"Update an existent user in the store","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}},"application/xml":{"schema":{"$ref":"#/components/schemas/User"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/User"}}}},"responses":{"default":{"description":"successful operation"}}},"delete":{"tags":["user"],"summary":"Delete user","description":"This can only be done by the logged in user.","operationId":"deleteUser","parameters":[{"name":"username","in":"path","description":"The name that needs to be deleted","required":true,"schema":{"type":"string"}}],"responses":{"400":{"description":"Invalid username supplied"},"404":{"description":"User not found"}}}}},"components":{"schemas":{"Order":{"type":"object","properties":{"id":{"type":"integer","format":"int64","example":10},"petId":{"type":"integer","format":"int64","example":198772},"quantity":{"type":"integer","format":"int32","example":7},"shipDate":{"type":"string","format":"date-time"},"status":{"type":"string","description":"Order Status","example":"approved","enum":["placed","approved","delivered"]},"complete":{"type":"boolean"}},"xml":{"name":"order"}},"Customer":{"type":"object","properties":{"id":{"type":"integer","format":"int64","example":100000},"username":{"type":"string","example":"fehguy"},"address":{"type":"array","xml":{"name":"addresses","wrapped":true},"items":{"$ref":"#/components/schemas/Address"}}},"xml":{"name":"customer"}},"Address":{"type":"object","properties":{"street":{"type":"string","example":"437 Lytton"},"city":{"type":"string","example":"Palo Alto"},"state":{"type":"string","example":"CA"},"zip":{"type":"string","example":"94301"}},"xml":{"name":"address"}},"Category":{"type":"object","properties":{"id":{"type":"integer","format":"int64","example":1},"name":{"type":"string","example":"Dogs"}},"xml":{"name":"category"}},"User":{"type":"object","properties":{"id":{"type":"integer","format":"int64","example":10},"username":{"type":"string","example":"theUser"},"firstName":{"type":"string","example":"John"},"lastName":{"type":"string","example":"James"},"email":{"type":"string","example":"john@email.com"},"password":{"type":"string","example":"12345"},"phone":{"type":"string","example":"12345"},"userStatus":{"type":"integer","description":"User Status","format":"int32","example":1}},"xml":{"name":"user"}},"Tag":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"}},"xml":{"name":"tag"}},"Pet":{"required":["name","photoUrls"],"type":"object","properties":{"id":{"type":"integer","format":"int64","example":10},"name":{"type":"string","example":"doggie"},"category":{"$ref":"#/components/schemas/Category"},"photoUrls":{"type":"array","xml":{"wrapped":true},"items":{"type":"string","xml":{"name":"photoUrl"}}},"tags":{"type":"array","xml":{"wrapped":true},"items":{"$ref":"#/components/schemas/Tag"}},"status":{"type":"string","description":"pet status in the store","enum":["available","pending","sold"]}},"xml":{"name":"pet"}},"ApiResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"type":{"type":"string"},"message":{"type":"string"}},"xml":{"name":"##default"}}},"requestBodies":{"Pet":{"description":"Pet object that needs to be added to the store","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pet"}},"application/xml":{"schema":{"$ref":"#/components/schemas/Pet"}}}},"UserArray":{"description":"List of user object","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/User"}}}}}},"securitySchemes":{"petstore_auth":{"type":"oauth2","flows":{"implicit":{"authorizationUrl":"https://petstore3.swagger.io/oauth/authorize","scopes":{"write:pets":"modify pets in your account","read:pets":"read your pets"}}}},"api_key":{"type":"apiKey","name":"api_key","in":"header"}}}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/shortcodes/tabs.en.md b/themes/relearn/exampleSite/content/shortcodes/tabs.en.md new file mode 100644 index 0000000..1d87607 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/tabs.en.md @@ -0,0 +1,135 @@ ++++ +description = "Show content in tabbed views" +title = "Tabbed views" ++++ + +The `tabs` shortcode displays arbitrary content in unlimited number of tabs. This comes in handy eg. for providing code snippets for multiple languages or providing configuration in different formats. + +{{< tabs groupId="tabs-example-language" >}} +{{% tab name="python" %}} + +```python +print("Hello World!") +``` + +{{% /tab %}} +{{% tab name="bash" %}} + +```bash +echo "Hello World!" +``` + +{{% /tab %}} +{{< /tabs >}} + +## Usage + +````go +{{}} +{{%/* tab name="python" */%}} +```python +print("Hello World!") +``` +{{%/* /tab */%}} +{{%/* tab name="bash" */%}} +```bash +echo "Hello World!" +``` +{{%/* /tab */%}} +{{}} +```` + +### Parameter + +| Name | Default | Notes | +|:----------------------|:-----------------|:------------| +| **groupId** | `default` | Arbitrary name of the group the tab view belongs to.

Tab views with the same **groupId** sychronize their selected tab. This sychronization applies to the whole site! | +| _**<content>**_ | _<empty>_ | Arbitrary number of tabs defined with the `tab` sub-shortcode. | + +{{% notice warning %}} +When using tab views with different content sets, make sure to use a common `groupId` for equal sets of tabs but distinct `groupId` for different sets. + +The tab selection is restored automatically based on the `groupId` and if it cannot find a tab item because it came from the `'default'` group on a different page then all tabs will be empty at first! +{{% /notice %}} + +## Examples + +### Distinct `groupId` + +````go +{{}} +{{%/* tab name="json" */%}} +```json +{ + "Hello": "World" +} +``` +{{%/* /tab */%}} +{{%/* tab name="XML" */%}} +```xml +World +``` +{{%/* /tab */%}} +{{%/* tab name="properties" */%}} +```properties +Hello = World +``` +{{%/* /tab */%}} +{{}} +```` + +{{< tabs groupId="tabs-example-config" >}} +{{% tab name="json" %}} +```json +{ + "Hello": "World" +} +``` +{{% /tab %}} +{{% tab name="XML" %}} +```xml +World +``` +{{% /tab %}} +{{% tab name="properties" %}} +```ini +Hello = World +``` +{{% /tab %}} +{{< /tabs >}} + +### Non-Distinct `groupId` + +See what happens to this tab view if you select **properties** tab from the previous example. + +````go +{{}} +{{%/* tab name="json" */%}} +```json +{ + "Hello": "World" +} +``` +{{%/* /tab */%}} +{{%/* tab name="XML" */%}} +```xml +World +``` +{{%/* /tab */%}} +{{}} +```` + +{{< tabs groupId="tabs-example-config" >}} +{{% tab name="json" %}} +```json +{ + "Hello": "World" +} +``` +{{% /tab %}} +{{% tab name="XML" %}} +```xml +World +``` +{{% /tab %}} +{{< /tabs >}} diff --git a/themes/relearn/exampleSite/content/shortcodes/tabs.pir.md b/themes/relearn/exampleSite/content/shortcodes/tabs.pir.md new file mode 100644 index 0000000..bfbe015 --- /dev/null +++ b/themes/relearn/exampleSite/content/shortcodes/tabs.pir.md @@ -0,0 +1,5 @@ ++++ +descrption = "Synchr'nize select'n o' content 'n different tabbed views" +title = "Tabbed views" ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/tests/_index.en.md b/themes/relearn/exampleSite/content/tests/_index.en.md new file mode 100644 index 0000000..a5d69e6 --- /dev/null +++ b/themes/relearn/exampleSite/content/tests/_index.en.md @@ -0,0 +1,14 @@ ++++ +chapter = true +hidden = true +title = "Tests" +weight = 5 ++++ + +### Chapter 5 + +# Tests + +Some pages for internal testing of differnt styles + +{{%children containerstyle="div" style="h2" description="true" %}} diff --git a/themes/relearn/exampleSite/content/tests/_index.pir.md b/themes/relearn/exampleSite/content/tests/_index.pir.md new file mode 100644 index 0000000..5022cbc --- /dev/null +++ b/themes/relearn/exampleSite/content/tests/_index.pir.md @@ -0,0 +1,7 @@ ++++ +chapter = true +hidden = true +title = "Tests" +weight = 5 ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/tests/code/_index.en.md b/themes/relearn/exampleSite/content/tests/code/_index.en.md new file mode 100644 index 0000000..df9b895 --- /dev/null +++ b/themes/relearn/exampleSite/content/tests/code/_index.en.md @@ -0,0 +1,45 @@ ++++ +description = "Some testing for different styles used in syntax highlightning and preformatted blocks" +title = "Code" ++++ + +Some testing for different styles used in syntax highlightning and preformatted blocks. + +## Inline Code + +`This is some very long inline code. Where does it wrap?` + +What about wrapping short inline code if multiple sections are written `side` `by` `side`? + +What about wrapping short inline code if multiple sections are written `side`/`by`/`side`? + +What about wrapping long inline code if multiple sections are written `side567` `by34567` `side567`? + +What about wrapping long inline code if multiple sections are written `side567`/`by34567`/`side567`? + +Can we just use a simple HTML element ? + +## Block Code + +```` +Code fences without any selected language +```` + +````json +{ + "well": "some JSON in codefences in here" +} +```` + +
{
+  "well": "some JSON in HTML elements here"
+}
+
+ +## Block Preformatted + + Some preformatted stuff with markdown indention + +
+Some preformatted stuff in HTML elements
+
diff --git a/themes/relearn/exampleSite/content/tests/code/_index.pir.md b/themes/relearn/exampleSite/content/tests/code/_index.pir.md new file mode 100644 index 0000000..3207c19 --- /dev/null +++ b/themes/relearn/exampleSite/content/tests/code/_index.pir.md @@ -0,0 +1,5 @@ ++++ +description = "Some test'n fer different styles used 'n rules highlightn'n an' preformatted blocks" +title = "Code" ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/tests/images/_index.en.md b/themes/relearn/exampleSite/content/tests/images/_index.en.md new file mode 100644 index 0000000..bd2d96f --- /dev/null +++ b/themes/relearn/exampleSite/content/tests/images/_index.en.md @@ -0,0 +1,58 @@ ++++ +description = "Some testing for different styles of image links" +title = "Images" ++++ + +Some testing for different styles of image links. + +## Markdown + +### Relative to page + +![Magic](images/magic.gif?classes=shadow&height=50px) + +### Relative to page up level + +![Magic](../images/images/magic.gif?classes=shadow&height=50px) + +### Static + +![Logo](/images/logo.svg?classes=shadow&height=50px) + +### External fully qualified + +![Minion](https://octodex.github.com/images/minion.png?classes=shadow&height=50px) + +### External without scheme + +![Minion](//octodex.github.com/images/minion.png?classes=shadow&height=50px) + +### External without scheme and scheme separator + +![Minion](octodex.github.com/images/minion.png?classes=shadow&height=50px) + +## HTML + +### Relative to page + +

+ +### Relative to page up level + +

+ +### Static + +

+ +### External fully qualified + +

+ +### External without scheme + +

+ +### External without scheme and scheme separator + +

diff --git a/themes/relearn/exampleSite/content/tests/images/_index.pir.md b/themes/relearn/exampleSite/content/tests/images/_index.pir.md new file mode 100644 index 0000000..ce50b9d --- /dev/null +++ b/themes/relearn/exampleSite/content/tests/images/_index.pir.md @@ -0,0 +1,5 @@ ++++ +description = "Some test'n fer different styles o' image links" +title = "Images" ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/tests/images/images/magic.gif b/themes/relearn/exampleSite/content/tests/images/images/magic.gif new file mode 100644 index 0000000..235c4ed Binary files /dev/null and b/themes/relearn/exampleSite/content/tests/images/images/magic.gif differ diff --git a/themes/relearn/exampleSite/content/tests/links/_index.en.md b/themes/relearn/exampleSite/content/tests/links/_index.en.md new file mode 100644 index 0000000..eefc343 --- /dev/null +++ b/themes/relearn/exampleSite/content/tests/links/_index.en.md @@ -0,0 +1,20 @@ ++++ +description = "Some testing for different styles of links" +title = "Links" ++++ + +Some testing for different styles of links. + +## Markdown + +### Relative to page: + +![Magic](images/magic.gif?classes=shadow) + +### Relative to page up level: + +![Magic](../images/images/magic.gif?classes=shadow) + +### Static: + +![Logo](/images/logo.svg?classes=shadow) diff --git a/themes/relearn/exampleSite/content/tests/links/_index.pir.md b/themes/relearn/exampleSite/content/tests/links/_index.pir.md new file mode 100644 index 0000000..1588583 --- /dev/null +++ b/themes/relearn/exampleSite/content/tests/links/_index.pir.md @@ -0,0 +1,5 @@ ++++ +description = "Some test'n fer different styles o' links" +title = "Links" ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/yours/1.en.md b/themes/relearn/exampleSite/content/yours/1.en.md new file mode 100644 index 0000000..3be3134 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/1.en.md @@ -0,0 +1,3 @@ ++++ +title = "1" ++++ diff --git a/themes/relearn/exampleSite/content/yours/1.pir.md b/themes/relearn/exampleSite/content/yours/1.pir.md new file mode 100644 index 0000000..3be3134 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/1.pir.md @@ -0,0 +1,3 @@ ++++ +title = "1" ++++ diff --git a/themes/relearn/exampleSite/content/yours/10.en.md b/themes/relearn/exampleSite/content/yours/10.en.md new file mode 100644 index 0000000..bc20ae1 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/10.en.md @@ -0,0 +1,3 @@ ++++ +title = "10" ++++ diff --git a/themes/relearn/exampleSite/content/yours/10.pir.md b/themes/relearn/exampleSite/content/yours/10.pir.md new file mode 100644 index 0000000..d8238fc --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/10.pir.md @@ -0,0 +1,3 @@ ++++ +title = "11" ++++ diff --git a/themes/relearn/exampleSite/content/yours/11.de.md b/themes/relearn/exampleSite/content/yours/11.de.md new file mode 100644 index 0000000..d8238fc --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/11.de.md @@ -0,0 +1,3 @@ ++++ +title = "11" ++++ diff --git a/themes/relearn/exampleSite/content/yours/12.de.md b/themes/relearn/exampleSite/content/yours/12.de.md new file mode 100644 index 0000000..5b53a4f --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/12.de.md @@ -0,0 +1,3 @@ ++++ +title = "12" ++++ diff --git a/themes/relearn/exampleSite/content/yours/13.de.md b/themes/relearn/exampleSite/content/yours/13.de.md new file mode 100644 index 0000000..e393431 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/13.de.md @@ -0,0 +1,3 @@ ++++ +title = "13" ++++ diff --git a/themes/relearn/exampleSite/content/yours/14.de.md b/themes/relearn/exampleSite/content/yours/14.de.md new file mode 100644 index 0000000..7fbd1ef --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/14.de.md @@ -0,0 +1,3 @@ ++++ +title = "14" ++++ diff --git a/themes/relearn/exampleSite/content/yours/15.de.md b/themes/relearn/exampleSite/content/yours/15.de.md new file mode 100644 index 0000000..17c431c --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/15.de.md @@ -0,0 +1,3 @@ ++++ +title = "15" ++++ diff --git a/themes/relearn/exampleSite/content/yours/16.de.md b/themes/relearn/exampleSite/content/yours/16.de.md new file mode 100644 index 0000000..27fb0a5 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/16.de.md @@ -0,0 +1,3 @@ ++++ +title = "16" ++++ diff --git a/themes/relearn/exampleSite/content/yours/17.de.md b/themes/relearn/exampleSite/content/yours/17.de.md new file mode 100644 index 0000000..a90e0d6 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/17.de.md @@ -0,0 +1,3 @@ ++++ +title = "17" ++++ diff --git a/themes/relearn/exampleSite/content/yours/18.de.md b/themes/relearn/exampleSite/content/yours/18.de.md new file mode 100644 index 0000000..5e08359 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/18.de.md @@ -0,0 +1,3 @@ ++++ +title = "18" ++++ diff --git a/themes/relearn/exampleSite/content/yours/19.de.md b/themes/relearn/exampleSite/content/yours/19.de.md new file mode 100644 index 0000000..480114d --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/19.de.md @@ -0,0 +1,3 @@ ++++ +title = "19" ++++ diff --git a/themes/relearn/exampleSite/content/yours/2.en.md b/themes/relearn/exampleSite/content/yours/2.en.md new file mode 100644 index 0000000..8e9b276 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/2.en.md @@ -0,0 +1,3 @@ ++++ +title = "2" ++++ diff --git a/themes/relearn/exampleSite/content/yours/2.pir.md b/themes/relearn/exampleSite/content/yours/2.pir.md new file mode 100644 index 0000000..8e9b276 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/2.pir.md @@ -0,0 +1,3 @@ ++++ +title = "2" ++++ diff --git a/themes/relearn/exampleSite/content/yours/20.de.md b/themes/relearn/exampleSite/content/yours/20.de.md new file mode 100644 index 0000000..5912459 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/20.de.md @@ -0,0 +1,3 @@ ++++ +title = "20" ++++ diff --git a/themes/relearn/exampleSite/content/yours/21.de.md b/themes/relearn/exampleSite/content/yours/21.de.md new file mode 100644 index 0000000..52d8057 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/21.de.md @@ -0,0 +1,3 @@ ++++ +title = "21" ++++ diff --git a/themes/relearn/exampleSite/content/yours/22.de.md b/themes/relearn/exampleSite/content/yours/22.de.md new file mode 100644 index 0000000..e47f69a --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/22.de.md @@ -0,0 +1,3 @@ ++++ +title = "22" ++++ diff --git a/themes/relearn/exampleSite/content/yours/23.de.md b/themes/relearn/exampleSite/content/yours/23.de.md new file mode 100644 index 0000000..99b52f9 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/23.de.md @@ -0,0 +1,3 @@ ++++ +title = "23" ++++ diff --git a/themes/relearn/exampleSite/content/yours/24.de.md b/themes/relearn/exampleSite/content/yours/24.de.md new file mode 100644 index 0000000..87ee322 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/24.de.md @@ -0,0 +1,3 @@ ++++ +title = "24" ++++ diff --git a/themes/relearn/exampleSite/content/yours/25.de.md b/themes/relearn/exampleSite/content/yours/25.de.md new file mode 100644 index 0000000..c9e28e5 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/25.de.md @@ -0,0 +1,3 @@ ++++ +title = "25" ++++ diff --git a/themes/relearn/exampleSite/content/yours/26.de.md b/themes/relearn/exampleSite/content/yours/26.de.md new file mode 100644 index 0000000..c1da6f0 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/26.de.md @@ -0,0 +1,3 @@ ++++ +title = "26" ++++ diff --git a/themes/relearn/exampleSite/content/yours/27.de.md b/themes/relearn/exampleSite/content/yours/27.de.md new file mode 100644 index 0000000..4084a27 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/27.de.md @@ -0,0 +1,3 @@ ++++ +title = "27" ++++ diff --git a/themes/relearn/exampleSite/content/yours/28.de.md b/themes/relearn/exampleSite/content/yours/28.de.md new file mode 100644 index 0000000..2d6ebf8 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/28.de.md @@ -0,0 +1,3 @@ ++++ +title = "28" ++++ diff --git a/themes/relearn/exampleSite/content/yours/29.de.md b/themes/relearn/exampleSite/content/yours/29.de.md new file mode 100644 index 0000000..0ad02de --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/29.de.md @@ -0,0 +1,3 @@ ++++ +title = "29" ++++ diff --git a/themes/relearn/exampleSite/content/yours/3.en.md b/themes/relearn/exampleSite/content/yours/3.en.md new file mode 100644 index 0000000..3437393 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/3.en.md @@ -0,0 +1,3 @@ ++++ +title = "3" ++++ diff --git a/themes/relearn/exampleSite/content/yours/3.pir.md b/themes/relearn/exampleSite/content/yours/3.pir.md new file mode 100644 index 0000000..3437393 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/3.pir.md @@ -0,0 +1,3 @@ ++++ +title = "3" ++++ diff --git a/themes/relearn/exampleSite/content/yours/30.de.md b/themes/relearn/exampleSite/content/yours/30.de.md new file mode 100644 index 0000000..e37d34c --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/30.de.md @@ -0,0 +1,3 @@ ++++ +title = "30" ++++ diff --git a/themes/relearn/exampleSite/content/yours/4.en.md b/themes/relearn/exampleSite/content/yours/4.en.md new file mode 100644 index 0000000..78d1dd9 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/4.en.md @@ -0,0 +1,3 @@ ++++ +title = "4" ++++ diff --git a/themes/relearn/exampleSite/content/yours/4.pir.md b/themes/relearn/exampleSite/content/yours/4.pir.md new file mode 100644 index 0000000..78d1dd9 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/4.pir.md @@ -0,0 +1,3 @@ ++++ +title = "4" ++++ diff --git a/themes/relearn/exampleSite/content/yours/5.en.md b/themes/relearn/exampleSite/content/yours/5.en.md new file mode 100644 index 0000000..b36bff7 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/5.en.md @@ -0,0 +1,3 @@ ++++ +title = "5" ++++ diff --git a/themes/relearn/exampleSite/content/yours/5.pir.md b/themes/relearn/exampleSite/content/yours/5.pir.md new file mode 100644 index 0000000..b36bff7 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/5.pir.md @@ -0,0 +1,3 @@ ++++ +title = "5" ++++ diff --git a/themes/relearn/exampleSite/content/yours/6.en.md b/themes/relearn/exampleSite/content/yours/6.en.md new file mode 100644 index 0000000..9a50aa4 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/6.en.md @@ -0,0 +1,3 @@ ++++ +title = "6" ++++ diff --git a/themes/relearn/exampleSite/content/yours/6.pir.md b/themes/relearn/exampleSite/content/yours/6.pir.md new file mode 100644 index 0000000..9a50aa4 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/6.pir.md @@ -0,0 +1,3 @@ ++++ +title = "6" ++++ diff --git a/themes/relearn/exampleSite/content/yours/7.en.md b/themes/relearn/exampleSite/content/yours/7.en.md new file mode 100644 index 0000000..dd31bb5 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/7.en.md @@ -0,0 +1,3 @@ ++++ +title = "7" ++++ diff --git a/themes/relearn/exampleSite/content/yours/7.pir.md b/themes/relearn/exampleSite/content/yours/7.pir.md new file mode 100644 index 0000000..dd31bb5 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/7.pir.md @@ -0,0 +1,3 @@ ++++ +title = "7" ++++ diff --git a/themes/relearn/exampleSite/content/yours/8.en.md b/themes/relearn/exampleSite/content/yours/8.en.md new file mode 100644 index 0000000..ab16e7a --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/8.en.md @@ -0,0 +1,3 @@ ++++ +title = "8" ++++ diff --git a/themes/relearn/exampleSite/content/yours/8.pir.md b/themes/relearn/exampleSite/content/yours/8.pir.md new file mode 100644 index 0000000..ab16e7a --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/8.pir.md @@ -0,0 +1,3 @@ ++++ +title = "8" ++++ diff --git a/themes/relearn/exampleSite/content/yours/9.en.md b/themes/relearn/exampleSite/content/yours/9.en.md new file mode 100644 index 0000000..847d3c5 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/9.en.md @@ -0,0 +1,3 @@ ++++ +title = "9" ++++ diff --git a/themes/relearn/exampleSite/content/yours/9.pir.md b/themes/relearn/exampleSite/content/yours/9.pir.md new file mode 100644 index 0000000..847d3c5 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/9.pir.md @@ -0,0 +1,3 @@ ++++ +title = "9" ++++ diff --git a/themes/relearn/exampleSite/content/yours/_index.en.md b/themes/relearn/exampleSite/content/yours/_index.en.md new file mode 100644 index 0000000..855d6c4 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/_index.en.md @@ -0,0 +1,12 @@ ++++ +chapter = true +hidden = true +title = "This could be yours" +weight = 4 ++++ + +### Chapter 4 + +# This could be yours + +Start your success story. Now! \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/yours/_index.pir.md b/themes/relearn/exampleSite/content/yours/_index.pir.md new file mode 100644 index 0000000..8c1f2ed --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/_index.pir.md @@ -0,0 +1,7 @@ ++++ +chapter = true +hidden = true +title = "This could be yers" +weight = 4 ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/yours/children-1/_index.en.md b/themes/relearn/exampleSite/content/yours/children-1/_index.en.md new file mode 100644 index 0000000..e05abd7 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/children-1/_index.en.md @@ -0,0 +1,6 @@ ++++ +hidden = true +title = "The one and only hidden child" ++++ + +Placeholder... \ No newline at end of file diff --git a/themes/relearn/exampleSite/content/yours/children-1/_index.pir.md b/themes/relearn/exampleSite/content/yours/children-1/_index.pir.md new file mode 100644 index 0000000..53dd0c9 --- /dev/null +++ b/themes/relearn/exampleSite/content/yours/children-1/_index.pir.md @@ -0,0 +1,5 @@ ++++ +hidden = true +title = "Th' one an' only hidden child" ++++ +{{< piratify >}} \ No newline at end of file diff --git a/themes/relearn/exampleSite/layouts/partials/menu-footer.html b/themes/relearn/exampleSite/layouts/partials/menu-footer.html new file mode 100644 index 0000000..5de9cec --- /dev/null +++ b/themes/relearn/exampleSite/layouts/partials/menu-footer.html @@ -0,0 +1,21 @@ + + + Download + Star + Fork +

Built with by Hugo

+ \ No newline at end of file diff --git a/themes/relearn/exampleSite/layouts/partials/menu-pre.html b/themes/relearn/exampleSite/layouts/partials/menu-pre.html new file mode 100644 index 0000000..98b2be8 --- /dev/null +++ b/themes/relearn/exampleSite/layouts/partials/menu-pre.html @@ -0,0 +1 @@ +{{ if .Params.chapter }}{{ .Params.weight }}. {{ end }} \ No newline at end of file diff --git a/themes/relearn/exampleSite/layouts/shortcodes/ghcontributors.html b/themes/relearn/exampleSite/layouts/shortcodes/ghcontributors.html new file mode 100644 index 0000000..3e8a928 --- /dev/null +++ b/themes/relearn/exampleSite/layouts/shortcodes/ghcontributors.html @@ -0,0 +1,31 @@ + +
+ {{ $url := .Get 0 }} + {{ range getJSON $url }} +
+ + + {{.contributions}} commits +
+ {{ end }} +
\ No newline at end of file diff --git a/themes/relearn/exampleSite/layouts/shortcodes/piratify.html b/themes/relearn/exampleSite/layouts/shortcodes/piratify.html new file mode 100644 index 0000000..642298b --- /dev/null +++ b/themes/relearn/exampleSite/layouts/shortcodes/piratify.html @@ -0,0 +1,111 @@ +{{- $langsrc := .Get 1 | default "en" }} +{{- $langtrg := .Page.Language.Lang }} +{{- $baseURL := urls.Parse .Site.BaseURL }} +{{- $baseURLpath := $baseURL.Path | default "/" }} +{{- $words := dict + "Hugo" "Cap'n Hugo" + "Info" "Ahoi" + "Note" "Avast" + "Tip" "Smarrrt Arrrse" + "Warning" "Arrr" + "good" "bloody" + "shortcode" "shorrrtcode" + "Shortcode" "Shorrrtcode" + "shortcodes" "shorrrtcodes" + "Shortcodes" "Shorrrtcodes" + "Mermaid" "Merrrmaid" + "Markdown" "Marrrkdown" + "Markup" "Marrrkup" + "markup" "marrrkup" + "for" "fer" + "Your" "Yer" + "your" "yer" + "You" "Ye" + "you" "ye" + "the" "th'" + "The" "Th'" + "is" "be" + "Is" "Be" + "are" "be" + "Are" "Be" + "Of" "O'" + "of" "o'" + "To" "T'" + "to" "t'" + "in" "'n" + "With" "Wit'" + "with" "wit'" + "Where" "Whar'" + "where" "whar'" + "After" "Aft" + "after" "aft" + "And" "An'" + "and" "an'" + "Load" "Board" + "load" "board" + "Loaded" "Boarded" + "loaded" "boarded" + "Content" "Rrrambling" + "content" "rrrambling" + "icon" "ay'con" + "Icon" "Ay'con" + "icons" "ay'cons" + "Icons" "Ay'cons" + "syntax" "rules" + "Syntax" "Rules" + "Site" "Ship" + "site" "ship" + "Page" "Plank" + "page" "plank" + "Pages" "Planks" + "pages" "planks" + "Relearn" "Relearrrn" + "Learn" "Learrrn" +-}} +{{- $specials := dict + "(\\w)ing([\\s\\n<.,;?!:])" "'n" + "(\\w)ings([\\s\\n<.,;?!:])" "'ns" + "(\\w)tion([\\s\\n<.,;?!:])" "t'n" + "(\\w)tions([\\s\\n<.,;?!:])" "t'ns" + "(\\w)(?:[aeiou])ble([\\s\\n<.,;?!:])" "'ble" + "(\\w)(?:[aeiou])mize([\\s\\n<.,;?!:])" "'mize" + "(\\w)(?:[aeiou])mizes([\\s\\n<.,;?!:])" "'mizes" + "(\\w)(?:[aeiou])nize([\\s\\n<.,;?!:])" "'nize" + "(\\w)(?:[aeiou])nizes([\\s\\n<.,;?!:])" "'nizes" + (printf "(.)=\"%s([^\"]*?\")" $baseURLpath) (printf "=\"%s%s/" $baseURLpath $langtrg) +-}} +{{- $fix := dict + "warn'n" "warning" + "sect'n" "section" + "n Cap'n" "n" + "Avast right o' John" "Note right of John" +-}} +{{- $c := "" }} +{{- range .Page.Translations }} + {{- if eq .Language.Lang $langsrc }} + {{- $l := .RelPermalink }} + {{- $c = .Content }} + {{- range $from, $to := $words }} + {{- $c = replaceRE (printf "([\\s\\n>])%s([\\s\\n<.,;?!:])" $from) (printf "${1}%s${2}" $to) $c }} + {{- end }} + {{- range $from, $to := $specials }} + {{- $c = replaceRE $from (printf "${1}%s${2}" $to) $c }} + {{- end }} + {{- range $from, $to := $fix }} + {{- $c = replace $c $from $to }} + {{- end }} + {{- $c = replaceRE "(src|href)=\"(images/[^\"]*?\")" (printf "${1}=\"%s${2}" $l) $c }} + {{- $c = replaceRE "(src|href)=\"([^\"]*?)/pir/([^\"]*?.files/[^\"]*?\")" "${1}=\"${2}/${3}" $c }} + {{- end }} +{{- end }} +{{- $style := "warning" }} +{{- $title := "Arrr! Pirrrates" }} +{{- $icon := "skull-crossbones" }} +
+
{{ $title }}
+
+

Fello' pirrates, be awarrre some featurrres may not work fer us in this trrranslat'n. Like table of rrramblings, some Merrrmaids and stuff.

+
+
+ +{{ $c | safeHTML }} \ No newline at end of file diff --git a/themes/relearn/exampleSite/static/images/logo.svg b/themes/relearn/exampleSite/static/images/logo.svg new file mode 100644 index 0000000..48b180d --- /dev/null +++ b/themes/relearn/exampleSite/static/images/logo.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/themes/relearn/exampleSite/static/js/buttons.js b/themes/relearn/exampleSite/static/js/buttons.js new file mode 100644 index 0000000..e6d0703 --- /dev/null +++ b/themes/relearn/exampleSite/static/js/buttons.js @@ -0,0 +1,6 @@ +/*! + * github-buttons v2.21.1 + * (c) 2021 なつき + * @license BSD-2-Clause + */ +!function(){"use strict";var e=window.document,o=e.location,t=window.Math,r=window.HTMLElement,a=window.XMLHttpRequest,n="github-button",i="https://buttons.github.io/buttons.html",c="github.com",l=a&&"prototype"in a&&"withCredentials"in a.prototype,d=l&&r&&"attachShadow"in r.prototype&&!("prototype"in r.prototype.attachShadow),s=function(e,o){for(var t=0,r=e.length;t'}}},download:{heights:{16:{width:16,path:''}}},eye:{heights:{16:{width:16,path:''}}},heart:{heights:{16:{width:16,path:''}}},"issue-opened":{heights:{16:{width:16,path:''}}},"mark-github":{heights:{16:{width:16,path:''}}},package:{heights:{16:{width:16,path:''}}},play:{heights:{16:{width:16,path:''}}},"repo-forked":{heights:{16:{width:16,path:''}}},"repo-template":{heights:{16:{width:16,path:''}}},star:{heights:{16:{width:16,path:''}}}},C=function(e,o){e=b(e).replace(/^octicon-/,""),f(y,e)||(e="mark-github");var t=o>=24&&24 in y[e].heights?24:16,r=y[e].heights[t];return'"},M={},A=function(e,o){var t=M[e]||(M[e]=[]);if(!(t.push(o)>1)){var r=g((function(){for(delete M[e];o=t.shift();)o.apply(null,arguments)}));if(l){var n=new a;m(n,"abort",r),m(n,"error",r),m(n,"load",(function(){var e;try{e=JSON.parse(this.responseText)}catch(e){return void r(e)}r(200!==this.status,e)})),n.open("GET",e),n.send()}else{var i=this||window;i._=function(e){i._=null,r(200!==e.meta.status,e.data)};var c=u(i.document)("script",{async:!0,src:e+(-1!==e.indexOf("?")?"&":"?")+"callback=_"}),d=function(){i._&&i._({meta:{}})};m(c,"load",d),m(c,"error",d),k(c,/de|m/,d),i.document.getElementsByTagName("head")[0].appendChild(c)}}},F=function(e,o,t){var r=u(e.ownerDocument),a=e.appendChild(r("style",{type:"text/css"})),n="body{margin:0}a{text-decoration:none;outline:0}.widget{display:inline-block;overflow:hidden;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;font-size:0;line-height:0;white-space:nowrap}.btn,.social-count{position:relative;display:inline-block;display:inline-flex;height:14px;padding:2px 5px;font-size:11px;font-weight:600;line-height:14px;vertical-align:bottom;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-repeat:repeat-x;background-position:-1px -1px;background-size:110% 110%;border:1px solid}.btn{border-radius:.25em}.btn:not(:last-child){border-radius:.25em 0 0 .25em}.social-count{border-left:0;border-radius:0 .25em .25em 0}.widget-lg .btn,.widget-lg .social-count{height:16px;padding:5px 10px;font-size:12px;line-height:16px}.octicon{display:inline-block;vertical-align:text-top;fill:currentColor;overflow:visible}"+function(e){if(null==e)return x.light;if(f(x,e))return x[e];var o=p(e,";",":",(function(e){return e.replace(/^[ \t\n\f\r]+|[ \t\n\f\r]+$/g,"")}));return x[f(x,o["no-preference"])?o["no-preference"]:"light"]+z("light",o.light)+z("dark",o.dark)}(o["data-color-scheme"]);a.styleSheet?a.styleSheet.cssText=n:a.appendChild(e.ownerDocument.createTextNode(n));var i="large"===b(o["data-size"]),l=r("a",{className:"btn",href:o.href,rel:"noopener",target:"_blank",title:o.title||void 0,"aria-label":o["aria-label"]||void 0,innerHTML:C(o["data-icon"],i?16:14)+" "},[r("span",{},[o["data-text"]||""])]),d=e.appendChild(r("div",{className:"widget"+(i?" widget-lg":"")},[l])),s=l.hostname.replace(/\.$/,"");if(("."+s).substring(s.length-c.length)!=="."+c)return l.removeAttribute("href"),void t(d);var h=(" /"+l.pathname).split(/\/+/);if(((s===c||s==="gist."+c)&&"archive"===h[3]||s===c&&"releases"===h[3]&&("download"===h[4]||"latest"===h[4]&&"download"===h[5])||s==="codeload."+c)&&(l.target="_top"),"true"===b(o["data-show-count"])&&s===c&&"marketplace"!==h[1]&&"sponsors"!==h[1]&&"orgs"!==h[1]&&"users"!==h[1]&&"-"!==h[1]){var g,m;if(!h[2]&&h[1])m="followers",g="?tab=followers";else if(!h[3]&&h[2])m="stargazers_count",g="/stargazers";else if(h[4]||"subscription"!==h[3])if(h[4]||"fork"!==h[3]){if("issues"!==h[3])return void t(d);m="open_issues_count",g="/issues"}else m="forks_count",g="/network/members";else m="subscribers_count",g="/watchers";var v=h[2]?"/repos/"+h[1]+"/"+h[2]:"/users/"+h[1];A.call(this,"https://api.github.com"+v,(function(e,o){if(!e){var a=o[m];d.appendChild(r("a",{className:"social-count",href:o.html_url+g,rel:"noopener",target:"_blank","aria-label":a+" "+m.replace(/_count$/,"").replace("_"," ").slice(0,a<2?-1:void 0)+" on GitHub"},[(""+a).replace(/\B(?=(\d{3})+(?!\d))/g,",")]))}t(d)}))}else t(d)},L=window.devicePixelRatio||1,_=function(e){return(L>1?t.ceil(t.round(e*L)/L*2)/2:t.ceil(e))||0},E=function(e,o){e.style.width=o[0]+"px",e.style.height=o[1]+"px"},G=function(o,r){if(null!=o&&null!=r)if(o.getAttribute&&(o=function(e){var o={href:e.href,title:e.title,"aria-label":e.getAttribute("aria-label")};return s(["icon","color-scheme","text","size","show-count"],(function(t){var r="data-"+t;o[r]=e.getAttribute(r)})),null==o["data-text"]&&(o["data-text"]=e.textContent||e.innerText),o}(o)),d){var a=h("span");F(a.attachShadow({mode:"closed"}),o,(function(){r(a)}))}else{var n=h("iframe",{src:"javascript:0",title:o.title||void 0,allowtransparency:!0,scrolling:"no",frameBorder:0});E(n,[0,0]),n.style.border="none";var c=function(){var a,l=n.contentWindow;try{a=l.document.body}catch(o){return void e.body.appendChild(n.parentNode.removeChild(n))}v(n,"load",c),F.call(l,a,o,(function(e){var a=function(e){var o=e.offsetWidth,r=e.offsetHeight;if(e.getBoundingClientRect){var a=e.getBoundingClientRect();o=t.max(o,_(a.width)),r=t.max(r,_(a.height))}return[o,r]}(e);n.parentNode.removeChild(n),w(n,"load",(function(){E(n,a)})),n.src=i+"#"+(n.name=function(e,o,t,r){null==o&&(o="&"),null==t&&(t="="),null==r&&(r=window.encodeURIComponent);var a=[];for(var n in e){var i=e[n];null!=i&&a.push(r(n)+t+r(i))}return a.join(o)}(o)),r(n)}))};m(n,"load",c),e.body.appendChild(n)}};o.protocol+"//"+o.host+o.pathname===i?F(e.body,p(window.name||o.hash.replace(/^#/,"")),(function(){})):function(o){if("complete"===e.readyState||"loading"!==e.readyState&&!e.documentElement.doScroll)setTimeout(o);else if(e.addEventListener){var t=g(o);w(e,"DOMContentLoaded",t),w(window,"load",t)}else k(e,/m/,o)}((function(){var o,t=e.querySelectorAll?e.querySelectorAll("a."+n):(o=[],s(e.getElementsByTagName("a"),(function(e){-1!==(" "+e.className+" ").replace(/[ \t\n\f\r]+/g," ").indexOf(" github-button ")&&o.push(e)})),o);s(t,(function(e){G(e,(function(o){e.parentNode.replaceChild(o,e)}))}))}))}(); diff --git a/themes/relearn/i18n/ar.toml b/themes/relearn/i18n/ar.toml new file mode 100644 index 0000000..c931477 --- /dev/null +++ b/themes/relearn/i18n/ar.toml @@ -0,0 +1,68 @@ +[Search-placeholder] +other = "...البحث" + +[Clear-History] +other = "مسح السجل" + +[Attachments-label] +other = "مرفقات" + +[title-404] +other = "خطأ" + +[message-404] +other = ".¯\\_(ツ)_/¯أوبس. يبدو أن هذه الصفحة غير موجودة" + +[Go-to-homepage] +other = "الذهاب إلى الصفحة الرئيسية" + +[Edit-this-page] +other = "حرر" + +[Print-this-chapter] +other = "طباعة الفصل بأكمله" + +[Shortcuts-Title] +other = "المزيد" + +[Expand-title] +other = "...قم بتوسيع" + +[Navigation-toggle] +other = "قائمة" + +[Toc-toggle] +other = "جدول المحتويات" + +[Byte-symbol] +other = "B" + +[Kilobyte-symbol] +other = "KB" + +[Megabyte-symbol] +other = "MB" + +[note] +other = "ملاحظه" + +[info] +other = "معلومات" + +[tip] +other = "بقشيش" + +[warning] +other = "تحذير" + +[Copy-to-clipboard] +other = "نسخ إلى الحافظة" + +[Copied-to-clipboard] +other = "نسخت إلى الحافظة!" + +[Copy-link-to-clipboard] +other = "نسخ الرابط إلى الحافظة" + +[Link-copied-to-clipboard] +other = "رابط نسخت إلى الحافظة!" diff --git a/themes/relearn/i18n/de.toml b/themes/relearn/i18n/de.toml new file mode 100644 index 0000000..4fc1fd3 --- /dev/null +++ b/themes/relearn/i18n/de.toml @@ -0,0 +1,68 @@ +[Search-placeholder] +other = "Suchen..." + +[Clear-History] +other = "Verlauf löschen" + +[Attachments-label] +other = "Anhänge" + +[title-404] +other = "Fehler" + +[message-404] +other = "Huch. Diese Seite scheint nicht zu existieren ¯\\_(ツ)_/¯." + +[Go-to-homepage] +other = "Gehe zur Homepage" + +[Edit-this-page] +other = "Bearbeiten" + +[Print-this-chapter] +other = "Ganzes Kapitel drucken" + +[Shortcuts-Title] +other = "Mehr" + +[Expand-title] +other = "Erweitere mich..." + +[Navigation-toggle] +other = "Menu" + +[Toc-toggle] +other = "Inhalt" + +[Byte-symbol] +other = "B" + +[Kilobyte-symbol] +other = "KB" + +[Megabyte-symbol] +other = "MB" + +[note] +other = "Anmerkung" + +[info] +other = "Info" + +[tip] +other = "Tipp" + +[warning] +other = "Warnung" + +[Copy-to-clipboard] +other = "In Zwischenablage kopieren" + +[Copied-to-clipboard] +other = "In Zwischenablage kopiert!" + +[Copy-link-to-clipboard] +other = "Link in Zwischenablage kopieren" + +[Link-copied-to-clipboard] +other = "Link in Zwischenablage kopiert!" diff --git a/themes/relearn/i18n/en.toml b/themes/relearn/i18n/en.toml new file mode 100644 index 0000000..93b46c3 --- /dev/null +++ b/themes/relearn/i18n/en.toml @@ -0,0 +1,68 @@ +[Search-placeholder] +other = "Search..." + +[Clear-History] +other = "Clear History" + +[Attachments-label] +other = "Attachments" + +[title-404] +other = "Error" + +[message-404] +other = "Woops. Looks like this page doesn't exist ¯\\_(ツ)_/¯." + +[Go-to-homepage] +other = "Go to homepage" + +[Edit-this-page] +other = "Edit" + +[Print-this-chapter] +other = "Print whole chapter" + +[Shortcuts-Title] +other = "More" + +[Expand-title] +other = "Expand me..." + +[Navigation-toggle] +other = "Menu" + +[Toc-toggle] +other = "Table of Contents" + +[Byte-symbol] +other = "B" + +[Kilobyte-symbol] +other = "KB" + +[Megabyte-symbol] +other = "MB" + +[note] +other = "Note" + +[info] +other = "Info" + +[tip] +other = "Tip" + +[warning] +other = "Warning" + +[Copy-to-clipboard] +other = "Copy to clipboard" + +[Copied-to-clipboard] +other = "Copied to clipboard!" + +[Copy-link-to-clipboard] +other = "Copy link to clipboard" + +[Link-copied-to-clipboard] +other = "Copied link to clipboard!" diff --git a/themes/relearn/i18n/es.toml b/themes/relearn/i18n/es.toml new file mode 100644 index 0000000..d3ec84a --- /dev/null +++ b/themes/relearn/i18n/es.toml @@ -0,0 +1,68 @@ +[Search-placeholder] +other = "Buscar..." + +[Clear-History] +other = "Borrar Historial" + +[Attachments-label] +other = "Adjuntos" + +[title-404] +other = "Error" + +[message-404] +other = "Ups. Parece que la página no existe ¯\\_(ツ)_/¯." + +[Go-to-homepage] +other = "Ir al inicio" + +[Edit-this-page] +other = "Editar" + +[Print-this-chapter] +other = "Imprimer le chapitre entier" + +[Shortcuts-Title] +other = "Más" + +[Expand-title] +other = "Expandir..." + +[Navigation-toggle] +other = "Menú" + +[Toc-toggle] +other = "Tabla de contenido" + +[Byte-symbol] +other = "B" + +[Kilobyte-symbol] +other = "KB" + +[Megabyte-symbol] +other = "MB" + +[note] +other = "Nota" + +[info] +other = "Información" + +[tip] +other = "Consejo" + +[warning] +other = "Aviso" + +[Copy-to-clipboard] +other = "Copiar en el portapapeles" + +[Copied-to-clipboard] +other = "¡Copiado al portapapeles!" + +[Copy-link-to-clipboard] +other = "Copiar enlace al portapapeles" + +[Link-copied-to-clipboard] +other = "¡Enlace copiado al portapapeles!" diff --git a/themes/relearn/i18n/fr.toml b/themes/relearn/i18n/fr.toml new file mode 100644 index 0000000..6b6cc55 --- /dev/null +++ b/themes/relearn/i18n/fr.toml @@ -0,0 +1,68 @@ +[Search-placeholder] +other = "Rechercher..." + +[Clear-History] +other = "Supprimer l'historique" + +[Attachments-label] +other = "Pièces jointes" + +[title-404] +other = "Erreur" + +[message-404] +other = "Oups. On dirait que cette page n'existe pas ¯\\_(ツ)_/¯" + +[Go-to-homepage] +other = "Vers la page d'accueil" + +[Edit-this-page] +other = "Éditer" + +[Print-this-chapter] +other = "Imprimer le chapitre entier" + +[Shortcuts-Title] +other = "Aller plus loin" + +[Expand-title] +other = "Déroulez-moi..." + +[Navigation-toggle] +other = "Menu" + +[Toc-toggle] +other = "Table des matières" + +[Byte-symbol] +other = "o" + +[Kilobyte-symbol] +other = "ko" + +[Megabyte-symbol] +other = "Mo" + +[note] +other = "Remarque" + +[info] +other = "Information" + +[tip] +other = "Astuce" + +[warning] +other = "Avertissement" + +[Copy-to-clipboard] +other = "Copier dans le presse-papiers" + +[Copied-to-clipboard] +other = "Copié dans le presse-papiers!" + +[Copy-link-to-clipboard] +other = "Copier le lien dans le presse-papiers" + +[Link-copied-to-clipboard] +other = "Lien copié dans le presse-papiers!" diff --git a/themes/relearn/i18n/hi.toml b/themes/relearn/i18n/hi.toml new file mode 100644 index 0000000..449d40e --- /dev/null +++ b/themes/relearn/i18n/hi.toml @@ -0,0 +1,68 @@ +[Search-placeholder] +other = "खोजे..." + +[Clear-History] +other = "इतिहास मिटाएँ" + +[Attachments-label] +other = "संलग्नंक (अटैचमेंट)" + +[title-404] +other = "त्रुटि" + +[message-404] +other = "यह पृष्ठ अभि अनुपलब्ध है!" + +[Go-to-homepage] +other = "मुख्य पृष्ठ पर जाऐ" + +[Edit-this-page] +other = "संपादन करना" + +[Print-this-chapter] +other = "पूरा अध्याय मुद्रित करें" + +[Shortcuts-Title] +other = "अधिक सामग्री दिखाएं" + +[Expand-title] +other = "विस्तार करे..." + +[Navigation-toggle] +other = "Menú" + +[Toc-toggle] +other = "विषयसूची" + +[Byte-symbol] +other = "B" + +[Kilobyte-symbol] +other = "KB" + +[Megabyte-symbol] +other = "MB" + +[note] +other = "नोट" + +[info] +other = "जानकारी" + +[tip] +other = "नोक" + +[warning] +other = "चेतावनी" + +[Copy-to-clipboard] +other = "क्लिपबोर्ड पर प्रतिलिपि बनाएँ" + +[Copied-to-clipboard] +other = "क्लिपबोर्ड पर कॉपी किया गया!" + +[Copy-link-to-clipboard] +other = "क्लिपबोर्ड पर लिंक की प्रतिलिपि बनाएँ" + +[Link-copied-to-clipboard] +other = "लिंक क्लिपबोर्ड के लिए प्रतिलिपि बनाई!" diff --git a/themes/relearn/i18n/id.toml b/themes/relearn/i18n/id.toml new file mode 100644 index 0000000..1555fcb --- /dev/null +++ b/themes/relearn/i18n/id.toml @@ -0,0 +1,68 @@ +[Search-placeholder] +other = "Telusuri..." + +[Clear-History] +other = "Bersihkan Riwayat" + +[Attachments-label] +other = "Lampiran" + +[title-404] +other = "Kesalahan" + +[message-404] +other = "Oops. Sepertinya halaman ini tidak ada ¯\\_(ツ)_/¯." + +[Go-to-homepage] +other = "Ke halaman depan" + +[Edit-this-page] +other = "Mengedit" + +[Print-this-chapter] +other = "Mencetak seluruh bab" + +[Shortcuts-Title] +other = "Lainnya" + +[Expand-title] +other = "Bentangkan..." + +[Navigation-toggle] +other = "Menu" + +[Toc-toggle] +other = "Daftar isi" + +[Byte-symbol] +other = "B" + +[Kilobyte-symbol] +other = "KB" + +[Megabyte-symbol] +other = "MB" + +[note] +other = "Nota" + +[info] +other = "Info" + +[tip] +other = "Ujung" + +[warning] +other = "Peringatan" + +[Copy-to-clipboard] +other = "Salin ke clipboard" + +[Copied-to-clipboard] +other = "Disalin ke clipboard!" + +[Copy-link-to-clipboard] +other = "Salin link ke clipboard" + +[Link-copied-to-clipboard] +other = "Link disalin ke clipboard!" diff --git a/themes/relearn/i18n/it.toml b/themes/relearn/i18n/it.toml new file mode 100644 index 0000000..a723f27 --- /dev/null +++ b/themes/relearn/i18n/it.toml @@ -0,0 +1,68 @@ +[Search-placeholder] +other = "Cerca..." + +[Clear-History] +other = "Reimposta storico" + +[Attachments-label] +other = "Allegati" + +[title-404] +other = "Errore" + +[message-404] +other = "Oh no! Sembra che la pagina da te cercata non esista ¯\\_(ツ)_/¯." + +[Go-to-homepage] +other = "Ritorna alla pagina iniziale" + +[Edit-this-page] +other = "Modifica" + +[Print-this-chapter] +other = "Stampa l'intero capitolo" + +[Shortcuts-Title] +other = "Altro" + +[Expand-title] +other = "Espandi..." + +[Navigation-toggle] +other = "Menu" + +[Toc-toggle] +other = "Indice" + +[Byte-symbol] +other = "B" + +[Kilobyte-symbol] +other = "KB" + +[Megabyte-symbol] +other = "MB" + +[note] +other = "Nota" + +[info] +other = "Informazione" + +[tip] +other = "Suggerimento" + +[warning] +other = "Attenzione" + +[Copy-to-clipboard] +other = "Copia nella clipboard" + +[Copied-to-clipboard] +other = "Copia dalla clipboard!" + +[Copy-link-to-clipboard] +other = "Copia collegamento in clipboard" + +[Link-copied-to-clipboard] +other = "Collegamento copiato dalla clipboard!" diff --git a/themes/relearn/i18n/ja.toml b/themes/relearn/i18n/ja.toml new file mode 100644 index 0000000..86e0ca9 --- /dev/null +++ b/themes/relearn/i18n/ja.toml @@ -0,0 +1,68 @@ +[Search-placeholder] +other = "検索..." + +[Clear-History] +other = "履歴削除" + +[Attachments-label] +other = "添付" + +[title-404] +other = "エラー" + +[message-404] +other = "おっと。ページが見当たりません。 ¯\\_(ツ)_/¯." + +[Go-to-homepage] +other = "ホームページへ行く" + +[Edit-this-page] +other = "編集" + +[Print-this-chapter] +other = "章全体を印刷する" + +[Shortcuts-Title] +other = "更に" + +[Expand-title] +other = "開く..." + +[Navigation-toggle] +other = "メニュー" + +[Toc-toggle] +other = "目次" + +[Byte-symbol] +other = "B" + +[Kilobyte-symbol] +other = "KB" + +[Megabyte-symbol] +other = "MB" + +[note] +other = "手記" + +[info] +other = "情報" + +[tip] +other = "先端" + +[warning] +other = "警告" + +[Copy-to-clipboard] +other = "クリップボードにコピー" + +[Copied-to-clipboard] +other = "クリップボードにコピー!" + +[Copy-link-to-clipboard] +other = "リンクをクリップボードにコピー" + +[Link-copied-to-clipboard] +other = "リンクをクリップボードにコピーしました!" diff --git a/themes/relearn/i18n/kr.toml b/themes/relearn/i18n/kr.toml new file mode 100644 index 0000000..d7f95c2 --- /dev/null +++ b/themes/relearn/i18n/kr.toml @@ -0,0 +1,71 @@ +[Search-placeholder] +other = "검색어를 입력하세요." + +[Clear-History] +other = "방문 기록 삭제" + +[Attachments-label] +other = "첨부파일" + +[title-404] +other = "오류" + +[message-404] +other = "존재하지 않는 페이지입니다." + +[Go-to-homepage] +other = "메인화면" + +[Edit-this-page] +other = "편집" + +[Print-this-chapter] +other = "전체 장 인쇄" + +[Shortcuts-Title] +other = "외부 링크" + +[Expand-title] +other = "더 보기" + +[Navigation-toggle] +other = "메뉴" + +[Toc-toggle] +other = "목차" + +[Byte-symbol] +other = "B" + +[Kilobyte-symbol] +other = "KB" + +[Megabyte-symbol] +other = "MB" + +[note] +# code snippent 내의 comment(주석)과의 혼동 방지를 위해 위와 같이 번역합니다. +other = "주" + +[info] +# 예제 내용상 learn theme 참고 용도로 사용되어 위와 같이 번역합니다. +other = "참고" + +[tip] +# 우리말 순화어로 기록 가능하고, note, info와 의미상 좀 더 명확한 구분이 되어 아래처럼 기록합니다. +other = "도움말" + +[warning] +other = "주의" + +[Copy-to-clipboard] +other = "클립보드에 복사" + +[Copied-to-clipboard] +other = "클립보드에 복사됐습니다!" + +[Copy-link-to-clipboard] +other = "링크를 클립보드에 복사" + +[Link-copied-to-clipboard] +other = "클립보드에 링크가 복사됐습니다!" diff --git a/themes/relearn/i18n/nl.toml b/themes/relearn/i18n/nl.toml new file mode 100644 index 0000000..39c338e --- /dev/null +++ b/themes/relearn/i18n/nl.toml @@ -0,0 +1,68 @@ +[Search-placeholder] +other = "Zoeken..." + +[Clear-History] +other = "Wis geschiedenis" + +[Attachments-label] +other = "Bijlagen" + +[title-404] +other = "Error" + +[message-404] +other = "Blijkbaar bestaat deze pagina niet ¯\\_(ツ)_/¯." + +[Go-to-homepage] +other = "Naar startpagina" + +[Edit-this-page] +other = "Bewerken" + +[Print-this-chapter] +other = "Het hele hoofdstuk afdrukken" + +[Shortcuts-Title] +other = "Snelkoppelingen" + +[Expand-title] +other = "Lees meer..." + +[Navigation-toggle] +other = "Menu" + +[Toc-toggle] +other = "Inhoudsopgave" + +[Byte-symbol] +other = "B" + +[Kilobyte-symbol] +other = "KB" + +[Megabyte-symbol] +other = "MB" + +[note] +other = "Notitie" + +[info] +other = "Info" + +[tip] +other = "Fooi" + +[warning] +other = "Waarschuwing" + +[Copy-to-clipboard] +other = "Naar klembord kopiëren" + +[Copied-to-clipboard] +other = "Gekopieerd naar klembord!" + +[Copy-link-to-clipboard] +other = "Link naar klembord kopiëren" + +[Link-copied-to-clipboard] +other = "Link gekopieerd naar klembord!" diff --git a/themes/relearn/i18n/pir.toml b/themes/relearn/i18n/pir.toml new file mode 100644 index 0000000..57e9dd0 --- /dev/null +++ b/themes/relearn/i18n/pir.toml @@ -0,0 +1,68 @@ +[Search-placeholder] +other = "Searrrch..." + +[Clear-History] +other = "Clear Historrry" + +[Attachments-label] +other = "Attachments" + +[title-404] +other = "Errror" + +[message-404] +other = "Woops. Looks like this plank doesn't exist ¯\\_(ツ)_/¯." + +[Go-to-homepage] +other = "Go t' homeplank" + +[Edit-this-page] +other = "Edit" + +[Print-this-chapter] +other = "Prrrint whole chapterrr" + +[Shortcuts-Title] +other = "Morrre" + +[Expand-title] +other = "Expand me..." + +[Navigation-toggle] +other = "Menu" + +[Toc-toggle] +other = "Table o' Contents" + +[Byte-symbol] +other = "B" + +[Kilobyte-symbol] +other = "KB" + +[Megabyte-symbol] +other = "MB" + +[note] +other = "Avast" + +[info] +other = "Ahoi" + +[tip] +other = "Smarrrt arrrse" + +[warning] +other = "Arrr" + +[Copy-to-clipboard] +other = "Copy t' clipboard" + +[Copied-to-clipboard] +other = "Copied t' clipboard!" + +[Copy-link-to-clipboard] +other = "Copy link t' clipboard" + +[Link-copied-to-clipboard] +other = "Copied link t' clipboard!" diff --git a/themes/relearn/i18n/pl.toml b/themes/relearn/i18n/pl.toml new file mode 100644 index 0000000..b6ce7d9 --- /dev/null +++ b/themes/relearn/i18n/pl.toml @@ -0,0 +1,68 @@ +[Search-placeholder] +other = "Szukaj..." + +[Clear-History] +other = "Wyczyść historię" + +[Attachments-label] +other = "Załączniki" + +[title-404] +other = "Błąd" + +[message-404] +other = "Ups. Wygląda na to, że strona nie istnieje ¯\\_(ツ)_/¯." + +[Go-to-homepage] +other = "Idź do strony paczątkowej" + +[Edit-this-page] +other = "Edycja" + +[Print-this-chapter] +other = "Drukowanie całego rozdziału" + +[Shortcuts-Title] +other = "Więcej" + +[Expand-title] +other = "Rozwiń mnie..." + +[Navigation-toggle] +other = "Menu" + +[Toc-toggle] +other = "Spis terści" + +[Byte-symbol] +other = "B" + +[Kilobyte-symbol] +other = "KB" + +[Megabyte-symbol] +other = "MB" + +[note] +other = "Uwaga" + +[info] +other = "Info" + +[tip] +other = "Porada" + +[warning] +other = "Ostrzeżenie" + +[Copy-to-clipboard] +other = "Kopiuj do schowaka" + +[Copied-to-clipboard] +other = "Skopiowano do schowka!" + +[Copy-link-to-clipboard] +other = "Kopiuj link do schowka" + +[Link-copied-to-clipboard] +other = "Skopiowano link do schowka!" diff --git a/themes/relearn/i18n/pt.toml b/themes/relearn/i18n/pt.toml new file mode 100644 index 0000000..414c663 --- /dev/null +++ b/themes/relearn/i18n/pt.toml @@ -0,0 +1,68 @@ +[Search-placeholder] +other = "Procurar..." + +[Clear-History] +other = "Limpar Histórico" + +[Attachments-label] +other = "Anexos" + +[title-404] +other = "Erro" + +[message-404] +other = "Ops. Parece que a página não existe ¯\\_(ツ)_/¯." + +[Go-to-homepage] +other = "Ir para o início" + +[Edit-this-page] +other = "Editar" + +[Print-this-chapter] +other = "Imprimir capítulo inteiro" + +[Shortcuts-Title] +other = "Mais" + +[Expand-title] +other = "Expandir..." + +[Navigation-toggle] +other = "Menu" + +[Toc-toggle] +other = "Índice" + +[Byte-symbol] +other = "B" + +[Kilobyte-symbol] +other = "KB" + +[Megabyte-symbol] +other = "MB" + +[note] +other = "Nota" + +[info] +other = "Informação" + +[tip] +other = "Dica" + +[warning] +other = "Aviso" + +[Copy-to-clipboard] +other = "Copiar para a área de transferência" + +[Copied-to-clipboard] +other = "Copiado para a área de transferência!" + +[Copy-link-to-clipboard] +other = "Link de cópia para a área de transferência" + +[Link-copied-to-clipboard] +other = "Link copiado para a área de transferência!" diff --git a/themes/relearn/i18n/ru.toml b/themes/relearn/i18n/ru.toml new file mode 100644 index 0000000..bc4fd25 --- /dev/null +++ b/themes/relearn/i18n/ru.toml @@ -0,0 +1,68 @@ +[Search-placeholder] +other = "Поиск..." + +[Clear-History] +other = "Очистить историю" + +[Attachments-label] +other = "Присоединенные файлы" + +[title-404] +other = "Ошибка" + +[message-404] +other = "Упс. Выглядит будто такой страницы нет ¯\\_(ツ)_/¯." + +[Go-to-homepage] +other = "Перейти на главную" + +[Edit-this-page] +other = "редактировать" + +[Print-this-chapter] +other = "Печать всей главы" + +[Shortcuts-Title] +other = "Еще" + +[Expand-title] +other = "Развернуть..." + +[Navigation-toggle] +other = "Меню" + +[Toc-toggle] +other = "Оглавление" + +[Byte-symbol] +other = "Б" + +[Kilobyte-symbol] +other = "КБ" + +[Megabyte-symbol] +other = "МБ" + +[note] +other = "Заметка" + +[info] +other = "Информация" + +[tip] +other = "Совет" + +[warning] +other = "Внимание" + +[Copy-to-clipboard] +other = "Копировать в буфер" + +[Copied-to-clipboard] +other = "Скопировано в буфер обмена!" + +[Copy-link-to-clipboard] +other = "Скопировать ссылку в буфер обмена" + +[Link-copied-to-clipboard] +other = "Ссылка скопирована в буфер обмена!" diff --git a/themes/relearn/i18n/tr.toml b/themes/relearn/i18n/tr.toml new file mode 100644 index 0000000..ea443ae --- /dev/null +++ b/themes/relearn/i18n/tr.toml @@ -0,0 +1,68 @@ +[Search-placeholder] +other = "Ara..." + +[Clear-History] +other = "Geçmişi Temizle" + +[Attachments-label] +other = "Ekler" + +[title-404] +other = "Hata" + +[message-404] +other = "Uups. Görünüşe göre böyle bir sayfa yok ¯\\_(ツ)_/¯" + +[Go-to-homepage] +other = "Anasayfaya dön" + +[Edit-this-page] +other = "Düzenlemek" + +[Print-this-chapter] +other = "Bölümün tamamını yazdır" + +[Shortcuts-Title] +other = "Dahası Var" + +[Expand-title] +other = "Genişlet..." + +[Navigation-toggle] +other = "Menü" + +[Toc-toggle] +other = "İçindekiler" + +[Byte-symbol] +other = "B" + +[Kilobyte-symbol] +other = "KB" + +[Megabyte-symbol] +other = "MB" + +[note] +other = "Not" + +[info] +other = "Bilgi" + +[tip] +other = "Bahşiş" + +[warning] +other = "Uyarı" + +[Copy-to-clipboard] +other = "Panoya kopyala" + +[Copied-to-clipboard] +other = "Panoya kopyalanmış!" + +[Copy-link-to-clipboard] +other = "Bağlantıyı panoya kopyala" + +[Link-copied-to-clipboard] +other = "Panoya bağlantı kopyalanmış!" diff --git a/themes/relearn/i18n/vn.toml b/themes/relearn/i18n/vn.toml new file mode 100644 index 0000000..bfb5e41 --- /dev/null +++ b/themes/relearn/i18n/vn.toml @@ -0,0 +1,71 @@ +[Search-placeholder] +other = "Tìm kiếm..." + +[Clear-History] +other = "Xóa lịch sử.." + +[Attachments-label] +other = "Tập tin đính kèm" + +[title-404] +other = "Lỗi" + +[message-404] +other = "Tiếc quá! Có vẻ như trang này không tồn tại ¯\\_(ツ)_/¯." + +[Go-to-homepage] +other = "Đi đến trang chủ" + +[Edit-this-page] +other = "Biên tập" + +[Print-this-chapter] +other = "In toàn bộ chương" + +[Shortcuts-Title] +other = "Nội dung khác" + +[Expand-title] +other = "Mở rộng..." + +[Navigation-toggle] +other = "Menu" + +[Toc-toggle] +other = "Mục lục" + +[BinaryPrefix-kilobyte] +other = "kb" + +[Byte-symbol] +other = "B" + +[Kilobyte-symbol] +other = "KB" + +[Megabyte-symbol] +other = "MB" + +[note] +other = "Ghi chú" + +[info] +other = "Thông tin" + +[tip] +other = "Mẹo vặt" + +[warning] +other = "Cảnh báo" + +[Copy-to-clipboard] +other = "Sao chép vào bảng tạm" + +[Copied-to-clipboard] +other = "Sao chép vào bảng tạm!" + +[Copy-link-to-clipboard] +other = "Sao chép nối kết vào bảng tạm" + +[Link-copied-to-clipboard] +other = "Liên kết được sao chép vào bảng tạm!" diff --git a/themes/relearn/i18n/zh-cn.toml b/themes/relearn/i18n/zh-cn.toml new file mode 100644 index 0000000..3227877 --- /dev/null +++ b/themes/relearn/i18n/zh-cn.toml @@ -0,0 +1,68 @@ +[Search-placeholder] +other = "搜索..." + +[Clear-History] +other = "清理历史记录" + +[Attachments-label] +other = "附件" + +[title-404] +other = "错误" + +[message-404] +other = "哎哟。 看起来这个页面不存在 ¯\\_(ツ)_/¯。" + +[Go-to-homepage] +other = "转到主页" + +[Edit-this-page] +other = "编辑" + +[Print-this-chapter] +other = "打印整章" + +[Shortcuts-Title] +other = "更多" + +[Expand-title] +other = "展开" + +[Navigation-toggle] +other = "导航" + +[Toc-toggle] +other = "目录" + +[Byte-symbol] +other = "B" + +[Kilobyte-symbol] +other = "KB" + +[Megabyte-symbol] +other = "MB" + +[note] +other = "注释" + +[info] +other = "信息" + +[tip] +other = "提示" + +[warning] +other = "警告" + +[Copy-to-clipboard] +other = "复制到剪贴板" + +[Copied-to-clipboard] +other = "复制到剪贴板!" + +[Copy-link-to-clipboard] +other = "将链接复制到剪贴板" + +[Link-copied-to-clipboard] +other = "链接复制到剪贴板!" diff --git a/themes/relearn/i18n/zh-tw.toml b/themes/relearn/i18n/zh-tw.toml new file mode 100644 index 0000000..adfb430 --- /dev/null +++ b/themes/relearn/i18n/zh-tw.toml @@ -0,0 +1,68 @@ +[Search-placeholder] +other = "搜尋..." + +[Clear-History] +other = "清除歷史紀錄" + +[Attachments-label] +other = "附件" + +[title-404] +other = "錯誤" + +[message-404] +other = "這個網頁已經被刪除、移動或從未存在" + +[Go-to-homepage] +other = "回到首頁" + +[Edit-this-page] +other = "編輯網頁" + +[Print-this-chapter] +other = "列印整章" + +[Shortcuts-Title] +other = "更多" + +[Expand-title] +other = "展開" + +[Navigation-toggle] +other = "導航" + +[Toc-toggle] +other = "目錄" + +[Byte-symbol] +other = "B" + +[Kilobyte-symbol] +other = "KB" + +[Megabyte-symbol] +other = "MB" + +[note] +other = "註釋" + +[info] +other = "資訊" + +[tip] +other = "提示" + +[warning] +other = "警告" + +[Copy-to-clipboard] +other = "複製到剪貼板" + +[Copied-to-clipboard] +other = "複製到剪貼簿!" + +[Copy-link-to-clipboard] +other = "將連結複製到剪貼簿" + +[Link-copied-to-clipboard] +other = "連結複製到剪貼簿!" diff --git a/themes/relearn/images/screenshot.png b/themes/relearn/images/screenshot.png new file mode 100644 index 0000000..8f7df24 Binary files /dev/null and b/themes/relearn/images/screenshot.png differ diff --git a/themes/relearn/images/tn.png b/themes/relearn/images/tn.png new file mode 100644 index 0000000..316339a Binary files /dev/null and b/themes/relearn/images/tn.png differ diff --git a/themes/relearn/layouts/404.html b/themes/relearn/layouts/404.html new file mode 100644 index 0000000..ddbaadb --- /dev/null +++ b/themes/relearn/layouts/404.html @@ -0,0 +1,41 @@ +{{- .Scratch.Set "relearnOutputFormat" "HTML" }} + + + + {{- partial "meta.html" . }} + {{- .Scratch.Add "title" "" }} + {{- if eq .Site.Data.titles .Title }} + {{- .Scratch.Set "title" (index .Site.Data.titles .Title).title }} + {{- else }} + {{- .Scratch.Set "title" .Title}} + {{- end }} + {{ .Scratch.Get "title" }} {{ default "::" .Site.Params.titleSeparator }} {{ .Site.Title }} + + {{- partial "favicon.html" . }} + {{- partial "stylesheet.html" . }} + + {{- partial "custom-header.html" . }} + + +
+ +
+
+

{{ T "title-404" }}

+

+

{{ T "message-404" }}

+

+

{{ T "Go-to-homepage" }}

+

Page not found!

+
+
+
+ + diff --git a/themes/relearn/layouts/_default/_markup/render-codeblock-mermaid.html b/themes/relearn/layouts/_default/_markup/render-codeblock-mermaid.html new file mode 100644 index 0000000..ee8fb37 --- /dev/null +++ b/themes/relearn/layouts/_default/_markup/render-codeblock-mermaid.html @@ -0,0 +1,4 @@ +
+ {{- safeHTML .Inner -}} +
+{{- .Page.Store.Set "htmlHasMermaid" true }} diff --git a/themes/relearn/layouts/_default/list.html b/themes/relearn/layouts/_default/list.html new file mode 100644 index 0000000..7a50069 --- /dev/null +++ b/themes/relearn/layouts/_default/list.html @@ -0,0 +1,2 @@ +{{- .Scratch.Set "relearnOutputFormat" "HTML" }} +{{- partial "_list.html" . }} \ No newline at end of file diff --git a/themes/relearn/layouts/_default/list.print.html b/themes/relearn/layouts/_default/list.print.html new file mode 100644 index 0000000..eac72a3 --- /dev/null +++ b/themes/relearn/layouts/_default/list.print.html @@ -0,0 +1,2 @@ +{{- .Scratch.Set "relearnOutputFormat" "PRINT" }} +{{- partial "_list.html" . }} \ No newline at end of file diff --git a/themes/relearn/layouts/_default/rss.xml b/themes/relearn/layouts/_default/rss.xml new file mode 100644 index 0000000..f2bde74 --- /dev/null +++ b/themes/relearn/layouts/_default/rss.xml @@ -0,0 +1,42 @@ +{{- printf "" | safeHTML }} +{{- partial "page-meta.hugo" . }} +{{- $pages := .Page.Pages }} +{{- if .Page.IsHome }} + {{- $pages = .Page.Sections }} +{{- else if .Page.Sections}} + {{- $pages = (.Page.Pages | union .Page.Sections) }} +{{- end }} +{{- $limit := .Site.Config.Services.RSS.Limit -}} +{{- if ge $limit 0 -}} + {{- $pages = $pages | first $limit -}} +{{- end }} + + + {{ if eq .Title .Site.Title }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{.}} on {{ end }}{{ .Site.Title }}{{ end }} + {{ .Permalink }} + Recent content {{ if ne .Title .Site.Title }}{{ with .Title }}in {{.}} {{ end }}{{ end }}on {{ .Site.Title }} + Hugo -- gohugo.io{{ with .Site.LanguageCode }} + {{.}}{{end}}{{ with .Site.Author.email }} + {{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}{{end}}{{ with .Site.Author.email }} + {{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}{{end}}{{ with .Site.Copyright }} + {{.}}{{end}}{{ if not .Date.IsZero }} + {{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}{{ end }} + {{- with .OutputFormats.Get "RSS" -}} + {{ printf "" .Permalink .MediaType | safeHTML }} + {{- end -}} + {{- range $pages }} + {{- if and .Permalink .Title (or (ne (.Scratch.Get "relearnIsHiddenStem") true) (ne .Site.Params.disableSeoHiddenPages true) ) }} + + {{ .Title }} + {{ .Permalink }} + {{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }} + {{- with .Site.Author.email }} + {{.}}{{ with $.Site.Author.name }} ({{.}}){{end}} + {{- end }} + {{ .Permalink }} + {{ .Summary | html }} + + {{- end }} + {{- end }} + + \ No newline at end of file diff --git a/themes/relearn/layouts/_default/single.html b/themes/relearn/layouts/_default/single.html new file mode 100644 index 0000000..d792465 --- /dev/null +++ b/themes/relearn/layouts/_default/single.html @@ -0,0 +1,2 @@ +{{- .Scratch.Set "relearnOutputFormat" "HTML" }} +{{- partial "_single.html" . }} \ No newline at end of file diff --git a/themes/relearn/layouts/_default/single.print.html b/themes/relearn/layouts/_default/single.print.html new file mode 100644 index 0000000..9403344 --- /dev/null +++ b/themes/relearn/layouts/_default/single.print.html @@ -0,0 +1,2 @@ +{{- .Scratch.Set "relearnOutputFormat" "PRINT" }} +{{- partial "_single.html" . }} \ No newline at end of file diff --git a/themes/relearn/layouts/_default/sitemap.xml b/themes/relearn/layouts/_default/sitemap.xml new file mode 100644 index 0000000..86c52db --- /dev/null +++ b/themes/relearn/layouts/_default/sitemap.xml @@ -0,0 +1,24 @@ +{{ printf "" | safeHTML }} +{{- partial "page-meta.hugo" . }} + +{{- range .Data.Pages }} +{{- if and .Title (or (ne (.Scratch.Get "relearnIsHiddenStem") true) (ne .Site.Params.disableSeoHiddenPages true) ) }} + + {{ .Permalink }}{{ if not .Lastmod.IsZero }} + {{ safeHTML ( .Lastmod.Format "2006-01-02T15:04:05-07:00" ) }}{{ end }}{{ with .Sitemap.ChangeFreq }} + {{ . }}{{ end }}{{ if ge .Sitemap.Priority 0.0 }} + {{ .Sitemap.Priority }}{{ end }}{{ if .IsTranslated }}{{ range .Translations }} + {{ end }} + {{ end }} + +{{- end -}} +{{- end }} + diff --git a/themes/relearn/layouts/_default/taxonomy.html b/themes/relearn/layouts/_default/taxonomy.html new file mode 100644 index 0000000..fb0e02a --- /dev/null +++ b/themes/relearn/layouts/_default/taxonomy.html @@ -0,0 +1,2 @@ +{{- .Scratch.Set "relearnOutputFormat" "HTML" }} +{{- partial "_taxonomy.html" . }} \ No newline at end of file diff --git a/themes/relearn/layouts/_default/taxonomy.print.html b/themes/relearn/layouts/_default/taxonomy.print.html new file mode 100644 index 0000000..9c47723 --- /dev/null +++ b/themes/relearn/layouts/_default/taxonomy.print.html @@ -0,0 +1,2 @@ +{{- .Scratch.Set "relearnOutputFormat" "PRINT" }} +{{- partial "_taxonomy.html" . }} \ No newline at end of file diff --git a/themes/relearn/layouts/index.html b/themes/relearn/layouts/index.html new file mode 100644 index 0000000..8eae7b7 --- /dev/null +++ b/themes/relearn/layouts/index.html @@ -0,0 +1,2 @@ +{{- .Scratch.Set "relearnOutputFormat" "HTML" }} +{{- partial "_index.html" . }} \ No newline at end of file diff --git a/themes/relearn/layouts/index.json b/themes/relearn/layouts/index.json new file mode 100644 index 0000000..d329ce3 --- /dev/null +++ b/themes/relearn/layouts/index.json @@ -0,0 +1,7 @@ +{{- $pages := slice }} +{{- range .Site.Pages }} +{{- if and .Title (or (ne (.Scratch.Get "relearnIsHiddenStem") true) (ne .Site.Params.disableSearchHiddenPages true) ) }} +{{- $pages = $pages | append (dict "uri" .RelPermalink "title" .Title "tags" .Params.tags "description" .Description "content" (.Plain | htmlUnescape)) }} +{{- end }} +{{- end }} +{{- $pages | jsonify (dict "indent" " ") }} diff --git a/themes/relearn/layouts/index.print.html b/themes/relearn/layouts/index.print.html new file mode 100644 index 0000000..6d7193e --- /dev/null +++ b/themes/relearn/layouts/index.print.html @@ -0,0 +1,2 @@ +{{- .Scratch.Set "relearnOutputFormat" "PRINT" }} +{{- partial "_index.html" . }} \ No newline at end of file diff --git a/themes/relearn/layouts/partials/_index.html b/themes/relearn/layouts/partials/_index.html new file mode 100644 index 0000000..8250488 --- /dev/null +++ b/themes/relearn/layouts/partials/_index.html @@ -0,0 +1,25 @@ +{{- partial "header.html" . }} +{{- if .Site.Home.Content }} + {{- if eq (.Scratch.Get "relearnOutputFormat") "PRINT" }} + {{- partial "body.print.html" .Site.Home }} + {{- else }} + {{- partial "body.html" .Site.Home }} + {{- end }} +{{- else }} +
+ +

Customize your own home page

+

+ The site is working. Don't forget to customize this page with your own. You typically have 3 choices : +

+
    +
  • 1. Create an _index.md document in content folder and fill it with Markdown content
  • +
  • 2. Create an index.html file in the static folder and fill the file with HTML content
  • +
  • 3. Configure your server to automatically redirect home page to one your documentation page
  • +
+ +
+
+
+{{- end }} +{{- partial "footer.html" . }} \ No newline at end of file diff --git a/themes/relearn/layouts/partials/_list.html b/themes/relearn/layouts/partials/_list.html new file mode 100644 index 0000000..3f7b1df --- /dev/null +++ b/themes/relearn/layouts/partials/_list.html @@ -0,0 +1,7 @@ +{{- partial "header.html" . }} +{{- if eq (.Scratch.Get "relearnOutputFormat") "PRINT" }} + {{- partial "body.print.html" . }} +{{- else }} + {{- partial "body.html" . }} +{{- end }} +{{- partial "footer.html" . }} \ No newline at end of file diff --git a/themes/relearn/layouts/partials/_single.html b/themes/relearn/layouts/partials/_single.html new file mode 100644 index 0000000..3f7b1df --- /dev/null +++ b/themes/relearn/layouts/partials/_single.html @@ -0,0 +1,7 @@ +{{- partial "header.html" . }} +{{- if eq (.Scratch.Get "relearnOutputFormat") "PRINT" }} + {{- partial "body.print.html" . }} +{{- else }} + {{- partial "body.html" . }} +{{- end }} +{{- partial "footer.html" . }} \ No newline at end of file diff --git a/themes/relearn/layouts/partials/_taxonomy.html b/themes/relearn/layouts/partials/_taxonomy.html new file mode 100644 index 0000000..7bdf074 --- /dev/null +++ b/themes/relearn/layouts/partials/_taxonomy.html @@ -0,0 +1,22 @@ +{{- partial "header.html" . }} +
+ +

{{ if eq .Kind "term" }}{{ .Data.Singular | humanize }} {{ default "::" .Site.Params.titleSeparator }} {{ end }}{{ .Title }}

+
    + {{- range .Data.Terms.Alphabetical }} + {{- if and .Page.Title (or (ne (.Page.Scratch.Get "relearnIsHiddenStem") true) (ne .Page.Site.Params.disableTagHiddenPages true) ) }} +
  • {{ .Page.Title }} ({{ len .Pages }})
  • + {{- end }} + {{- else }} + {{- range sort .Pages "Title" }} + {{- if and .Title (or (ne (.Scratch.Get "relearnIsHiddenStem") true) (ne .Site.Params.disableTagHiddenPages true) ) }} +
  • {{ .Title }}
  • + {{- end }} + {{- end }} + {{- end }} +
+ +
+
+
+{{- partial "footer.html" . }} \ No newline at end of file diff --git a/themes/relearn/layouts/partials/article.html b/themes/relearn/layouts/partials/article.html new file mode 100644 index 0000000..1564dfa --- /dev/null +++ b/themes/relearn/layouts/partials/article.html @@ -0,0 +1,11 @@ +{{- $content := .content }} +{{- with .page }} + + +{{ if and (not .IsHome ) (not .Params.chapter) }}

{{ .Title }}

+{{ end }}{{ $content | safeHTML }} +
+ {{- partial "content-footer.html" . }} +
+ +{{- end }} \ No newline at end of file diff --git a/themes/relearn/layouts/partials/body.html b/themes/relearn/layouts/partials/body.html new file mode 100644 index 0000000..a92573d --- /dev/null +++ b/themes/relearn/layouts/partials/body.html @@ -0,0 +1 @@ +{{- partial "article.html" (dict "page" . "content" .Content) }} \ No newline at end of file diff --git a/themes/relearn/layouts/partials/body.print.html b/themes/relearn/layouts/partials/body.print.html new file mode 100644 index 0000000..9f1637f --- /dev/null +++ b/themes/relearn/layouts/partials/body.print.html @@ -0,0 +1,84 @@ +{{- $currentNode := . }} +{{- $isActive := .IsHome }} +{{- $pages := .Site.Home.Sections }} +{{- $defaultOrdersectionsby := .Site.Params.ordersectionsby | default "weight" }} +{{- $currentOrdersectionsby := .Site.Home.Params.ordersectionsby | default $defaultOrdersectionsby }} +{{- if $isActive }} + {{- template "section-print" dict "sect" . "currentnode" $currentNode }} + {{- if or .IsHome .Params.chapter $pages }} +
+ {{- end }} +{{- end }} +{{- if eq $currentOrdersectionsby "title" }} + {{- range $pages.ByTitle }} + {{- template "section-tree-print" dict "sect" . "currentnode" $currentNode "isActive" $isActive }} + {{- end }} +{{- else }} + {{- range $pages.ByWeight }} + {{- template "section-tree-print" dict "sect" . "currentnode" $currentNode "isActive" $isActive }} + {{- end }} +{{- end }} +{{- if $isActive }} + {{- if or .IsHome .Params.chapter $pages }} +
+ {{- end }} +{{- end }} +{{- define "section-tree-print" }} + {{- $currentNode := .currentnode }} + {{- $isActive := .isActive }} + {{- $currentFileRelPermalink := .currentnode.RelPermalink }} + {{- with .sect }} + {{- $isSelf := eq .RelPermalink $currentFileRelPermalink }} + {{- $isActive = or $isSelf $isActive }} + {{- $pages := .Pages }} + {{- if .Page.IsHome }} + {{- $pages = .Sections }} + {{- else if .Page.Sections}} + {{- $pages = (.Pages | union .Sections) }} + {{- end }} + {{- $relearnIsHiddenFrom := index ($currentNode.Scratch.Get "relearnIsHiddenFrom") .RelPermalink }} + {{- $isAncestor := and (not $isSelf) (.IsAncestor $currentNode) }} + {{- $hidden := and $relearnIsHiddenFrom (not $.showhidden) (not $isSelf) (not $isAncestor) }} + {{- if $hidden }} + {{- else if or .IsSection .IsHome }} + {{- $defaultOrdersectionsby := .Site.Params.ordersectionsby | default "weight" }} + {{- $currentOrdersectionsby := .Params.ordersectionsby | default $defaultOrdersectionsby }} + {{- if $isActive }} + {{- template "section-print" dict "sect" . "currentnode" $currentNode }} + {{- if or .IsHome .Params.chapter $pages }} +
+ {{- end }} + {{- end }} + {{- if eq $currentOrdersectionsby "title" }} + {{- range $pages.ByTitle }} + {{- template "section-tree-print" dict "sect" . "currentnode" $currentNode "isActive" $isActive }} + {{- end }} + {{- else }} + {{- range $pages.ByWeight }} + {{- template "section-tree-print" dict "sect" . "currentnode" $currentNode "isActive" $isActive }} + {{- end }} + {{- end }} + {{- if $isActive }} + {{- if or .IsHome .Params.chapter $pages }} +
+ {{- end }} + {{- end }} + {{- else }} + {{- if $isActive }} + {{- template "section-print" dict "sect" . "currentnode" $currentNode }} + {{- end }} + {{- end }} + {{- end }} +{{- end }} +{{- define "section-print" }} + {{- $currentNode := .currentnode }} + {{- with .sect }} + {{- $currentNode.Page.Store.Set "printHasMermaid" (or ($currentNode.Page.Store.Get "printHasMermaid") (.Page.Store.Get "htmlHasMermaid")) }} + {{- $currentNode.Page.Store.Set "printHasSwagger" (or ($currentNode.Page.Store.Get "printHasSwagger") (.Page.Store.Get "htmlHasSwagger")) }} + {{/* if we have a relative link in a print page, our print URL is one level to deep; so we are making it absolute to our page by prepending the page's permalink */}} + {{- $link_prefix := strings.TrimRight "/" .Page.RelPermalink }} + {{- $content := partial "content.html" . }} + {{- $content = replaceRE "((?:src|href)\\s*=(?:\\s*[\"']\\s*)?)(\\.[^\"'\\s>]*|[\\w]+[^\"'\\s>:]*)([\"'\\s>])" (printf "${1}%s/${2}${3}" $link_prefix) $content }} + {{- partial "article.html" (dict "page" . "content" $content) }} + {{- end }} +{{- end }} \ No newline at end of file diff --git a/themes/relearn/layouts/partials/content-footer.html b/themes/relearn/layouts/partials/content-footer.html new file mode 100644 index 0000000..5451a4e --- /dev/null +++ b/themes/relearn/layouts/partials/content-footer.html @@ -0,0 +1,6 @@ +{{- with .Params.LastModifierDisplayName }} + {{ with $.Params.LastModifierEmail }}{{ end }}{{ . }}{{ with $.Params.LastModifierEmail }}{{ end }} + {{- with $.Date }} + {{ . | time.Format ":date_medium" }} + {{- end }} +{{- end }} \ No newline at end of file diff --git a/themes/relearn/layouts/partials/content.html b/themes/relearn/layouts/partials/content.html new file mode 100644 index 0000000..ceeab0c --- /dev/null +++ b/themes/relearn/layouts/partials/content.html @@ -0,0 +1 @@ +{{- .Content }} \ No newline at end of file diff --git a/themes/relearn/layouts/partials/custom-comments.html b/themes/relearn/layouts/partials/custom-comments.html new file mode 100644 index 0000000..53f5831 --- /dev/null +++ b/themes/relearn/layouts/partials/custom-comments.html @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/themes/relearn/layouts/partials/custom-footer.html b/themes/relearn/layouts/partials/custom-footer.html new file mode 100644 index 0000000..daa6be7 --- /dev/null +++ b/themes/relearn/layouts/partials/custom-footer.html @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/themes/relearn/layouts/partials/custom-header.html b/themes/relearn/layouts/partials/custom-header.html new file mode 100644 index 0000000..ee449b0 --- /dev/null +++ b/themes/relearn/layouts/partials/custom-header.html @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/themes/relearn/layouts/partials/favicon.html b/themes/relearn/layouts/partials/favicon.html new file mode 100644 index 0000000..a77568f --- /dev/null +++ b/themes/relearn/layouts/partials/favicon.html @@ -0,0 +1,14 @@ + {{- $assetBusting := not .Site.Params.disableAssetsBusting }} + {{- if (fileExists "/static/images/favicon.svg") }} + + {{- else if (fileExists "/static/images/favicon.png") }} + + {{- else if (fileExists "/static/images/favicon.ico") }} + + {{- else if (fileExists "/static/images/logo.svg") }} + + {{- else if (fileExists "/static/images/logo.png") }} + + {{- else if (fileExists "/static/images/logo.ico") }} + + {{- end }} \ No newline at end of file diff --git a/themes/relearn/layouts/partials/footer.html b/themes/relearn/layouts/partials/footer.html new file mode 100644 index 0000000..68c5080 --- /dev/null +++ b/themes/relearn/layouts/partials/footer.html @@ -0,0 +1,69 @@ + + + +{{- partial "custom-comments.html" . }} + +{{- partial "menu.html" . }} + + + +{{- $wantsMermaid := or (and (eq (.Scratch.Get "relearnOutputFormat") "HTML") (.Page.Store.Get "htmlHasMermaid")) (and (eq (.Scratch.Get "relearnOutputFormat") "PRINT") (.Page.Store.Get "printHasMermaid")) }} +{{- if $wantsMermaid }} + + {{- if isset .Params "custommermaidurl" }} + + {{- else if isset .Site.Params "custommermaidurl" }} + + {{- else }} + + {{- end }} + {{- if isset .Params "mermaidinitialize" }} + {{- $.Scratch.Set "mermaidInitialize" .Params.mermaidInitialize }} + {{- else if isset .Site.Params "mermaidinitialize" }} + {{- $.Scratch.Set "mermaidInitialize" .Site.Params.mermaidInitialize }} + {{- else }} + {{- $.Scratch.Set "mermaidInitialize" "{}" }} + {{- end }} + +{{- end }} +{{- $wantsSwagger := or (and (eq (.Scratch.Get "relearnOutputFormat") "HTML") (.Page.Store.Get "htmlHasSwagger")) (and (eq (.Scratch.Get "relearnOutputFormat") "PRINT") (.Page.Store.Get "printHasSwagger")) }} +{{- if $wantsSwagger }} + {{- if isset .Params "customswaggerurl" }} + + {{- else if isset .Site.Params "customswaggerurl" }} + + {{- else }} + + {{- end }} + {{- if isset .Params "swaggerinitialize" }} + {{- $.Scratch.Set "swaggerInitialize" .Params.swaggerInitialize }} + {{- else if isset .Site.Params "swaggerinitialize" }} + {{- $.Scratch.Set "swaggerInitialize" .Site.Params.swaggerInitialize }} + {{- else }} + {{- $.Scratch.Set "swaggerInitialize" "{}" }} + {{- end }} + +{{- end }} + + {{- partial "custom-footer.html" . }} + + diff --git a/themes/relearn/layouts/partials/header.html b/themes/relearn/layouts/partials/header.html new file mode 100644 index 0000000..0529745 --- /dev/null +++ b/themes/relearn/layouts/partials/header.html @@ -0,0 +1,125 @@ + + + + {{- partial "meta.html" . }} + {{ if and .Title (not (eq .Title .Site.Title)) }}{{ .Title }} {{ default "::" .Site.Params.titleSeparator }} {{ end}}{{ .Site.Title }} + + {{- if not (and .Title (or (ne (.Scratch.Get "relearnIsHiddenStem") true) (ne .Site.Params.disableSeoHiddenPages true) ) ) }} + {{- else }} + {{- range .AlternativeOutputFormats }} + {{- if ne .Name "JSON" }} + + {{- end }} + {{- end }} + {{- end }} + {{- if and (ne .Site.Params.disableSeoHiddenPages true) (ne .Site.Params.disableSearchHiddenPages true) }} + {{- range .AlternativeOutputFormats }} + {{- if eq .Name "JSON" }} + + {{- end }} + {{- end }} + {{- end }} + + {{- partial "favicon.html" . }} + {{- partial "stylesheet.html" . }} + {{- partial "custom-header.html" . }} + + +
+ +
+ +
+
+
+{{- partial "tags.html" . }} +
+{{- define "breadcrumb" }} + {{- $parent := .page.Parent }} + {{- $ispublished := gt (int (len .page.Permalink)) 0 }} + {{- $depth := .depth }} + {{- if $ispublished }} + {{- $depth = add $depth 1 }} + {{- end }} + {{- if $parent }} + {{- template "breadcrumb" dict "page" $parent "depth" $depth }} + {{- end }} + {{- if $ispublished }} +
  • {{if .page.Title}}{{ .page.Title }}{{else}}{{ .page.Site.Title }}{{end}}{{ if .depth }} > {{ end }}
  • + {{- end }} +{{- end }} \ No newline at end of file diff --git a/themes/relearn/layouts/partials/logo.html b/themes/relearn/layouts/partials/logo.html new file mode 100644 index 0000000..080da00 --- /dev/null +++ b/themes/relearn/layouts/partials/logo.html @@ -0,0 +1,59 @@ + + \ No newline at end of file diff --git a/themes/relearn/layouts/partials/menu-footer.html b/themes/relearn/layouts/partials/menu-footer.html new file mode 100644 index 0000000..478e2ef --- /dev/null +++ b/themes/relearn/layouts/partials/menu-footer.html @@ -0,0 +1,2 @@ + +

    Built with by Hugo

    \ No newline at end of file diff --git a/themes/relearn/layouts/partials/menu-post.html b/themes/relearn/layouts/partials/menu-post.html new file mode 100644 index 0000000..1022847 --- /dev/null +++ b/themes/relearn/layouts/partials/menu-post.html @@ -0,0 +1 @@ +{{ .Params.Post | safeHTML }} \ No newline at end of file diff --git a/themes/relearn/layouts/partials/menu-pre.html b/themes/relearn/layouts/partials/menu-pre.html new file mode 100644 index 0000000..0552d7a --- /dev/null +++ b/themes/relearn/layouts/partials/menu-pre.html @@ -0,0 +1 @@ +{{ .Params.Pre | safeHTML }} \ No newline at end of file diff --git a/themes/relearn/layouts/partials/menu.html b/themes/relearn/layouts/partials/menu.html new file mode 100644 index 0000000..d5a18b7 --- /dev/null +++ b/themes/relearn/layouts/partials/menu.html @@ -0,0 +1,171 @@ + + {{- $showvisitedlinks := .Site.Params.showVisitedLinks }} + + {{- define "section-tree-nav" }} + {{- $currentNode := .currentnode }} + {{- $showvisitedlinks := .showvisitedlinks }} + {{- $alwaysopen := .alwaysopen }} + {{- $currentFileRelPermalink := .currentnode.RelPermalink }} + {{- with .sect }} + {{- $isSelf := eq .RelPermalink $currentFileRelPermalink }} + {{- $isAncestor := and (not $isSelf) (.IsAncestor $currentNode) }} + {{- $isActive := $isSelf }} + {{- $pages := .Pages }} + {{- if .Page.IsHome }} + {{- $pages = .Sections }} + {{- else if .Page.Sections}} + {{- $pages = (.Pages | union .Sections) }} + {{- end }} + {{- $relearnIsHiddenFrom := index ($currentNode.Scratch.Get "relearnIsHiddenFrom") .RelPermalink }} + {{- $hidden := and $relearnIsHiddenFrom (not $.showhidden) (not $isSelf) (not $isAncestor) }} + {{- if $hidden }} + {{- else if or .IsSection .IsHome }} + {{- $numberOfVisibleChildren := 0 }} + {{- range $pages }} + {{- $isSelfSub := eq .RelPermalink $currentFileRelPermalink }} + {{- $isAncestorSub := and (not $isSelf) (.IsAncestor $currentNode) }} + {{- $relearnIsSubHiddenFrom := index ($currentNode.Scratch.Get "relearnIsHiddenFrom") .RelPermalink }} + {{- $subHidden := and $relearnIsSubHiddenFrom (not $.showhidden) (not $isSelfSub) (not $isAncestorSub) }} + {{- $numberOfVisibleChildren = add $numberOfVisibleChildren (int (not $subHidden)) }} + {{- end }} + {{- safeHTML .Params.head }} + {{- if $numberOfVisibleChildren }} + {{- $defaultOrdersectionsby := .Site.Params.ordersectionsby | default "weight" }} + {{- $currentOrdersectionsby := .Params.ordersectionsby | default $defaultOrdersectionsby }} + {{- $currentAlwaysopen := .Params.alwaysopen | default $alwaysopen }} + {{- $pageHash := md5 .Page }} + {{- $isOpen := or $currentAlwaysopen $isSelf $isAncestor }} +
  • + {{- partial "menu-pre.html" . }}{{ or .Params.menuTitle .LinkTitle .Title }}{{ partial "menu-post.html" . }} + {{- if $showvisitedlinks }}{{ end }}
      + {{- $defaultAlwaysopen := .Site.Params.alwaysopen | default true }} + {{- if eq $currentOrdersectionsby "title" }} + {{- range $pages.ByTitle }} + {{- template "section-tree-nav" dict "sect" . "currentnode" $currentNode "showvisitedlinks" $showvisitedlinks "alwaysopen" $defaultAlwaysopen }} + {{- end }} + {{- else }} + {{- range $pages.ByWeight }} + {{- template "section-tree-nav" dict "sect" . "currentnode" $currentNode "showvisitedlinks" $showvisitedlinks "alwaysopen" $defaultAlwaysopen }} + {{- end }} + {{- end }}
  • + {{- else }} +
  • + {{- partial "menu-pre.html" . }}{{ or .Params.menuTitle .LinkTitle .Title }}{{ partial "menu-post.html" . }} + {{- if $showvisitedlinks }}{{ end }}
  • + {{- end }} + {{- else }} +
  • + {{- partial "menu-pre.html" . }}{{ or .Params.menuTitle .LinkTitle .Title }}{{ partial "menu-post.html" . }} + {{- if $showvisitedlinks }}{{ end }}
  • + {{- end }} + {{- end }} + {{- end }} \ No newline at end of file diff --git a/themes/relearn/layouts/partials/meta.html b/themes/relearn/layouts/partials/meta.html new file mode 100644 index 0000000..1d1cd80 --- /dev/null +++ b/themes/relearn/layouts/partials/meta.html @@ -0,0 +1,16 @@ + + + {{- $c:=""}}{{/* to avoid that user swiping to the left leaves a gap on the right side, we set minimum-scale, even if not advised to */}} + + {{ hugo.Generator }} + {{- $ver := partial "version.html" }} + {{- $ver = replaceRE "\\s*(\\S*)" "${1}" $ver }} + + {{- partial "page-meta.hugo" . }} + {{- if not (and .Title (or (ne (.Scratch.Get "relearnIsHiddenStem") true) (ne .Site.Params.disableSeoHiddenPages true) ) ) }} + + {{- end }} + + {{- with .Site.Params.author }} + + {{- end }} \ No newline at end of file diff --git a/themes/relearn/layouts/partials/page-meta.hugo b/themes/relearn/layouts/partials/page-meta.hugo new file mode 100644 index 0000000..d6a3219 --- /dev/null +++ b/themes/relearn/layouts/partials/page-meta.hugo @@ -0,0 +1,68 @@ +{{- $currentNode := . }} +{{- $currentNode.Scratch.Delete "relearnIsSelfFound" }} +{{- $currentNode.Scratch.Delete "relearnPrevPage" }} +{{- $currentNode.Scratch.Delete "relearnNextPage" }} +{{- $currentNode.Scratch.Delete "relearnSubPages" }} +{{- $currentNode.Scratch.Delete "relearnIsHiddenNode" }}{{/* the node itself is flagged as hidden */}} +{{- $currentNode.Scratch.Delete "relearnIsHiddenStem" }}{{/* the node or one of its parents is flagged as hidden */}} +{{- $currentNode.Scratch.Delete "relearnIsHiddenFrom" }}{{/* the node is hidden from the current page */}} +{{- $wantsMermaid := or (and (ne $currentNode.Params.disableMermaid nil) (not $currentNode.Params.disableMermaid)) (and (ne .Site.Params.disableMermaid nil) (not .Site.Params.disableMermaid)) }} +{{- if $wantsMermaid }} + {{- $currentNode.Page.Store.Set "htmlHasMermaid" true }} +{{- end }} +{{- $wantsSwagger := or (and (ne .Params.disableSwagger nil) (not .Params.disableSwagger)) (and (ne .Site.Params.disableSwagger nil) (not .Site.Params.disableSwagger)) }} +{{- if $wantsSwagger }} + {{- $currentNode.Page.Store.Set "htmlHasSwagger" true }} +{{- end }} +{{- template "relearn-structure" dict "node" .Site.Home "currentnode" $currentNode "hiddenstem" false "hiddencurrent" false "defaultOrdersectionsby" .Site.Params.ordersectionsby }} +{{- define "relearn-structure" }} + {{- $currentNode := .currentnode }} + {{- $isSelf := eq $currentNode.RelPermalink .node.RelPermalink }} + {{- $isDescendant := and (not $isSelf) (.node.IsDescendant $currentNode) }} + {{- $isAncestor := and (not $isSelf) (.node.IsAncestor $currentNode) }} + {{- $isOther := and (not $isDescendant) (not $isSelf) (not $isAncestor) }} + + {{- if $isSelf }} + {{- $currentNode.Scratch.Set "relearnIsSelfFound" true }} + {{- end}} + {{- $isSelfFound := eq ($currentNode.Scratch.Get "relearnIsSelfFound") true }} + {{- $isPreSelf := and (not $isSelfFound) (not $isSelf) }} + {{- $isPostSelf := and ($isSelfFound) (not $isSelf) }} + + {{- $hidden_node := or (.node.Params.hidden) (eq .node.Title "") }} + {{- $hidden_stem:= or $hidden_node .hiddenstem }} + {{- $hidden_current_stem:= or $hidden_node .hiddencurrent }} + {{- $hidden_from_current := or (and $hidden_node (not $isAncestor) (not $isSelf) ) (and .hiddencurrent (or $isPreSelf $isPostSelf $isDescendant) ) }} + {{- $currentNode.Scratch.SetInMap "relearnIsHiddenNode" .node.RelPermalink $hidden_node }} + {{- $currentNode.Scratch.SetInMap "relearnIsHiddenStem" .node.RelPermalink $hidden_stem }} + {{- $currentNode.Scratch.SetInMap "relearnIsHiddenFrom" .node.RelPermalink $hidden_current_stem }} + + {{- if not $hidden_from_current }} + {{- if $isPreSelf }} + {{- $currentNode.Scratch.Set "relearnPrevPage" .node }} + {{- else if and $isPostSelf (eq ($currentNode.Scratch.Get "relearnNextPage") nil) }} + {{- $currentNode.Scratch.Set "relearnNextPage" .node }} + {{- end}} + {{- end }} + + {{- $currentNode.Scratch.Set "relearnSubPages" .node.Pages }} + {{- if .node.IsHome }} + {{- $currentNode.Scratch.Set "relearnSubPages" .node.Sections }} + {{- else if .node.Sections }} + {{- $currentNode.Scratch.Set "relearnSubPages" (.node.Pages | union .node.Sections) }} + {{- end }} + {{- $pages := ($currentNode.Scratch.Get "relearnSubPages") }} + + {{- $defaultOrdersectionsby := .defaultOrdersectionsby }} + {{- $currentOrdersectionsby := .node.Params.ordersectionsby | default $defaultOrdersectionsby }} + + {{- if eq $currentOrdersectionsby "title"}} + {{- range $pages.ByTitle }} + {{- template "relearn-structure" dict "node" . "currentnode" $currentNode "hiddenstem" $hidden_stem "hiddencurrent" $hidden_from_current "defaultOrdersectionsby" $defaultOrdersectionsby }} + {{- end}} + {{- else}} + {{- range $pages.ByWeight }} + {{- template "relearn-structure" dict "node" . "currentnode" $currentNode "hiddenstem" $hidden_stem "hiddencurrent" $hidden_from_current "defaultOrdersectionsby" $defaultOrdersectionsby }} + {{- end}} + {{- end }} +{{- end }} \ No newline at end of file diff --git a/themes/relearn/layouts/partials/search.html b/themes/relearn/layouts/partials/search.html new file mode 100644 index 0000000..07cb7b0 --- /dev/null +++ b/themes/relearn/layouts/partials/search.html @@ -0,0 +1,9 @@ + + {{- $assetBusting := not .Site.Params.disableAssetsBusting }} + + + \ No newline at end of file diff --git a/themes/relearn/layouts/partials/stylesheet.html b/themes/relearn/layouts/partials/stylesheet.html new file mode 100644 index 0000000..9d51142 --- /dev/null +++ b/themes/relearn/layouts/partials/stylesheet.html @@ -0,0 +1,47 @@ + {{- $assetBusting := not .Site.Params.disableAssetsBusting }} + + + + + + + {{- $themevariants := slice | append (.Site.Params.themeVariant | default "relearn-light" ) }} + {{- with index $themevariants 0 }} + + {{- end }} + + + + {{- if .Site.Params.disableInlineCopyToClipBoard }} + + {{- end }} + + + \ No newline at end of file diff --git a/themes/relearn/layouts/partials/tags.html b/themes/relearn/layouts/partials/tags.html new file mode 100644 index 0000000..74cdc73 --- /dev/null +++ b/themes/relearn/layouts/partials/tags.html @@ -0,0 +1,8 @@ + +{{- if .Params.tags }} +
    +{{- range sort .Params.tags }} + {{ . }} +{{- end }} +
    +{{- end }} \ No newline at end of file diff --git a/themes/relearn/layouts/partials/toc.html b/themes/relearn/layouts/partials/toc.html new file mode 100644 index 0000000..ad37718 --- /dev/null +++ b/themes/relearn/layouts/partials/toc.html @@ -0,0 +1,6 @@ + +
    +
    +{{ .TableOfContents }} +
    +
    \ No newline at end of file diff --git a/themes/relearn/layouts/partials/version.html b/themes/relearn/layouts/partials/version.html new file mode 100644 index 0000000..02a3de3 --- /dev/null +++ b/themes/relearn/layouts/partials/version.html @@ -0,0 +1 @@ +4.0.3+tip diff --git a/themes/relearn/layouts/shortcodes/attachments.html b/themes/relearn/layouts/shortcodes/attachments.html new file mode 100644 index 0000000..358c4f8 --- /dev/null +++ b/themes/relearn/layouts/shortcodes/attachments.html @@ -0,0 +1,47 @@ +{{- $_hugo_config := `{ "version": 1 }` }} +{{- $style := .Get "style" | default "transparent" }} +{{- $title := .Get "title" | default ($style | T) | default ("Attachments-label" | T) }} +{{- $icon := .Get "icon" | default "" }} +{{- if and (not $icon) (eq (len $icon) 0) }} + {{- $icon = "paperclip" }} + {{- if eq $style "info" }}{{ $icon = default "info-circle" }}{{ end }} + {{- if eq $style "warning" }}{{ $icon = default "exclamation-triangle" }}{{ end }} + {{- if eq $style "note" }}{{ $icon = default "exclamation-circle" }}{{ end }} + {{- if eq $style "tip" }}{{ $icon = default "lightbulb" }}{{ end }} +{{- end }} +{{- $icon = trim $icon " " }} +{{- if and $icon (not (findRE ".*?\\bfa-\\w.*?" $icon)) }} + {{- $icon = printf "fa-fw fas fa-%s" $icon }} +{{- end }} +{{- $sort := .Get "sort" | default "asc" }} +{{- $pattern := .Get "pattern" | default "" }} +
    +
    {{ if $icon }} {{ end }}{{ $title }}
    +
      + {{- $filesName := "files" }} + {{- if ne .Page.File.BaseFileName "index" }} + {{- $filesName = printf "%s.files" .Page.File.BaseFileName }} + {{- end }} + {{- $fileLink := printf "%s/%s" (.Page.Language.ContentDir | default "content") .Page.File.Dir }} + {{- $fileLink = replace (replace $fileLink "\\" "/") "content/" "" }} + {{- $fileDir := printf "%s/%s" (.Page.Language.ContentDir | default "content") .Page.File.Dir }} + {{- $fileDir = replace $fileDir "\\" "/" }} + {{- range sort (readDir (printf "%s%s" $fileDir $filesName) ) "Name" $sort }} + {{- if findRE $pattern .Name}} + {{- $size := .Size }} + {{- $unit := "Byte-symbol" }} + {{- if ge $size 1024 }} + {{- $size = div $size 1024 }} + {{- $unit = "Kilobyte-symbol" }} + {{- end }} + {{- if ge $size 1024 }} + {{- $size = div $size 1024 }} + {{- $unit = "Megabyte-symbol" }} + {{- end }} + {{- $unitsymbol := $unit | T }} +
    • {{.Name}} ({{$size}} {{$unitsymbol}})
    • + {{- end }} + {{- end }} +
    + {{- .Inner }} +
    \ No newline at end of file diff --git a/themes/relearn/layouts/shortcodes/button.html b/themes/relearn/layouts/shortcodes/button.html new file mode 100644 index 0000000..035c2a3 --- /dev/null +++ b/themes/relearn/layouts/shortcodes/button.html @@ -0,0 +1,27 @@ +{{- $_hugo_config := `{ "version": 1 }` }} +{{- $href := .Get "href" }} +{{- $style := .Get "style" | default "transparent" }} +{{- $title := .Get "title" | default (.Inner) | default ($style | T) }} +{{- $icon := .Get "icon" | default "" }} +{{- if and (not $icon) (eq (len $icon) 0) }} + {{- if eq $style "info" }}{{ $icon = default "info-circle" }}{{ end }} + {{- if eq $style "warning" }}{{ $icon = default "exclamation-triangle" }}{{ end }} + {{- if eq $style "note" }}{{ $icon = default "exclamation-circle" }}{{ end }} + {{- if eq $style "tip" }}{{ $icon = default "lightbulb" }}{{ end }} +{{- end }} +{{- $icon = trim $icon " " }} +{{- if and $icon (not (findRE ".*?\\bfa-\\w.*?" $icon)) }} + {{- $icon = printf "fa-fw fas fa-%s" $icon }} +{{- end }} +{{- $iconposition := .Get "icon-position" | default "left" }} + + + {{- if and $icon (eq $iconposition "left") }} + + {{- end }} + {{ $title }} + {{- if and $icon (eq $iconposition "right") }} + + {{- end }} + + \ No newline at end of file diff --git a/themes/relearn/layouts/shortcodes/children.html b/themes/relearn/layouts/shortcodes/children.html new file mode 100644 index 0000000..246ff31 --- /dev/null +++ b/themes/relearn/layouts/shortcodes/children.html @@ -0,0 +1,105 @@ +{{- $_hugo_config := `{ "version": 1 }` }} +{{- $showhidden := .Get "showhidden" | default false }} +{{- if eq (printf "%T" $showhidden) "string" }} + {{- $showhidden = (eq $showhidden "true") }} +{{- end }} +{{- $style := .Get "style" | default "li" }} +{{- $depth := .Get "depth" | default 1 }} +{{- $withDescription := .Get "description" | default false }} +{{- if eq (printf "%T" $withDescription) "string" }} + {{- $withDescription = (eq $withDescription "true") }} +{{- end }} +{{- $sortTerm := .Get "sort" | lower }} +{{- $containerstyle := .Get "containerstyle" | default "ul" }} +{{- if( and (not (eq $style "li") ) (eq $containerstyle "ul" ) ) }} + {{- $containerstyle = "div" }} +{{- end }} + +{{ (printf "<%s class=\"children children-%s children-sort-%s\">" $containerstyle $style $sortTerm)|safeHTML }} + {{- $pages := .Page.Pages }} + {{- if .Page.IsHome }} + {{- $pages = .Page.Sections }} + {{- else if .Page.Sections}} + {{- $pages = (.Page.Pages | union .Page.Sections) }} + {{- end }} + + {{- $defaultOrdersectionsby := .Site.Params.ordersectionsby | default "weight" }} + {{- $currentOrdersectionsby := $sortTerm | default (.Page.Params.ordersectionsby | default $defaultOrdersectionsby) }} + {{- if eq $currentOrdersectionsby "weight" }} + {{- template "childs" dict "menu" $pages.ByWeight "containerstyle" $containerstyle "style" $style "showhidden" $showhidden "count" 1 "depth" $depth "pages" .Site.Pages "description" $withDescription "sortTerm" $sortTerm }} + {{- else if or (eq $currentOrdersectionsby "name") (eq $currentOrdersectionsby "title") }} + {{- template "childs" dict "menu" $pages.ByTitle "containerstyle" $containerstyle "style" $style "showhidden" $showhidden "count" 1 "depth" $depth "pages" .Site.Pages "description" $withDescription "sortTerm" $sortTerm }} + {{- else if eq $currentOrdersectionsby "publishdate" }} + {{- template "childs" dict "menu" $pages.ByPublishDate "containerstyle" $containerstyle "style" $style "showhidden" $showhidden "count" 1 "depth" $depth "pages" .Site.Pages "description" $withDescription "sortTerm" $sortTerm }} + {{- else if eq $currentOrdersectionsby "date" }} + {{- template "childs" dict "menu" $pages.ByDate "containerstyle" $containerstyle "style" $style "showhidden" $showhidden "count" 1 "depth" $depth "pages" .Site.Pages "description" $withDescription "sortTerm" $sortTerm }} + {{- else if eq $currentOrdersectionsby "length" }} + {{- template "childs" dict "menu" $pages.ByLength "containerstyle" $containerstyle "style" $style "showhidden" $showhidden "count" 1 "depth" $depth "pages" .Site.Pages "description" $withDescription "sortTerm" $sortTerm }} + {{- else }} + {{- template "childs" dict "menu" $pages "containerstyle" $containerstyle "style" $style "showhidden" $showhidden "count" 1 "depth" $depth "pages" .Site.Pages "description" $withDescription "sortTerm" $sortTerm }} + {{- end }} +{{ (printf "" $containerstyle)|safeHTML }} + +{{- define "childs" }} + {{- range .menu }} + {{- $hidden := and (or (.Params.hidden) (eq .Title "")) (not $.showhidden) }} + {{- if not $hidden }} + {{- if not .IsHome }} + {{- if hasPrefix $.style "h" }} + {{- $num := sub ( int (trim $.style "h") ) 1 }} + {{- $numn := add $num $.count }} + +{{ (printf "" $numn)|safeHTML -}} +{{ .Title }} +{{- (printf "" $numn)|safeHTML }} + + {{- else }} +{{ (printf "<%s>" $.style)|safeHTML -}} +{{ .Title }} +{{- (printf "" $.style)|safeHTML }} + {{- end }} + + {{- if $.description }} + {{- if .Description }} +

    {{ .Description }}

    + {{else}} +

    {{ .Summary }}

    + {{- end }} + {{- end }} + {{- end }} + {{- if lt $.count $.depth }} + + {{- if eq $.style "li" }} +{{- (printf "<%s>" $.containerstyle)|safeHTML }} + {{- end }} + + {{- $pages := .Page.Pages }} + {{- if .Page.IsHome }} + {{- $pages = .Page.Sections }} + {{- else if .Page.Sections}} + {{- $pages = (.Page.Pages | union .Page.Sections) }} + {{- end }} + + {{- $defaultOrdersectionsby := .Site.Params.ordersectionsby | default "weight" }} + {{- $currentOrdersectionsby := $.sortTerm | default (.Page.Params.ordersectionsby | default $defaultOrdersectionsby) }} + {{- if eq $currentOrdersectionsby "weight" }} + {{- template "childs" dict "menu" $pages.ByWeight "containerstyle" $.containerstyle "style" $.style "showhidden" $.showhidden "count" (add $.count 1) "depth" $.depth "pages" $.pages "description" $.description "sortTerm" $.sortTerm }} + {{- else if or (eq $.currentOrdersectionsby "name") (eq $.currentOrdersectionsby "title") }} + {{- template "childs" dict "menu" $pages.ByTitle "containerstyle" $.containerstyle "style" $.style "showhidden" $.showhidden "count" (add $.count 1) "depth" $.depth "pages" $.pages "description" $.description "sortTerm" $.sortTerm }} + {{- else if eq $.currentOrdersectionsby "publishdate" }} + {{- template "childs" dict "menu" $pages.ByPublishDate "containerstyle" $.containerstyle "style" $.style "showhidden" $.showhidden "count" (add $.count 1) "depth" $.depth "pages" $.pages "description" $.description "sortTerm" $.sortTerm }} + {{- else if eq $.currentOrdersectionsby "date" }} + {{- template "childs" dict "menu" $pages.ByDate "containerstyle" $.containerstyle "style" $.style "showhidden" $.showhidden "count" (add $.count 1) "depth" $.depth "pages" $.pages "description" $.description "sortTerm" $.sortTerm }} + {{- else if eq $.currentOrdersectionsby "length" }} + {{- template "childs" dict "menu" $pages.ByLength "containerstyle" $.containerstyle "style" $.style "showhidden" $.showhidden "count" (add $.count 1) "depth" $.depth "pages" $.pages "description" $.description "sortTerm" $.sortTerm }} + {{- else }} + {{- template "childs" dict "menu" $pages "containerstyle" $.containerstyle "style" $.style "showhidden" $.showhidden "count" (add $.count 1) "depth" $.depth "pages" $.pages "description" $.description "sortTerm" $.sortTerm }} + {{- end }} + + {{- if eq $.style "li" }} +{{- (printf "" $.containerstyle)|safeHTML }} + {{- end }} + {{- end }} + {{- end }} + {{- end }} +{{- end }} \ No newline at end of file diff --git a/themes/relearn/layouts/shortcodes/expand.html b/themes/relearn/layouts/shortcodes/expand.html new file mode 100644 index 0000000..e5f1a50 --- /dev/null +++ b/themes/relearn/layouts/shortcodes/expand.html @@ -0,0 +1,22 @@ +{{- $_hugo_config := `{ "version": 1 }` }} +{{- $title := .Get "title" | default (.Get 0) | default (T "Expand-title") }} +{{- $expanded := .Get "open" | default (.Get 1) | default false }} +{{- if eq (printf "%T" $expanded) "string" }} + {{- $expanded = (eq $expanded "true") }} +{{- end }} +{{- $content := .Inner | safeHTML }} +
    + {{/* things are getting complicated when search tries to open the expand box while jquery sets the display CSS on the element */}}{{ "" -}} + + + + {{ $title }} + +
    +{{ $content }} +
    +
    \ No newline at end of file diff --git a/themes/relearn/layouts/shortcodes/include.html b/themes/relearn/layouts/shortcodes/include.html new file mode 100644 index 0000000..5f357bf --- /dev/null +++ b/themes/relearn/layouts/shortcodes/include.html @@ -0,0 +1,10 @@ +{{- $file := .Get "file" | default (.Get 0) }} +{{- $showFirstHeading := .Get "showfirstheading" | default (.Get 1) | default true }} +{{- if eq (printf "%T" $showFirstHeading) "string" }} + {{- $showFirstHeading = (eq $showFirstHeading "true") }} +{{- end }} +{{- if not $showFirstHeading }}
    {{ end }} + +{{ $file | readFile | safeHTML }} + +{{- if not $showFirstHeading }}
    {{ end }} \ No newline at end of file diff --git a/themes/relearn/layouts/shortcodes/mermaid.html b/themes/relearn/layouts/shortcodes/mermaid.html new file mode 100644 index 0000000..c7af39c --- /dev/null +++ b/themes/relearn/layouts/shortcodes/mermaid.html @@ -0,0 +1,6 @@ +{{- $_hugo_config := `{ "version": 1 }` }} +{{- $align := .Get "align" | default "center" }} +
    + {{- safeHTML .Inner -}} +
    +{{- .Page.Store.Set "htmlHasMermaid" true }} \ No newline at end of file diff --git a/themes/relearn/layouts/shortcodes/notice.html b/themes/relearn/layouts/shortcodes/notice.html new file mode 100644 index 0000000..88e0120 --- /dev/null +++ b/themes/relearn/layouts/shortcodes/notice.html @@ -0,0 +1,19 @@ +{{- $_hugo_config := `{ "version": 1 }` }} +{{- $style := .Get "style" | default (.Get 0) | default "default" }} +{{- $title := .Get "title" | default (.Get 1) | default ($style | T) }} +{{- $icon := .Get "icon" | default (.Get 2) | default "" }} +{{- if and (not $icon) (eq (len $icon) 0) }} + {{- if eq $style "info" }}{{ $icon = default "info-circle" }}{{ end }} + {{- if eq $style "warning" }}{{ $icon = default "exclamation-triangle" }}{{ end }} + {{- if eq $style "note" }}{{ $icon = default "exclamation-circle" }}{{ end }} + {{- if eq $style "tip" }}{{ $icon = default "lightbulb" }}{{ end }} +{{- end }} +{{- $icon = trim $icon " " }} +{{- if and $icon (not (findRE ".*?\\bfa-\\w.*?" $icon)) }} + {{- $icon = printf "fa-fw fas fa-%s" $icon }} +{{- end }} +
    +
    {{ if $icon }} {{ end }}{{ $title }}
    +
    +{{ .Inner }}
    +
    \ No newline at end of file diff --git a/themes/relearn/layouts/shortcodes/siteparam.html b/themes/relearn/layouts/shortcodes/siteparam.html new file mode 100644 index 0000000..d4cbd07 --- /dev/null +++ b/themes/relearn/layouts/shortcodes/siteparam.html @@ -0,0 +1,7 @@ +{{- $paramName := .Get "name" | default (.Get 0) -}} +{{- $siteParams := .Site.Params -}} +{{- with $paramName -}} + {{- with $siteParams -}} + {{- index . (lower $paramName) -}} + {{- end -}} +{{- end -}} \ No newline at end of file diff --git a/themes/relearn/layouts/shortcodes/swagger.html b/themes/relearn/layouts/shortcodes/swagger.html new file mode 100644 index 0000000..ba360be --- /dev/null +++ b/themes/relearn/layouts/shortcodes/swagger.html @@ -0,0 +1,25 @@ +{{- $original := .Get "src" }} +{{- with .Page.Resources.Match $original }} + {{- range . }} + {{- $original = .RelPermalink }} + {{- end }} +{{- end }} + + +{{- .Page.Store.Set "htmlHasSwagger" true }} \ No newline at end of file diff --git a/themes/relearn/layouts/shortcodes/tab.html b/themes/relearn/layouts/shortcodes/tab.html new file mode 100644 index 0000000..661af36 --- /dev/null +++ b/themes/relearn/layouts/shortcodes/tab.html @@ -0,0 +1,11 @@ +{{ if .Parent }} + {{ $name := trim (.Get "name") " " }} + {{ if not (.Parent.Scratch.Get "tabs") }} + {{ .Parent.Scratch.Set "tabs" slice }} + {{ end }} + {{ with .Inner }} + {{ $.Parent.Scratch.Add "tabs" (dict "name" $name "content" . ) }} + {{ end }} +{{ else }} + {{- errorf "[%s] %q: tab shortcode missing its parent" site.Language.Lang .Page.Path -}} +{{ end}} diff --git a/themes/relearn/layouts/shortcodes/tabs.html b/themes/relearn/layouts/shortcodes/tabs.html new file mode 100644 index 0000000..bc4c561 --- /dev/null +++ b/themes/relearn/layouts/shortcodes/tabs.html @@ -0,0 +1,21 @@ +{{- with .Inner }}{{/* don't do anything, just call it */}}{{ end }} +{{- $groupId := .Get "groupId" | default "default" }} +
    +
    + {{- range $idx, $tab := .Scratch.Get "tabs" }} + + {{- end }} +
    +
    + {{- range $idx, $tab := .Scratch.Get "tabs" }} +
    +{{ .content }} +
    + {{- end }} +
    +
    diff --git a/themes/relearn/static/css/auto-complete.css b/themes/relearn/static/css/auto-complete.css new file mode 100644 index 0000000..082a1f5 --- /dev/null +++ b/themes/relearn/static/css/auto-complete.css @@ -0,0 +1,48 @@ +.autocomplete-suggestions { + text-align: left; + cursor: default; + border: 1px solid #ccc; + border-top: 0; + background: #fff; + box-shadow: -1px 1px 3px rgba(0,0,0,.1); + + /* core styles should not be changed */ + position: absolute; + display: none; + z-index: 9999; + max-height: 254px; + overflow: hidden; + overflow-y: auto; + box-sizing: border-box; +} +.autocomplete-suggestion { + position: relative; + cursor: pointer; + padding: 7px; + line-height: 23px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + color: #333; +} + +.autocomplete-suggestion b { + font-weight: normal; + color: #1f8dd6; +} + +.autocomplete-suggestion.selected { + background: #333; + color: #fff; +} + +.autocomplete-suggestion:hover { + background: #444; + color: #fff; +} + +.autocomplete-suggestion > .context { + font-size: 12px; + overflow: hidden; + text-overflow: ellipsis; +} diff --git a/themes/relearn/static/css/chroma-learn.css b/themes/relearn/static/css/chroma-learn.css new file mode 100644 index 0000000..06eac5f --- /dev/null +++ b/themes/relearn/static/css/chroma-learn.css @@ -0,0 +1,83 @@ +/* based on base16-snazzy +/* Background */ .chroma { color: #e2e4e5; background-color: #282a36 } +/* Other */ .chroma .x { } +/* Error */ .chroma .err { color: #ff5c57 } +/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; } +/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; width: auto; overflow: auto; display: block; } +/* LineHighlight */ .chroma .hl { display: block; width: 100%;background-color: #ffffcc } +/* LineNumbersTable */ .chroma .lnt { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } +/* LineNumbers */ .chroma .ln { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } +/* Keyword */ .chroma .k { color: #ff6ac1 } +/* KeywordConstant */ .chroma .kc { color: #ff6ac1 } +/* KeywordDeclaration */ .chroma .kd { color: #ff5c57 } +/* KeywordNamespace */ .chroma .kn { color: #ff6ac1 } +/* KeywordPseudo */ .chroma .kp { color: #ff6ac1 } +/* KeywordReserved */ .chroma .kr { color: #ff6ac1 } +/* KeywordType */ .chroma .kt { color: #9aedfe } +/* Name */ .chroma .n { } +/* NameAttribute */ .chroma .na { color: #57c7ff } +/* NameBuiltin */ .chroma .nb { color: #ff5c57 } +/* NameBuiltinPseudo */ .chroma .bp { } +/* NameClass */ .chroma .nc { color: #f3f99d } +/* NameConstant */ .chroma .no { color: #ff9f43 } +/* NameDecorator */ .chroma .nd { color: #ff9f43 } +/* NameEntity */ .chroma .ni { } +/* NameException */ .chroma .ne { } +/* NameFunction */ .chroma .nf { color: #57c7ff } +/* NameFunctionMagic */ .chroma .fm { } +/* NameLabel */ .chroma .nl { color: #ff5c57 } +/* NameNamespace */ .chroma .nn { } +/* NameOther */ .chroma .nx { } +/* NameProperty */ .chroma .py { } +/* NameTag */ .chroma .nt { color: #ff6ac1 } +/* NameVariable */ .chroma .nv { color: #ff5c57 } +/* NameVariableClass */ .chroma .vc { color: #ff5c57 } +/* NameVariableGlobal */ .chroma .vg { color: #ff5c57 } +/* NameVariableInstance */ .chroma .vi { color: #ff5c57 } +/* NameVariableMagic */ .chroma .vm { } +/* Literal */ .chroma .l { } +/* LiteralDate */ .chroma .ld { } +/* LiteralString */ .chroma .s { color: #5af78e } +/* LiteralStringAffix */ .chroma .sa { color: #5af78e } +/* LiteralStringBacktick */ .chroma .sb { color: #5af78e } +/* LiteralStringChar */ .chroma .sc { color: #5af78e } +/* LiteralStringDelimiter */ .chroma .dl { color: #5af78e } +/* LiteralStringDoc */ .chroma .sd { color: #5af78e } +/* LiteralStringDouble */ .chroma .s2 { color: #5af78e } +/* LiteralStringEscape */ .chroma .se { color: #5af78e } +/* LiteralStringHeredoc */ .chroma .sh { color: #5af78e } +/* LiteralStringInterpol */ .chroma .si { color: #5af78e } +/* LiteralStringOther */ .chroma .sx { color: #5af78e } +/* LiteralStringRegex */ .chroma .sr { color: #5af78e } +/* LiteralStringSingle */ .chroma .s1 { color: #5af78e } +/* LiteralStringSymbol */ .chroma .ss { color: #5af78e } +/* LiteralNumber */ .chroma .m { color: #ff9f43 } +/* LiteralNumberBin */ .chroma .mb { color: #ff9f43 } +/* LiteralNumberFloat */ .chroma .mf { color: #ff9f43 } +/* LiteralNumberHex */ .chroma .mh { color: #ff9f43 } +/* LiteralNumberInteger */ .chroma .mi { color: #ff9f43 } +/* LiteralNumberIntegerLong */ .chroma .il { color: #ff9f43 } +/* LiteralNumberOct */ .chroma .mo { color: #ff9f43 } +/* Operator */ .chroma .o { color: #ff6ac1 } +/* OperatorWord */ .chroma .ow { color: #ff6ac1 } +/* Punctuation */ .chroma .p { } +/* Comment */ .chroma .c { color: #78787e } +/* CommentHashbang */ .chroma .ch { color: #78787e } +/* CommentMultiline */ .chroma .cm { color: #78787e } +/* CommentSingle */ .chroma .c1 { color: #78787e } +/* CommentSpecial */ .chroma .cs { color: #78787e } +/* CommentPreproc */ .chroma .cp { color: #78787e } +/* CommentPreprocFile */ .chroma .cpf { color: #78787e } +/* Generic */ .chroma .g { } +/* GenericDeleted */ .chroma .gd { color: #ff5c57 } +/* GenericEmph */ .chroma .ge { text-decoration: underline } +/* GenericError */ .chroma .gr { color: #ff5c57 } +/* GenericHeading */ .chroma .gh { font-weight: bold } +/* GenericInserted */ .chroma .gi { font-weight: bold } +/* GenericOutput */ .chroma .go { color: #43454f } +/* GenericPrompt */ .chroma .gp { } +/* GenericStrong */ .chroma .gs { font-style: italic } +/* GenericSubheading */ .chroma .gu { font-weight: bold } +/* GenericTraceback */ .chroma .gt { } +/* GenericUnderline */ .chroma .gl { text-decoration: underline } +/* TextWhitespace */ .chroma .w { } diff --git a/themes/relearn/static/css/chroma-neon.css b/themes/relearn/static/css/chroma-neon.css new file mode 100644 index 0000000..c5e4968 --- /dev/null +++ b/themes/relearn/static/css/chroma-neon.css @@ -0,0 +1,83 @@ +/* based on rrt +/* Background */ .chroma { color: #f8f8f2; background-color: #000000 } +/* Other */ .chroma .x { } +/* Error */ .chroma .err { } +/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; } +/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; width: auto; overflow: auto; display: block; } +/* LineHighlight */ .chroma .hl { display: block; width: 100%;background-color: #ffffcc } +/* LineNumbersTable */ .chroma .lnt { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7c7c79 } +/* LineNumbers */ .chroma .ln { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7c7c79 } +/* Keyword */ .chroma .k { color: #ff0000 } +/* KeywordConstant */ .chroma .kc { color: #ff0000 } +/* KeywordDeclaration */ .chroma .kd { color: #ff0000 } +/* KeywordNamespace */ .chroma .kn { color: #ff0000 } +/* KeywordPseudo */ .chroma .kp { color: #ff0000 } +/* KeywordReserved */ .chroma .kr { color: #ff0000 } +/* KeywordType */ .chroma .kt { color: #ee82ee } +/* Name */ .chroma .n { } +/* NameAttribute */ .chroma .na { } +/* NameBuiltin */ .chroma .nb { } +/* NameBuiltinPseudo */ .chroma .bp { } +/* NameClass */ .chroma .nc { } +/* NameConstant */ .chroma .no { color: #7fffd4 } +/* NameDecorator */ .chroma .nd { } +/* NameEntity */ .chroma .ni { } +/* NameException */ .chroma .ne { } +/* NameFunction */ .chroma .nf { color: #ffff00 } +/* NameFunctionMagic */ .chroma .fm { } +/* NameLabel */ .chroma .nl { } +/* NameNamespace */ .chroma .nn { } +/* NameOther */ .chroma .nx { } +/* NameProperty */ .chroma .py { } +/* NameTag */ .chroma .nt { } +/* NameVariable */ .chroma .nv { color: #eedd82 } +/* NameVariableClass */ .chroma .vc { } +/* NameVariableGlobal */ .chroma .vg { } +/* NameVariableInstance */ .chroma .vi { } +/* NameVariableMagic */ .chroma .vm { } +/* Literal */ .chroma .l { } +/* LiteralDate */ .chroma .ld { } +/* LiteralString */ .chroma .s { color: #87ceeb } +/* LiteralStringAffix */ .chroma .sa { color: #87ceeb } +/* LiteralStringBacktick */ .chroma .sb { color: #87ceeb } +/* LiteralStringChar */ .chroma .sc { color: #87ceeb } +/* LiteralStringDelimiter */ .chroma .dl { color: #87ceeb } +/* LiteralStringDoc */ .chroma .sd { color: #87ceeb } +/* LiteralStringDouble */ .chroma .s2 { color: #87ceeb } +/* LiteralStringEscape */ .chroma .se { color: #87ceeb } +/* LiteralStringHeredoc */ .chroma .sh { color: #87ceeb } +/* LiteralStringInterpol */ .chroma .si { color: #87ceeb } +/* LiteralStringOther */ .chroma .sx { color: #87ceeb } +/* LiteralStringRegex */ .chroma .sr { color: #87ceeb } +/* LiteralStringSingle */ .chroma .s1 { color: #87ceeb } +/* LiteralStringSymbol */ .chroma .ss { color: #ff6600 } +/* LiteralNumber */ .chroma .m { color: #ff6600 } +/* LiteralNumberBin */ .chroma .mb { color: #ff6600 } +/* LiteralNumberFloat */ .chroma .mf { color: #ff6600 } +/* LiteralNumberHex */ .chroma .mh { color: #ff6600 } +/* LiteralNumberInteger */ .chroma .mi { color: #ff6600 } +/* LiteralNumberIntegerLong */ .chroma .il { color: #ff6600 } +/* LiteralNumberOct */ .chroma .mo { color: #ff6600 } +/* Operator */ .chroma .o { } +/* OperatorWord */ .chroma .ow { } +/* Punctuation */ .chroma .p { } +/* Comment */ .chroma .c { color: #00ff00 } +/* CommentHashbang */ .chroma .ch { color: #00ff00 } +/* CommentMultiline */ .chroma .cm { color: #00ff00 } +/* CommentSingle */ .chroma .c1 { color: #00ff00 } +/* CommentSpecial */ .chroma .cs { color: #00ff00 } +/* CommentPreproc */ .chroma .cp { color: #e5e5e5 } +/* CommentPreprocFile */ .chroma .cpf { color: #e5e5e5 } +/* Generic */ .chroma .g { } +/* GenericDeleted */ .chroma .gd { } +/* GenericEmph */ .chroma .ge { } +/* GenericError */ .chroma .gr { } +/* GenericHeading */ .chroma .gh { } +/* GenericInserted */ .chroma .gi { } +/* GenericOutput */ .chroma .go { } +/* GenericPrompt */ .chroma .gp { } +/* GenericStrong */ .chroma .gs { } +/* GenericSubheading */ .chroma .gu { } +/* GenericTraceback */ .chroma .gt { } +/* GenericUnderline */ .chroma .gl { } +/* TextWhitespace */ .chroma .w { } diff --git a/themes/relearn/static/css/chroma-relearn-dark.css b/themes/relearn/static/css/chroma-relearn-dark.css new file mode 100644 index 0000000..0ecb3c7 --- /dev/null +++ b/themes/relearn/static/css/chroma-relearn-dark.css @@ -0,0 +1,83 @@ +/* based on monokai +/* Background */ .chroma { color: #f8f8f8; background-color: #2b2b2b } +/* Other */ .chroma .x { } +/* Error */ .chroma .err { color: #960050; } +/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; } +/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; width: auto; overflow: auto; display: block; } +/* LineHighlight */ .chroma .hl { display: block; width: 100%;background-color: #ffffcc } +/* LineNumbersTable */ .chroma .lnt { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } +/* LineNumbers */ .chroma .ln { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } +/* Keyword */ .chroma .k { color: #66d9ef } +/* KeywordConstant */ .chroma .kc { color: #66d9ef } +/* KeywordDeclaration */ .chroma .kd { color: #66d9ef } +/* KeywordNamespace */ .chroma .kn { color: #f92672 } +/* KeywordPseudo */ .chroma .kp { color: #66d9ef } +/* KeywordReserved */ .chroma .kr { color: #66d9ef } +/* KeywordType */ .chroma .kt { color: #66d9ef } +/* Name */ .chroma .n { } +/* NameAttribute */ .chroma .na { color: #a6e22e } +/* NameBuiltin */ .chroma .nb { } +/* NameBuiltinPseudo */ .chroma .bp { } +/* NameClass */ .chroma .nc { color: #a6e22e } +/* NameConstant */ .chroma .no { color: #66d9ef } +/* NameDecorator */ .chroma .nd { color: #a6e22e } +/* NameEntity */ .chroma .ni { } +/* NameException */ .chroma .ne { color: #a6e22e } +/* NameFunction */ .chroma .nf { color: #a6e22e } +/* NameFunctionMagic */ .chroma .fm { } +/* NameLabel */ .chroma .nl { } +/* NameNamespace */ .chroma .nn { } +/* NameOther */ .chroma .nx { color: #a6e22e } +/* NameProperty */ .chroma .py { } +/* NameTag */ .chroma .nt { color: #f92672 } +/* NameVariable */ .chroma .nv { } +/* NameVariableClass */ .chroma .vc { } +/* NameVariableGlobal */ .chroma .vg { } +/* NameVariableInstance */ .chroma .vi { } +/* NameVariableMagic */ .chroma .vm { } +/* Literal */ .chroma .l { color: #ae81ff } +/* LiteralDate */ .chroma .ld { color: #e6db74 } +/* LiteralString */ .chroma .s { color: #e6db74 } +/* LiteralStringAffix */ .chroma .sa { color: #e6db74 } +/* LiteralStringBacktick */ .chroma .sb { color: #e6db74 } +/* LiteralStringChar */ .chroma .sc { color: #e6db74 } +/* LiteralStringDelimiter */ .chroma .dl { color: #e6db74 } +/* LiteralStringDoc */ .chroma .sd { color: #e6db74 } +/* LiteralStringDouble */ .chroma .s2 { color: #e6db74 } +/* LiteralStringEscape */ .chroma .se { color: #ae81ff } +/* LiteralStringHeredoc */ .chroma .sh { color: #e6db74 } +/* LiteralStringInterpol */ .chroma .si { color: #e6db74 } +/* LiteralStringOther */ .chroma .sx { color: #e6db74 } +/* LiteralStringRegex */ .chroma .sr { color: #e6db74 } +/* LiteralStringSingle */ .chroma .s1 { color: #e6db74 } +/* LiteralStringSymbol */ .chroma .ss { color: #e6db74 } +/* LiteralNumber */ .chroma .m { color: #ae81ff } +/* LiteralNumberBin */ .chroma .mb { color: #ae81ff } +/* LiteralNumberFloat */ .chroma .mf { color: #ae81ff } +/* LiteralNumberHex */ .chroma .mh { color: #ae81ff } +/* LiteralNumberInteger */ .chroma .mi { color: #ae81ff } +/* LiteralNumberIntegerLong */ .chroma .il { color: #ae81ff } +/* LiteralNumberOct */ .chroma .mo { color: #ae81ff } +/* Operator */ .chroma .o { color: #f92672 } +/* OperatorWord */ .chroma .ow { color: #f92672 } +/* Punctuation */ .chroma .p { } +/* Comment */ .chroma .c { color: #7c7c7c } +/* CommentHashbang */ .chroma .ch { color: #7c7c7c } +/* CommentMultiline */ .chroma .cm { color: #7c7c7c } +/* CommentSingle */ .chroma .c1 { color: #7c7c7c } +/* CommentSpecial */ .chroma .cs { color: #7c7c7c } +/* CommentPreproc */ .chroma .cp { color: #7c7c7c } +/* CommentPreprocFile */ .chroma .cpf { color: #7c7c7c } +/* Generic */ .chroma .g { } +/* GenericDeleted */ .chroma .gd { color: #f92672 } +/* GenericEmph */ .chroma .ge { font-style: italic } +/* GenericError */ .chroma .gr { } +/* GenericHeading */ .chroma .gh { } +/* GenericInserted */ .chroma .gi { color: #a6e22e } +/* GenericOutput */ .chroma .go { } +/* GenericPrompt */ .chroma .gp { } +/* GenericStrong */ .chroma .gs { font-weight: bold } +/* GenericSubheading */ .chroma .gu { color: #7c7c7c } +/* GenericTraceback */ .chroma .gt { } +/* GenericUnderline */ .chroma .gl { } +/* TextWhitespace */ .chroma .w { } diff --git a/themes/relearn/static/css/chroma-relearn-light.css b/themes/relearn/static/css/chroma-relearn-light.css new file mode 100644 index 0000000..44bc989 --- /dev/null +++ b/themes/relearn/static/css/chroma-relearn-light.css @@ -0,0 +1,83 @@ +/* based on tango +/* Background */ .chroma { background-color: #f8f8f8 } +/* Other */ .chroma .x { color: #000000 } +/* Error */ .chroma .err { color: #a40000 } +/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; } +/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; width: auto; overflow: auto; display: block; } +/* LineHighlight */ .chroma .hl { display: block; width: 100%;background-color: #ffffcc } +/* LineNumbersTable */ .chroma .lnt { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } +/* LineNumbers */ .chroma .ln { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } +/* Keyword */ .chroma .k { color: #204a87; font-weight: bold } +/* KeywordConstant */ .chroma .kc { color: #204a87; font-weight: bold } +/* KeywordDeclaration */ .chroma .kd { color: #204a87; font-weight: bold } +/* KeywordNamespace */ .chroma .kn { color: #204a87; font-weight: bold } +/* KeywordPseudo */ .chroma .kp { color: #204a87; font-weight: bold } +/* KeywordReserved */ .chroma .kr { color: #204a87; font-weight: bold } +/* KeywordType */ .chroma .kt { color: #204a87; font-weight: bold } +/* Name */ .chroma .n { color: #000000 } +/* NameAttribute */ .chroma .na { color: #c4a000 } +/* NameBuiltin */ .chroma .nb { color: #204a87 } +/* NameBuiltinPseudo */ .chroma .bp { color: #3465a4 } +/* NameClass */ .chroma .nc { color: #000000 } +/* NameConstant */ .chroma .no { color: #000000 } +/* NameDecorator */ .chroma .nd { color: #5c35cc; font-weight: bold } +/* NameEntity */ .chroma .ni { color: #ce5c00 } +/* NameException */ .chroma .ne { color: #cc0000; font-weight: bold } +/* NameFunction */ .chroma .nf { color: #000000 } +/* NameFunctionMagic */ .chroma .fm { color: #000000 } +/* NameLabel */ .chroma .nl { color: #f57900 } +/* NameNamespace */ .chroma .nn { color: #000000 } +/* NameOther */ .chroma .nx { color: #000000 } +/* NameProperty */ .chroma .py { color: #000000 } +/* NameTag */ .chroma .nt { color: #204a87; font-weight: bold } +/* NameVariable */ .chroma .nv { color: #000000 } +/* NameVariableClass */ .chroma .vc { color: #000000 } +/* NameVariableGlobal */ .chroma .vg { color: #000000 } +/* NameVariableInstance */ .chroma .vi { color: #000000 } +/* NameVariableMagic */ .chroma .vm { color: #000000 } +/* Literal */ .chroma .l { color: #000000 } +/* LiteralDate */ .chroma .ld { color: #000000 } +/* LiteralString */ .chroma .s { color: #4e9a06 } +/* LiteralStringAffix */ .chroma .sa { color: #4e9a06 } +/* LiteralStringBacktick */ .chroma .sb { color: #4e9a06 } +/* LiteralStringChar */ .chroma .sc { color: #4e9a06 } +/* LiteralStringDelimiter */ .chroma .dl { color: #4e9a06 } +/* LiteralStringDoc */ .chroma .sd { color: #8f5902; font-style: italic } +/* LiteralStringDouble */ .chroma .s2 { color: #4e9a06 } +/* LiteralStringEscape */ .chroma .se { color: #4e9a06 } +/* LiteralStringHeredoc */ .chroma .sh { color: #4e9a06 } +/* LiteralStringInterpol */ .chroma .si { color: #4e9a06 } +/* LiteralStringOther */ .chroma .sx { color: #4e9a06 } +/* LiteralStringRegex */ .chroma .sr { color: #4e9a06 } +/* LiteralStringSingle */ .chroma .s1 { color: #4e9a06 } +/* LiteralStringSymbol */ .chroma .ss { color: #4e9a06 } +/* LiteralNumber */ .chroma .m { color: #0000cf; font-weight: bold } +/* LiteralNumberBin */ .chroma .mb { color: #0000cf; font-weight: bold } +/* LiteralNumberFloat */ .chroma .mf { color: #0000cf; font-weight: bold } +/* LiteralNumberHex */ .chroma .mh { color: #0000cf; font-weight: bold } +/* LiteralNumberInteger */ .chroma .mi { color: #0000cf; font-weight: bold } +/* LiteralNumberIntegerLong */ .chroma .il { color: #0000cf; font-weight: bold } +/* LiteralNumberOct */ .chroma .mo { color: #0000cf; font-weight: bold } +/* Operator */ .chroma .o { color: #ce5c00; font-weight: bold } +/* OperatorWord */ .chroma .ow { color: #204a87; font-weight: bold } +/* Punctuation */ .chroma .p { color: #000000; font-weight: bold } +/* Comment */ .chroma .c { color: #8f5902; font-style: italic } +/* CommentHashbang */ .chroma .ch { color: #8f5902; font-style: italic } +/* CommentMultiline */ .chroma .cm { color: #8f5902; font-style: italic } +/* CommentSingle */ .chroma .c1 { color: #8f5902; font-style: italic } +/* CommentSpecial */ .chroma .cs { color: #8f5902; font-style: italic } +/* CommentPreproc */ .chroma .cp { color: #8f5902; font-style: italic } +/* CommentPreprocFile */ .chroma .cpf { color: #8f5902; font-style: italic } +/* Generic */ .chroma .g { color: #000000 } +/* GenericDeleted */ .chroma .gd { color: #a40000 } +/* GenericEmph */ .chroma .ge { color: #000000; font-style: italic } +/* GenericError */ .chroma .gr { color: #ef2929 } +/* GenericHeading */ .chroma .gh { color: #000080; font-weight: bold } +/* GenericInserted */ .chroma .gi { color: #00a000 } +/* GenericOutput */ .chroma .go { color: #000000; font-style: italic } +/* GenericPrompt */ .chroma .gp { color: #8f5902 } +/* GenericStrong */ .chroma .gs { color: #000000; font-weight: bold } +/* GenericSubheading */ .chroma .gu { color: #800080; font-weight: bold } +/* GenericTraceback */ .chroma .gt { color: #a40000; font-weight: bold } +/* GenericUnderline */ .chroma .gl { color: #000000; text-decoration: underline } +/* TextWhitespace */ .chroma .w { color: #f8f8f8; text-decoration: underline } diff --git a/themes/relearn/static/css/featherlight.min.css b/themes/relearn/static/css/featherlight.min.css new file mode 100644 index 0000000..058487f --- /dev/null +++ b/themes/relearn/static/css/featherlight.min.css @@ -0,0 +1,8 @@ +/** + * Featherlight - ultra slim jQuery lightbox + * Version 1.7.13 - http://noelboss.github.io/featherlight/ + * + * Copyright 2018, Noël Raoul Bossart (http://www.noelboss.com) + * MIT Licensed. +**/ +html.with-featherlight{overflow:hidden}.featherlight{display:none;position:fixed;top:0;right:0;bottom:0;left:0;z-index:2147483647;text-align:center;white-space:nowrap;cursor:pointer;background:#333;background:rgba(0,0,0,0)}.featherlight:last-of-type{background:rgba(0,0,0,.8)}.featherlight:before{content:'';display:inline-block;height:100%;vertical-align:middle}.featherlight .featherlight-content{position:relative;text-align:left;vertical-align:middle;display:inline-block;overflow:auto;padding:25px 25px 0;border-bottom:25px solid transparent;margin-left:5%;margin-right:5%;max-height:95%;background:#fff;cursor:auto;white-space:normal}.featherlight .featherlight-inner{display:block}.featherlight link.featherlight-inner,.featherlight script.featherlight-inner,.featherlight style.featherlight-inner{display:none}.featherlight .featherlight-close-icon{position:absolute;z-index:9999;top:0;right:0;line-height:25px;width:25px;cursor:pointer;text-align:center;font-family:Arial,sans-serif;background:#fff;background:rgba(255,255,255,.3);color:#000;border:0;padding:0}.featherlight .featherlight-close-icon::-moz-focus-inner{border:0;padding:0}.featherlight .featherlight-image{width:100%}.featherlight-iframe .featherlight-content{border-bottom:0;padding:0;-webkit-overflow-scrolling:touch}.featherlight iframe{border:0}.featherlight *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@media only screen and (max-width:1024px){.featherlight .featherlight-content{margin-left:0;margin-right:0;max-height:98%;padding:10px 10px 0;border-bottom:10px solid transparent}}@media print{html.with-featherlight>*>:not(.featherlight){display:none}} \ No newline at end of file diff --git a/themes/relearn/static/css/fontawesome-all.min.css b/themes/relearn/static/css/fontawesome-all.min.css new file mode 100644 index 0000000..ac76ff1 --- /dev/null +++ b/themes/relearn/static/css/fontawesome-all.min.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa,.fab,.fad,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bacteria:before{content:"\e059"}.fa-bacterium:before{content:"\e05a"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-box-tissue:before{content:"\e05b"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudflare:before{content:"\e07d"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\e052"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-deezer:before{content:"\e077"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-disease:before{content:"\f7fa"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edge-legacy:before{content:"\e078"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-faucet:before{content:"\e005"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\e007"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-pay:before{content:"\e079"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guilded:before{content:"\e07e"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-holding-water:before{content:"\f4c1"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-sparkles:before{content:"\e05d"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-hands-wash:before{content:"\e05e"}.fa-handshake:before{content:"\f2b5"}.fa-handshake-alt-slash:before{content:"\e05f"}.fa-handshake-slash:before{content:"\e060"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-head-side-cough:before{content:"\e061"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-head-side-mask:before{content:"\e063"}.fa-head-side-virus:before{content:"\e064"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hive:before{content:"\e07f"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hospital-user:before{content:"\f80d"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-house-user:before{content:"\e065"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\e013"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-innosoft:before{content:"\e080"}.fa-instagram:before{content:"\f16d"}.fa-instagram-square:before{content:"\e055"}.fa-instalod:before{content:"\e081"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-house:before{content:"\e066"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lungs:before{content:"\f604"}.fa-lungs-virus:before{content:"\e067"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\e01a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\e056"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-octopus-deploy:before{content:"\e082"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-arrows:before{content:"\e068"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-perbyte:before{content:"\e083"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\e01e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-plane-slash:before{content:"\e069"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pump-medical:before{content:"\e06a"}.fa-pump-soap:before{content:"\e06b"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-rust:before{content:"\e07a"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-shield-virus:before{content:"\e06c"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopify:before{content:"\e057"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sink:before{content:"\e06d"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-soap:before{content:"\e06e"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-stopwatch-20:before{content:"\e06f"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-store-alt-slash:before{content:"\e070"}.fa-store-slash:before{content:"\e071"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-tiktok:before{content:"\e07b"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\e041"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-uncharted:before{content:"\e084"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\e049"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-unsplash:before{content:"\e07c"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-users-slash:before{content:"\e073"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-vest:before{content:"\e085"}.fa-vest-patches:before{content:"\e086"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-virus:before{content:"\e074"}.fa-virus-slash:before{content:"\e075"}.fa-viruses:before{content:"\e076"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-watchman-monitoring:before{content:"\e087"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wodu:before{content:"\e088"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.fab,.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900} \ No newline at end of file diff --git a/themes/relearn/static/css/ie.css b/themes/relearn/static/css/ie.css new file mode 100644 index 0000000..941c310 --- /dev/null +++ b/themes/relearn/static/css/ie.css @@ -0,0 +1,448 @@ +@media all and (-ms-high-contrast:none) { + /* set default colors as in variant.css for IE11 */ + body { + background-color: #ffffff; /* var(--MAIN-BG-color) */ + color: #101010; /* var(--MAIN-TEXT-color) */ + font-family: "Work Sans", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif; /* var(--MAIN-font) */ + } + + a, + .anchor, + #toc-menu, + #body a.highlight:after { + color: #486ac9; /* var(--MAIN-LINK-color) */ + } + + a:hover, + .anchor:hover, + #toc-menu:hover, + #body a.highlight:hover:after { + color: #202891; /* var(--MAIN-LINK-HOVER-color) */ + } + + #sidebar { + background: #282828; /* var(--MENU-SECTIONS-BG-color) */ + } + + #header-wrapper { + /* initially use section background to avoid flickering on load when a + non default variant is active */ + background-color: rgba( 0, 0, 0, 0 ); /* var(--MENU-SECTIONS-BG-color) */ + border-bottom-color: rgba( 0, 0, 0, 0 ); /* var(--MENU-SECTIONS-BG-color) */ + color: #e0e0e0; /* var(--MENU-SEARCH-color) */ + } + + .searchbox { + border-color: #e0e0e0; /* var(--MENU-SEARCH-BORDER-color) */ + background-color: #323232; /* var(--MENU-SEARCH-BG-color) */ + } + + #sidebar .collapsible-menu label:after, + #sidebar a { + color: #bababa; /* var(--MENU-SECTIONS-LINK-color) */ + } + + #sidebar select:hover, + #sidebar .collapsible-menu label:hover:after, + #sidebar a:hover { + color: #ffffff; /* var(--MENU-SECTIONS-LINK-HOVER-color) */ + } + + #sidebar ul.topics > li.parent, + #sidebar ul.topics > li.active { + background-color: rgba( 0, 0, 0, .166 ); /* var(--MENU-SECTIONS-ACTIVE-BG-color) */ + } + + #sidebar ul.topics li.active > a { + background-color: #ffffff; /* var(--MENU-SECTION-ACTIVE-CATEGORY-BG-color) */ + color: #444444; /* var(--MENU-SECTION-ACTIVE-CATEGORY-color) */ + } + + #sidebar ul li.visited > a .read-icon { + color: #486ac9; /* var(--MENU-VISITED-color) */ + } + + #sidebar .nav-title { + color: #ffffff; /* var(--MENU-SECTIONS-LINK-HOVER-color) */ + } + + #sidebar hr { + border-color: #606060; /* var(--MENU-SECTION-HR-color) */ + } + + #footer { + color: #bababa; /* var(--MENU-SECTIONS-LINK-color) */ + } + + h1 { + color: #101010; /* var(--MAIN-TEXT-color) */ + font-family: "Work Sans", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif; /* var(--MAIN-font) */ + } + + h2, h3, h4, h5, h6 { + color: #4a4a4a; /* var(--MAIN-TITLES-TEXT-color) */ + font-family: "Work Sans", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif; /* var(--MAIN-TITLES-TEXT-font) */ + } + + div.box { + background-color: rgba( 128, 128, 128, 1 ); /* var(--INTERNAL-BOX-NEUTRAL-color) */ + } + + div.box > .box-label { + color: rgba( 255, 255, 255, 1 ); /* var(--BOX-CAPTION-color) */ + } + + div.box > .box-content { + background-color: rgba( 255, 255, 255, .833 ); /* var(--BOX-BG-color) */ + color: rgba( 16, 16, 16, 1 ); /* var(--BOX-TEXT-color) */ + } + + div.box.info { + background-color: rgba( 48, 117, 229, 1 ); /* var(--INTERNAL-BOX-INFO-color) */ + } + + div.box.info > .box-content { + color: rgba( 16, 16, 16, 1 ); /* var(--INTERNAL-BOX-INFO-TEXT-color) */ + } + + div.box.warning { + background-color: rgba( 224, 62, 62, 1 ); /* var(--INTERNAL-BOX-WARNING-color) */ + } + + div.box.warning > .box-content { + color: rgba( 16, 16, 16, 1 ); /* var(--INTERNAL-BOX-WARNING-TEXT-color) */ + } + + div.box.note { + background-color: rgba( 237, 153, 9, 1 ); /* var(--INTERNAL-BOX-NOTE-color) */ + } + + div.box.note > .box-content { + color: rgba( 16, 16, 16, 1 ); /* var(--INTERNAL-BOX-NOTE-TEXT-color) */ + } + + div.box.tip { + background-color: rgba( 42, 178, 24, 1 ); /* var(--INTERNAL-BOX-TIP-color) */ + } + + div.box.tip > .box-content { + color: rgba( 16, 16, 16, 1 ); /* var(--INTERNAL-BOX-TIP-TEXT-color) */ + } + + div.box.primary { + background-color: #7dc903; /* var(--INTERNAL-PRIMARY-color) */ + } + + div.box.primary > .box-content { + color: #101010; /* var(--INTERNAL-MAIN-TEXT-color) */ + } + + div.box.secondary { + background-color: #486ac9; /* var(--INTERNAL-SECONDARY-color) */ + } + + div.box.secondary > .box-content { + color: #101010; /* var(--INTERNAL-MAIN-TEXT-color) */ + } + + div.box.blue { + background-color: rgba( 48, 117, 229, 1 ); /* var(--INTERNAL-BOX-BLUE-color) */ + } + + div.box.blue > .box-content { + color: rgba( 16, 16, 16, 1 ); /* var(--INTERNAL-BOX-BLUE-TEXT-color) */ + } + + div.box.green { + background-color: rgba( 42, 178, 24, 1 ); /* var(--INTERNAL-BOX-GREEN-color) */ + } + + div.box.green > .box-content { + color: rgba( 16, 16, 16, 1 ); /* var(--INTERNAL-BOX-GREEN-TEXT-color) */ + } + + div.box.grey { + background-color: rgba( 128, 128, 128, 1 ); /* var(--INTERNAL-BOX-GREY-color) */ + } + + div.box.grey > .box-content { + color: rgba( 16, 16, 16, 1 ); /* var(--INTERNAL-BOX-GREY-TEXT-color) */ + } + + div.box.orange { + background-color: rgba( 237, 153, 9, 1 ); /* var(--INTERNAL-BOX-ORANGE-color) */ + } + + div.box.orange > .box-content { + color: rgba( 16, 16, 16, 1 ); /* var(--INTERNAL-BOX-ORANGE-TEXT-color) */ + } + + div.box.red { + background-color: rgba( 224, 62, 62, 1 ); /* var(--INTERNAL-BOX-RED-color) */ + } + + div.box.red > .box-content { + color: rgba( 16, 16, 16, 1 ); /* var(--INTERNAL-BOX-RED-TEXT-color) */ + } + + div.box.transparent { + background-color: transparent; + } + + div.box.transparent > .box-label { + color: #4a4a4a; /* var(--MAIN-TITLES-TEXT-color) */ + } + + div.box.transparent > .box-content { + background-color: transparent; + color: #101010; /* var(--MAIN-TEXT-color) */ + } + + code, + kbd, + pre, + samp { + font-family: "Consolas", menlo, monospace; /* var(--CODE-font) */ + } + + code { + background-color: #fffae9; /* var(--CODE-INLINE-BG-color) */ + border-color: #f8e8c8; /* var(--CODE-INLINE-BORDER-color) */ + color: #5e5e5e; /* var(--CODE-INLINE-color) */ + } + + pre { + background-color: #f8f8f8; /* var(--CODE-BLOCK-BG-color) */ + border-color: #d8d8d8; /* var(--CODE-BLOCK-BORDER-color) */ + color: #000000; /* var(--CODE-BLOCK-color) */ + } + + div.featherlight .featherlight-content{ + background-color: #ffffff /* var(--INTERNAL-MAIN-BG-color); */ + } + + #topbar { + background-color: #ffffff; /* var(--MAIN-BG-color) */ + } + + #body a[aria-disabled="true"] { + color: #101010; /* var(--MAIN-TEXT-color) - inherit is not processed correctly in Chrome */ + } + + .copy-to-clipboard-button { + background-color: #fffae9; /* var(--CODE-INLINE-BG-color) */ + border-color: #f8e8c8; /* var(--CODE-INLINE-BORDER-color) */ + color: #5e5e5e; /* var(--CODE-INLINE-color) */ + font-family: "Consolas", menlo, monospace; /* var(--CODE-font) */ + } + + .copy-to-clipboard-button:hover { + background-color: #5e5e5e; /* var(--CODE-INLINE-color) */ + color: #fffae9; /* var(--CODE-INLINE-BG-color) */ + } + + pre .copy-to-clipboard-button { + border-color: #d8d8d8; /* var(--CODE-BLOCK-BORDER-color) */ + color: #486ac9; /* var(--MAIN-LINK-color) */ + } + + pre .copy-to-clipboard-button:hover { + background-color: #486ac9; /* var(--MAIN-LINK-color) */ + border-color: #486ac9; /* var(--MAIN-LINK-color) */ + color: #f8f8f8; /* var(--CODE-BLOCK-BG-color) */ + } + + #homelinks { + background-color: #7dc903; /* var(--MENU-HEADER-BORDER-color) */ + border-color: #7dc903; /* var(--MENU-HEADER-BORDER-color) */ + } + + #homelinks a { + color: #323232 /* var(--MENU-HOME-LINK-color) */ + } + + #homelinks a:hover { + color: #808080 /* var(--MENU-HOME-LINK-HOVER-color) */; + } + + #body a.highlight:after { + background-color: #486ac9; /* var(--MAIN-LINK-color) */ + } + + #body a.highlight:hover:after { + background-color: #202891; /* var(--MAIN-LINK-HOVER-color) */ + } + + .progress { + background-color: #ffffff; /* var(--MAIN-BG-color) */ + } + + .btn { + background-color: rgba( 128, 128, 128, 1 ); /* var(--BOX-NEUTRAL-color) */ + } + + .btn a { + border-color: rgba( 128, 128, 128, 1 ); /* var(--BOX-NEUTRAL-color) */ + color: rgba( 255, 255, 255, 1 ); /* var(--BOX-CAPTION-color) */ + } + + .btn a:hover, + .btn a:focus, + .btn a:active { + background-color: rgba( 255, 255, 255, .833 ); /* var(--BOX-BG-color) */ + color: rgba( 16, 16, 16, 1 ); /* var(--BOX-NEUTRAL-TEXT-color) */ + } + + .btn.cstyle.info { + background-color: rgba( 48, 117, 229, 1 ); /* var(--BOX-INFO-color) */ + } + + .btn.cstyle.info a { + border-color: rgba( 48, 117, 229, 1 ); /* var(--BOX-INFO-color) */ + } + + .btn.cstyle.note { + background-color: rgba( 237, 153, 9, 1 ); /* var(--BOX-NOTE-color) */ + } + + .btn.cstyle.note a { + border-color: rgba( 237, 153, 9, 1 ); /* var(--BOX-NOTE-color) */ + } + + .btn.cstyle.tip { + background-color: rgba( 42, 178, 24, 1 ); /* var(--BOX-TIP-color) */ + } + + .btn.cstyle.tip a { + border-color: rgba( 42, 178, 24, 1 ); /* var(--BOX-TIP-color) */ + } + + .btn.cstyle.warning { + background-color: rgba( 224, 62, 62, 1 ); /* var(--BOX-WARNING-color) */ + } + + .btn.cstyle.warning a { + border-color: rgba( 224, 62, 62, 1 ); /* var(--BOX-WARNING-color) */ + } + + .btn.cstyle.primary { + background-color: #7dc903; /* var(--PRIMARY-color) */ + } + + .btn.cstyle.primary a { + border-color: #7dc903; /* var(--PRIMARY-color) */ + } + + .btn.cstyle.secondary { + background-color: #486ac9; /* var(--SECONDARY-color) */ + } + + .btn.cstyle.secondary a { + border-color: #486ac9; /* var(--SECONDARY-color) */ + } + + .btn.cstyle.blue { + background-color: rgba( 48, 117, 229, 1 ); /* var(--BOX-BLUE-color) */ + } + + .btn.cstyle.blue a { + border-color: rgba( 48, 117, 229, 1 ); /* var(--BOX-BLUE-color) */ + } + + .btn.cstyle.green { + background-color: rgba( 42, 178, 24, 1 ); /* var(--BOX-GREEN-color) */ + } + + .btn.cstyle.green a { + border-color: rgba( 42, 178, 24, 1 ); /* var(--BOX-GREEN-color) */ + } + + .btn.cstyle.grey { + background-color: rgba( 128, 128, 128, 1 ); /* var(--BOX-GREY-color) */ + } + + .btn.cstyle.grey a { + border-color: rgba( 128, 128, 128, 1 ); /* var(--BOX-GREY-color) */ + } + + .btn.cstyle.orange { + background-color: rgba( 237, 153, 9, 1 ); /* var(--BOX-ORANGE-color) */ + } + + .btn.cstyle.orange a { + border-color: rgba( 237, 153, 9, 1 ); /* var(--BOX-ORANGE-color) */ + } + + .btn.cstyle.red { + background-color: rgba( 224, 62, 62, 1 ); /* var(--BOX-RED-color) */ + } + + .btn.cstyle.red a { + border-color: rgba( 224, 62, 62, 1 ); /* var(--BOX-RED-color) */ + } + + .btn.cstyle.transparent { + background-color: transparent; + color: #101010; /* var(--MAIN-TEXT-color) */ + } + + .btn.cstyle.transparent:hover, + .btn.cstyle.transparent:focus, + .btn.cstyle.transparent:active { + background-color: rgba( 128, 128, 128, 1 ); /* var(--BOX-NEUTRAL-color) */ + } + + .btn.cstyle.transparent a { + color: #4a4a4a; /* var(--MAIN-TITLES-TEXT-color) */ + } + + #body .tags a.tag-link { + background-color: #7dc903; /* var(--TAG-BG-color) */ + color: #ffffff; /* var(--MAIN-BG-color) */ + } + + #body .tags a.tag-link:before { + border-right-color: #7dc903; /* var(--TAG-BG-color) */ + } + + #body .tags a.tag-link:after { + background: #ffffff; /* var(--MAIN-BG-color) */ + } + + #body .tab-nav-button.active { + background-color: #ffffff !important; /* var(--MAIN-BG-color) */ + border-bottom-color: #ffffff !important; /* var(--MAIN-BG-color) */ + } +} + +@media all and (-ms-high-contrast:none) { + /* set further styles to fix broken stuff in IE11 */ + + /* turn off animiation in IE because this causes the menu + to move in from the left on every page load */ + .default-animation{ + transition: none; + } + + /* our silly dinosaur browser wants to have the real colors */ + #header-wrapper { + background-color: #7dc903; /* var(--MENU-HEADER-BG-color) */ + border-bottom-color: #7dc903; /* var(--MENU-HEADER-BORDER-color) */ + } + + /* clears the 'X' from Internet Explorer's search input */ + input[type=search]::-ms-clear { display: none; width : 0; height: 0; } + input[type=search]::-ms-reveal { display: none; width : 0; height: 0; } + + /* turn off variant selector as it uses modern stuff; don't change + order with block below */ + .showVariantSwitch{ + display: getamodernbrowser; + } + /* dumb IE11 doesn't understand initial, so we force a fallback here */ + .showLangSwitch, + .showVisitedLinks, + .showFooter { + display: block; + } +} diff --git a/themes/relearn/static/css/nucleus.css b/themes/relearn/static/css/nucleus.css new file mode 100644 index 0000000..f03efd7 --- /dev/null +++ b/themes/relearn/static/css/nucleus.css @@ -0,0 +1,289 @@ +*, *::before, *::after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + +@-webkit-viewport { + width: device-width; } +@-moz-viewport { + width: device-width; } +@-ms-viewport { + width: device-width; } +@-o-viewport { + width: device-width; } +@viewport { + width: device-width; } +html { + font-size: 100%; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; } + +body { + margin: 0; } + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section, +summary { + display: block; } + +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; } + +audio:not([controls]) { + display: none; + height: 0; } + +[hidden], +template { + display: none; } + +a { + background: transparent; + text-decoration: none; } + +a:active, +a:hover { + outline: 0; } + +abbr[title] { + border-bottom: 1px dotted; } + +b, +strong { + font-weight: bold; } + +dfn { + font-style: italic; } + +mark { + background: #FFFF27; + color: #333; } + +sub, +sup { + font-size: 0.8rem; + line-height: 0; + position: relative; + vertical-align: baseline; } + +sup { + top: -0.5em; } + +sub { + bottom: -0.25em; } + +img { + border: 0; + max-width: 100%; } + +svg:not(:root) { + overflow: hidden; } + +figure { + margin: 1em 40px; } + +hr { + height: 0; } + +pre { + overflow: auto; } + +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; } + +button { + overflow: visible; } + +button, +select { + text-transform: none; } + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; } + +button[disabled], +html input[disabled] { + cursor: default; } + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; } + +input { + line-height: normal; } + +input[type="checkbox"], +input[type="radio"] { + padding: 0; } + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; } + +input[type="search"] { + -webkit-appearance: textfield; } + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; } + +legend { + border: 0; + padding: 0; } + +textarea { + overflow: auto; } + +optgroup { + font-weight: bold; } + +table { + border-collapse: collapse; + border-spacing: 0; + table-layout: fixed; + width: 100%; } + +tr, td, th { + vertical-align: middle; } + +th, td { + padding: 0.425rem 0; } + +th { + text-align: left; } + +body { + font-size: 1rem; + line-height: 1.5; } + +h1, h2, h3, h4, h5, h6 { + margin: 0.85rem 0 1rem 0; + text-rendering: optimizeLegibility; } + +h1 { + font-size: 3.25rem; } + +h2 { + font-size: 2.55rem; } + +h3 { + font-size: 2.15rem; } + +h4 { + font-size: 1.8rem; } + +h5 { + font-size: 1.4rem; } + +h6 { + font-size: 0.9rem; } + +p { + margin: 1rem 0; } + +ul, ol { + margin-top: 1rem; + margin-bottom: 1rem; } + ul ul, ul ol, ol ul, ol ol { + margin-top: 0; + margin-bottom: 0; } + +blockquote { + margin: 1.5rem 0; + padding-left: 0.85rem; } + +cite { + display: block; + font-size: 0.925rem; } + cite:before { + content: "\2014 \0020"; } + +pre { + margin: 1.5rem 0; + padding: 0.938rem; } + +code { + vertical-align: bottom; } + +small { + font-size: 0.925rem; } + +hr { + border-left: none; + border-right: none; + border-top: none; + margin: 1.5rem 0; } + +fieldset { + border: 0; + padding: 0.938rem; + margin: 0 0 1rem 0; } + +input, +label, +select { + display: block; } + +label { + margin-bottom: 0.425rem; } + label.required:after { + content: "*"; } + label abbr { + display: none; } + +textarea, input[type="email"], input[type="number"], input[type="password"], input[type="search"], input[type="tel"], input[type="text"], input[type="url"], input[type="color"], input[type="date"], input[type="datetime"], input[type="datetime-local"], input[type="month"], input[type="time"], input[type="week"], select[multiple=multiple] { + -webkit-transition: border-color; + -moz-transition: border-color; + transition: border-color; + border-radius: 0.1875rem; + margin-bottom: 0.85rem; + padding: 0.425rem 0.425rem; + width: 100%; } + textarea:focus, input[type="email"]:focus, input[type="number"]:focus, input[type="password"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="text"]:focus, input[type="url"]:focus, input[type="color"]:focus, input[type="date"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="week"]:focus, select[multiple=multiple]:focus { + outline: none; } + +textarea { + resize: vertical; } + +input[type="checkbox"], input[type="radio"] { + display: inline; + margin-right: 0.425rem; } + +input[type="file"] { + width: 100%; } + +select { + width: auto; + max-width: 100%; + margin-bottom: 1rem; } + +button, +input[type="submit"] { + cursor: pointer; + user-select: none; + white-space: nowrap; + border: inherit; } diff --git a/themes/relearn/static/css/perfect-scrollbar.min.css b/themes/relearn/static/css/perfect-scrollbar.min.css new file mode 100644 index 0000000..6761910 --- /dev/null +++ b/themes/relearn/static/css/perfect-scrollbar.min.css @@ -0,0 +1 @@ +.ps{overflow:hidden!important;overflow-anchor:none;-ms-overflow-style:none;touch-action:auto;-ms-touch-action:auto}.ps__rail-x{display:none;opacity:0;transition:background-color .2s linear,opacity .2s linear;-webkit-transition:background-color .2s linear,opacity .2s linear;height:15px;bottom:0;position:absolute}.ps__rail-y{display:none;opacity:0;transition:background-color .2s linear,opacity .2s linear;-webkit-transition:background-color .2s linear,opacity .2s linear;width:15px;right:0;position:absolute}.ps--active-x>.ps__rail-x,.ps--active-y>.ps__rail-y{display:block;background-color:transparent}.ps--focus>.ps__rail-x,.ps--focus>.ps__rail-y,.ps--scrolling-x>.ps__rail-x,.ps--scrolling-y>.ps__rail-y,.ps:hover>.ps__rail-x,.ps:hover>.ps__rail-y{opacity:.6}.ps .ps__rail-x.ps--clicking,.ps .ps__rail-x:focus,.ps .ps__rail-x:hover,.ps .ps__rail-y.ps--clicking,.ps .ps__rail-y:focus,.ps .ps__rail-y:hover{background-color:#eee;opacity:.9}.ps__thumb-x{background-color:#aaa;border-radius:6px;transition:background-color .2s linear,height .2s ease-in-out;-webkit-transition:background-color .2s linear,height .2s ease-in-out;height:6px;bottom:2px;position:absolute}.ps__thumb-y{background-color:#aaa;border-radius:6px;transition:background-color .2s linear,width .2s ease-in-out;-webkit-transition:background-color .2s linear,width .2s ease-in-out;width:6px;right:2px;position:absolute}.ps__rail-x.ps--clicking .ps__thumb-x,.ps__rail-x:focus>.ps__thumb-x,.ps__rail-x:hover>.ps__thumb-x{background-color:#999;height:11px}.ps__rail-y.ps--clicking .ps__thumb-y,.ps__rail-y:focus>.ps__thumb-y,.ps__rail-y:hover>.ps__thumb-y{background-color:#999;width:11px}@supports (-ms-overflow-style:none){.ps{overflow:auto!important}}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.ps{overflow:auto!important}} \ No newline at end of file diff --git a/themes/relearn/static/css/print.css b/themes/relearn/static/css/print.css new file mode 100644 index 0000000..53aa5c5 --- /dev/null +++ b/themes/relearn/static/css/print.css @@ -0,0 +1,181 @@ +@import "theme-relearn-light.css"; + +#sidebar { + display: none; +} +#body { + margin-left: 0; + min-width: 100%; + max-width: 100%; + width: 100%; +} +#body #navigation { + display: none; +} +html, +body #body{ + font-size: 8.9pt; +} +body { + background-color: white; +} +pre code { + font-size: 8.3pt; +} +code.copy-to-clipboard-code { + border-bottom-right-radius: 2px; + border-top-right-radius: 2px; + border-right-width: 1px; +} +pre { + border: 1px solid #ccc; +} +#body #topbar{ + background-color: #fff; /* avoid background bleeding*/ + border-bottom: 1px solid #ddd; + border-radius: 0; + padding-left: 0; /* for print, we want to align with the footer to ease the layout */ + color: #777; +} +.navigation, +#top-print-link, +#top-github-link { + /* we don't need this while printing */ + display: none; +} +#body #breadcrumbs { + width: 100%; +} +#body #breadcrumbs .links { + overflow-x: hidden; + visibility: visible; +} +.copy-to-clipboard-button { + display: none; +} + +#body h1, #body h2, #body h3, #body h4, #body h5, #body h6 { + /* better contrast for colored elements */ + color: black; +} +#body th, #body td, +#body code, #body strong, #body b, +#body li, #body dd, #body dt, +#body p, +#body a { + /* better contrast for colored elements */ + color: black; +} +#body .anchor{ + display: none; +} +#body pre, +#body code { + background-color: white; + border-color: #ddd; +} + +hr{ + border-bottom: 1px solid #ddd; +} +body, +#body, +#body-inner { + overflow: visible !important; /* turn off limitations for perfect scrollbar */ +} +#body #body-inner { + /* reset paddings for chapters in screen */ + padding: 0 3rem 4rem 3rem; +} + +#body #body-inner h1 { + border-bottom: 1px solid #ddd; + margin-bottom: 2rem; + padding-bottom: .75rem; +} +#body-inner .chapter h3:first-of-type { + margin-top: 2rem; +} +#body-inner .chapter p { + font-size: 1rem; +} + +.footline { + /* in print mode show footer line to signal reader the end of document */ + border-top: 1px solid #ddd; + color: #777; + margin-top: 1.5rem; + padding-top: .75rem; +} +#body #body-inner .footline a { + text-decoration: none; +} +#body #body-inner a { + /* in print we want to distinguish links in our content from + normal text even if printed black/white; + don't use a.highlight in selector to also get links that are + put as HTML into markdown */ + text-decoration-line: underline; +} +#toc-menu { + /* we don't need this while printing */ + display: none; +} +#body #sidebar-toggle-span { + /* we don't need this while printing */ + display: none; +} +#breadcrumbs .links { + display: inline; +} +#topbar{ + /* the header is sticky which is not suitable for print; */ + position: inherit; /* IE11 doesn't know "initial" here */ +} +#topbar > div { + background-color: #ffffff; /* IE11 doesn't know "initial" here */ +} +#body .tab-nav-button:not(.active) { + opacity: .5; +} +#head-tags { + display: none; +} +mark { + background: inherit; + color: inherit; +} +.mermaid > svg:hover { + border-color: transparent; +} +div.box { + border: 1px solid #ddd; +} +div.box > .box-content { + background-color: white; +} +rapi-doc{ + /* adjust rapi-doc internals to fill out available space */ + font-size: 4pt; + margin-left: -12px; + width: calc( 100% + 12px + 8px ); +} +.btn, +#body .tab-nav-button { + color: black !important; +} +#body .tab-nav-button.active { + background-color: white !important; + border-bottom-color: white !important; + color: black; +} +#body .tab-nav-button:not(.active) { + opacity: 1; +} + +article { + break-before: page; +} +#body-inner article:first-of-type { + break-before: avoid; +} diff --git a/themes/relearn/static/css/tabs.css b/themes/relearn/static/css/tabs.css new file mode 100644 index 0000000..425316b --- /dev/null +++ b/themes/relearn/static/css/tabs.css @@ -0,0 +1,58 @@ +#body .tab-nav-button { + background-color: rgba( 134, 134, 134, .166 ); + border-color: rgba( 134, 134, 134, .333 ); + border-radius: 4px 4px 0 0; + border-style: solid; + border-width: 1px; + bottom: -1px; + -webkit-print-color-adjust: exact; + color-adjust: exact; + display: block; + float: left; + font-size: .9rem; + font-weight: 500; + line-height: 1.42857143; + margin-left: 4px; + padding: 6px 12px; + position: relative; +} +#body .tab-nav-button:first-child { + margin-left: 9px; +} +#body .tab-nav-button:not(.active) { + border-bottom-color: rgba( 134, 134, 134, .1 ); + margin-top: 7px; + padding-bottom: 2px !important; + padding-top: 2px !important; +} +#body .tab-nav-button:not(.active) span { + opacity: .8; +} +#body .tab-panel { + margin-bottom: 1.5rem; + margin-top: 1.5rem; +} +#body .tab-content { + background-color: transparent; + border-color: rgba( 134, 134, 134, .333 ); + border-style: solid; + border-width: 1px; + clear: both; + -webkit-print-color-adjust: exact; + color-adjust: exact; + display: block; + padding: 8px; + z-index: 10; +} +#body .tab-content .tab-item{ + display: none; +} + +#body .tab-content .tab-item.active{ + display: block; +} + +#body .tab-item pre{ + margin-bottom: 0; + margin-top: 0; +} diff --git a/themes/relearn/static/css/tags.css b/themes/relearn/static/css/tags.css new file mode 100644 index 0000000..dc68a44 --- /dev/null +++ b/themes/relearn/static/css/tags.css @@ -0,0 +1,45 @@ +/* Tags */ + +#head-tags{ + margin-left:1rem; + margin-top:1rem; +} + +#body .tags a.tag-link { + border-bottom-right-radius: 3px; + border-top-right-radius: 3px; + box-shadow: 0 1px 2px rgba(0,0,0,0.2); + display: inline-block; + font-size: 0.8em; + font-weight: 400; + line-height: 2em; + margin: 0 16px 8px 0; + padding: 0 10px 0 12px; + position: relative; +} + +#body .tags a.tag-link:before { + border-color: transparent; + border-style: solid; + border-width: 1em 1em 1em 0; + content: ""; + left: -.99em; + height: 0; + position: absolute; + top:0; + width: 0; +} + +#body .tags a.tag-link:after { + border-radius: 100%; + content: ""; + left: 1px; + height: 5px; + position: absolute; + top: 10px; + width: 5px; +} + +#body .tags a.tag-link:hover:after { + width: 5px; +} diff --git a/themes/relearn/static/css/theme-blue.css b/themes/relearn/static/css/theme-blue.css new file mode 100644 index 0000000..595523f --- /dev/null +++ b/themes/relearn/static/css/theme-blue.css @@ -0,0 +1,48 @@ +/* here in this showcase we use our own modified chroma syntax highlightning style; + if you want to use a predefined style instead: + - remove `markup.highlight.noClasses` from your config.toml + - set `markup.highlight.style` to a predefined style name in your config.toml + - remove the following `@import` of the self-defined chroma stylesheet */ +@import "chroma-learn.css"; + +:root { + --MAIN-TEXT-color: #323232; /* Color of text by default */ + --MAIN-TITLES-TEXT-color: #5e5e5e; /* Color of titles h2-h3-h4-h5-h6 */ + --MAIN-LINK-color: #1c90f3; /* Color of links */ + --MAIN-LINK-HOVER-color: #167ad0; /* Color of hovered links */ + --MAIN-BG-color: #ffffff; /* color of text by default */ + + /* adjusted to base16-snazzy chroma style */ + --CODE-BLOCK-color: #e2e4e5; /* fallback color for code text */ + --CODE-BLOCK-BG-color: #282a36; /* fallback color for code background */ + --CODE-BLOCK-BORDER-color: #282a36; /* color of block code border */ + + --CODE-INLINE-color: #5e5e5e; /* color for inline code text */ + --CODE-INLINE-BG-color: #fffae9; /* color for inline code background */ + --CODE-INLINE-BORDER-color: #f8e8c8; /* color of inline code border */ + + --MENU-HOME-LINK-color: #323232; /* Color of the home button text */ + --MENU-HOME-LINK-HOVER-color: #5e5e5e; /* Color of the hovered home button text */ + + --MENU-HEADER-BG-color: #1c90f3; /* Background color of menu header */ + --MENU-HEADER-BORDER-color: #33a1ff; /*Color of menu header border */ + + --MENU-SEARCH-color: #ffffff; /* Color of search field text */ + --MENU-SEARCH-BG-color: #167ad0; /* Search field background color (by default borders + icons) */ + --MENU-SEARCH-BORDER-color: #33a1ff; /* Override search field border color */ + + --MENU-SECTIONS-ACTIVE-BG-color: #20272b; /* Background color of the active section and its children */ + --MENU-SECTIONS-BG-color: #252c31; /* Background color of other sections */ + --MENU-SECTIONS-LINK-color: #ccc; /* Color of links in menu */ + --MENU-SECTIONS-LINK-HOVER-color: #e6e6e6; /* Color of links in menu, when hovered */ + --MENU-SECTION-ACTIVE-CATEGORY-color: #777; /* Color of active category text */ + --MENU-SECTION-ACTIVE-CATEGORY-BG-color: #fff; /* Color of background for the active category (only) */ + + --MENU-VISITED-color: #1c90f3; /* Color of 'page visited' icons in menu */ + --MENU-SECTION-HR-color: #20272b; /* Color of
    separator in menu */ + + /* base styling for boxes */ + --BOX-CAPTION-color: rgba( 255, 255, 255, 1 ); /* color of the title text */ + --BOX-BG-color: rgba( 255, 255, 255, .833 ); /* color of the content background */ + --BOX-TEXT-color: rgba( 16, 16, 16, 1 ); /* fixed color of the content text */ +} diff --git a/themes/relearn/static/css/theme-green.css b/themes/relearn/static/css/theme-green.css new file mode 100644 index 0000000..eacee1e --- /dev/null +++ b/themes/relearn/static/css/theme-green.css @@ -0,0 +1,48 @@ +/* here in this showcase we use our own modified chroma syntax highlightning style; + if you want to use a predefined style instead: + - remove `markup.highlight.noClasses` from your config.toml + - set `markup.highlight.style` to a predefined style name in your config.toml + - remove the following `@import` of the self-defined chroma stylesheet */ +@import "chroma-learn.css"; + +:root { + --MAIN-TEXT-color: #323232; /* Color of text by default */ + --MAIN-TITLES-TEXT-color: #5e5e5e; /* Color of titles h2-h3-h4-h5-h6 */ + --MAIN-LINK-color: #599a3e; /* Color of links */ + --MAIN-LINK-HOVER-color: #3f6d2c; /* Color of hovered links */ + --MAIN-BG-color: #ffffff; /* color of text by default */ + + /* adjusted to base16-snazzy chroma style */ + --CODE-BLOCK-color: #e2e4e5; /* fallback color for code text */ + --CODE-BLOCK-BG-color: #282a36; /* fallback color for code background */ + --CODE-BLOCK-BORDER-color: #282a36; /* color of block code border */ + + --CODE-INLINE-color: #5e5e5e; /* color for inline code text */ + --CODE-INLINE-BG-color: #fffae9; /* color for inline code background */ + --CODE-INLINE-BORDER-color: #f8e8c8; /* color of inline code border */ + + --MENU-HOME-LINK-color: #323232; /* Color of the home button text */ + --MENU-HOME-LINK-HOVER-color: #5e5e5e; /* Color of the hovered home button text */ + + --MENU-HEADER-BG-color: #74b559; /* Background color of menu header */ + --MENU-HEADER-BORDER-color: #9cd484; /*Color of menu header border */ + + --MENU-SEARCH-color: #ffffff; /* Color of search field text */ + --MENU-SEARCH-BG-color: #599a3e; /* Search field background color (by default borders + icons) */ + --MENU-SEARCH-BORDER-color: #84c767; /* Override search field border color */ + + --MENU-SECTIONS-ACTIVE-BG-color: #1b211c; /* Background color of the active section and its children */ + --MENU-SECTIONS-BG-color: #222723; /* Background color of other sections */ + --MENU-SECTIONS-LINK-color: #ccc; /* Color of links in menu */ + --MENU-SECTIONS-LINK-HOVER-color: #e6e6e6; /* Color of links in menu, when hovered */ + --MENU-SECTION-ACTIVE-CATEGORY-color: #777; /* Color of active category text */ + --MENU-SECTION-ACTIVE-CATEGORY-BG-color: #fff; /* Color of background for the active category (only) */ + + --MENU-VISITED-color: #599a3e; /* Color of 'page visited' icons in menu */ + --MENU-SECTION-HR-color: #18211c; /* Color of
    separator in menu */ + + /* base styling for boxes */ + --BOX-CAPTION-color: rgba( 255, 255, 255, 1 ); /* color of the title text */ + --BOX-BG-color: rgba( 255, 255, 255, .833 ); /* color of the content background */ + --BOX-TEXT-color: rgba( 16, 16, 16, 1 ); /* fixed color of the content text */ +} diff --git a/themes/relearn/static/css/theme-learn.css b/themes/relearn/static/css/theme-learn.css new file mode 100644 index 0000000..75a1afd --- /dev/null +++ b/themes/relearn/static/css/theme-learn.css @@ -0,0 +1,59 @@ +/* here in this showcase we use our own modified chroma syntax highlightning style; + if you want to use a predefined style instead: + - remove `markup.highlight.noClasses` from your config.toml + - set `markup.highlight.style` to a predefined style name in your config.toml + - remove the following `@import` of the self-defined chroma stylesheet */ +@import "chroma-learn.css"; + +:root { + --MAIN-TEXT-color: #323232; /* Color of text by default */ + --MAIN-TITLES-TEXT-color: #5e5e5e; /* Color of titles h2-h3-h4-h5-h6 */ + --MAIN-LINK-color: #00bdf3; /* Color of links */ + --MAIN-LINK-HOVER-color: #0082a7; /* Color of hovered links */ + --MAIN-BG-color: #ffffff; /* color of text by default */ + + /* adjusted to base16-snazzy chroma style */ + --CODE-BLOCK-color: #e2e4e5; /* fallback color for code text */ + --CODE-BLOCK-BG-color: #282a36; /* fallback color for code background */ + --CODE-BLOCK-BORDER-color: #282a36; /* color of block code border */ + + --CODE-INLINE-color: #5e5e5e; /* color for inline code text */ + --CODE-INLINE-BG-color: #fff7dd; /* color for inline code background */ + --CODE-INLINE-BORDER-color: #fbf0cb; /* color of inline code border */ + + --MENU-HOME-LINK-color: #cccccc; /* Color of the home button text */ + --MENU-HOME-LINK-HOVER-color: #e6e6e6; /* Color of the hovered home button text */ + + --MENU-HEADER-BG-color: #8451a1; /* Background color of menu header */ + --MENU-HEADER-BORDER-color: #9c6fb6; /*Color of menu header border */ + + --MENU-SEARCH-color: #ffffff; /* Color of search field text */ + --MENU-SEARCH-BG-color: #764890; /* Search field background color (by default borders + icons) */ + --MENU-SEARCH-BORDER-color: #915eae; /* Override search field border color */ + + --MENU-SECTIONS-ACTIVE-BG-color: #251f29; /* Background color of the active section and its children */ + --MENU-SECTIONS-BG-color: #322a38; /* Background color of other sections */ + --MENU-SECTIONS-LINK-color: #cccccc; /* Color of links in menu */ + --MENU-SECTIONS-LINK-HOVER-color: #e6e6e6; /* Color of links in menu, when hovered */ + --MENU-SECTION-ACTIVE-CATEGORY-color: #777777; /* Color of active category text */ + --MENU-SECTION-ACTIVE-CATEGORY-BG-color: #ffffff; /* Color of background for the active category (only) */ + + --MENU-VISITED-color: #00bdf3; /* Color of 'page visited' icons in menu */ + --MENU-SECTION-HR-color: #2a232f; /* Color of
    separator in menu */ + + /* base styling for boxes */ + --BOX-CAPTION-color: rgba( 255, 255, 255, 1 ); /* color of the title text */ + --BOX-BG-color: rgba( 255, 255, 255, .833 ); /* color of the content background */ + --BOX-TEXT-color: rgba( 16, 16, 16, 1 ); /* fixed color of the content text */ +} + +body a#logo, +body #logo svg, +body #logo svg * { + color: var(--INTERNAL-MENU-SEARCH-color); + fill: var(--INTERNAL-MENU-SEARCH-color) !important; +} + +body a#logo:hover { + color: var(--INTERNAL-MENU-SEARCH-color); +} diff --git a/themes/relearn/static/css/theme-neon.css b/themes/relearn/static/css/theme-neon.css new file mode 100644 index 0000000..2e9be5e --- /dev/null +++ b/themes/relearn/static/css/theme-neon.css @@ -0,0 +1,260 @@ +/* here in this showcase we use our own modified chroma syntax highlightning style; + if you want to use a predefined style instead: + - remove `markup.highlight.noClasses` from your config.toml + - set `markup.highlight.style` to a predefined style name in your config.toml + - remove the following `@import` of the self-defined chroma stylesheet */ +@import "chroma-neon.css"; + +:root { + --PRIMARY-color: #f300b2; /* brand primary color */ + --SECONDARY-color: #1c90f3; /* brand secondary color */ + + --MAIN-TEXT-color: #e0e0e0; /* text color of content and h1 titles */ + --MAIN-LINK-HOVER-color: #4cabff; /* hoverd link color of content */ + --MAIN-BG-color: #202020; /* background color of content */ + + /* optional overwrites for specific headers */ + --MAIN-TITLES-TEXT-color: #f300b2; /* text color of h2-h6 titles and transparent box titles */ + --MAIN-TITLES-H3-color: #00f3d3; /* text color of h3-h6 titles */ + --MAIN-TITLES-H4-color: #ffff00; /* text color of h4-h6 titles */ + + /* adjusted to neon chroma style */ + --CODE-BLOCK-color: #f8f8f2; /* fallback text color of block code; should be adjusted to your selected chroma style */ + --CODE-BLOCK-BG-color: #000000; /* fallback background color of block code; should be adjusted to your selected chroma style */ + + --CODE-INLINE-color: #82e550; /* text color of inline code */ + --CODE-INLINE-BG-color: #282a36; /* background color of inline code */ + --CODE-INLINE-BORDER-color: #464646; /* border color of inline code */ + + --MERMAID-theme: dark; /* name of the default Mermaid theme for this variant, can be overridden in config.toml */ + --SWAGGER-theme: dark; /* name of the default Swagger theme for this variant, can be overridden in config.toml */ + + --MENU-HEADER-BG-color: rgba( 0, 0, 0, 0 ); /* background color of menu header */ + + --MENU-HOME-LINK-color: #323232; /* home button color if configured */ + --MENU-HOME-LINK-HOVER-color: #5e5e5e; /* hoverd home button color if configured */ + + --MENU-SEARCH-color: #e0e0e0; /* text and icon color of search box */ + --MENU-SEARCH-BG-color: #323232; /* background color of search box */ + --MENU-SEARCH-BORDER-color: #e0e0e0; /* border color of search box */ + + --MENU-SECTIONS-BG-color: linear-gradient( 165deg, #f300b2d3 0%, #1c90f3b3 65%, #00e3d3b3 100% ); /* background of the menu; this is NOT just a color value but can be a complete CSS background definition including gradients, etc. */ + --MENU-SECTIONS-ACTIVE-BG-color: rgba( 0, 0, 0, .166 ); /* background color of the active menu section */ + --MENU-SECTIONS-LINK-color: #ffffff; /* link color of menu topics */ + --MENU-SECTIONS-LINK-HOVER-color: #d0d0d0; /* hoverd link color of menu topics */ + --MENU-SECTION-ACTIVE-CATEGORY-color: #56ffe8; /* text color of the displayed menu topic */ + --MENU-SECTION-HR-color: #bababa; /* separator color of menu footer */ + + --MENU-VISITED-color: #33a1ff; /* icon color of visited menu topics if configured */ + + /* base styling for boxes */ + --BOX-CAPTION-color: rgba( 240, 240, 240, 1 ); /* text color of colored box titles */ + --BOX-BG-color: rgba( 20, 20, 20, 1 ); /* background color of colored boxes */ + --BOX-TEXT-color: initial; /* text color of colored box content */ + + /* optional base colors for colored boxes as in attachments and notice shortcode */ + --BOX-BLUE-color: rgba( 48, 117, 229, 1 ); /* background color of blue boxes */ + --BOX-BLUE-TEXT-color: var( --BOX-BLUE-color ); /* text color of blue boxes */ + --BOX-GREEN-color: rgba( 42, 178, 24, 1 ); /* background color of green boxes */ + --BOX-GREEN-TEXT-color: var( --BOX-GREEN-color ); /* text color of green boxes */ + --BOX-GREY-color: rgba( 128, 128, 128, 1 ); /* background color of grey boxes */ + --BOX-GREY-TEXT-color: var( --BOX-GREY-color ); /* text color of grey boxes */ + --BOX-ORANGE-color: rgba( 237, 153, 9, 1 ); /* background color of orange boxes */ + --BOX-ORANGE-TEXT-color: var( --BOX-ORANGE-color ); /* text color of orange boxes */ + --BOX-RED-color: rgba( 224, 62, 62, 1 ); /* background color of red boxes */ + --BOX-RED-TEXT-color: var( --BOX-RED-color ); /* text color of red boxes */ +} + +body a#logo, +body #logo svg, +body #logo svg * { + color: var(--INTERNAL-MENU-SEARCH-color); + fill: var(--INTERNAL-MENU-SEARCH-color) !important; +} + +body a#logo{ + color: var(--INTERNAL-MENU-SEARCH-color); + text-shadow: + 0 0 1px var(--INTERNAL-MENU-SEARCH-color), + 0 0 2px var(--INTERNAL-MENU-SEARCH-color), + 0 0 4px var(--INTERNAL-MENU-SEARCH-color), + 0 0 8px #808080, + 0 0 4px var(--INTERNAL-MENU-SECTIONS-LINK-HOVER-color), + 0 0 8px var(--INTERNAL-MENU-SECTIONS-LINK-HOVER-color); +} + +body h1 { + color: #fff; + text-shadow: + 0 0 1px #fff, + 0 0 2px #fff, + 0 0 4px #fff, + 0 0 8px #fff, + 0 0 3px var(--INTERNAL-MAIN-TITLES-H1-color), + 0 0 6px var(--INTERNAL-MAIN-TITLES-H1-color), + 0 0 8px var(--INTERNAL-MAIN-TITLES-H1-color); +} + +body h2 { + color: #fff; + text-shadow: + 0 0 1px #fff, + 0 0 2px #fff, + 0 0 8px #808080, + 0 0 4px var(--INTERNAL-MAIN-TITLES-H2-color), + 0 0 8px var(--INTERNAL-MAIN-TITLES-H2-color), + 0 0 10px var(--INTERNAL-MAIN-TITLES-H2-color); +} + +body h3 { + color: #fff; + text-shadow: + 0 0 1px #fff, + 0 0 2px #fff, + 0 0 8px #808080, + 0 0 4px var(--INTERNAL-MAIN-TITLES-H3-color), + 0 0 8px var(--INTERNAL-MAIN-TITLES-H3-color), + 0 0 10px var(--INTERNAL-MAIN-TITLES-H3-color); +} + +body h4 { + color: #fff; + text-shadow: + 0 0 1px #fff, + 0 0 2px #fff, + 0 0 8px #808080, + 0 0 4px var(--INTERNAL-MAIN-TITLES-H4-color), + 0 0 8px var(--INTERNAL-MAIN-TITLES-H4-color), + 0 0 10px var(--INTERNAL-MAIN-TITLES-H4-color); +} + +body h5 { + color: #fff; + text-shadow: + 0 0 1px #fff, + 0 0 2px #fff, + 0 0 8px #808080, + 0 0 4px var(--INTERNAL-MAIN-TITLES-H5-color), + 0 0 8px var(--INTERNAL-MAIN-TITLES-H5-color), + 0 0 10px var(--INTERNAL-MAIN-TITLES-H5-color); +} + +body h6 { + color: #fff; + text-shadow: + 0 0 1px #fff, + 0 0 2px #fff, + 0 0 8px #808080, + 0 0 4px var(--INTERNAL-MAIN-TITLES-H6-color), + 0 0 8px var(--INTERNAL-MAIN-TITLES-H6-color), + 0 0 10px var(--INTERNAL-MAIN-TITLES-H5-color); +} + +body #sidebar ul.topics li.active > label, +body #sidebar ul.topics li.active > a { + color: #fff; + text-shadow: + 0 0 1px #fff, + 0 0 2px #fff, + 0 0 8px #808080, + 0 0 4px var(--INTERNAL-MENU-SECTION-ACTIVE-CATEGORY-color), + 0 0 8px var(--INTERNAL-MENU-SECTION-ACTIVE-CATEGORY-color); +} + +body #sidebar select:hover, +body #sidebar label:hover, +body #sidebar a:hover { + color: #fff; + text-shadow: + 0 0 1px #fff, + 0 0 2px #fff, + 0 0 8px #808080, + 0 0 4px var(--INTERNAL-MENU-SECTIONS-LINK-HOVER-color), + 0 0 8px var(--INTERNAL-MENU-SECTIONS-LINK-HOVER-color); +} + +body h1 a, +body h2 a, +body h3 a, +body h4 a, +body h5 a, +body h6 a, +body .anchor { + text-shadow: none; +} + +body .btn, +body div.box { + box-shadow: + 0 0 1px #fff, + 0 0 2px #fff, + 0 0 4px #808080, + 0 0 4px var(--VARIABLE-BOX-color); +} + +body .btn, +body div.box > .box-label { + text-shadow: + 0 0 1px #fff, + 0 0 2px #fff, + 0 0 4px #808080, + 0 0 4px var(--VARIABLE-BOX-CAPTION-color); +} + +body .btn.cstyle { + --VARIABLE-BOX-TEXT-color: var(--VARIABLE-BOX-CAPTION-color); +} + +body .btn.cstyle.transparent { + --VARIABLE-BOX-BG-color: var(--INTERNAL-BOX-BG-color); +} + +body .btn.cstyle.transparent a { + border-color: var(--VARIABLE-BOX-color); + color: var(--VARIABLE-BOX-CAPTION-color); +} + +body .btn.cstyle.transparent a:hover, +body .btn.cstyle.transparent a:focus, +body .btn.cstyle.transparent a:active { + background-color: var(--INTERNAL-MAIN-TITLES-TEXT-color); + color: var(--INTERNAL-MAIN-TEXT-color); +} + +body .box.cstyle.transparent { + box-shadow: none; +} + +@media print { + #body h1, + #body h2, + #body h3, + #body h4, + #body h5, + #body h6 { + text-shadow: none; + } + #body .btn, + #body div.box, + #body div.box > .box-label { + box-shadow: none; + text-shadow: none; + } +} + +/* if we are in print chapter preview our @media statement from +above will not apply, so we have to repeat it here */ +.print #body h1, +.print #body h2, +.print #body h3, +.print #body h4, +.print #body h5, +.print #body h6 { + text-shadow: none; +} +.print #body .btn, +.print #body div.box, +.print #body div.box > .box-label { + box-shadow: none; + text-shadow: none; +} diff --git a/themes/relearn/static/css/theme-red.css b/themes/relearn/static/css/theme-red.css new file mode 100644 index 0000000..79abc73 --- /dev/null +++ b/themes/relearn/static/css/theme-red.css @@ -0,0 +1,48 @@ +/* here in this showcase we use our own modified chroma syntax highlightning style; + if you want to use a predefined style instead: + - remove `markup.highlight.noClasses` from your config.toml + - set `markup.highlight.style` to a predefined style name in your config.toml + - remove the following `@import` of the self-defined chroma stylesheet */ +@import "chroma-learn.css"; + +:root { + --MAIN-TEXT-color: #323232; /* Color of text by default */ + --MAIN-TITLES-TEXT-color: #5e5e5e; /* Color of titles h2-h3-h4-h5-h6 */ + --MAIN-LINK-color: #f31c1c; /* Color of links */ + --MAIN-LINK-HOVER-color: #d01616; /* Color of hovered links */ + --MAIN-BG-color: #ffffff; /* color of text by default */ + + /* adjusted to base16-snazzy chroma style */ + --CODE-BLOCK-color: #e2e4e5; /* fallback color for code text */ + --CODE-BLOCK-BG-color: #282a36; /* fallback color for code background */ + --CODE-BLOCK-BORDER-color: #282a36; /* color of block code border */ + + --CODE-INLINE-color: #5e5e5e; /* color for inline code text */ + --CODE-INLINE-BG-color: #fffae9; /* color for inline code background */ + --CODE-INLINE-BORDER-color: #f8e8c8; /* color of inline code border */ + + --MENU-HOME-LINK-color: #ccc; /* Color of the home button text */ + --MENU-HOME-LINK-HOVER-color: #e6e6e6; /* Color of the hovered home button text */ + + --MENU-HEADER-BG-color: #dc1010; /* Background color of menu header */ + --MENU-HEADER-BORDER-color: #e23131; /*Color of menu header border */ + + --MENU-SEARCH-color: #ffffff; /* Color of search field text */ + --MENU-SEARCH-BG-color: #b90000; /* Search field background color (by default borders + icons) */ + --MENU-SEARCH-BORDER-color: #ef2020; /* Override search field border color */ + + --MENU-SECTIONS-ACTIVE-BG-color: #2b2020; /* Background color of the active section and its children */ + --MENU-SECTIONS-BG-color: #312525; /* Background color of other sections */ + --MENU-SECTIONS-LINK-color: #ccc; /* Color of links in menu */ + --MENU-SECTIONS-LINK-HOVER-color: #e6e6e6; /* Color of links in menu, when hovered */ + --MENU-SECTION-ACTIVE-CATEGORY-color: #777; /* Color of active category text */ + --MENU-SECTION-ACTIVE-CATEGORY-BG-color: #fff; /* Color of background for the active category (only) */ + + --MENU-VISITED-color: #f31c1c; /* Color of 'page visited' icons in menu */ + --MENU-SECTION-HR-color: #2b2020; /* Color of
    separator in menu */ + + /* base styling for boxes */ + --BOX-CAPTION-color: rgba( 255, 255, 255, 1 ); /* color of the title text */ + --BOX-BG-color: rgba( 255, 255, 255, .833 ); /* color of the content background */ + --BOX-TEXT-color: rgba( 16, 16, 16, 1 ); /* fixed color of the content text */ +} diff --git a/themes/relearn/static/css/theme-relearn-dark.css b/themes/relearn/static/css/theme-relearn-dark.css new file mode 100644 index 0000000..d36c8a8 --- /dev/null +++ b/themes/relearn/static/css/theme-relearn-dark.css @@ -0,0 +1,47 @@ +/* here in this showcase we use our own modified chroma syntax highlightning style; + if you want to use a predefined style instead: + - remove `markup.highlight.noClasses` from your config.toml + - set `markup.highlight.style` to a predefined style name in your config.toml + - remove the following `@import` of the self-defined chroma stylesheet */ +@import "chroma-relearn-dark.css"; + +:root { + --PRIMARY-color: #7dc903; /* brand primary color */ + --SECONDARY-color: #6c8ce3; /* brand secondary color */ + + --MAIN-TEXT-color: #e0e0e0; /* text color of content and h1 titles */ + --MAIN-LINK-HOVER-color: #93b0ff; /* hoverd link color of content */ + --MAIN-BG-color: #202020; /* background color of content */ + --MAIN-TITLES-TEXT-color: #ffffff; /* text color of h2-h6 titles and transparent box titles */ + + /* adjusted to relearn-dark chroma style */ + --CODE-BLOCK-color: #f8f8f8; /* fallback text color of block code; should be adjusted to your selected chroma style */ + --CODE-BLOCK-BG-color: #2b2b2b; /* fallback background color of block code; should be adjusted to your selected chroma style */ + + --CODE-INLINE-color: #82e550; /* text color of inline code */ + --CODE-INLINE-BG-color: #2d2d2d; /* background color of inline code */ + --CODE-INLINE-BORDER-color: #464646; /* border color of inline code */ + + --MERMAID-theme: dark; /* name of the default Mermaid theme for this variant, can be overridden in config.toml */ + --SWAGGER-theme: dark; /* name of the default Swagger theme for this variant, can be overridden in config.toml */ + + --MENU-HOME-LINK-color: #323232; /* home button color if configured */ + --MENU-HOME-LINK-HOVER-color: #5e5e5e; /* hoverd home button color if configured */ + + --MENU-SEARCH-color: #e0e0e0; /* text and icon color of search box */ + --MENU-SEARCH-BG-color: #323232; /* background color of search box */ + --MENU-SEARCH-BORDER-color: #e0e0e0; /* border color of search box */ + + --MENU-SECTIONS-BG-color: #2b2b2b; /* background of the menu; this is NOT just a color value but can be a complete CSS background definition including gradients, etc. */ + --MENU-SECTIONS-LINK-color: #bababa; /* link color of menu topics */ + --MENU-SECTIONS-LINK-HOVER-color: #ffffff; /* hoverd link color of menu topics */ + --MENU-SECTIONS-ACTIVE-BG-color: #323232; /* background color of the active menu section */ + --MENU-SECTION-ACTIVE-CATEGORY-color: #82e550; /* text color of the displayed menu topic */ + --MENU-SECTION-HR-color: #606060; /* separator color of menu footer */ + + --MENU-VISITED-color: #486ac9; /* icon color of visited menu topics if configured */ + + --BOX-CAPTION-color: rgba( 240, 240, 240, 1 ); /* text color of colored box titles */ + --BOX-BG-color: rgba( 20, 20, 20, 1 ); /* background color of colored boxes */ + --BOX-TEXT-color: #e0e0e0; /* text color of colored box content */ +} diff --git a/themes/relearn/static/css/theme-relearn-light.css b/themes/relearn/static/css/theme-relearn-light.css new file mode 100644 index 0000000..1bc6a5a --- /dev/null +++ b/themes/relearn/static/css/theme-relearn-light.css @@ -0,0 +1,43 @@ +/* here in this showcase we use our own modified chroma syntax highlightning style; + if you want to use a predefined style instead: + - remove `markup.highlight.noClasses` from your config.toml + - set `markup.highlight.style` to a predefined style name in your config.toml + - remove the following `@import` of the self-defined chroma stylesheet */ +@import "chroma-relearn-light.css"; + +:root { + --PRIMARY-color: #7dc903; /* brand primary color */ + --SECONDARY-color: #486ac9; /* brand secondary color */ + + --MAIN-TEXT-color: #101010; /* text color of content and h1 titles */ + --MAIN-LINK-HOVER-color: #202891; /* hoverd link color of content */ + --MAIN-BG-color: #ffffff; /* background color of content */ + --MAIN-TITLES-TEXT-color: #4a4a4a; /* text color of h2-h6 titles and transparent box titles */ + + /* adjusted to relearn-light chroma style */ + --CODE-BLOCK-color: #000000; /* fallback text color of block code; should be adjusted to your selected chroma style */ + --CODE-BLOCK-BG-color: #f8f8f8; /* fallback background color of block code; should be adjusted to your selected chroma style */ + --CODE-BLOCK-BORDER-color: #d8d8d8; /* border color of block code */ + + --CODE-INLINE-color: #5e5e5e; /* text color of inline code */ + --CODE-INLINE-BG-color: #fffae9; /* background color of inline code */ + --CODE-INLINE-BORDER-color: #f8e8c8; /* border color of inline code */ + + --MENU-HOME-LINK-color: #323232; /* home button color if configured */ + --MENU-HOME-LINK-HOVER-color: #808080; /* hoverd home button color if configured */ + + --MENU-SEARCH-color: #e0e0e0; /* text and icon color of search box */ + --MENU-SEARCH-BG-color: #323232; /* background color of search box */ + --MENU-SEARCH-BORDER-color: #e0e0e0; /* border color of search box */ + + --MENU-SECTIONS-BG-color: #282828; /* background of the menu; this is NOT just a color value but can be a complete CSS background definition including gradients, etc. */ + --MENU-SECTIONS-ACTIVE-BG-color: rgba( 0, 0, 0, .166 ); /* background color of the active menu section */ + --MENU-SECTIONS-LINK-color: #bababa; /* link color of menu topics */ + --MENU-SECTIONS-LINK-HOVER-color: #ffffff; /* hoverd link color of menu topics */ + --MENU-SECTION-ACTIVE-CATEGORY-color: #444444; /* text color of the displayed menu topic */ + --MENU-SECTION-HR-color: #606060; /* separator color of menu footer */ + + --BOX-CAPTION-color: rgba( 255, 255, 255, 1 ); /* text color of colored box titles */ + --BOX-BG-color: rgba( 255, 255, 255, .833 ); /* background color of colored boxes */ + --BOX-TEXT-color: rgba( 16, 16, 16, 1 ); /* text color of colored box content */ +} diff --git a/themes/relearn/static/css/theme-relearn.css b/themes/relearn/static/css/theme-relearn.css new file mode 100644 index 0000000..36aae7a --- /dev/null +++ b/themes/relearn/static/css/theme-relearn.css @@ -0,0 +1,3 @@ +/* this file is here for compatiblity with older installations + use theme-relearn-light instead */ +@import "theme-relearn-light.css"; diff --git a/themes/relearn/static/css/theme.css b/themes/relearn/static/css/theme.css new file mode 100644 index 0000000..99c5482 --- /dev/null +++ b/themes/relearn/static/css/theme.css @@ -0,0 +1,1411 @@ +@charset "UTF-8"; + +@import "tags.css"; +@import "tabs.css"; + +@font-face { + font-family: 'Work Sans'; + font-style: normal; + font-weight: 200; + src: url("../fonts/WorkSans-ExtraLight.woff") format("woff2"), url("../fonts/WorkSans-ExtraLight.woff") format("woff"); + font-display: swap; +} + +@font-face { + font-family: 'Work Sans'; + font-style: normal; + font-weight: 300; + src: url("../fonts/WorkSans-Light.woff2") format("woff2"), url("../fonts/WorkSans-Light.woff") format("woff"); + font-display: swap; +} + +@font-face { + font-family: 'Work Sans'; + font-style: normal; + font-weight: 400; + src: url("../fonts/WorkSans-Regular.woff2") format("woff2"), url("../fonts/WorkSans-Regular.woff") format("woff"); + font-display: swap; +} + +@font-face { + font-family: 'Work Sans'; + font-style: normal; + font-weight: 500; + src: url("../fonts/WorkSans-Medium.woff2") format("woff2"), url("../fonts/WorkSans-Medium.woff") format("woff"); + font-display: swap; +} + +@font-face { + font-family: 'Work Sans'; + font-style: normal; + font-weight: 600; + src: url("../fonts/WorkSans-Bold.woff2") format("woff2"), url("../fonts/WorkSans-Bold.woff") format("woff"); + font-display: swap; +} + +html { + width: 100%; + height: 100%; +} + +body { + display: flex; + flex-direction: row-reverse; /* IE11 to allow body to have initial focus for PS and better SEO and a11y */ + font-size: 16.25px; + font-weight: 300; + height: 100%; + justify-content: flex-end; + line-height: 1.574; + /* overflow: hidden; PSC removed for #242 #243 #244; to avoid browser scrollbar to flicker before we create our own */ + width: 100%; +} + +body #body-inner .chapter h1 { + font-size: 3.5rem; +} +@media only screen and (min-width: 48em) and (max-width: 59.938em) { + body #body-inner .chapter h1 { + font-size: 2.8rem; + } +} +@media only screen and (max-width: 47.938em) { + body #body-inner .chapter h1 { + font-size: 2rem; + } +} + +pre { + position: relative; +} + +b, +strong, +label, +th { + font-weight: 600; +} + +.default-animation{ + transition: all 0.35s ease; +} + +#sidebar { + display: flex; + flex-basis: auto; + flex-direction: column; + flex-grow: 0; + flex-shrink: 0; + font-size: 15.25px; + height: 100%; + left: 0; + line-height: 1.574; + min-height: 100%; + min-width: 300px; + max-width: 300px; + position: fixed; + width: 300px; + z-index: 310; +} + +#header-wrapper { + border-bottom-style: solid; + border-bottom-width: 4px; + text-align: center; + padding: 1rem; + position: relative; +} +#header a { + display: inline-block; +} + +.searchbox { + border-radius: 4px; + border-style: solid; + border-width: 1px; + position: relative; + margin-top: 1rem; +} + +.searchbox label { + color: rgba( 255, 255, 255, .8 ); + position: absolute; + left: 10px; + top: 3px; +} + +.searchbox span { + color: rgba( 255, 255, 255, .6 ); + position: absolute; + right: 10px; + top: 3px; + cursor: pointer; +} + +.searchbox span:hover { + color: rgba( 255, 255, 255, .9 ); +} + +.searchbox input { + display: inline-block; + width: 100%; + height: 30px; + background: transparent; + border: 0; + padding: 0 25px 0 30px; + margin: 0; + font-weight: 300; +} + +.searchbox input:-ms-input-placeholder { + color: rgba( 255, 255, 255, .4 ); +} + +.searchbox input::placeholder { + color: rgba( 255, 255, 255, .4 ); +} + +#content-wrapper { + display: flex; + flex-direction: column; + flex: 1; /* fill rest of vertical space */ + overflow: hidden; + position: relative; /* PS */ + z-index: 410; +} + +#sidebar a.padding { + padding: 0 1rem; +} + +#sidebar ul.topics { + margin: 0 1rem; +} + +#sidebar ul.topics.searched ul { + display: block; +} + +#sidebar ul.topics ul { + display: none; +} + +#sidebar ul.topics li { + position: relative; +} + +#sidebar ul.topics > li > ul > li:last-child { + padding-bottom: 1rem; +} + +#sidebar ul.topics ul ul { + padding-bottom: 0; +} + +#sidebar ul.topics li.parent > ul, +#sidebar ul.topics li.active > ul, +#sidebar ul.topics li.alwaysopen > ul { + display: block; +} + +#sidebar ul.topics input.toggle, +#sidebar ul.topics label { + display: none; +} + +#sidebar ul.topics > li > label, +#sidebar ul.topics > li > a { + font-size: 1.1rem; + line-height: 2rem; +} + +#sidebar ul.topics > li > a b { + font-weight: 400; + opacity: 0.5; +} + +#sidebar ul.topics > li > a .fa { + margin-top: 9px; +} + +#sidebar ul.topics > li { + margin-left: -1rem; + margin-right: -1rem; + padding-left: 1rem; + padding-right: 1rem; +} + +#sidebar ul.topics li > a { + margin-left: -1rem; + margin-right: -1rem; + padding-left: 1rem; + padding-right: 1rem; +} + +#sidebar ul { + list-style: none; + padding: 0; + margin: 0; +} + +#sidebar ul li { + padding: 0; +} + +#sidebar ul li.visited + span { + margin-right: 16px; +} + +#sidebar ul li a { + display: block; + padding: 2px 0; +} + +#sidebar ul li a span { + display: block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +#sidebar ul li > a { + padding: 4px 0; +} + +#sidebar ul li li { + padding-left: 1rem; +} + +#sidebar ul.topics > li > a .read-icon { + margin-top: 9px; +} + +#sidebar #shortcuts li { + list-style: none; + padding: 2px 0; +} + +#sidebar ul li .read-icon { + display: none; + float: right; + font-size: 13px; + margin: 4px 0 0 0; + min-width: 16px; + text-align: right; +} + +#sidebar ul li.visited > a .read-icon { + display: inline; +} + +#sidebar .nav-title { + font-size: 2rem; + font-weight: 200; + letter-spacing: -1px; + line-height: 110% !important; + margin: 1rem 0 1rem 0; + padding-left: 1rem; + text-rendering: optimizeLegibility; + text-transform: uppercase; +} + +#sidebar .footermargin { + margin-top: auto; +} + +#sidebar hr { + border-bottom-style: solid; + border-bottom-width: 1px; + margin: 1.5rem 1rem 1rem 1rem; +} + +#body { + display: flex; + flex-basis: 100%; + flex-direction: column; + flex-grow: 1; + flex-shrink: 0; + height: 100%; + margin-left: 300px; + min-height: 100%; + min-width: calc( 100% - 300px); + max-width: calc( 100% - 300px); + overflow-wrap: break-word; /* avoid x-scrolling of body if it is to large to fit */ + position: relative; /* PS */ + width: calc( 100% - 300px); + z-index: 300; +} + +#body img, +#body .video-container { + display: block; + margin: 1.5rem auto; + text-align: center; +} + +#body img.border, +#body .video-container.border { + border: 2px solid #e6e6e6; + padding: 2px; +} + +#body img.shadow, +#body .video-container.shadow { + box-shadow: 0 10px 30px rgba( 200, 200, 200, .666 ); +} + +#body img.inline { + display: inline !important; + margin: 0 !important; + vertical-align: bottom; +} + +#body-inner { + display: flex; + flex: auto; + flex-direction: column; + overflow-y: auto; + padding: 0 3rem 4rem 3rem; + position: relative; /* PS */ +} +@media screen and (max-width: 59.938em) { + #body-inner { + padding: 0 2rem 15px 2rem; + } +} +@media screen and (max-width: 47.938em) { + #body-inner { + padding: 0 1rem 5px 1rem; + } +} + +#body h1 + hr { + margin-bottom: 2rem; + margin-top: -1rem; +} + +/* we limit width if we have large screens */ +@media screen and ( min-width: 1300px ){ /* #sidebar/width + ./max-width */ + #body .flex-block-wrapper { + margin-left: auto; + margin-right: auto; + max-width: 1000px; + } +} + +#body-inner.chapter { + margin-left: auto; + margin-right: auto; + padding: 2rem 9rem; +} +@media screen and (max-width: 59.938em) { + #body-inner.chapter { + padding: 15px 4rem 15px 4rem; + } +} +@media screen and (max-width: 47.938em) { + #body-inner.chapter { + padding: 5px 2rem 5px 2rem; + } +} + +#body-inner .chapter h3:first-of-type { + font-weight: 200; + margin-top: 0; + text-align: center; +} + +#body-inner .chapter h1 { + border-bottom: 4px solid rgba( 134, 134, 134, .125 ); + font-size: 5rem; +} + +#body-inner .chapter p { + font-size: 1.2rem; + text-align: justify; +} + +h1 { + font-weight: 200; + text-align: center; + text-transform: uppercase; +} + +h2, h3, h4, h5, h6 { + letter-spacing: -1px; + text-rendering: optimizeLegibility; +} + +blockquote { + border-left: 10px solid rgba( 134, 134, 134, .4 ); +} + +blockquote p { + font-size: 105%; + font-style: italic; + opacity: .75; + text-align: justify; +} + +blockquote cite { + display: block; + font-weight: bold; + opacity: .5; + padding-top: .5em; + text-align: right; +} + +/* colored boxes */ + +div.box { + --VARIABLE-BOX-color: var(--INTERNAL-BOX-NEUTRAL-color); + --VARIABLE-BOX-CAPTION-color: var(--INTERNAL-BOX-CAPTION-color); + --VARIABLE-BOX-BG-color: var(--INTERNAL-BOX-BG-color); + --VARIABLE-BOX-TEXT-color: var(--INTERNAL-BOX-NEUTRAL-TEXT-color); + -webkit-print-color-adjust: exact; + color-adjust: exact; + margin: 1.5rem 0; +} + +div.box > .box-label { + font-weight: 500; + padding: .2rem .6rem; +} + +div.box > .box-content { + padding-bottom: .1rem; + padding-left: 1rem; + padding-right: 1rem; +} + +div.box > .box-content > :first-child { + margin-top: 0; + padding-top: 1rem; +} + +div.box > .box-content > :last-child { + margin-bottom: 1rem; +} + +/* attachments shortcode */ + +div.attachments .box-content { + display: block; + margin: 0; + padding-left: 1.75rem; +} + +/* Children shortcode */ + +.children p { + font-size: small; + margin-bottom: 0px; + margin-top: 0px; + padding-bottom: 0px; + padding-top: 0px; +} + +.children-li p { + font-size: small; + font-style: italic; +} + +.children-h2 p, +.children-h3 p { + font-size: small; + margin-bottom: 0px; + margin-top: 0px; + padding-bottom: 0px; + padding-top: 0px; +} + +#body-inner .children h2, +#body-inner .children h3, +#body-inner .children h4, +#body-inner .children h5, +#body-inner .children h6 { + margin-bottom: 0; + margin-top: 1rem; +} +#body-inner ul.children-h2, +#body-inner ul.children-h3, +#body-inner ul.children-h4, +#body-inner ul.children-h5, +#body-inner ul.children-h6 { + /* if we display children with style=h2 but without a containerstyle + a ul will be used for structuring; we remove default indention for uls + in this case */ + padding-inline-start: 0; +} + +code, +kbd, +pre, +samp { + font-size: 92%; + vertical-align: baseline; +} + +code { + border-radius: 2px; + border-style: solid; + border-width: 1px; + -webkit-print-color-adjust: economy; + color-adjust: economy; + padding-left: 2px; + padding-right: 2px; + white-space: nowrap; +} + +span.copy-to-clipboard { + display: inline-block; +} + +code.copy-to-clipboard-code { + border-bottom-right-radius: 0; + border-top-right-radius: 0; + border-right-width: 0; +} + +pre { + border-radius: 2px; + border-style: solid; + border-width: 1px; + -webkit-print-color-adjust: economy; + color-adjust: economy; + line-height: 1.15; + padding: 1rem; +} + +pre code { + background-color: inherit; + color: inherit; + -webkit-print-color-adjust: economy; + color-adjust: economy; + border: 0; + font-size: 15px; + margin: 0; + padding: 0; + white-space: inherit; +} + +hr { + border-bottom: 4px solid rgba( 134, 134, 134, .125 ); +} + +#body-inner pre { + white-space: pre-wrap; +} + +#body-inner h1, +#body-inner h2, +#body-inner h3, +#body-inner h4, +#body-inner h5, +#body-inner h6 { + /* big titles cause a horizontal scrollbar - fixing this by wrapping text */ + overflow-wrap: break-word; + overflow-x: hidden; +} + +table { + border: 1px solid rgba( 134, 134, 134, .333 ); + margin-bottom: 1rem; + margin-top: 1rem; + table-layout: auto; +} + +th, +thead td { + background-color: rgba( 134, 134, 134, .166 ); + border: 1px solid rgba( 134, 134, 134, .333 ); + -webkit-print-color-adjust: exact; + color-adjust: exact; + padding: 0.5rem; +} + +td { + border: 1px solid rgba( 134, 134, 134, .333 ); + padding: 0.5rem; +} + +.tooltipped { + position: relative; +} + +.tooltipped:after { + background: rgba(0, 0, 0, 1); + border: 1px solid #777; + border-radius: 3px; + color: #fff; + content: attr(aria-label); + display: none; + font: normal normal 11px/1.5 "Work Sans", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif; + -webkit-font-smoothing: subpixel-antialiased; + letter-spacing: normal; + padding: 5px 8px; + pointer-events: none; + position: absolute; + text-align: center; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: pre; + word-wrap: break-word; + z-index: 450; +} + +.tooltipped:before { + border: 5px solid transparent; + color: rgba(0, 0, 0, 1); + content: ""; + display: none; + height: 0; + pointer-events: none; + position: absolute; + width: 0; + z-index: 460; +} + +.tooltipped:hover:before, +.tooltipped:hover:after, +.tooltipped:active:before, +.tooltipped:active:after, +.tooltipped:focus:before, +.tooltipped:focus:after { + display: inline-block; + text-decoration: none; +} + +.tooltipped-s:after, +.tooltipped-se:after, +.tooltipped-sw:after { + margin-top: 5px; + right: 50%; + top: 100%; +} + +.tooltipped-s:before, +.tooltipped-se:before, +.tooltipped-sw:before { + border-bottom-color: rgba(0, 0, 0, 0.8); + bottom: -5px; + margin-right: -5px; + right: 50%; + top: auto; +} + +.tooltipped-se:after { + left: 50%; + margin-left: -15px; + right: auto; +} + +.tooltipped-sw:after { + margin-right: -15px; +} + +.tooltipped-n:after, +.tooltipped-ne:after, +.tooltipped-nw:after { + bottom: 100%; + margin-bottom: 5px; + right: 50%; +} + +.tooltipped-n:before, +.tooltipped-ne:before, +.tooltipped-nw:before { + border-top-color: rgba(0, 0, 0, 0.8); + bottom: auto; + margin-right: -5px; + right: 50%; + top: -5px; +} + +.tooltipped-ne:after { + left: 50%; + margin-left: -15px; + right: auto; +} + +.tooltipped-nw:after { + margin-right: -15px; +} + +.tooltipped-s:after, +.tooltipped-n:after { + transform: translateX(50%); +} + +.tooltipped-w:after { + bottom: 50%; + margin-right: 5px; + right: 100%; + transform: translateY(50%); +} + +.tooltipped-w:before { + border-left-color: rgba(0, 0, 0, 0.8); + bottom: 50%; + left: -5px; + margin-top: -5px; + top: 50%; +} + +.tooltipped-e:after { + bottom: 50%; + left: 100%; + margin-left: 5px; + transform: translateY(50%); +} + +.tooltipped-e:before { + border-right-color: rgba(0, 0, 0, 0.8); + bottom: 50%; + margin-top: -5px; + right: -5px; + top: 50%; +} + +#sidebar .highlightable { + padding: 1rem 0 1rem; + position: relative; +} + +.lightbox-active #body { + overflow: visible; +} + +.featherlight img { + margin: 0 !important; +} + +#topbar { + min-height: 3rem; + position: relative; + z-index: 480; +} + +#topbar > div { + background-color: rgba( 134, 134, 134, .066 ); + height: 100%; +} + +.navigation, +#top-print-link, +#top-github-link { + display: block; + float: right; +} + +.nav, +.print-link, +.github-link { + border-left: thin solid rgba( 134, 134, 134, .333 ); + padding-left: 1rem; + padding-right: 1rem; +} +span.nav i{ + color: rgba( 134, 134, 134, .333 ); +} + +.navigation, +#top-print-link, +#top-github-link { + position: relative; + top: 50%; + transform: translateY(-50%); +} + +#toc-menu{ + cursor: pointer; +} +#toc-menu, +#sidebar-toggle-span { + border-right: thin solid rgba( 134, 134, 134, .333 ); + padding-left: 1rem; + padding-right: 1rem; +} + +#body #breadcrumbs { + display: inline-block; + float: left; + height: auto; + line-height: 1.4; + margin-bottom: 0; + overflow: hidden; + position: relative; + text-overflow: ellipsis; + top: 50%; + transform: translateY(-50%); + white-space: nowrap; + width: calc(100% - 5*3.25rem); +} +@media screen and (max-width: 47.938em) { + #body #breadcrumbs { + text-overflow: unset; + } +} + +#sidebar-toggle-span { + display: none; +} +.progress { + left: 1rem; + top: 1rem; +} +@media screen and (max-width: 47.938em) { + .mobile-support #sidebar-toggle-span { + display: inline; + } + .progress { + left: 4.25rem; + } +} + +#body #breadcrumbs .links { + display: inline; + padding: 0 .75rem; +} +@media screen and (max-width: 47.938em) { + #body #breadcrumbs .links { + /* we just hide the breadcrumbs instead of display: none; + this makes sure that the breadcrumbs are still usable for + accessability */ + visibility: hidden; + } +} + +#body #breadcrumbs .links * { + display: inline-block; + padding: 0; +} + +#body #breadcrumbs .links meta { + display: none; +} + +#body #breadcrumbs .links li:last-of-type { + cursor: text; +} + +#body a[aria-disabled="true"] { + pointer-events: none; + text-decoration: none; +} + +@media screen and (max-width: 59.938em) { + #sidebar { + min-width: 230px; + max-width: 230px; + width: 230px; + } + #body { + margin-left: 230px; + min-width: calc( 100% - 230px); + max-width: calc( 100% - 230px); + width: calc( 100% - 230px); + } +} +@media screen and (max-width: 47.938em) { + /* we don't support sidebar flyout in mobile */ + .mobile-support #sidebar { + left: -230px; + } + .mobile-support #navshow{ + display: inline; + } + .mobile-support #body { + margin-left: 0; + min-width: 100%; + max-width: 100%; + width: 100%; + } + .mobile-support.sidebar-flyout { + overflow: hidden; + } + .mobile-support.sidebar-flyout #sidebar { + left: 0; + z-index: 400; + } + .mobile-support.sidebar-flyout #body { + margin-left: 230px; + overflow: hidden; + } + .mobile-support.sidebar-flyout #sidebar-overlay{ + background-color: rgba(134, 134, 134, 0.5); + bottom: 0; + cursor: pointer; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 500; + } +} + +.copy-to-clipboard-button { + border-radius: 0 2px 2px 0; + border-style: solid; + border-width: 1px; + cursor: pointer; + font-size: 92%; + padding-left: 22px; +} + +.copy-to-clipboard-button > i { + font-size: 92%; + font-weight: 500; + margin-left: -22px; +} + +.copy-to-clipboard-code + .copy-to-clipboard-button > i { + padding-left: 5px; + padding-right: 5px; +} + +pre .copy-to-clipboard-button { + background-color: rgba( 160, 160, 160, .2 ); + border-radius: 2px; + border-style: solid; + border-width: 1px; + padding: 5px 3px 5px 25px; + position: absolute; + right: 4px; + top: 4px; +} + +#homelinks { + border-bottom-style: solid; + border-bottom-width: 4px; + padding: 7px 0; +} + +option { + color: initial; +} + +.expand{ + margin-bottom: 1rem; + margin-top: 1rem; +} + +.expand-label { + cursor: pointer; +} + +.expand-label > .fas { + font-size: .8rem; + width: .6rem; +} + +/* expander collapsed, default */ +.expand > .expand-label > .fa-chevron-down { + display: none; +} +.expand > .expand-label > .fa-chevron-right { + display: inline-block; +} + +/* expander expanded, controlled by expand.html */ +.expand.expand-expanded > .expand-label > .fa-chevron-down { + display: inline-block; +} +.expand.expand-expanded > .expand-label > .fa-chevron-right { + display: none; +} + +/* expander expand collapsed marked, must override logic of expand.html, controlled by theme.js */ +.expand:not(.expand-expanded).expand-marked > .expand-label > .fa-chevron-down { + display: inline-block; +} +.expand:not(.expand-expanded).expand-marked > .expand-label > .fa-chevron-right { + display: none; +} +.expand:not(.expand-expanded).expand-marked > .expand-content { + /* this will disable jquery's animation */ + display: block !important; +} + +#body footer.footline{ + margin-top: 2rem; +} + +.footline i{ + margin-left: .5rem; +} +.footline i:first-child{ + margin-left: 0; +} + +.mermaid { + margin-bottom: 1.7rem; + margin-top: 1.7rem; +} + +.mermaid > svg { + border: 1px solid transparent; + cursor: pointer; + /* remove inline height from generated diagram */ + height: initial !important; +} + +.mermaid > svg:hover { + border-color: rgba( 134, 134, 134, .333 ); +} + +.mermaid-code { + display: none; +} + +.include.hide-first-heading h1:first-of-type, +.include.hide-first-heading h2:first-of-type, +.include.hide-first-heading h3:first-of-type, +.include.hide-first-heading h4:first-of-type, +.include.hide-first-heading h5:first-of-type, +.include.hide-first-heading h6:first-of-type { + display: none; +} + +.include.hide-first-heading h1 + h2:first-of-type, +.include.hide-first-heading h1 + h3:first-of-type, +.include.hide-first-heading h2 + h3:first-of-type, +.include.hide-first-heading h1 + h4:first-of-type, +.include.hide-first-heading h2 + h4:first-of-type, +.include.hide-first-heading h3 + h4:first-of-type, +.include.hide-first-heading h1 + h5:first-of-type, +.include.hide-first-heading h2 + h5:first-of-type, +.include.hide-first-heading h3 + h5:first-of-type, +.include.hide-first-heading h4 + h5:first-of-type, +.include.hide-first-heading h1 + h6:first-of-type, +.include.hide-first-heading h2 + h6:first-of-type, +.include.hide-first-heading h3 + h6:first-of-type, +.include.hide-first-heading h4 + h6:first-of-type, +.include.hide-first-heading h5 + h6:first-of-type { + display: block; +} + +#body a.highlight, +#body a.highlight:hover, +#body a.highlight:focus { + outline-style: none; + text-decoration: none; +} + +#body a.highlight { + display: inline-block; + line-height: 1.1; +} + +#body a.highlight:after { + content: ""; + display: block; + height: 1px; + width: 0%; + transition: width 0.5s ease; +} + +#body a.highlight:hover:after, +#body a.highlight:focus:after { + width: 100%; +} + +#body #topbar .navigation a.highlight:after, +#body #sidebar-toggle-span a.highlight:after, +#body #top-print-link a.highlight:after, +#body #top-github-link a.highlight:after { + background-color: transparent; +} + +/* Table of contents */ + +.toc-flyout #toc-overlay{ + bottom: 0; + cursor: pointer; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 470; +} + +.progress { + border: 0px solid rgba( 134, 134, 134, .166 ); + box-shadow: 1px 2px 5px 1px rgba( 134, 134, 134, .2 ); + height: 0; + opacity: 0; + overflow: hidden; + position: absolute; + width: 0; + z-index: 490; +} + +.toc-flyout .progress { + border-width: 1px; + height: auto; + opacity: 1; + width: auto; +} + +.progress .wrapper { + background-color: rgba( 134, 134, 134, .066 ); +} + +.progress ul { + list-style: none; + margin: 0; + padding: 0 15px; +} + +#TableOfContents { + font-size: 13px !important; + max-height: 90vh; + overflow: hidden; + padding: 15px 5px !important; + position: relative; /* PS */ +} + +#TableOfContents > ul > li > a { + font-weight: 500; +} + +.btn { + --VARIABLE-BOX-color: var(--INTERNAL-BOX-NEUTRAL-color); + --VARIABLE-BOX-CAPTION-color: var(--INTERNAL-BOX-CAPTION-color); + --VARIABLE-BOX-BG-color: var(--INTERNAL-BOX-BG-color); + --VARIABLE-BOX-TEXT-color: var(--INTERNAL-BOX-NEUTRAL-TEXT-color); + border-radius: 4px; + -webkit-print-color-adjust: exact; + color-adjust: exact; + cursor: pointer; + display: inline-block; + font-size: .9rem; + font-weight: 500; + line-height: 1.42857143; + margin-bottom: 0; + touch-action: manipulation; + -ms-user-select: none; + -webkit-user-select: none; + user-select: none; +} + +.btn a { + border-radius: 4px; + border-style: solid; + border-width: 1px; + padding: 6px 12px; + text-align: center; + touch-action: manipulation; + -ms-user-select: none; + -webkit-user-select: none; + user-select: none; + white-space: nowrap; + background-color: transparent; +} + +#body #body-inner .btn a.highlight:after { + background-color: transparent; +} + +.btn a:focus { + outline: none; +} + +.btn a:hover, +.btn a:focus { + text-decoration: none; +} + +/* anchors */ +.anchor { + cursor: pointer; + font-size: .5em; + margin-left: .66em; + margin-top: .9em; + position: absolute; + visibility: hidden; +} + +h2:hover .anchor, +h3:hover .anchor, +h4:hover .anchor, +h5:hover .anchor, +h6:hover .anchor { + visibility: visible; +} + +/* Redfines headers style */ + +h1 a, +h2 a, +h3 a, +h4 a, +h5 a, +h6 a { + font-weight: inherit; +} + +#body h2 { + font-size: 2.2rem; + font-weight: 500; + margin-top: 2rem; +} + +#body h3 { + font-size: 1.8rem; + font-weight: 500; + margin-top: 2rem; +} + +#body h4 { + font-size: 1.85rem; + font-weight: 300; + margin-top: 2rem; +} + +#body h5 { + font-size: 1.6rem; + font-weight: 300; + margin-top: 2rem; +} + +#body h6 { + font-size: 1.3rem; + font-weight: 300; + margin-top: 2rem; +} + +#body h1 + h2, +#body h1 + h3, +#body h1 + h4, +#body h1 + h5, +#body h1 + h6, +#body h2 + h3, +#body h2 + h4, +#body h2 + h5, +#body h2 + h6, +#body h3 + h4, +#body h3 + h5, +#body h3 + h6, +#body h4 + h5, +#body h4 + h6, +#body h5 + h6 { + margin-top: 1rem; +} + +rapi-doc { + /* adjust rapi-doc internals to fill out available space */ + margin-left: calc( -8px - 24px ); + width: calc( 100% + 8px + 24px + 8px ); +} + +.select-container i { + padding-top: .25em; +} + +.select-container i, +.select-container span { + display: block; + float: left; +} + +.select-style { + border: 0; + border-radius: 0px; + height: 1.574em; + overflow: hidden; +} + +.select-style select { + -webkit-appearance: none; + appearance: none; + border: none; + box-shadow: none; + background-color: transparent; + background-image: none; + width: 100%; +} + +.select-style select:focus { + outline: none; +} + +.select-style select::-ms-expand { + display: none; +} + +.select-style :hover { + cursor: pointer; +} + +.select-style option { + color: #000000; + padding: 0; + margin: 0; +} + +.select-clear { + clear: both; +} + +.footerLangSwitch, +.footerVariantSwitch, +.footerVisitedLinks, +.footerFooter { + display: none; +} + +.showLangSwitch, +.showVariantSwitch, +.showVisitedLinks, +.showFooter { + display: initial; +} + +@media screen and (max-width: 47.938em) { + #breadcrumbs .links { + display: none; + } +} + +/* clears the 'X' from Chrome's search input */ +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-results-button, +input[type="search"]::-webkit-search-results-decoration { display: none; } + +#sidebar ul.collapsible-menu input.toggle { + cursor: pointer; + display: block; + left: -1rem; + opacity: 0; + overflow: hidden; + position: absolute; + top: 0; +} + +#sidebar ul.collapsible-menu label { + cursor: pointer; + display: inline; + height: 1rem; + left: 0; + margin-top: .25em; + position: absolute; + width: 1rem; +} + +#sidebar .collapsible-menu input.toggle + label:after { + content: "▸"; +} + +#sidebar .collapsible-menu input.toggle:checked + label:after { + content: "▾"; +} + +#sidebar .collapsible-menu input.toggle + label + a + ul { + display: none; +} + +#sidebar .collapsible-menu input.toggle:checked + label + a + ul { + display: inline; +} diff --git a/themes/relearn/static/css/variant.css b/themes/relearn/static/css/variant.css new file mode 100644 index 0000000..29d5b42 --- /dev/null +++ b/themes/relearn/static/css/variant.css @@ -0,0 +1,397 @@ +:root { + /* initially use section background to avoid flickering on load when a non default variant is active; + this is only possible because every color variant defines this variable, otherwise we would have been lost */ + --INTERNAL-PRIMARY-color: var(--PRIMARY-color, var(--MENU-HEADER-BG-color, rgba( 0, 0, 0, 0 ))); /* not --INTERNAL-MENU-HEADER-BG-color */ + --INTERNAL-SECONDARY-color: var(--SECONDARY-color, var(--MAIN-LINK-color, #486ac9)); /* not --INTERNAL-MAIN-LINK-color */ + + --INTERNAL-MAIN-TEXT-color: var(--MAIN-TEXT-color, #101010); + --INTERNAL-MAIN-TITLES-TEXT-color: var(--MAIN-TITLES-TEXT-color, #4a4a4a); + --INTERNAL-MAIN-LINK-color: var(--MAIN-LINK-color, var(--SECONDARY-color, #486ac9)); /* not --INTERNAL-SECONDARY-color */ + --INTERNAL-MAIN-LINK-HOVER-color: var(--MAIN-LINK-HOVER-color, var(--INTERNAL-MAIN-LINK-color)); + --INTERNAL-MAIN-BG-color: var(--MAIN-BG-color, #ffffff); + + --INTERNAL-MAIN-TITLES-H1-color: var(--MAIN-TITLES-H1-color, var(--INTERNAL-MAIN-TEXT-color)); + --INTERNAL-MAIN-TITLES-H2-color: var(--MAIN-TITLES-H2-color, var(--INTERNAL-MAIN-TITLES-TEXT-color)); + --INTERNAL-MAIN-TITLES-H3-color: var(--MAIN-TITLES-H3-color, var(--INTERNAL-MAIN-TITLES-H2-color)); + --INTERNAL-MAIN-TITLES-H4-color: var(--MAIN-TITLES-H4-color, var(--INTERNAL-MAIN-TITLES-H3-color)); + --INTERNAL-MAIN-TITLES-H5-color: var(--MAIN-TITLES-H5-color, var(--INTERNAL-MAIN-TITLES-H4-color)); + --INTERNAL-MAIN-TITLES-H6-color: var(--MAIN-TITLES-H6-color, var(--INTERNAL-MAIN-TITLES-H5-color)); + + --INTERNAL-MAIN-font: var(--MAIN-font, "Work Sans", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif); + --INTERNAL-MAIN-TITLES-TEXT-font: var(--MAIN-TITLES-TEXT-font, var(--INTERNAL-MAIN-font)); + + --INTERNAL-MAIN-TITLES-H1-font: var(--MAIN-TITLES-H1-font, var(--INTERNAL-MAIN-font)); + --INTERNAL-MAIN-TITLES-H2-font: var(--MAIN-TITLES-H2-font, var(--INTERNAL-MAIN-TITLES-TEXT-font)); + --INTERNAL-MAIN-TITLES-H3-font: var(--MAIN-TITLES-H3-font, var(--INTERNAL-MAIN-TITLES-H2-font)); + --INTERNAL-MAIN-TITLES-H4-font: var(--MAIN-TITLES-H4-font, var(--INTERNAL-MAIN-TITLES-H3-font)); + --INTERNAL-MAIN-TITLES-H5-font: var(--MAIN-TITLES-H5-font, var(--INTERNAL-MAIN-TITLES-H4-font)); + --INTERNAL-MAIN-TITLES-H6-font: var(--MAIN-TITLES-H6-font, var(--INTERNAL-MAIN-TITLES-H5-font)); + + --INTERNAL-CODE-BLOCK-color: var(--CODE-BLOCK-color, var(--MAIN-CODE-color, #000000)); + --INTERNAL-CODE-BLOCK-BG-color: var(--CODE-BLOCK-BG-color, var(--MAIN-CODE-BG-color, #f8f8f8)); + --INTERNAL-CODE-BLOCK-BORDER-color: var(--CODE-BLOCK-BORDER-color, var(--MAIN-CODE-BG-color, var(--INTERNAL-CODE-BLOCK-BG-color))); + + --INTERNAL-CODE-INLINE-color: var(--CODE-INLINE-color, #5e5e5e); + --INTERNAL-CODE-INLINE-BG-color: var(--CODE-INLINE-BG-color, #fffae9); + --INTERNAL-CODE-INLINE-BORDER-color: var(--CODE-INLINE-BORDER-color, #fbf0cb); + + --INTERNAL-CODE-font: var(--CODE-font, "Consolas", menlo, monospace); + + --INTERNAL-MERMAID-theme: var(--CONFIG-MERMAID-theme, var(--MERMAID-theme, default)); + --INTERNAL-SWAGGER-theme: var(--CONFIG-SWAGGER-theme, var(--SWAGGER-theme, light)); + + --INTERNAL-TAG-BG-color: var(--TAG-BG-color, var(--INTERNAL-PRIMARY-color)); + + --INTERNAL-MENU-HEADER-BG-color: var(--MENU-HEADER-BG-color, var(--PRIMARY-color, rgba( 0, 0, 0, 0 ))); /* not --INTERNAL-PRIMARY-color */ + --INTERNAL-MENU-HEADER-BORDER-color: var(--MENU-HEADER-BORDER-color, var(--INTERNAL-MENU-HEADER-BG-color)); + + --INTERNAL-MENU-HOME-LINK-color: var(--MENU-HOME-LINK-color, #323232); + --INTERNAL-MENU-HOME-LINK-HOVER-color: var(--MENU-HOME-LINK-HOVER-color, var(--MENU-HOME-LINK-HOVERED-color, #808080)); + + --INTERNAL-MENU-SEARCH-color: var(--MENU-SEARCH-color, var(--MENU-SEARCH-BOX-ICONS-color, #e0e0e0)); + --INTERNAL-MENU-SEARCH-BG-color: var(--MENU-SEARCH-BG-color, #323232); + --INTERNAL-MENU-SEARCH-BORDER-color: var(--MENU-SEARCH-BORDER-color, var(--MENU-SEARCH-BOX-color, var(--INTERNAL-MENU-SEARCH-BG-color))); + + --INTERNAL-MENU-SECTIONS-ACTIVE-BG-color: var(--MENU-SECTIONS-ACTIVE-BG-color, rgba( 0, 0, 0, .166 )); + --INTERNAL-MENU-SECTIONS-BG-color: var(--MENU-SECTIONS-BG-color, #282828); + --INTERNAL-MENU-SECTIONS-LINK-color: var(--MENU-SECTIONS-LINK-color, #bababa); + --INTERNAL-MENU-SECTIONS-LINK-HOVER-color: var(--MENU-SECTIONS-LINK-HOVER-color, var(--INTERNAL-MENU-SECTIONS-LINK-color)); + --INTERNAL-MENU-SECTION-ACTIVE-CATEGORY-color: var(--MENU-SECTION-ACTIVE-CATEGORY-color, #444444); + --INTERNAL-MENU-SECTION-ACTIVE-CATEGORY-BG-color: var(--MENU-SECTION-ACTIVE-CATEGORY-BG-color, var(--INTERNAL-MAIN-BG-color)); + + --INTERNAL-MENU-VISITED-color: var(--MENU-VISITED-color, var(--INTERNAL-SECONDARY-color)); + --INTERNAL-MENU-SECTION-HR-color: var(--MENU-SECTION-HR-color, #606060); + + --INTERNAL-BOX-CAPTION-color: var(--BOX-CAPTION-color, rgba( 255, 255, 255, 1 )); + --INTERNAL-BOX-BG-color: var(--BOX-BG-color, rgba( 255, 255, 255, .833 )); + --INTERNAL-BOX-TEXT-color: var(--BOX-TEXT-color, rgba( 16, 16, 16, 1 )); + + --INTERNAL-BOX-BLUE-color: var(--BOX-BLUE-color, rgba( 48, 117, 229, 1 )); + --INTERNAL-BOX-GREEN-color: var(--BOX-GREEN-color, rgba( 42, 178, 24, 1 )); + --INTERNAL-BOX-GREY-color: var(--BOX-GREY-color, rgba( 128, 128, 128, 1 )); + --INTERNAL-BOX-ORANGE-color: var(--BOX-ORANGE-color, rgba( 237, 153, 9, 1 )); + --INTERNAL-BOX-RED-color: var(--BOX-RED-color, rgba( 224, 62, 62, 1 )); + + --INTERNAL-BOX-INFO-color: var(--BOX-INFO-color, var(--INTERNAL-BOX-BLUE-color)); + --INTERNAL-BOX-NEUTRAL-color: var(--BOX-NEUTRAL-color, var(--INTERNAL-BOX-GREY-color)); + --INTERNAL-BOX-NOTE-color: var(--BOX-NOTE-color, var(--INTERNAL-BOX-ORANGE-color)); + --INTERNAL-BOX-TIP-color: var(--BOX-TIP-color, var(--INTERNAL-BOX-GREEN-color)); + --INTERNAL-BOX-WARNING-color: var(--BOX-WARNING-color, var(--INTERNAL-BOX-RED-color)); + + --INTERNAL-BOX-BLUE-TEXT-color: var(--BOX-BLUE-TEXT-color, var(--INTERNAL-BOX-TEXT-color)); + --INTERNAL-BOX-GREEN-TEXT-color: var(--BOX-GREEN-TEXT-color, var(--INTERNAL-BOX-TEXT-color)); + --INTERNAL-BOX-GREY-TEXT-color: var(--BOX-GREY-TEXT-color, var(--INTERNAL-BOX-TEXT-color)); + --INTERNAL-BOX-ORANGE-TEXT-color: var(--BOX-ORANGE-TEXT-color, var(--INTERNAL-BOX-TEXT-color)); + --INTERNAL-BOX-RED-TEXT-color: var(--BOX-RED-TEXT-color, var(--INTERNAL-BOX-TEXT-color)); + + --INTERNAL-BOX-INFO-TEXT-color: var(--BOX-INFO-TEXT-color, var(--INTERNAL-BOX-BLUE-TEXT-color)); + --INTERNAL-BOX-NEUTRAL-TEXT-color: var(--BOX-NEUTRAL-TEXT-color, var(--INTERNAL-BOX-GREY-TEXT-color)); + --INTERNAL-BOX-NOTE-TEXT-color: var(--BOX-NOTE-TEXT-color, var(--INTERNAL-BOX-ORANGE-TEXT-color)); + --INTERNAL-BOX-TIP-TEXT-color: var(--BOX-TIP-TEXT-color, var(--INTERNAL-BOX-GREEN-TEXT-color)); + --INTERNAL-BOX-WARNING-TEXT-color: var(--BOX-WARNING-TEXT-color, var(--INTERNAL-BOX-RED-TEXT-color)); +} + +body { + background-color: var(--INTERNAL-MAIN-BG-color); + color: var(--INTERNAL-MAIN-TEXT-color); + font-family: var(--INTERNAL-MAIN-font); +} + +a, +.anchor, +#toc-menu, +#body a.highlight:after { + color: var(--INTERNAL-MAIN-LINK-color); +} + +a:hover, +.anchor:hover, +#toc-menu:hover, +#body a.highlight:hover:after { + color: var(--INTERNAL-MAIN-LINK-HOVER-color); +} + +#sidebar { + background: var(--INTERNAL-MENU-SECTIONS-BG-color); +} + +#header-wrapper { + background-color: var(--INTERNAL-MENU-HEADER-BG-color); + border-color: var(--INTERNAL-MENU-HEADER-BORDER-color); + color: var(--INTERNAL-MENU-SEARCH-color); +} + +.searchbox { + border-color: var(--INTERNAL-MENU-SEARCH-BORDER-color); + background-color: var(--INTERNAL-MENU-SEARCH-BG-color); +} + +#sidebar .collapsible-menu label:after, +#sidebar a { + color: var(--INTERNAL-MENU-SECTIONS-LINK-color); +} + +#sidebar select:hover, +#sidebar .collapsible-menu label:hover:after, +#sidebar a:hover { + color: var(--INTERNAL-MENU-SECTIONS-LINK-HOVER-color); +} + +#sidebar ul.topics > li.parent, +#sidebar ul.topics > li.active { + background-color: var(--INTERNAL-MENU-SECTIONS-ACTIVE-BG-color); +} + +#sidebar ul.topics li.active > a { + background-color: var(--INTERNAL-MENU-SECTION-ACTIVE-CATEGORY-BG-color); + color: var(--INTERNAL-MENU-SECTION-ACTIVE-CATEGORY-color); +} + +#sidebar ul li.visited > a .read-icon { + color: var(--INTERNAL-MENU-VISITED-color); +} + +#sidebar .nav-title { + color: var(--INTERNAL-MENU-SECTIONS-LINK-HOVER-color); +} + +#sidebar hr { + border-color: var(--INTERNAL-MENU-SECTION-HR-color); +} + +#footer { + color: var(--INTERNAL-MENU-SECTIONS-LINK-color); +} + +h1 { + color: var(--INTERNAL-MAIN-TITLES-H1-color); + font-family: var(--INTERNAL-MAIN-TITLES-H1-font); +} + +h2 { + color: var(--INTERNAL-MAIN-TITLES-H2-color); + font-family: var(--INTERNAL-MAIN-TITLES-H2-font); +} + +h3 { + color: var(--INTERNAL-MAIN-TITLES-H3-color); + font-family: var(--INTERNAL-MAIN-TITLES-H3-font); +} + +h4 { + color: var(--INTERNAL-MAIN-TITLES-H4-color); + font-family: var(--INTERNAL-MAIN-TITLES-H4-font); +} + +h5 { + color: var(--INTERNAL-MAIN-TITLES-H5-color); + font-family: var(--INTERNAL-MAIN-TITLES-H5-font); +} + +h6 { + color: var(--INTERNAL-MAIN-TITLES-H6-color); + font-family: var(--INTERNAL-MAIN-TITLES-H6-font); +} + +div.box { + background-color: var(--VARIABLE-BOX-color); +} + +div.box > .box-label { + color: var(--VARIABLE-BOX-CAPTION-color); +} + +div.box > .box-content { + background-color: var(--VARIABLE-BOX-BG-color); + color: var(--VARIABLE-BOX-TEXT-color); +} + +.cstyle.info { + --VARIABLE-BOX-color: var(--INTERNAL-BOX-INFO-color); + --VARIABLE-BOX-TEXT-color: var(--INTERNAL-BOX-INFO-TEXT-color); +} + +.cstyle.warning { + --VARIABLE-BOX-color: var(--INTERNAL-BOX-WARNING-color); + --VARIABLE-BOX-TEXT-color: var(--INTERNAL-BOX-WARNING-TEXT-color); +} + +.cstyle.note { + --VARIABLE-BOX-color: var(--INTERNAL-BOX-NOTE-color); + --VARIABLE-BOX-TEXT-color: var(--INTERNAL-BOX-NOTE-TEXT-color); +} + +.cstyle.tip { + --VARIABLE-BOX-color: var(--INTERNAL-BOX-TIP-color); + --VARIABLE-BOX-TEXT-color: var(--INTERNAL-BOX-TIP-TEXT-color); +} + +.cstyle.primary { + --VARIABLE-BOX-color: var(--INTERNAL-PRIMARY-color); + --VARIABLE-BOX-TEXT-color: var(--INTERNAL-MAIN-TEXT-color); +} + +.cstyle.secondary { + --VARIABLE-BOX-color: var(--INTERNAL-SECONDARY-color); + --VARIABLE-BOX-TEXT-color: var(--INTERNAL-MAIN-TEXT-color); +} + +.cstyle.blue { + --VARIABLE-BOX-color: var(--INTERNAL-BOX-BLUE-color); + --VARIABLE-BOX-TEXT-color: var(--INTERNAL-BOX-BLUE-TEXT-color); +} + +.cstyle.green { + --VARIABLE-BOX-color: var(--INTERNAL-BOX-GREEN-color); + --VARIABLE-BOX-TEXT-color: var(--INTERNAL-BOX-GREEN-TEXT-color); +} + +.cstyle.grey { + --VARIABLE-BOX-color: var(--INTERNAL-BOX-GREY-color); + --VARIABLE-BOX-TEXT-color: var(--INTERNAL-BOX-GREY-TEXT-color); +} + +.cstyle.orange { + --VARIABLE-BOX-color: var(--INTERNAL-BOX-ORANGE-color); + --VARIABLE-BOX-TEXT-color: var(--INTERNAL-BOX-ORANGE-TEXT-color); +} + +.cstyle.red { + --VARIABLE-BOX-color: var(--INTERNAL-BOX-RED-color); + --VARIABLE-BOX-TEXT-color: var(--INTERNAL-BOX-RED-TEXT-color); +} + +.cstyle.transparent { + --VARIABLE-BOX-color: transparent; + --VARIABLE-BOX-CAPTION-color: var(--INTERNAL-MAIN-TITLES-TEXT-color); + --VARIABLE-BOX-BG-color: transparent; + --VARIABLE-BOX-TEXT-color: var(--INTERNAL-MAIN-TEXT-color); +} + +code, +kbd, +pre, +samp { + font-family: var(--INTERNAL-CODE-font); +} + +code { + background-color: var(--INTERNAL-CODE-INLINE-BG-color); + border-color: var(--INTERNAL-CODE-INLINE-BORDER-color); + color: var(--INTERNAL-CODE-INLINE-color); +} + +pre { + background-color: var(--INTERNAL-CODE-BLOCK-BG-color); + border-color: var(--INTERNAL-CODE-BLOCK-BORDER-color); + color: var(--INTERNAL-CODE-BLOCK-color); +} + +div.featherlight .featherlight-content{ + background-color: var(--INTERNAL-MAIN-BG-color); +} + +#topbar { + background-color: var(--INTERNAL-MAIN-BG-color); +} + +#body a[aria-disabled="true"] { + color: var(--INTERNAL-MAIN-TEXT-color); +} + +.copy-to-clipboard-button { + background-color: var(--INTERNAL-CODE-INLINE-BG-color); + border-color: var(--INTERNAL-CODE-INLINE-BORDER-color); + color: var(--INTERNAL-CODE-INLINE-color); + font-family: var(--INTERNAL-CODE-font); +} + +.copy-to-clipboard-button:hover { + background-color: var(--INTERNAL-CODE-INLINE-color); + color: var(--INTERNAL-CODE-INLINE-BG-color); +} + +pre .copy-to-clipboard-button { + border-color: var(--INTERNAL-CODE-BLOCK-BORDER-color); + color: var(--INTERNAL-MAIN-LINK-color); +} + +pre .copy-to-clipboard-button:hover { + background-color: var(--INTERNAL-MAIN-LINK-color); + border-color: var(--INTERNAL-MAIN-LINK-color); + color: var(--INTERNAL-CODE-BLOCK-BG-color); +} + +#homelinks { + background-color: var(--INTERNAL-MENU-HEADER-BORDER-color); + border-color: var(--INTERNAL-MENU-HEADER-BORDER-color); +} + +#homelinks a { + color: var(--INTERNAL-MENU-HOME-LINK-color); +} + +#homelinks a:hover { + color: var(--INTERNAL-MENU-HOME-LINK-HOVER-color); +} + +#body a.highlight:after { + background-color: var(--INTERNAL-MAIN-LINK-color); +} + +#body a.highlight:hover:after { + background-color: var(--INTERNAL-MAIN-LINK-HOVER-color); +} + +.progress { + background-color: var(--INTERNAL-MAIN-BG-color); +} + +.btn { + background-color: var(--VARIABLE-BOX-color); +} + +.btn a { + border-color: var(--VARIABLE-BOX-color); + color: var(--VARIABLE-BOX-CAPTION-color); +} + +.btn a:hover, +.btn a:focus, +.btn a:active { + background-color: var(--VARIABLE-BOX-BG-color); + color: var(--VARIABLE-BOX-TEXT-color); +} + +.btn.cstyle.transparent { + --VARIABLE-BOX-BG-color: var(--INTERNAL-BOX-BG-color); +} + +.btn.cstyle.transparent:hover, +.btn.cstyle.transparent:focus, +.btn.cstyle.transparent:active { + background-color: var(--INTERNAL-BOX-NEUTRAL-color); +} + +.btn.cstyle.transparent a { + --VARIABLE-BOX-color: var(--INTERNAL-BOX-NEUTRAL-color); + --VARIABLE-BOX-TEXT-color: var(--VARIABLE-BOX-CAPTION-color); +} + +#body .tags a.tag-link { + background-color: var(--INTERNAL-TAG-BG-color); + color: var(--INTERNAL-MAIN-BG-color); +} + +#body .tags a.tag-link:before { + border-right-color: var(--INTERNAL-TAG-BG-color); +} + +#body .tags a.tag-link:after { + background-color: var(--INTERNAL-MAIN-BG-color); +} + +#body .tab-nav-button.active { + background-color: var(--INTERNAL-MAIN-BG-color) !important; + border-bottom-color: var(--INTERNAL-MAIN-BG-color) !important; +} diff --git a/themes/relearn/static/fonts/WorkSans-Bold.woff b/themes/relearn/static/fonts/WorkSans-Bold.woff new file mode 100644 index 0000000..3f08066 Binary files /dev/null and b/themes/relearn/static/fonts/WorkSans-Bold.woff differ diff --git a/themes/relearn/static/fonts/WorkSans-Bold.woff2 b/themes/relearn/static/fonts/WorkSans-Bold.woff2 new file mode 100644 index 0000000..492d463 Binary files /dev/null and b/themes/relearn/static/fonts/WorkSans-Bold.woff2 differ diff --git a/themes/relearn/static/fonts/WorkSans-ExtraLight.woff b/themes/relearn/static/fonts/WorkSans-ExtraLight.woff new file mode 100644 index 0000000..30108ba Binary files /dev/null and b/themes/relearn/static/fonts/WorkSans-ExtraLight.woff differ diff --git a/themes/relearn/static/fonts/WorkSans-ExtraLight.woff2 b/themes/relearn/static/fonts/WorkSans-ExtraLight.woff2 new file mode 100644 index 0000000..bda56c6 Binary files /dev/null and b/themes/relearn/static/fonts/WorkSans-ExtraLight.woff2 differ diff --git a/themes/relearn/static/fonts/WorkSans-Light.woff b/themes/relearn/static/fonts/WorkSans-Light.woff new file mode 100644 index 0000000..47f58a2 Binary files /dev/null and b/themes/relearn/static/fonts/WorkSans-Light.woff differ diff --git a/themes/relearn/static/fonts/WorkSans-Light.woff2 b/themes/relearn/static/fonts/WorkSans-Light.woff2 new file mode 100644 index 0000000..e7537e8 Binary files /dev/null and b/themes/relearn/static/fonts/WorkSans-Light.woff2 differ diff --git a/themes/relearn/static/fonts/WorkSans-Medium.woff b/themes/relearn/static/fonts/WorkSans-Medium.woff new file mode 100644 index 0000000..79150e3 Binary files /dev/null and b/themes/relearn/static/fonts/WorkSans-Medium.woff differ diff --git a/themes/relearn/static/fonts/WorkSans-Medium.woff2 b/themes/relearn/static/fonts/WorkSans-Medium.woff2 new file mode 100644 index 0000000..5909c58 Binary files /dev/null and b/themes/relearn/static/fonts/WorkSans-Medium.woff2 differ diff --git a/themes/relearn/static/fonts/WorkSans-Regular.woff b/themes/relearn/static/fonts/WorkSans-Regular.woff new file mode 100644 index 0000000..e4b8c47 Binary files /dev/null and b/themes/relearn/static/fonts/WorkSans-Regular.woff differ diff --git a/themes/relearn/static/fonts/WorkSans-Regular.woff2 b/themes/relearn/static/fonts/WorkSans-Regular.woff2 new file mode 100644 index 0000000..de39aa8 Binary files /dev/null and b/themes/relearn/static/fonts/WorkSans-Regular.woff2 differ diff --git a/themes/relearn/static/images/gopher-404.jpg b/themes/relearn/static/images/gopher-404.jpg new file mode 100644 index 0000000..2a50543 Binary files /dev/null and b/themes/relearn/static/images/gopher-404.jpg differ diff --git a/themes/relearn/static/js/auto-complete.js b/themes/relearn/static/js/auto-complete.js new file mode 100644 index 0000000..8db4a86 --- /dev/null +++ b/themes/relearn/static/js/auto-complete.js @@ -0,0 +1,255 @@ +/* + JavaScript autoComplete v1.0.4 + #46 - positioning + #75 - complete + McShelby/hugo-theme-relearn#155 + Copyright (c) 2014 Simon Steinberger / Pixabay + GitHub: https://github.com/Pixabay/JavaScript-autoComplete + License: http://www.opensource.org/licenses/mit-license.php +*/ + +var autoComplete = (function(){ + // "use strict"; + function autoComplete(options){ + if (!document.querySelector) return; + + // helpers + function hasClass(el, className){ return el.classList ? el.classList.contains(className) : new RegExp('\\b'+ className+'\\b').test(el.className); } + + function addEvent(el, type, handler){ + if (el.attachEvent) el.attachEvent('on'+type, handler); else el.addEventListener(type, handler); + } + function removeEvent(el, type, handler){ + // if (el.removeEventListener) not working in IE11 + if (el.detachEvent) el.detachEvent('on'+type, handler); else el.removeEventListener(type, handler); + } + function live(elClass, event, cb, context){ + addEvent(context || document, event, function(e){ + var found, el = e.target || e.srcElement; + while (el && !(found = hasClass(el, elClass))) el = el.parentElement; + if (found) cb.call(el, e); + }); + } + + var o = { + selector: 0, + source: 0, + minChars: 3, + delay: 150, + offsetLeft: 0, + offsetTop: 1, + cache: 1, + menuClass: '', + selectorToInsert: 0, + renderItem: function (item, search){ + // escape special characters + search = search.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + var re = new RegExp("(" + search.split(' ').join('|') + ")", "gi"); + return '
    ' + item.replace(re, "$1") + '
    '; + }, + onSelect: function(e, term, item){} + }; + for (var k in options) { if (options.hasOwnProperty(k)) o[k] = options[k]; } + + // init + var elems = typeof o.selector == 'object' ? [o.selector] : document.querySelectorAll(o.selector); + for (var i=0; i 0) + that.sc.scrollTop = selTop + that.sc.suggestionHeight + scrTop - that.sc.maxHeight; + else if (selTop < 0) + that.sc.scrollTop = selTop + scrTop; + } + } + } + addEvent(window, 'resize', that.updateSC); + + if (typeof o.selectorToInsert === "string" && document.querySelector(o.selectorToInsert) instanceof HTMLElement) { + document.querySelector(o.selectorToInsert).appendChild(that.sc); + } else { + document.body.appendChild(that.sc); + } + + live('autocomplete-suggestion', 'mouseleave', function(e){ + var sel = that.sc.querySelector('.autocomplete-suggestion.selected'); + if (sel) setTimeout(function(){ sel.className = sel.className.replace('selected', ''); }, 20); + }, that.sc); + + live('autocomplete-suggestion', 'mouseover', function(e){ + var sel = that.sc.querySelector('.autocomplete-suggestion.selected'); + if (sel) sel.className = sel.className.replace('selected', ''); + this.className += ' selected'; + }, that.sc); + + live('autocomplete-suggestion', 'mousedown', function(e){ + if (hasClass(this, 'autocomplete-suggestion')) { // else outside click + var v = this.getAttribute('data-val'); + that.value = v; + o.onSelect(e, v, this); + that.sc.style.display = 'none'; + } + }, that.sc); + + that.blurHandler = function(){ + try { var over_sb = document.querySelector('.autocomplete-suggestions:hover'); } catch(e){ var over_sb = 0; } + if (!over_sb) { + that.last_val = that.value; + that.sc.style.display = 'none'; + setTimeout(function(){ that.sc.style.display = 'none'; }, 350); // hide suggestions on fast input + } else if (that !== document.activeElement) setTimeout(function(){ that.focus(); }, 20); + }; + addEvent(that, 'blur', that.blurHandler); + + var suggest = function(data){ + var val = that.value; + that.cache[val] = data; + if (data.length && val.length >= o.minChars) { + var s = ''; + for (var i=0;i 40) && key != 13 && key != 27) { + var val = that.value; + if (val.length >= o.minChars) { + if (val != that.last_val) { + that.last_val = val; + clearTimeout(that.timer); + if (o.cache) { + if (val in that.cache) { suggest(that.cache[val]); return; } + // no requests if previous suggestions were empty + for (var i=1; i https://github.com/noelboss/featherlight/issues/317 +!function(u){"use strict";if(void 0!==u)if(u.fn.jquery.match(/-ajax/))"console"in window&&window.console.info("Featherlight needs regular jQuery, not the slim version.");else{var r=[],i=function(t){return r=u.grep(r,function(e){return e!==t&&0','
    ','",'
    '+n.loading+"
    ","
    ","
    "].join("")),o="."+n.namespace+"-close"+(n.otherClose?","+n.otherClose:"");return n.$instance=i.clone().addClass(n.variant),n.$instance.on(n.closeTrigger+"."+n.namespace,function(e){if(!e.isDefaultPrevented()){var t=u(e.target);("background"===n.closeOnClick&&t.is("."+n.namespace)||"anywhere"===n.closeOnClick||t.closest(o).length)&&(n.close(e),e.preventDefault())}}),this},getContent:function(){if(!1!==this.persist&&this.$content)return this.$content;var t=this,e=this.constructor.contentFilters,n=function(e){return t.$currentTarget&&t.$currentTarget.attr(e)},r=n(t.targetAttr),i=t.target||r||"",o=e[t.type];if(!o&&i in e&&(o=e[i],i=t.target&&r),i=i||n("href")||"",!o)for(var a in e)t[a]&&(o=e[a],i=t[a]);if(!o){var s=i;if(i=null,u.each(t.contentFilters,function(){return(o=e[this]).test&&(i=o.test(s)),!i&&o.regex&&s.match&&s.match(o.regex)&&(i=s),!i}),!i)return"console"in window&&window.console.error("Featherlight: no content filter found "+(s?' for "'+s+'"':" (no target specified)")),!1}return o.process.call(t,i)},setContent:function(e){return this.$instance.removeClass(this.namespace+"-loading"),this.$instance.toggleClass(this.namespace+"-iframe",e.is("iframe")),this.$instance.find("."+this.namespace+"-inner").not(e).slice(1).remove().end().replaceWith(u.contains(this.$instance[0],e[0])?"":e),this.$content=e.addClass(this.namespace+"-inner"),this},open:function(t){var n=this;if(n.$instance.hide().appendTo(n.root),!(t&&t.isDefaultPrevented()||!1===n.beforeOpen(t))){t&&t.preventDefault();var e=n.getContent();if(e)return r.push(n),s(!0),n.$instance.fadeIn(n.openSpeed),n.beforeContent(t),u.when(e).always(function(e){n.setContent(e),n.afterContent(t)}).then(n.$instance.promise()).done(function(){n.afterOpen(t)})}return n.$instance.detach(),u.Deferred().reject().promise()},close:function(e){var t=this,n=u.Deferred();return!1===t.beforeClose(e)?n.reject():(0===i(t).length&&s(!1),t.$instance.fadeOut(t.closeSpeed,function(){t.$instance.detach(),t.afterClose(e),n.resolve()})),n.promise()},resize:function(e,t){if(e&&t&&(this.$content.css("width","").css("height",""),this.$content.parent().width()');return n.onload=function(){r.naturalWidth=n.width,r.naturalHeight=n.height,t.resolve(r)},n.onerror=function(){t.reject(r)},n.src=e,t.promise()}},html:{regex:/^\s*<[\w!][^<]*>/,process:function(e){return u(e)}},ajax:{regex:/./,process:function(e){var n=u.Deferred(),r=u("
    ").load(e,function(e,t){"error"!==t&&n.resolve(r.contents()),n.fail()});return n.promise()}},iframe:{process:function(e){var t=new u.Deferred,n=u("')}else"loose"!==s.securityLevel&&(T=Om().sanitize(T,{ADD_TAGS:["foreignobject"],ADD_ATTR:["dominant-baseline"]}));if(void 0!==n)switch(g){case"flowchart":case"flowchart-v2":n(T,Gx.bindFunctions);break;case"gantt":n(T,Qw.bindFunctions);break;case"class":case"classDiagram":n(T,Zb.bindFunctions);break;default:n(T)}else o.debug("CB = undefined!");IT.forEach((function(t){t()})),IT=[];var S="sandbox"===s.securityLevel?"#i"+t:"#d"+t,A=au(S).node();return null!==A&&"function"==typeof A.remove&&au(S).node().remove(),T},parse:function(t){t+="\n";var e=wb(),n=db.detectInit(t,e);n&&o.info("reinit ",n);var r,i=db.detectType(t,e);switch(o.debug("Type "+i),i){case"gitGraph":wk.clear(),(r=Tk()).parser.yy=wk;break;case"flowchart":case"flowchart-v2":Gx.clear(),(r=Zx()).parser.yy=Gx;break;case"sequence":OT.clear(),(r=pT()).parser.yy=OT;break;case"gantt":(r=ek()).parser.yy=Qw;break;case"class":case"classDiagram":(r=n_()).parser.yy=Zb;break;case"state":case"stateDiagram":(r=EC()).parser.yy=UC;break;case"info":o.debug("info info info"),(r=Fk()).parser.yy=Ik;break;case"pie":o.debug("pie"),(r=Uk()).parser.yy=Hk;break;case"er":o.debug("er"),(r=dx()).parser.yy=hx;break;case"journey":o.debug("Journey"),(r=pE()).parser.yy=fE;break;case"requirement":case"requirementDiagram":o.debug("RequirementDiagram"),(r=Zk()).parser.yy=nT}return r.parser.yy.graphType=i,r.parser.yy.parseError=function(t,e){throw{str:t,hash:e}},r.parse(t),r},parseDirective:function(t,e,n,r){try{if(void 0!==e)switch(e=e.trim(),n){case"open_directive":PE={};break;case"type_directive":PE.type=e.toLowerCase();break;case"arg_directive":PE.args=JSON.parse(e);break;case"close_directive":(function(t,e,n){switch(o.debug("Directive type=".concat(e.type," with args:"),e.args),e.type){case"init":case"initialize":["config"].forEach((function(t){void 0!==e.args[t]&&("flowchart-v2"===n&&(n="flowchart"),e.args[n]=e.args[t],delete e.args[t])})),o.debug("sanitize in handleDirective",e.args),hb(e.args),o.debug("sanitize in handleDirective (done)",e.args),e.args,Tb(e.args);break;case"wrap":case"nowrap":t&&t.setWrap&&t.setWrap("wrap"===e.type);break;case"themeCss":o.warn("themeCss encountered");break;default:o.warn("Unhandled directive: source: '%%{".concat(e.type,": ").concat(JSON.stringify(e.args?e.args:{}),"}%%"),e)}})(t,PE,r),PE=null}}catch(t){o.error("Error while rendering sequenceDiagram directive: ".concat(e," jison context: ").concat(n)),o.error(t.message)}},initialize:function(t){t&&t.fontFamily&&(t.themeVariables&&t.themeVariables.fontFamily||(t.themeVariables={fontFamily:t.fontFamily})),function(t){gb=rb({},t)}(t),t&&t.theme&&Mv[t.theme]?t.themeVariables=Mv[t.theme].getThemeVariables(t.themeVariables):t&&(t.themeVariables=Mv.default.getThemeVariables(t.themeVariables));var e="object"===RE(t)?function(t){return mb=rb({},yb),mb=rb(mb,t),t.theme&&Mv[t.theme]&&(mb.themeVariables=Mv[t.theme].getThemeVariables(t.themeVariables)),bb=_b(mb,vb),mb}(t):xb();YE(e),s(e.logLevel)},reinitialize:function(){},getConfig:wb,setConfig:function(t){return rb(bb,t),wb()},getSiteConfig:xb,updateSiteConfig:function(t){return mb=rb(mb,t),_b(mb,vb),mb},reset:function(){Cb()},globalReset:function(){Cb(),YE(wb())},defaultConfig:yb});s(wb().logLevel),Cb(wb());const UE=jE;var zE=function(){var t,e,n=UE.getConfig();arguments.length>=2?(void 0!==arguments[0]&&(qE.sequenceConfig=arguments[0]),t=arguments[1]):t=arguments[0],"function"==typeof arguments[arguments.length-1]?(e=arguments[arguments.length-1],o.debug("Callback function found")):void 0!==n.mermaid&&("function"==typeof n.mermaid.callback?(e=n.mermaid.callback,o.debug("Callback function found")):o.debug("No Callback function found")),t=void 0===t?document.querySelectorAll(".mermaid"):"string"==typeof t?document.querySelectorAll(t):t instanceof window.Node?[t]:t,o.debug("Start On Load before: "+qE.startOnLoad),void 0!==qE.startOnLoad&&(o.debug("Start On Load inner: "+qE.startOnLoad),UE.updateSiteConfig({startOnLoad:qE.startOnLoad})),void 0!==qE.ganttConfig&&UE.updateSiteConfig({gantt:qE.ganttConfig});for(var r,i=new db.initIdGeneratior(n.deterministicIds,n.deterministicIDSeed),a=function(n){var a=t[n];if(a.getAttribute("data-processed"))return"continue";a.setAttribute("data-processed",!0);var s="mermaid-".concat(i.next());r=a.innerHTML,r=db.entityDecode(r).trim().replace(//gi,"
    ");var c=db.detectInit(r);c&&o.debug("Detected early reinit: ",c),UE.render(s,r,(function(t,n){a.innerHTML=t,void 0!==e&&e(s),n&&n(a)}),a)},s=0;s{t.exports={graphlib:n(6614),dagre:n(1463),intersect:n(8114),render:n(5787),util:n(8355),version:n(5689)}},9144:(t,e,n)=>{var r=n(8355);function i(t,e,n,i){var a=t.append("marker").attr("id",e).attr("viewBox","0 0 10 10").attr("refX",9).attr("refY",5).attr("markerUnits","strokeWidth").attr("markerWidth",8).attr("markerHeight",6).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").style("stroke-width",1).style("stroke-dasharray","1,0");r.applyStyle(a,n[i+"Style"]),n[i+"Class"]&&a.attr("class",n[i+"Class"])}t.exports={default:i,normal:i,vee:function(t,e,n,i){var a=t.append("marker").attr("id",e).attr("viewBox","0 0 10 10").attr("refX",9).attr("refY",5).attr("markerUnits","strokeWidth").attr("markerWidth",8).attr("markerHeight",6).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 L 4 5 z").style("stroke-width",1).style("stroke-dasharray","1,0");r.applyStyle(a,n[i+"Style"]),n[i+"Class"]&&a.attr("class",n[i+"Class"])},undirected:function(t,e,n,i){var a=t.append("marker").attr("id",e).attr("viewBox","0 0 10 10").attr("refX",9).attr("refY",5).attr("markerUnits","strokeWidth").attr("markerWidth",8).attr("markerHeight",6).attr("orient","auto").append("path").attr("d","M 0 5 L 10 5").style("stroke-width",1).style("stroke-dasharray","1,0");r.applyStyle(a,n[i+"Style"]),n[i+"Class"]&&a.attr("class",n[i+"Class"])}}},5632:(t,e,n)=>{var r=n(8355),i=n(4322),a=n(1322);t.exports=function(t,e){var n,o=e.nodes().filter((function(t){return r.isSubgraph(e,t)})),s=t.selectAll("g.cluster").data(o,(function(t){return t}));return s.selectAll("*").remove(),s.enter().append("g").attr("class","cluster").attr("id",(function(t){return e.node(t).id})).style("opacity",0),s=t.selectAll("g.cluster"),r.applyTransition(s,e).style("opacity",1),s.each((function(t){var n=e.node(t),r=i.select(this);i.select(this).append("rect");var o=r.append("g").attr("class","label");a(o,n,n.clusterLabelPos)})),s.selectAll("rect").each((function(t){var n=e.node(t),a=i.select(this);r.applyStyle(a,n.style)})),n=s.exit?s.exit():s.selectAll(null),r.applyTransition(n,e).style("opacity",0).remove(),s}},6315:(t,e,n)=>{"use strict";var r=n(1034),i=n(1322),a=n(8355),o=n(4322);t.exports=function(t,e){var n,s=t.selectAll("g.edgeLabel").data(e.edges(),(function(t){return a.edgeToId(t)})).classed("update",!0);return s.exit().remove(),s.enter().append("g").classed("edgeLabel",!0).style("opacity",0),(s=t.selectAll("g.edgeLabel")).each((function(t){var n=o.select(this);n.select(".label").remove();var a=e.edge(t),s=i(n,e.edge(t),0,0).classed("label",!0),c=s.node().getBBox();a.labelId&&s.attr("id",a.labelId),r.has(a,"width")||(a.width=c.width),r.has(a,"height")||(a.height=c.height)})),n=s.exit?s.exit():s.selectAll(null),a.applyTransition(n,e).style("opacity",0).remove(),s}},940:(t,e,n)=>{"use strict";var r=n(1034),i=n(3042),a=n(8355),o=n(4322);function s(t,e){var n=(o.line||o.svg.line)().x((function(t){return t.x})).y((function(t){return t.y}));return(n.curve||n.interpolate)(t.curve),n(e)}t.exports=function(t,e,n){var c=t.selectAll("g.edgePath").data(e.edges(),(function(t){return a.edgeToId(t)})).classed("update",!0),u=function(t,e){var n=t.enter().append("g").attr("class","edgePath").style("opacity",0);return n.append("path").attr("class","path").attr("d",(function(t){var n=e.edge(t),i=e.node(t.v).elem;return s(n,r.range(n.points.length).map((function(){return e=(t=i).getBBox(),{x:(n=t.ownerSVGElement.getScreenCTM().inverse().multiply(t.getScreenCTM()).translate(e.width/2,e.height/2)).e,y:n.f};var t,e,n})))})),n.append("defs"),n}(c,e);!function(t,e){var n=t.exit();a.applyTransition(n,e).style("opacity",0).remove()}(c,e);var l=void 0!==c.merge?c.merge(u):c;return a.applyTransition(l,e).style("opacity",1),l.each((function(t){var n=o.select(this),r=e.edge(t);r.elem=this,r.id&&n.attr("id",r.id),a.applyClass(n,r.class,(n.classed("update")?"update ":"")+"edgePath")})),l.selectAll("path.path").each((function(t){var n=e.edge(t);n.arrowheadId=r.uniqueId("arrowhead");var c=o.select(this).attr("marker-end",(function(){return"url("+(t=location.href,e=n.arrowheadId,t.split("#")[0]+"#"+e+")");var t,e})).style("fill","none");a.applyTransition(c,e).attr("d",(function(t){return function(t,e){var n=t.edge(e),r=t.node(e.v),a=t.node(e.w),o=n.points.slice(1,n.points.length-1);return o.unshift(i(r,o[0])),o.push(i(a,o[o.length-1])),s(n,o)}(e,t)})),a.applyStyle(c,n.style)})),l.selectAll("defs *").remove(),l.selectAll("defs").each((function(t){var r=e.edge(t);(0,n[r.arrowhead])(o.select(this),r.arrowheadId,r,"arrowhead")})),l}},607:(t,e,n)=>{"use strict";var r=n(1034),i=n(1322),a=n(8355),o=n(4322);t.exports=function(t,e,n){var s,c=e.nodes().filter((function(t){return!a.isSubgraph(e,t)})),u=t.selectAll("g.node").data(c,(function(t){return t})).classed("update",!0);return u.exit().remove(),u.enter().append("g").attr("class","node").style("opacity",0),(u=t.selectAll("g.node")).each((function(t){var s=e.node(t),c=o.select(this);a.applyClass(c,s.class,(c.classed("update")?"update ":"")+"node"),c.select("g.label").remove();var u=c.append("g").attr("class","label"),l=i(u,s),h=n[s.shape],f=r.pick(l.node().getBBox(),"width","height");s.elem=this,s.id&&c.attr("id",s.id),s.labelId&&u.attr("id",s.labelId),r.has(s,"width")&&(f.width=s.width),r.has(s,"height")&&(f.height=s.height),f.width+=s.paddingLeft+s.paddingRight,f.height+=s.paddingTop+s.paddingBottom,u.attr("transform","translate("+(s.paddingLeft-s.paddingRight)/2+","+(s.paddingTop-s.paddingBottom)/2+")");var d=o.select(this);d.select(".label-container").remove();var p=h(d,f,s).classed("label-container",!0);a.applyStyle(p,s.style);var g=p.node().getBBox();s.width=g.width,s.height=g.height})),s=u.exit?u.exit():u.selectAll(null),a.applyTransition(s,e).style("opacity",0).remove(),u}},4322:(t,e,n)=>{var r;if(!r)try{r=n(7188)}catch(t){}r||(r=window.d3),t.exports=r},1463:(t,e,n)=>{var r;try{r=n(681)}catch(t){}r||(r=window.dagre),t.exports=r},6614:(t,e,n)=>{var r;try{r=n(8282)}catch(t){}r||(r=window.graphlib),t.exports=r},8114:(t,e,n)=>{t.exports={node:n(3042),circle:n(6587),ellipse:n(3260),polygon:n(5337),rect:n(8049)}},6587:(t,e,n)=>{var r=n(3260);t.exports=function(t,e,n){return r(t,e,e,n)}},3260:t=>{t.exports=function(t,e,n,r){var i=t.x,a=t.y,o=i-r.x,s=a-r.y,c=Math.sqrt(e*e*s*s+n*n*o*o),u=Math.abs(e*n*o/c);r.x{function e(t,e){return t*e>0}t.exports=function(t,n,r,i){var a,o,s,c,u,l,h,f,d,p,g,y,m;if(!(a=n.y-t.y,s=t.x-n.x,u=n.x*t.y-t.x*n.y,d=a*r.x+s*r.y+u,p=a*i.x+s*i.y+u,0!==d&&0!==p&&e(d,p)||(o=i.y-r.y,c=r.x-i.x,l=i.x*r.y-r.x*i.y,h=o*t.x+c*t.y+l,f=o*n.x+c*n.y+l,0!==h&&0!==f&&e(h,f)||0==(g=a*c-o*s))))return y=Math.abs(g/2),{x:(m=s*l-c*u)<0?(m-y)/g:(m+y)/g,y:(m=o*u-a*l)<0?(m-y)/g:(m+y)/g}}},3042:t=>{t.exports=function(t,e){return t.intersect(e)}},5337:(t,e,n)=>{var r=n(6808);t.exports=function(t,e,n){var i=t.x,a=t.y,o=[],s=Number.POSITIVE_INFINITY,c=Number.POSITIVE_INFINITY;e.forEach((function(t){s=Math.min(s,t.x),c=Math.min(c,t.y)}));for(var u=i-t.width/2-s,l=a-t.height/2-c,h=0;h1&&o.sort((function(t,e){var r=t.x-n.x,i=t.y-n.y,a=Math.sqrt(r*r+i*i),o=e.x-n.x,s=e.y-n.y,c=Math.sqrt(o*o+s*s);return a{t.exports=function(t,e){var n,r,i=t.x,a=t.y,o=e.x-i,s=e.y-a,c=t.width/2,u=t.height/2;return Math.abs(s)*c>Math.abs(o)*u?(s<0&&(u=-u),n=0===s?0:u*o/s,r=u):(o<0&&(c=-c),n=c,r=0===o?0:c*s/o),{x:i+n,y:a+r}}},8284:(t,e,n)=>{var r=n(8355);t.exports=function(t,e){var n=t.append("foreignObject").attr("width","100000"),i=n.append("xhtml:div");i.attr("xmlns","http://www.w3.org/1999/xhtml");var a=e.label;switch(typeof a){case"function":i.insert(a);break;case"object":i.insert((function(){return a}));break;default:i.html(a)}r.applyStyle(i,e.labelStyle),i.style("display","inline-block"),i.style("white-space","nowrap");var o=i.node().getBoundingClientRect();return n.attr("width",o.width).attr("height",o.height),n}},1322:(t,e,n)=>{var r=n(7318),i=n(8284),a=n(8287);t.exports=function(t,e,n){var o=e.label,s=t.append("g");"svg"===e.labelType?a(s,e):"string"!=typeof o||"html"===e.labelType?i(s,e):r(s,e);var c,u=s.node().getBBox();switch(n){case"top":c=-e.height/2;break;case"bottom":c=e.height/2-u.height;break;default:c=-u.height/2}return s.attr("transform","translate("+-u.width/2+","+c+")"),s}},8287:(t,e,n)=>{var r=n(8355);t.exports=function(t,e){var n=t;return n.node().appendChild(e.label),r.applyStyle(n,e.labelStyle),n}},7318:(t,e,n)=>{var r=n(8355);t.exports=function(t,e){for(var n=t.append("text"),i=function(t){for(var e,n="",r=!1,i=0;i{var r;try{r={defaults:n(1747),each:n(6073),isFunction:n(3560),isPlainObject:n(8630),pick:n(9722),has:n(8721),range:n(6026),uniqueId:n(3955)}}catch(t){}r||(r=window._),t.exports=r},6381:(t,e,n)=>{"use strict";var r=n(8355),i=n(4322);t.exports=function(t,e){var n=t.filter((function(){return!i.select(this).classed("update")}));function a(t){var n=e.node(t);return"translate("+n.x+","+n.y+")"}n.attr("transform",a),r.applyTransition(t,e).style("opacity",1).attr("transform",a),r.applyTransition(n.selectAll("rect"),e).attr("width",(function(t){return e.node(t).width})).attr("height",(function(t){return e.node(t).height})).attr("x",(function(t){return-e.node(t).width/2})).attr("y",(function(t){return-e.node(t).height/2}))}},4577:(t,e,n)=>{"use strict";var r=n(8355),i=n(4322),a=n(1034);t.exports=function(t,e){function n(t){var n=e.edge(t);return a.has(n,"x")?"translate("+n.x+","+n.y+")":""}t.filter((function(){return!i.select(this).classed("update")})).attr("transform",n),r.applyTransition(t,e).style("opacity",1).attr("transform",n)}},4849:(t,e,n)=>{"use strict";var r=n(8355),i=n(4322);t.exports=function(t,e){function n(t){var n=e.node(t);return"translate("+n.x+","+n.y+")"}t.filter((function(){return!i.select(this).classed("update")})).attr("transform",n),r.applyTransition(t,e).style("opacity",1).attr("transform",n)}},5787:(t,e,n)=>{var r=n(1034),i=n(4322),a=n(1463).layout;t.exports=function(){var t=n(607),e=n(5632),i=n(6315),u=n(940),l=n(4849),h=n(4577),f=n(6381),d=n(4418),p=n(9144),g=function(n,g){!function(t){t.nodes().forEach((function(e){var n=t.node(e);r.has(n,"label")||t.children(e).length||(n.label=e),r.has(n,"paddingX")&&r.defaults(n,{paddingLeft:n.paddingX,paddingRight:n.paddingX}),r.has(n,"paddingY")&&r.defaults(n,{paddingTop:n.paddingY,paddingBottom:n.paddingY}),r.has(n,"padding")&&r.defaults(n,{paddingLeft:n.padding,paddingRight:n.padding,paddingTop:n.padding,paddingBottom:n.padding}),r.defaults(n,o),r.each(["paddingLeft","paddingRight","paddingTop","paddingBottom"],(function(t){n[t]=Number(n[t])})),r.has(n,"width")&&(n._prevWidth=n.width),r.has(n,"height")&&(n._prevHeight=n.height)})),t.edges().forEach((function(e){var n=t.edge(e);r.has(n,"label")||(n.label=""),r.defaults(n,s)}))}(g);var y=c(n,"output"),m=c(y,"clusters"),v=c(y,"edgePaths"),b=i(c(y,"edgeLabels"),g),_=t(c(y,"nodes"),g,d);a(g),l(_,g),h(b,g),u(v,g,p);var x=e(m,g);f(x,g),function(t){r.each(t.nodes(),(function(e){var n=t.node(e);r.has(n,"_prevWidth")?n.width=n._prevWidth:delete n.width,r.has(n,"_prevHeight")?n.height=n._prevHeight:delete n.height,delete n._prevWidth,delete n._prevHeight}))}(g)};return g.createNodes=function(e){return arguments.length?(t=e,g):t},g.createClusters=function(t){return arguments.length?(e=t,g):e},g.createEdgeLabels=function(t){return arguments.length?(i=t,g):i},g.createEdgePaths=function(t){return arguments.length?(u=t,g):u},g.shapes=function(t){return arguments.length?(d=t,g):d},g.arrows=function(t){return arguments.length?(p=t,g):p},g};var o={paddingLeft:10,paddingRight:10,paddingTop:10,paddingBottom:10,rx:0,ry:0,shape:"rect"},s={arrowhead:"normal",curve:i.curveLinear};function c(t,e){var n=t.select("g."+e);return n.empty()&&(n=t.append("g").attr("class",e)),n}},4418:(t,e,n)=>{"use strict";var r=n(8049),i=n(3260),a=n(6587),o=n(5337);t.exports={rect:function(t,e,n){var i=t.insert("rect",":first-child").attr("rx",n.rx).attr("ry",n.ry).attr("x",-e.width/2).attr("y",-e.height/2).attr("width",e.width).attr("height",e.height);return n.intersect=function(t){return r(n,t)},i},ellipse:function(t,e,n){var r=e.width/2,a=e.height/2,o=t.insert("ellipse",":first-child").attr("x",-e.width/2).attr("y",-e.height/2).attr("rx",r).attr("ry",a);return n.intersect=function(t){return i(n,r,a,t)},o},circle:function(t,e,n){var r=Math.max(e.width,e.height)/2,i=t.insert("circle",":first-child").attr("x",-e.width/2).attr("y",-e.height/2).attr("r",r);return n.intersect=function(t){return a(n,r,t)},i},diamond:function(t,e,n){var r=e.width*Math.SQRT2/2,i=e.height*Math.SQRT2/2,a=[{x:0,y:-i},{x:-r,y:0},{x:0,y:i},{x:r,y:0}],s=t.insert("polygon",":first-child").attr("points",a.map((function(t){return t.x+","+t.y})).join(" "));return n.intersect=function(t){return o(n,a,t)},s}}},8355:(t,e,n)=>{var r=n(1034);t.exports={isSubgraph:function(t,e){return!!t.children(e).length},edgeToId:function(t){return a(t.v)+":"+a(t.w)+":"+a(t.name)},applyStyle:function(t,e){e&&t.attr("style",e)},applyClass:function(t,e,n){e&&t.attr("class",e).attr("class",n+" "+t.attr("class"))},applyTransition:function(t,e){var n=e.graph();if(r.isPlainObject(n)){var i=n.transition;if(r.isFunction(i))return i(t)}return t}};var i=/:/g;function a(t){return t?String(t).replace(i,"\\:"):""}},5689:t=>{t.exports="0.6.4"},7188:(t,e,n)=>{"use strict";n.r(e),n.d(e,{FormatSpecifier:()=>uc,active:()=>Jr,arc:()=>fx,area:()=>vx,areaRadial:()=>Sx,ascending:()=>i,autoType:()=>Fo,axisBottom:()=>it,axisLeft:()=>at,axisRight:()=>rt,axisTop:()=>nt,bisect:()=>u,bisectLeft:()=>c,bisectRight:()=>s,bisector:()=>a,blob:()=>ms,brush:()=>Ai,brushSelection:()=>Ci,brushX:()=>Ei,brushY:()=>Si,buffer:()=>bs,chord:()=>Fi,clientPoint:()=>Dn,cluster:()=>Sd,color:()=>Ve,contourDensity:()=>oo,contours:()=>to,create:()=>Y_,creator:()=>ie,cross:()=>f,csv:()=>Ts,csvFormat:()=>To,csvFormatBody:()=>Co,csvFormatRow:()=>So,csvFormatRows:()=>Eo,csvFormatValue:()=>Ao,csvParse:()=>wo,csvParseRows:()=>ko,cubehelix:()=>qa,curveBasis:()=>sw,curveBasisClosed:()=>uw,curveBasisOpen:()=>hw,curveBundle:()=>dw,curveCardinal:()=>yw,curveCardinalClosed:()=>vw,curveCardinalOpen:()=>_w,curveCatmullRom:()=>kw,curveCatmullRomClosed:()=>Cw,curveCatmullRomOpen:()=>Sw,curveLinear:()=>px,curveLinearClosed:()=>Mw,curveMonotoneX:()=>Fw,curveMonotoneY:()=>Pw,curveNatural:()=>Uw,curveStep:()=>$w,curveStepAfter:()=>Hw,curveStepBefore:()=>qw,customEvent:()=>ye,descending:()=>d,deviation:()=>y,dispatch:()=>ft,drag:()=>po,dragDisable:()=>Se,dragEnable:()=>Ae,dsv:()=>ks,dsvFormat:()=>_o,easeBack:()=>hs,easeBackIn:()=>us,easeBackInOut:()=>hs,easeBackOut:()=>ls,easeBounce:()=>os,easeBounceIn:()=>as,easeBounceInOut:()=>ss,easeBounceOut:()=>os,easeCircle:()=>rs,easeCircleIn:()=>es,easeCircleInOut:()=>rs,easeCircleOut:()=>ns,easeCubic:()=>Xr,easeCubicIn:()=>Vr,easeCubicInOut:()=>Xr,easeCubicOut:()=>Gr,easeElastic:()=>ps,easeElasticIn:()=>ds,easeElasticInOut:()=>gs,easeElasticOut:()=>ps,easeExp:()=>ts,easeExpIn:()=>Ko,easeExpInOut:()=>ts,easeExpOut:()=>Jo,easeLinear:()=>Yo,easePoly:()=>Ho,easePolyIn:()=>$o,easePolyInOut:()=>Ho,easePolyOut:()=>qo,easeQuad:()=>zo,easeQuadIn:()=>jo,easeQuadInOut:()=>zo,easeQuadOut:()=>Uo,easeSin:()=>Zo,easeSinIn:()=>Go,easeSinInOut:()=>Zo,easeSinOut:()=>Xo,entries:()=>pa,event:()=>le,extent:()=>m,forceCenter:()=>Ls,forceCollide:()=>Ws,forceLink:()=>Xs,forceManyBody:()=>tc,forceRadial:()=>ec,forceSimulation:()=>Js,forceX:()=>nc,forceY:()=>rc,format:()=>pc,formatDefaultLocale:()=>bc,formatLocale:()=>vc,formatPrefix:()=>gc,formatSpecifier:()=>cc,geoAlbers:()=>zf,geoAlbersUsa:()=>$f,geoArea:()=>gu,geoAzimuthalEqualArea:()=>Vf,geoAzimuthalEqualAreaRaw:()=>Wf,geoAzimuthalEquidistant:()=>Xf,geoAzimuthalEquidistantRaw:()=>Gf,geoBounds:()=>sl,geoCentroid:()=>bl,geoCircle:()=>Nl,geoClipAntimeridian:()=>zl,geoClipCircle:()=>$l,geoClipExtent:()=>Vl,geoClipRectangle:()=>Wl,geoConicConformal:()=>ed,geoConicConformalRaw:()=>td,geoConicEqualArea:()=>Uf,geoConicEqualAreaRaw:()=>jf,geoConicEquidistant:()=>ad,geoConicEquidistantRaw:()=>id,geoContains:()=>ph,geoDistance:()=>ah,geoEqualEarth:()=>fd,geoEqualEarthRaw:()=>hd,geoEquirectangular:()=>rd,geoEquirectangularRaw:()=>nd,geoGnomonic:()=>pd,geoGnomonicRaw:()=>dd,geoGraticule:()=>mh,geoGraticule10:()=>vh,geoIdentity:()=>gd,geoInterpolate:()=>bh,geoLength:()=>nh,geoMercator:()=>Qf,geoMercatorRaw:()=>Zf,geoNaturalEarth1:()=>md,geoNaturalEarth1Raw:()=>yd,geoOrthographic:()=>bd,geoOrthographicRaw:()=>vd,geoPath:()=>kf,geoProjection:()=>Ff,geoProjectionMutator:()=>Pf,geoRotation:()=>Sl,geoStereographic:()=>xd,geoStereographicRaw:()=>_d,geoStream:()=>nu,geoTransform:()=>Tf,geoTransverseMercator:()=>kd,geoTransverseMercatorRaw:()=>wd,gray:()=>ka,hcl:()=>Ba,hierarchy:()=>Md,histogram:()=>D,hsl:()=>an,html:()=>Ds,image:()=>Es,interpolate:()=>Mn,interpolateArray:()=>xn,interpolateBasis:()=>un,interpolateBasisClosed:()=>ln,interpolateBlues:()=>f_,interpolateBrBG:()=>Tb,interpolateBuGn:()=>zb,interpolateBuPu:()=>qb,interpolateCividis:()=>k_,interpolateCool:()=>E_,interpolateCubehelix:()=>Up,interpolateCubehelixDefault:()=>T_,interpolateCubehelixLong:()=>zp,interpolateDate:()=>kn,interpolateDiscrete:()=>Sp,interpolateGnBu:()=>Wb,interpolateGreens:()=>p_,interpolateGreys:()=>y_,interpolateHcl:()=>Pp,interpolateHclLong:()=>Yp,interpolateHsl:()=>Op,interpolateHslLong:()=>Ip,interpolateHue:()=>Ap,interpolateInferno:()=>F_,interpolateLab:()=>Rp,interpolateMagma:()=>R_,interpolateNumber:()=>Tn,interpolateNumberArray:()=>bn,interpolateObject:()=>Cn,interpolateOrRd:()=>Gb,interpolateOranges:()=>w_,interpolatePRGn:()=>Eb,interpolatePiYG:()=>Ab,interpolatePlasma:()=>P_,interpolatePuBu:()=>Kb,interpolatePuBuGn:()=>Zb,interpolatePuOr:()=>Nb,interpolatePuRd:()=>t_,interpolatePurples:()=>v_,interpolateRainbow:()=>A_,interpolateRdBu:()=>Bb,interpolateRdGy:()=>Ob,interpolateRdPu:()=>n_,interpolateRdYlBu:()=>Rb,interpolateRdYlGn:()=>Pb,interpolateReds:()=>__,interpolateRgb:()=>gn,interpolateRgbBasis:()=>mn,interpolateRgbBasisClosed:()=>vn,interpolateRound:()=>Mp,interpolateSinebow:()=>B_,interpolateSpectral:()=>jb,interpolateString:()=>An,interpolateTransformCss:()=>pr,interpolateTransformSvg:()=>gr,interpolateTurbo:()=>L_,interpolateViridis:()=>I_,interpolateWarm:()=>C_,interpolateYlGn:()=>o_,interpolateYlGnBu:()=>i_,interpolateYlOrBr:()=>c_,interpolateYlOrRd:()=>l_,interpolateZoom:()=>Bp,interrupt:()=>ar,interval:()=>fk,isoFormat:()=>uk,isoParse:()=>hk,json:()=>As,keys:()=>fa,lab:()=>Ta,lch:()=>Da,line:()=>mx,lineRadial:()=>Ex,linkHorizontal:()=>Rx,linkRadial:()=>Px,linkVertical:()=>Fx,local:()=>U_,map:()=>na,matcher:()=>mt,max:()=>I,mean:()=>R,median:()=>F,merge:()=>P,min:()=>Y,mouse:()=>Ln,namespace:()=>Ct,namespaces:()=>Tt,nest:()=>ra,now:()=>qn,pack:()=>tp,packEnclose:()=>Id,packSiblings:()=>Gd,pairs:()=>l,partition:()=>op,path:()=>Wi,permute:()=>j,pie:()=>xx,piecewise:()=>$p,pointRadial:()=>Ax,polygonArea:()=>Hp,polygonCentroid:()=>Wp,polygonContains:()=>Qp,polygonHull:()=>Zp,polygonLength:()=>Kp,precisionFixed:()=>_c,precisionPrefix:()=>xc,precisionRound:()=>wc,quadtree:()=>js,quantile:()=>B,quantize:()=>qp,radialArea:()=>Sx,radialLine:()=>Ex,randomBates:()=>ig,randomExponential:()=>ag,randomIrwinHall:()=>rg,randomLogNormal:()=>ng,randomNormal:()=>eg,randomUniform:()=>tg,range:()=>k,rgb:()=>Qe,ribbon:()=>Ki,scaleBand:()=>dg,scaleDiverging:()=>ob,scaleDivergingLog:()=>sb,scaleDivergingPow:()=>ub,scaleDivergingSqrt:()=>lb,scaleDivergingSymlog:()=>cb,scaleIdentity:()=>Mg,scaleImplicit:()=>hg,scaleLinear:()=>Ag,scaleLog:()=>Pg,scaleOrdinal:()=>fg,scalePoint:()=>gg,scalePow:()=>Vg,scaleQuantile:()=>Xg,scaleQuantize:()=>Zg,scaleSequential:()=>Jv,scaleSequentialLog:()=>tb,scaleSequentialPow:()=>nb,scaleSequentialQuantile:()=>ib,scaleSequentialSqrt:()=>rb,scaleSequentialSymlog:()=>eb,scaleSqrt:()=>Gg,scaleSymlog:()=>zg,scaleThreshold:()=>Qg,scaleTime:()=>jv,scaleUtc:()=>Zv,scan:()=>U,schemeAccent:()=>db,schemeBlues:()=>h_,schemeBrBG:()=>kb,schemeBuGn:()=>Ub,schemeBuPu:()=>$b,schemeCategory10:()=>fb,schemeDark2:()=>pb,schemeGnBu:()=>Hb,schemeGreens:()=>d_,schemeGreys:()=>g_,schemeOrRd:()=>Vb,schemeOranges:()=>x_,schemePRGn:()=>Cb,schemePaired:()=>gb,schemePastel1:()=>yb,schemePastel2:()=>mb,schemePiYG:()=>Sb,schemePuBu:()=>Qb,schemePuBuGn:()=>Xb,schemePuOr:()=>Mb,schemePuRd:()=>Jb,schemePurples:()=>m_,schemeRdBu:()=>Db,schemeRdGy:()=>Lb,schemeRdPu:()=>e_,schemeRdYlBu:()=>Ib,schemeRdYlGn:()=>Fb,schemeReds:()=>b_,schemeSet1:()=>vb,schemeSet2:()=>bb,schemeSet3:()=>_b,schemeSpectral:()=>Yb,schemeTableau10:()=>xb,schemeYlGn:()=>a_,schemeYlGnBu:()=>r_,schemeYlOrBr:()=>s_,schemeYlOrRd:()=>u_,select:()=>Te,selectAll:()=>$_,selection:()=>ke,selector:()=>pt,selectorAll:()=>yt,set:()=>ha,shuffle:()=>z,stack:()=>Xw,stackOffsetDiverging:()=>Qw,stackOffsetExpand:()=>Zw,stackOffsetNone:()=>Ww,stackOffsetSilhouette:()=>Kw,stackOffsetWiggle:()=>Jw,stackOrderAppearance:()=>tk,stackOrderAscending:()=>nk,stackOrderDescending:()=>ik,stackOrderInsideOut:()=>ak,stackOrderNone:()=>Vw,stackOrderReverse:()=>ok,stratify:()=>hp,style:()=>Rt,sum:()=>$,svg:()=>Bs,symbol:()=>rw,symbolCircle:()=>Yx,symbolCross:()=>jx,symbolDiamond:()=>$x,symbolSquare:()=>Gx,symbolStar:()=>Vx,symbolTriangle:()=>Zx,symbolWye:()=>ew,symbols:()=>nw,text:()=>xs,thresholdFreedmanDiaconis:()=>L,thresholdScott:()=>O,thresholdSturges:()=>N,tickFormat:()=>Eg,tickIncrement:()=>A,tickStep:()=>M,ticks:()=>S,timeDay:()=>Ay,timeDays:()=>My,timeFormat:()=>pm,timeFormatDefaultLocale:()=>Iv,timeFormatLocale:()=>fm,timeFriday:()=>vy,timeFridays:()=>Cy,timeHour:()=>Dy,timeHours:()=>By,timeInterval:()=>ty,timeMillisecond:()=>jy,timeMilliseconds:()=>Uy,timeMinute:()=>Oy,timeMinutes:()=>Iy,timeMonday:()=>py,timeMondays:()=>xy,timeMonth:()=>ay,timeMonths:()=>oy,timeParse:()=>gm,timeSaturday:()=>by,timeSaturdays:()=>Ey,timeSecond:()=>Fy,timeSeconds:()=>Py,timeSunday:()=>dy,timeSundays:()=>_y,timeThursday:()=>my,timeThursdays:()=>Ty,timeTuesday:()=>gy,timeTuesdays:()=>wy,timeWednesday:()=>yy,timeWednesdays:()=>ky,timeWeek:()=>dy,timeWeeks:()=>_y,timeYear:()=>ny,timeYears:()=>ry,timeout:()=>Kn,timer:()=>Vn,timerFlush:()=>Gn,touch:()=>Bn,touches:()=>q_,transition:()=>qr,transpose:()=>q,tree:()=>vp,treemap:()=>kp,treemapBinary:()=>Tp,treemapDice:()=>ap,treemapResquarify:()=>Ep,treemapSlice:()=>bp,treemapSliceDice:()=>Cp,treemapSquarify:()=>wp,tsv:()=>Cs,tsvFormat:()=>Bo,tsvFormatBody:()=>Lo,tsvFormatRow:()=>Io,tsvFormatRows:()=>Oo,tsvFormatValue:()=>Ro,tsvParse:()=>No,tsvParseRows:()=>Do,utcDay:()=>im,utcDays:()=>am,utcFormat:()=>ym,utcFriday:()=>Gy,utcFridays:()=>em,utcHour:()=>Hv,utcHours:()=>Wv,utcMillisecond:()=>jy,utcMilliseconds:()=>Uy,utcMinute:()=>Gv,utcMinutes:()=>Xv,utcMonday:()=>qy,utcMondays:()=>Qy,utcMonth:()=>zv,utcMonths:()=>$v,utcParse:()=>mm,utcSaturday:()=>Xy,utcSaturdays:()=>nm,utcSecond:()=>Fy,utcSeconds:()=>Py,utcSunday:()=>$y,utcSundays:()=>Zy,utcThursday:()=>Vy,utcThursdays:()=>tm,utcTuesday:()=>Hy,utcTuesdays:()=>Ky,utcWednesday:()=>Wy,utcWednesdays:()=>Jy,utcWeek:()=>$y,utcWeeks:()=>Zy,utcYear:()=>sm,utcYears:()=>cm,values:()=>da,variance:()=>g,version:()=>r,voronoi:()=>Kk,window:()=>Bt,xml:()=>Ns,zip:()=>W,zoom:()=>fT,zoomIdentity:()=>nT,zoomTransform:()=>rT});var r="5.16.0";function i(t,e){return te?1:t>=e?0:NaN}function a(t){var e;return 1===t.length&&(e=t,t=function(t,n){return i(e(t),n)}),{left:function(e,n,r,i){for(null==r&&(r=0),null==i&&(i=e.length);r>>1;t(e[a],n)<0?r=a+1:i=a}return r},right:function(e,n,r,i){for(null==r&&(r=0),null==i&&(i=e.length);r>>1;t(e[a],n)>0?i=a:r=a+1}return r}}}var o=a(i),s=o.right,c=o.left;const u=s;function l(t,e){null==e&&(e=h);for(var n=0,r=t.length-1,i=t[0],a=new Array(r<0?0:r);nt?1:e>=t?0:NaN}function p(t){return null===t?NaN:+t}function g(t,e){var n,r,i=t.length,a=0,o=-1,s=0,c=0;if(null==e)for(;++o1)return c/(a-1)}function y(t,e){var n=g(t,e);return n?Math.sqrt(n):n}function m(t,e){var n,r,i,a=t.length,o=-1;if(null==e){for(;++o=n)for(r=i=n;++on&&(r=n),i=n)for(r=i=n;++on&&(r=n),i0)return[t];if((r=e0)for(t=Math.ceil(t/o),e=Math.floor(e/o),a=new Array(i=Math.ceil(e-t+1));++s=0?(a>=T?10:a>=C?5:a>=E?2:1)*Math.pow(10,i):-Math.pow(10,-i)/(a>=T?10:a>=C?5:a>=E?2:1)}function M(t,e,n){var r=Math.abs(e-t)/Math.max(0,n),i=Math.pow(10,Math.floor(Math.log(r)/Math.LN10)),a=r/i;return a>=T?i*=10:a>=C?i*=5:a>=E&&(i*=2),eh;)f.pop(),--d;var p,g=new Array(d+1);for(i=0;i<=d;++i)(p=g[i]=[]).x0=i>0?f[i-1]:l,p.x1=i=1)return+n(t[r-1],r-1,t);var r,i=(r-1)*e,a=Math.floor(i),o=+n(t[a],a,t);return o+(+n(t[a+1],a+1,t)-o)*(i-a)}}function L(t,e,n){return t=_.call(t,p).sort(i),Math.ceil((n-e)/(2*(B(t,.75)-B(t,.25))*Math.pow(t.length,-1/3)))}function O(t,e,n){return Math.ceil((n-e)/(3.5*y(t)*Math.pow(t.length,-1/3)))}function I(t,e){var n,r,i=t.length,a=-1;if(null==e){for(;++a=n)for(r=n;++ar&&(r=n)}else for(;++a=n)for(r=n;++ar&&(r=n);return r}function R(t,e){var n,r=t.length,i=r,a=-1,o=0;if(null==e)for(;++a=0;)for(e=(r=t[i]).length;--e>=0;)n[--o]=r[e];return n}function Y(t,e){var n,r,i=t.length,a=-1;if(null==e){for(;++a=n)for(r=n;++an&&(r=n)}else for(;++a=n)for(r=n;++an&&(r=n);return r}function j(t,e){for(var n=e.length,r=new Array(n);n--;)r[n]=t[e[n]];return r}function U(t,e){if(n=t.length){var n,r,a=0,o=0,s=t[o];for(null==e&&(e=i);++a=0&&(n=t.slice(r+1),t=t.slice(0,r)),t&&!e.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:n}}))}function lt(t,e){for(var n,r=0,i=t.length;r0)for(var n,r,i=new Array(n),a=0;ae?1:t>=e?0:NaN}bt.prototype={constructor:bt,appendChild:function(t){return this._parent.insertBefore(t,this._next)},insertBefore:function(t,e){return this._parent.insertBefore(t,e)},querySelector:function(t){return this._parent.querySelector(t)},querySelectorAll:function(t){return this._parent.querySelectorAll(t)}};var kt="http://www.w3.org/1999/xhtml";const Tt={svg:"http://www.w3.org/2000/svg",xhtml:kt,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function Ct(t){var e=t+="",n=e.indexOf(":");return n>=0&&"xmlns"!==(e=t.slice(0,n))&&(t=t.slice(n+1)),Tt.hasOwnProperty(e)?{space:Tt[e],local:t}:t}function Et(t){return function(){this.removeAttribute(t)}}function St(t){return function(){this.removeAttributeNS(t.space,t.local)}}function At(t,e){return function(){this.setAttribute(t,e)}}function Mt(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}function Nt(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttribute(t):this.setAttribute(t,n)}}function Dt(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,n)}}function Bt(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function Lt(t){return function(){this.style.removeProperty(t)}}function Ot(t,e,n){return function(){this.style.setProperty(t,e,n)}}function It(t,e,n){return function(){var r=e.apply(this,arguments);null==r?this.style.removeProperty(t):this.style.setProperty(t,r,n)}}function Rt(t,e){return t.style.getPropertyValue(e)||Bt(t).getComputedStyle(t,null).getPropertyValue(e)}function Ft(t){return function(){delete this[t]}}function Pt(t,e){return function(){this[t]=e}}function Yt(t,e){return function(){var n=e.apply(this,arguments);null==n?delete this[t]:this[t]=n}}function jt(t){return t.trim().split(/^|\s+/)}function Ut(t){return t.classList||new zt(t)}function zt(t){this._node=t,this._names=jt(t.getAttribute("class")||"")}function $t(t,e){for(var n=Ut(t),r=-1,i=e.length;++r=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};var ue={},le=null;function he(t,e,n){return t=fe(t,e,n),function(e){var n=e.relatedTarget;n&&(n===this||8&n.compareDocumentPosition(this))||t.call(this,e)}}function fe(t,e,n){return function(r){var i=le;le=r;try{t.call(this,this.__data__,e,n)}finally{le=i}}}function de(t){return t.trim().split(/^|\s+/).map((function(t){var e="",n=t.indexOf(".");return n>=0&&(e=t.slice(n+1),t=t.slice(0,n)),{type:t,name:e}}))}function pe(t){return function(){var e=this.__on;if(e){for(var n,r=0,i=-1,a=e.length;r=x&&(x=_+1);!(b=m[x])&&++x=0;)(r=i[a])&&(o&&4^r.compareDocumentPosition(o)&&o.parentNode.insertBefore(r,o),o=r);return this},sort:function(t){function e(e,n){return e&&n?t(e.__data__,n.__data__):!e-!n}t||(t=wt);for(var n=this._groups,r=n.length,i=new Array(r),a=0;a1?this.each((null==e?Lt:"function"==typeof e?It:Ot)(t,e,null==n?"":n)):Rt(this.node(),t)},property:function(t,e){return arguments.length>1?this.each((null==e?Ft:"function"==typeof e?Yt:Pt)(t,e)):this.node()[t]},classed:function(t,e){var n=jt(t+"");if(arguments.length<2){for(var r=Ut(this.node()),i=-1,a=n.length;++i>8&15|e>>4&240,e>>4&15|240&e,(15&e)<<4|15&e,1):8===n?Xe(e>>24&255,e>>16&255,e>>8&255,(255&e)/255):4===n?Xe(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|240&e,((15&e)<<4|15&e)/255):null):(e=Pe.exec(t))?new Ke(e[1],e[2],e[3],1):(e=Ye.exec(t))?new Ke(255*e[1]/100,255*e[2]/100,255*e[3]/100,1):(e=je.exec(t))?Xe(e[1],e[2],e[3],e[4]):(e=Ue.exec(t))?Xe(255*e[1]/100,255*e[2]/100,255*e[3]/100,e[4]):(e=ze.exec(t))?nn(e[1],e[2]/100,e[3]/100,1):(e=$e.exec(t))?nn(e[1],e[2]/100,e[3]/100,e[4]):qe.hasOwnProperty(t)?Ge(qe[t]):"transparent"===t?new Ke(NaN,NaN,NaN,0):null}function Ge(t){return new Ke(t>>16&255,t>>8&255,255&t,1)}function Xe(t,e,n,r){return r<=0&&(t=e=n=NaN),new Ke(t,e,n,r)}function Ze(t){return t instanceof De||(t=Ve(t)),t?new Ke((t=t.rgb()).r,t.g,t.b,t.opacity):new Ke}function Qe(t,e,n,r){return 1===arguments.length?Ze(t):new Ke(t,e,n,null==r?1:r)}function Ke(t,e,n,r){this.r=+t,this.g=+e,this.b=+n,this.opacity=+r}function Je(){return"#"+en(this.r)+en(this.g)+en(this.b)}function tn(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(1===t?")":", "+t+")")}function en(t){return((t=Math.max(0,Math.min(255,Math.round(t)||0)))<16?"0":"")+t.toString(16)}function nn(t,e,n,r){return r<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new on(t,e,n,r)}function rn(t){if(t instanceof on)return new on(t.h,t.s,t.l,t.opacity);if(t instanceof De||(t=Ve(t)),!t)return new on;if(t instanceof on)return t;var e=(t=t.rgb()).r/255,n=t.g/255,r=t.b/255,i=Math.min(e,n,r),a=Math.max(e,n,r),o=NaN,s=a-i,c=(a+i)/2;return s?(o=e===a?(n-r)/s+6*(n0&&c<1?0:o,new on(o,s,c,t.opacity)}function an(t,e,n,r){return 1===arguments.length?rn(t):new on(t,e,n,null==r?1:r)}function on(t,e,n,r){this.h=+t,this.s=+e,this.l=+n,this.opacity=+r}function sn(t,e,n){return 255*(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)}function cn(t,e,n,r,i){var a=t*t,o=a*t;return((1-3*t+3*a-o)*e+(4-6*a+3*o)*n+(1+3*t+3*a-3*o)*r+o*i)/6}function un(t){var e=t.length-1;return function(n){var r=n<=0?n=0:n>=1?(n=1,e-1):Math.floor(n*e),i=t[r],a=t[r+1],o=r>0?t[r-1]:2*i-a,s=r180||n<-180?n-360*Math.round(n/360):n):hn(isNaN(t)?e:t)}function pn(t,e){var n=e-t;return n?fn(t,n):hn(isNaN(t)?e:t)}Me(De,Ve,{copy:function(t){return Object.assign(new this.constructor,this,t)},displayable:function(){return this.rgb().displayable()},hex:He,formatHex:He,formatHsl:function(){return rn(this).formatHsl()},formatRgb:We,toString:We}),Me(Ke,Qe,Ne(De,{brighter:function(t){return t=null==t?Le:Math.pow(Le,t),new Ke(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function(t){return t=null==t?Be:Math.pow(Be,t),new Ke(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function(){return this},displayable:function(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Je,formatHex:Je,formatRgb:tn,toString:tn})),Me(on,an,Ne(De,{brighter:function(t){return t=null==t?Le:Math.pow(Le,t),new on(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?Be:Math.pow(Be,t),new on(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=this.h%360+360*(this.h<0),e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,r=n+(n<.5?n:1-n)*e,i=2*n-r;return new Ke(sn(t>=240?t-240:t+120,i,r),sn(t,i,r),sn(t<120?t+240:t-120,i,r),this.opacity)},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"hsl(":"hsla(")+(this.h||0)+", "+100*(this.s||0)+"%, "+100*(this.l||0)+"%"+(1===t?")":", "+t+")")}}));const gn=function t(e){var n=function(t){return 1==(t=+t)?pn:function(e,n){return n-e?function(t,e,n){return t=Math.pow(t,n),e=Math.pow(e,n)-t,n=1/n,function(r){return Math.pow(t+r*e,n)}}(e,n,t):hn(isNaN(e)?n:e)}}(e);function r(t,e){var r=n((t=Qe(t)).r,(e=Qe(e)).r),i=n(t.g,e.g),a=n(t.b,e.b),o=pn(t.opacity,e.opacity);return function(e){return t.r=r(e),t.g=i(e),t.b=a(e),t.opacity=o(e),t+""}}return r.gamma=t,r}(1);function yn(t){return function(e){var n,r,i=e.length,a=new Array(i),o=new Array(i),s=new Array(i);for(n=0;na&&(i=e.slice(a,i),s[o]?s[o]+=i:s[++o]=i),(n=n[0])===(r=r[0])?s[o]?s[o]+=r:s[++o]=r:(s[++o]=null,c.push({i:o,x:Tn(n,r)})),a=Sn.lastIndex;return a=0&&e._call.call(null,t),e=e._next;--Rn}function Xn(){jn=(Yn=zn.now())+Un,Rn=Fn=0;try{Gn()}finally{Rn=0,function(){for(var t,e,n=On,r=1/0;n;)n._call?(r>n._time&&(r=n._time),t=n,n=n._next):(e=n._next,n._next=null,n=t?t._next=e:On=e);In=t,Qn(r)}(),jn=0}}function Zn(){var t=zn.now(),e=t-Yn;e>1e3&&(Un-=e,Yn=t)}function Qn(t){Rn||(Fn&&(Fn=clearTimeout(Fn)),t-jn>24?(t<1/0&&(Fn=setTimeout(Xn,t-zn.now()-Un)),Pn&&(Pn=clearInterval(Pn))):(Pn||(Yn=zn.now(),Pn=setInterval(Zn,1e3)),Rn=1,$n(Xn)))}function Kn(t,e,n){var r=new Wn;return e=null==e?0:+e,r.restart((function(n){r.stop(),t(n+e)}),e,n),r}Wn.prototype=Vn.prototype={constructor:Wn,restart:function(t,e,n){if("function"!=typeof t)throw new TypeError("callback is not a function");n=(null==n?qn():+n)+(null==e?0:+e),this._next||In===this||(In?In._next=this:On=this,In=this),this._call=t,this._time=n,Qn()},stop:function(){this._call&&(this._call=null,this._time=1/0,Qn())}};var Jn=ft("start","end","cancel","interrupt"),tr=[];function er(t,e,n,r,i,a){var o=t.__transition;if(o){if(n in o)return}else t.__transition={};!function(t,e,n){var r,i=t.__transition;function a(c){var u,l,h,f;if(1!==n.state)return s();for(u in i)if((f=i[u]).name===n.name){if(3===f.state)return Kn(a);4===f.state?(f.state=6,f.timer.stop(),f.on.call("interrupt",t,t.__data__,f.index,f.group),delete i[u]):+u0)throw new Error("too late; already scheduled");return n}function rr(t,e){var n=ir(t,e);if(n.state>3)throw new Error("too late; already running");return n}function ir(t,e){var n=t.__transition;if(!n||!(n=n[e]))throw new Error("transition not found");return n}function ar(t,e){var n,r,i,a=t.__transition,o=!0;if(a){for(i in e=null==e?null:e+"",a)(n=a[i]).name===e?(r=n.state>2&&n.state<5,n.state=6,n.timer.stop(),n.on.call(r?"interrupt":"cancel",t,t.__data__,n.index,n.group),delete a[i]):o=!1;o&&delete t.__transition}}var or,sr,cr,ur,lr=180/Math.PI,hr={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1};function fr(t,e,n,r,i,a){var o,s,c;return(o=Math.sqrt(t*t+e*e))&&(t/=o,e/=o),(c=t*n+e*r)&&(n-=t*c,r-=e*c),(s=Math.sqrt(n*n+r*r))&&(n/=s,r/=s,c/=s),t*r180?e+=360:e-t>180&&(t+=360),a.push({i:n.push(i(n)+"rotate(",null,r)-2,x:Tn(t,e)})):e&&n.push(i(n)+"rotate("+e+r)}(a.rotate,o.rotate,s,c),function(t,e,n,a){t!==e?a.push({i:n.push(i(n)+"skewX(",null,r)-2,x:Tn(t,e)}):e&&n.push(i(n)+"skewX("+e+r)}(a.skewX,o.skewX,s,c),function(t,e,n,r,a,o){if(t!==n||e!==r){var s=a.push(i(a)+"scale(",null,",",null,")");o.push({i:s-4,x:Tn(t,n)},{i:s-2,x:Tn(e,r)})}else 1===n&&1===r||a.push(i(a)+"scale("+n+","+r+")")}(a.scaleX,a.scaleY,o.scaleX,o.scaleY,s,c),a=o=null,function(t){for(var e,n=-1,r=c.length;++n=0&&(t=t.slice(0,e)),!t||"start"===t}))}(e)?nr:rr;return function(){var o=a(this,t),s=o.on;s!==r&&(i=(r=s).copy()).on(e,n),o.on=i}}var Rr=ke.prototype.constructor;function Fr(t){return function(){this.style.removeProperty(t)}}function Pr(t,e,n){return function(r){this.style.setProperty(t,e.call(this,r),n)}}function Yr(t,e,n){var r,i;function a(){var a=e.apply(this,arguments);return a!==i&&(r=(i=a)&&Pr(t,a,n)),r}return a._value=e,a}function jr(t){return function(e){this.textContent=t.call(this,e)}}function Ur(t){var e,n;function r(){var r=t.apply(this,arguments);return r!==n&&(e=(n=r)&&jr(r)),e}return r._value=t,r}var zr=0;function $r(t,e,n,r){this._groups=t,this._parents=e,this._name=n,this._id=r}function qr(t){return ke().transition(t)}function Hr(){return++zr}var Wr=ke.prototype;function Vr(t){return t*t*t}function Gr(t){return--t*t*t+1}function Xr(t){return((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2}$r.prototype=qr.prototype={constructor:$r,select:function(t){var e=this._name,n=this._id;"function"!=typeof t&&(t=pt(t));for(var r=this._groups,i=r.length,a=new Array(i),o=0;o1&&n.name===e)return new $r([[t]],Kr,e,+r);return null}function ti(t){return function(){return t}}function ei(t,e,n){this.target=t,this.type=e,this.selection=n}function ni(){le.stopImmediatePropagation()}function ri(){le.preventDefault(),le.stopImmediatePropagation()}var ii={name:"drag"},ai={name:"space"},oi={name:"handle"},si={name:"center"};function ci(t){return[+t[0],+t[1]]}function ui(t){return[ci(t[0]),ci(t[1])]}function li(t){return function(e){return Bn(e,le.touches,t)}}var hi={name:"x",handles:["w","e"].map(bi),input:function(t,e){return null==t?null:[[+t[0],e[0][1]],[+t[1],e[1][1]]]},output:function(t){return t&&[t[0][0],t[1][0]]}},fi={name:"y",handles:["n","s"].map(bi),input:function(t,e){return null==t?null:[[e[0][0],+t[0]],[e[1][0],+t[1]]]},output:function(t){return t&&[t[0][1],t[1][1]]}},di={name:"xy",handles:["n","w","e","s","nw","ne","sw","se"].map(bi),input:function(t){return null==t?null:ui(t)},output:function(t){return t}},pi={overlay:"crosshair",selection:"move",n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},gi={e:"w",w:"e",nw:"ne",ne:"nw",se:"sw",sw:"se"},yi={n:"s",s:"n",nw:"sw",ne:"se",se:"ne",sw:"nw"},mi={overlay:1,selection:1,n:null,e:1,s:null,w:-1,nw:-1,ne:1,se:1,sw:-1},vi={overlay:1,selection:1,n:-1,e:null,s:1,w:null,nw:-1,ne:-1,se:1,sw:1};function bi(t){return{type:t}}function _i(){return!le.ctrlKey&&!le.button}function xi(){var t=this.ownerSVGElement||this;return t.hasAttribute("viewBox")?[[(t=t.viewBox.baseVal).x,t.y],[t.x+t.width,t.y+t.height]]:[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]}function wi(){return navigator.maxTouchPoints||"ontouchstart"in this}function ki(t){for(;!t.__brush;)if(!(t=t.parentNode))return;return t.__brush}function Ti(t){return t[0][0]===t[1][0]||t[0][1]===t[1][1]}function Ci(t){var e=t.__brush;return e?e.dim.output(e.selection):null}function Ei(){return Mi(hi)}function Si(){return Mi(fi)}function Ai(){return Mi(di)}function Mi(t){var e,n=xi,r=_i,i=wi,a=!0,o=ft("start","brush","end"),s=6;function c(e){var n=e.property("__brush",g).selectAll(".overlay").data([bi("overlay")]);n.enter().append("rect").attr("class","overlay").attr("pointer-events","all").attr("cursor",pi.overlay).merge(n).each((function(){var t=ki(this).extent;Te(this).attr("x",t[0][0]).attr("y",t[0][1]).attr("width",t[1][0]-t[0][0]).attr("height",t[1][1]-t[0][1])})),e.selectAll(".selection").data([bi("selection")]).enter().append("rect").attr("class","selection").attr("cursor",pi.selection).attr("fill","#777").attr("fill-opacity",.3).attr("stroke","#fff").attr("shape-rendering","crispEdges");var r=e.selectAll(".handle").data(t.handles,(function(t){return t.type}));r.exit().remove(),r.enter().append("rect").attr("class",(function(t){return"handle handle--"+t.type})).attr("cursor",(function(t){return pi[t.type]})),e.each(u).attr("fill","none").attr("pointer-events","all").on("mousedown.brush",f).filter(i).on("touchstart.brush",f).on("touchmove.brush",d).on("touchend.brush touchcancel.brush",p).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function u(){var t=Te(this),e=ki(this).selection;e?(t.selectAll(".selection").style("display",null).attr("x",e[0][0]).attr("y",e[0][1]).attr("width",e[1][0]-e[0][0]).attr("height",e[1][1]-e[0][1]),t.selectAll(".handle").style("display",null).attr("x",(function(t){return"e"===t.type[t.type.length-1]?e[1][0]-s/2:e[0][0]-s/2})).attr("y",(function(t){return"s"===t.type[0]?e[1][1]-s/2:e[0][1]-s/2})).attr("width",(function(t){return"n"===t.type||"s"===t.type?e[1][0]-e[0][0]+s:s})).attr("height",(function(t){return"e"===t.type||"w"===t.type?e[1][1]-e[0][1]+s:s}))):t.selectAll(".selection,.handle").style("display","none").attr("x",null).attr("y",null).attr("width",null).attr("height",null)}function l(t,e,n){var r=t.__brush.emitter;return!r||n&&r.clean?new h(t,e,n):r}function h(t,e,n){this.that=t,this.args=e,this.state=t.__brush,this.active=0,this.clean=n}function f(){if((!e||le.touches)&&r.apply(this,arguments)){var n,i,o,s,c,h,f,d,p,g,y,m=this,v=le.target.__data__.type,b="selection"===(a&&le.metaKey?v="overlay":v)?ii:a&&le.altKey?si:oi,_=t===fi?null:mi[v],x=t===hi?null:vi[v],w=ki(m),k=w.extent,T=w.selection,C=k[0][0],E=k[0][1],S=k[1][0],A=k[1][1],M=0,N=0,D=_&&x&&a&&le.shiftKey,B=le.touches?li(le.changedTouches[0].identifier):Ln,L=B(m),O=L,I=l(m,arguments,!0).beforestart();"overlay"===v?(T&&(p=!0),w.selection=T=[[n=t===fi?C:L[0],o=t===hi?E:L[1]],[c=t===fi?S:n,f=t===hi?A:o]]):(n=T[0][0],o=T[0][1],c=T[1][0],f=T[1][1]),i=n,s=o,h=c,d=f;var R=Te(m).attr("pointer-events","none"),F=R.selectAll(".overlay").attr("cursor",pi[v]);if(le.touches)I.moved=Y,I.ended=U;else{var P=Te(le.view).on("mousemove.brush",Y,!0).on("mouseup.brush",U,!0);a&&P.on("keydown.brush",z,!0).on("keyup.brush",$,!0),Se(le.view)}ni(),ar(m),u.call(m),I.start()}function Y(){var t=B(m);!D||g||y||(Math.abs(t[0]-O[0])>Math.abs(t[1]-O[1])?y=!0:g=!0),O=t,p=!0,ri(),j()}function j(){var t;switch(M=O[0]-L[0],N=O[1]-L[1],b){case ai:case ii:_&&(M=Math.max(C-n,Math.min(S-c,M)),i=n+M,h=c+M),x&&(N=Math.max(E-o,Math.min(A-f,N)),s=o+N,d=f+N);break;case oi:_<0?(M=Math.max(C-n,Math.min(S-n,M)),i=n+M,h=c):_>0&&(M=Math.max(C-c,Math.min(S-c,M)),i=n,h=c+M),x<0?(N=Math.max(E-o,Math.min(A-o,N)),s=o+N,d=f):x>0&&(N=Math.max(E-f,Math.min(A-f,N)),s=o,d=f+N);break;case si:_&&(i=Math.max(C,Math.min(S,n-M*_)),h=Math.max(C,Math.min(S,c+M*_))),x&&(s=Math.max(E,Math.min(A,o-N*x)),d=Math.max(E,Math.min(A,f+N*x)))}h0&&(n=i-M),x<0?f=d-N:x>0&&(o=s-N),b=ai,F.attr("cursor",pi.selection),j());break;default:return}ri()}function $(){switch(le.keyCode){case 16:D&&(g=y=D=!1,j());break;case 18:b===si&&(_<0?c=h:_>0&&(n=i),x<0?f=d:x>0&&(o=s),b=oi,j());break;case 32:b===ai&&(le.altKey?(_&&(c=h-M*_,n=i+M*_),x&&(f=d-N*x,o=s+N*x),b=si):(_<0?c=h:_>0&&(n=i),x<0?f=d:x>0&&(o=s),b=oi),F.attr("cursor",pi[v]),j());break;default:return}ri()}}function d(){l(this,arguments).moved()}function p(){l(this,arguments).ended()}function g(){var e=this.__brush||{selection:null};return e.extent=ui(n.apply(this,arguments)),e.dim=t,e}return c.move=function(e,n){e.selection?e.on("start.brush",(function(){l(this,arguments).beforestart().start()})).on("interrupt.brush end.brush",(function(){l(this,arguments).end()})).tween("brush",(function(){var e=this,r=e.__brush,i=l(e,arguments),a=r.selection,o=t.input("function"==typeof n?n.apply(this,arguments):n,r.extent),s=Mn(a,o);function c(t){r.selection=1===t&&null===o?null:s(t),u.call(e),i.brush()}return null!==a&&null!==o?c:c(1)})):e.each((function(){var e=this,r=arguments,i=e.__brush,a=t.input("function"==typeof n?n.apply(e,r):n,i.extent),o=l(e,r).beforestart();ar(e),i.selection=null===a?null:a,u.call(e),o.start().brush().end()}))},c.clear=function(t){c.move(t,null)},h.prototype={beforestart:function(){return 1==++this.active&&(this.state.emitter=this,this.starting=!0),this},start:function(){return this.starting?(this.starting=!1,this.emit("start")):this.emit("brush"),this},brush:function(){return this.emit("brush"),this},end:function(){return 0==--this.active&&(delete this.state.emitter,this.emit("end")),this},emit:function(e){ye(new ei(c,e,t.output(this.state.selection)),o.apply,o,[e,this.that,this.args])}},c.extent=function(t){return arguments.length?(n="function"==typeof t?t:ti(ui(t)),c):n},c.filter=function(t){return arguments.length?(r="function"==typeof t?t:ti(!!t),c):r},c.touchable=function(t){return arguments.length?(i="function"==typeof t?t:ti(!!t),c):i},c.handleSize=function(t){return arguments.length?(s=+t,c):s},c.keyModifiers=function(t){return arguments.length?(a=!!t,c):a},c.on=function(){var t=o.on.apply(o,arguments);return t===o?c:t},c}var Ni=Math.cos,Di=Math.sin,Bi=Math.PI,Li=Bi/2,Oi=2*Bi,Ii=Math.max;function Ri(t){return function(e,n){return t(e.source.value+e.target.value,n.source.value+n.target.value)}}function Fi(){var t=0,e=null,n=null,r=null;function i(i){var a,o,s,c,u,l,h=i.length,f=[],d=k(h),p=[],g=[],y=g.groups=new Array(h),m=new Array(h*h);for(a=0,u=-1;++uzi)if(Math.abs(l*s-c*u)>zi&&i){var f=n-a,d=r-o,p=s*s+c*c,g=f*f+d*d,y=Math.sqrt(p),m=Math.sqrt(h),v=i*Math.tan((ji-Math.acos((p+h-g)/(2*y*m)))/2),b=v/m,_=v/y;Math.abs(b-1)>zi&&(this._+="L"+(t+b*u)+","+(e+b*l)),this._+="A"+i+","+i+",0,0,"+ +(l*f>u*d)+","+(this._x1=t+_*s)+","+(this._y1=e+_*c)}else this._+="L"+(this._x1=t)+","+(this._y1=e)},arc:function(t,e,n,r,i,a){t=+t,e=+e,a=!!a;var o=(n=+n)*Math.cos(r),s=n*Math.sin(r),c=t+o,u=e+s,l=1^a,h=a?r-i:i-r;if(n<0)throw new Error("negative radius: "+n);null===this._x1?this._+="M"+c+","+u:(Math.abs(this._x1-c)>zi||Math.abs(this._y1-u)>zi)&&(this._+="L"+c+","+u),n&&(h<0&&(h=h%Ui+Ui),h>$i?this._+="A"+n+","+n+",0,1,"+l+","+(t-o)+","+(e-s)+"A"+n+","+n+",0,1,"+l+","+(this._x1=c)+","+(this._y1=u):h>zi&&(this._+="A"+n+","+n+",0,"+ +(h>=ji)+","+l+","+(this._x1=t+n*Math.cos(i))+","+(this._y1=e+n*Math.sin(i))))},rect:function(t,e,n,r){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)+"h"+ +n+"v"+ +r+"h"+-n+"Z"},toString:function(){return this._}};const Wi=Hi;function Vi(t){return t.source}function Gi(t){return t.target}function Xi(t){return t.radius}function Zi(t){return t.startAngle}function Qi(t){return t.endAngle}function Ki(){var t=Vi,e=Gi,n=Xi,r=Zi,i=Qi,a=null;function o(){var o,s=Pi.call(arguments),c=t.apply(this,s),u=e.apply(this,s),l=+n.apply(this,(s[0]=c,s)),h=r.apply(this,s)-Li,f=i.apply(this,s)-Li,d=l*Ni(h),p=l*Di(h),g=+n.apply(this,(s[0]=u,s)),y=r.apply(this,s)-Li,m=i.apply(this,s)-Li;if(a||(a=o=Wi()),a.moveTo(d,p),a.arc(0,0,l,h,f),h===y&&f===m||(a.quadraticCurveTo(0,0,g*Ni(y),g*Di(y)),a.arc(0,0,g,y,m)),a.quadraticCurveTo(0,0,d,p),a.closePath(),o)return a=null,o+""||null}return o.radius=function(t){return arguments.length?(n="function"==typeof t?t:Yi(+t),o):n},o.startAngle=function(t){return arguments.length?(r="function"==typeof t?t:Yi(+t),o):r},o.endAngle=function(t){return arguments.length?(i="function"==typeof t?t:Yi(+t),o):i},o.source=function(e){return arguments.length?(t=e,o):t},o.target=function(t){return arguments.length?(e=t,o):e},o.context=function(t){return arguments.length?(a=null==t?null:t,o):a},o}var Ji="$";function ta(){}function ea(t,e){var n=new ta;if(t instanceof ta)t.each((function(t,e){n.set(e,t)}));else if(Array.isArray(t)){var r,i=-1,a=t.length;if(null==e)for(;++i=r.length)return null!=t&&n.sort(t),null!=e?e(n):n;for(var c,u,l,h=-1,f=n.length,d=r[i++],p=na(),g=o();++hr.length)return t;var a,s=i[n-1];return null!=e&&n>=r.length?a=t.entries():(a=[],t.each((function(t,e){a.push({key:e,values:o(t,n)})}))),null!=s?a.sort((function(t,e){return s(t.key,e.key)})):a}return n={object:function(t){return a(t,0,ia,aa)},map:function(t){return a(t,0,oa,sa)},entries:function(t){return o(a(t,0,oa,sa),0)},key:function(t){return r.push(t),n},sortKeys:function(t){return i[r.length-1]=t,n},sortValues:function(e){return t=e,n},rollup:function(t){return e=t,n}}}function ia(){return{}}function aa(t,e,n){t[e]=n}function oa(){return na()}function sa(t,e,n){t.set(e,n)}function ca(){}var ua=na.prototype;function la(t,e){var n=new ca;if(t instanceof ca)t.each((function(t){n.add(t)}));else if(t){var r=-1,i=t.length;if(null==e)for(;++r.008856451679035631?Math.pow(t,1/3):t/xa+ba}function Sa(t){return t>_a?t*t*t:xa*(t-ba)}function Aa(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function Ma(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function Na(t){if(t instanceof La)return new La(t.h,t.c,t.l,t.opacity);if(t instanceof Ca||(t=wa(t)),0===t.a&&0===t.b)return new La(NaN,0r!=d>r&&n<(f-u)*(r-l)/(d-l)+u&&(i=-i)}return i}function Qa(t,e,n){var r,i,a,o;return function(t,e,n){return(e[0]-t[0])*(n[1]-t[1])==(n[0]-t[0])*(e[1]-t[1])}(t,e,n)&&(i=t[r=+(t[0]===e[0])],a=n[r],o=e[r],i<=a&&a<=o||o<=a&&a<=i)}function Ka(){}var Ja=[[],[[[1,1.5],[.5,1]]],[[[1.5,1],[1,1.5]]],[[[1.5,1],[.5,1]]],[[[1,.5],[1.5,1]]],[[[1,1.5],[.5,1]],[[1,.5],[1.5,1]]],[[[1,.5],[1,1.5]]],[[[1,.5],[.5,1]]],[[[.5,1],[1,.5]]],[[[1,1.5],[1,.5]]],[[[.5,1],[1,.5]],[[1.5,1],[1,1.5]]],[[[1.5,1],[1,.5]]],[[[.5,1],[1.5,1]]],[[[1,1.5],[1.5,1]]],[[[.5,1],[1,1.5]]],[]];function to(){var t=1,e=1,n=N,r=s;function i(t){var e=n(t);if(Array.isArray(e))e=e.slice().sort(Va);else{var r=m(t),i=r[0],o=r[1];e=M(i,o,e),e=k(Math.floor(i/e)*e,Math.floor(o/e)*e,e)}return e.map((function(e){return a(t,e)}))}function a(n,i){var a=[],s=[];return function(n,r,i){var a,s,c,u,l,h,f=new Array,d=new Array;for(a=s=-1,u=n[0]>=r,Ja[u<<1].forEach(p);++a=r,Ja[c|u<<1].forEach(p);for(Ja[u<<0].forEach(p);++s=r,l=n[s*t]>=r,Ja[u<<1|l<<2].forEach(p);++a=r,h=l,l=n[s*t+a+1]>=r,Ja[c|u<<1|l<<2|h<<3].forEach(p);Ja[u|l<<3].forEach(p)}for(a=-1,l=n[s*t]>=r,Ja[l<<2].forEach(p);++a=r,Ja[l<<2|h<<3].forEach(p);function p(t){var e,n,r=[t[0][0]+a,t[0][1]+s],c=[t[1][0]+a,t[1][1]+s],u=o(r),l=o(c);(e=d[u])?(n=f[l])?(delete d[e.end],delete f[n.start],e===n?(e.ring.push(c),i(e.ring)):f[e.start]=d[n.end]={start:e.start,end:n.end,ring:e.ring.concat(n.ring)}):(delete d[e.end],e.ring.push(c),d[e.end=l]=e):(e=f[l])?(n=d[u])?(delete f[e.start],delete d[n.end],e===n?(e.ring.push(c),i(e.ring)):f[n.start]=d[e.end]={start:n.start,end:e.end,ring:n.ring.concat(e.ring)}):(delete f[e.start],e.ring.unshift(r),f[e.start=u]=e):f[u]=d[l]={start:u,end:l,ring:[r,c]}}Ja[l<<3].forEach(p)}(n,i,(function(t){r(t,n,i),function(t){for(var e=0,n=t.length,r=t[n-1][1]*t[0][0]-t[n-1][0]*t[0][1];++e0?a.push([t]):s.push(t)})),s.forEach((function(t){for(var e,n=0,r=a.length;n0&&o0&&s0&&a>0))throw new Error("invalid size");return t=r,e=a,i},i.thresholds=function(t){return arguments.length?(n="function"==typeof t?t:Array.isArray(t)?Ga(Wa.call(t)):Ga(t),i):n},i.smooth=function(t){return arguments.length?(r=t?s:Ka,i):r===s},i}function eo(t,e,n){for(var r=t.width,i=t.height,a=1+(n<<1),o=0;o=n&&(s>=a&&(c-=t.data[s-a+o*r]),e.data[s-n+o*r]=c/Math.min(s+1,r-1+a-s,a))}function no(t,e,n){for(var r=t.width,i=t.height,a=1+(n<<1),o=0;o=n&&(s>=a&&(c-=t.data[o+(s-a)*r]),e.data[o+(s-n)*r]=c/Math.min(s+1,i-1+a-s,a))}function ro(t){return t[0]}function io(t){return t[1]}function ao(){return 1}function oo(){var t=ro,e=io,n=ao,r=960,i=500,a=20,o=2,s=3*a,c=r+2*s>>o,u=i+2*s>>o,l=Ga(20);function h(r){var i=new Float32Array(c*u),h=new Float32Array(c*u);r.forEach((function(r,a,l){var h=+t(r,a,l)+s>>o,f=+e(r,a,l)+s>>o,d=+n(r,a,l);h>=0&&h=0&&f>o),no({width:c,height:u,data:h},{width:c,height:u,data:i},a>>o),eo({width:c,height:u,data:i},{width:c,height:u,data:h},a>>o),no({width:c,height:u,data:h},{width:c,height:u,data:i},a>>o),eo({width:c,height:u,data:i},{width:c,height:u,data:h},a>>o),no({width:c,height:u,data:h},{width:c,height:u,data:i},a>>o);var d=l(i);if(!Array.isArray(d)){var p=I(i);d=M(0,p,d),(d=k(0,Math.floor(p/d)*d,d)).shift()}return to().thresholds(d).size([c,u])(i).map(f)}function f(t){return t.value*=Math.pow(2,-2*o),t.coordinates.forEach(d),t}function d(t){t.forEach(p)}function p(t){t.forEach(g)}function g(t){t[0]=t[0]*Math.pow(2,o)-s,t[1]=t[1]*Math.pow(2,o)-s}function y(){return c=r+2*(s=3*a)>>o,u=i+2*s>>o,h}return h.x=function(e){return arguments.length?(t="function"==typeof e?e:Ga(+e),h):t},h.y=function(t){return arguments.length?(e="function"==typeof t?t:Ga(+t),h):e},h.weight=function(t){return arguments.length?(n="function"==typeof t?t:Ga(+t),h):n},h.size=function(t){if(!arguments.length)return[r,i];var e=Math.ceil(t[0]),n=Math.ceil(t[1]);if(!(e>=0||e>=0))throw new Error("invalid size");return r=e,i=n,y()},h.cellSize=function(t){if(!arguments.length)return 1<=1))throw new Error("invalid cell size");return o=Math.floor(Math.log(t)/Math.LN2),y()},h.thresholds=function(t){return arguments.length?(l="function"==typeof t?t:Array.isArray(t)?Ga(Wa.call(t)):Ga(t),h):l},h.bandwidth=function(t){if(!arguments.length)return Math.sqrt(a*(a+1));if(!((t=+t)>=0))throw new Error("invalid bandwidth");return a=Math.round((Math.sqrt(4*t*t+1)-1)/2),y()},h}function so(t){return function(){return t}}function co(t,e,n,r,i,a,o,s,c,u){this.target=t,this.type=e,this.subject=n,this.identifier=r,this.active=i,this.x=a,this.y=o,this.dx=s,this.dy=c,this._=u}function uo(){return!le.ctrlKey&&!le.button}function lo(){return this.parentNode}function ho(t){return null==t?{x:le.x,y:le.y}:t}function fo(){return navigator.maxTouchPoints||"ontouchstart"in this}function po(){var t,e,n,r,i=uo,a=lo,o=ho,s=fo,c={},u=ft("start","drag","end"),l=0,h=0;function f(t){t.on("mousedown.drag",d).filter(s).on("touchstart.drag",y).on("touchmove.drag",m).on("touchend.drag touchcancel.drag",v).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function d(){if(!r&&i.apply(this,arguments)){var o=b("mouse",a.apply(this,arguments),Ln,this,arguments);o&&(Te(le.view).on("mousemove.drag",p,!0).on("mouseup.drag",g,!0),Se(le.view),Ce(),n=!1,t=le.clientX,e=le.clientY,o("start"))}}function p(){if(Ee(),!n){var r=le.clientX-t,i=le.clientY-e;n=r*r+i*i>h}c.mouse("drag")}function g(){Te(le.view).on("mousemove.drag mouseup.drag",null),Ae(le.view,n),Ee(),c.mouse("end")}function y(){if(i.apply(this,arguments)){var t,e,n=le.changedTouches,r=a.apply(this,arguments),o=n.length;for(t=0;t=a?c=!0:10===(r=t.charCodeAt(o++))?u=!0:13===r&&(u=!0,10===t.charCodeAt(o)&&++o),t.slice(i+1,e-1).replace(/""/g,'"')}for(;o9999?"+"+bo(t,6):bo(t,4)}(t.getUTCFullYear())+"-"+bo(t.getUTCMonth()+1,2)+"-"+bo(t.getUTCDate(),2)+(i?"T"+bo(e,2)+":"+bo(n,2)+":"+bo(r,2)+"."+bo(i,3)+"Z":r?"T"+bo(e,2)+":"+bo(n,2)+":"+bo(r,2)+"Z":n||e?"T"+bo(e,2)+":"+bo(n,2)+"Z":"")}(t):e.test(t+="")?'"'+t.replace(/"/g,'""')+'"':t}return{parse:function(t,e){var n,i,a=r(t,(function(t,r){if(n)return n(t,r-1);i=t,n=e?function(t,e){var n=mo(t);return function(r,i){return e(n(r),i,t)}}(t,e):mo(t)}));return a.columns=i||[],a},parseRows:r,format:function(e,n){return null==n&&(n=vo(e)),[n.map(o).join(t)].concat(i(e,n)).join("\n")},formatBody:function(t,e){return null==e&&(e=vo(t)),i(t,e).join("\n")},formatRows:function(t){return t.map(a).join("\n")},formatRow:a,formatValue:o}}var xo=_o(","),wo=xo.parse,ko=xo.parseRows,To=xo.format,Co=xo.formatBody,Eo=xo.formatRows,So=xo.formatRow,Ao=xo.formatValue,Mo=_o("\t"),No=Mo.parse,Do=Mo.parseRows,Bo=Mo.format,Lo=Mo.formatBody,Oo=Mo.formatRows,Io=Mo.formatRow,Ro=Mo.formatValue;function Fo(t){for(var e in t){var n,r,i=t[e].trim();if(i)if("true"===i)i=!0;else if("false"===i)i=!1;else if("NaN"===i)i=NaN;else if(isNaN(n=+i)){if(!(r=i.match(/^([-+]\d{2})?\d{4}(-\d{2}(-\d{2})?)?(T\d{2}:\d{2}(:\d{2}(\.\d{3})?)?(Z|[-+]\d{2}:\d{2})?)?$/)))continue;Po&&r[4]&&!r[7]&&(i=i.replace(/-/g,"/").replace(/T/," ")),i=new Date(i)}else i=n;else i=null;t[e]=i}return t}var Po=new Date("2019-01-01T00:00").getHours()||new Date("2019-07-01T00:00").getHours();function Yo(t){return+t}function jo(t){return t*t}function Uo(t){return t*(2-t)}function zo(t){return((t*=2)<=1?t*t:--t*(2-t)+1)/2}var $o=function t(e){function n(t){return Math.pow(t,e)}return e=+e,n.exponent=t,n}(3),qo=function t(e){function n(t){return 1-Math.pow(1-t,e)}return e=+e,n.exponent=t,n}(3),Ho=function t(e){function n(t){return((t*=2)<=1?Math.pow(t,e):2-Math.pow(2-t,e))/2}return e=+e,n.exponent=t,n}(3),Wo=Math.PI,Vo=Wo/2;function Go(t){return 1==+t?1:1-Math.cos(t*Vo)}function Xo(t){return Math.sin(t*Vo)}function Zo(t){return(1-Math.cos(Wo*t))/2}function Qo(t){return 1.0009775171065494*(Math.pow(2,-10*t)-.0009765625)}function Ko(t){return Qo(1-+t)}function Jo(t){return 1-Qo(t)}function ts(t){return((t*=2)<=1?Qo(1-t):2-Qo(t-1))/2}function es(t){return 1-Math.sqrt(1-t*t)}function ns(t){return Math.sqrt(1- --t*t)}function rs(t){return((t*=2)<=1?1-Math.sqrt(1-t*t):Math.sqrt(1-(t-=2)*t)+1)/2}var is=7.5625;function as(t){return 1-os(1-t)}function os(t){return(t=+t)<.36363636363636365?is*t*t:t<.7272727272727273?is*(t-=.5454545454545454)*t+.75:t<.9090909090909091?is*(t-=.8181818181818182)*t+.9375:is*(t-=.9545454545454546)*t+.984375}function ss(t){return((t*=2)<=1?1-os(1-t):os(t-1)+1)/2}var cs=1.70158,us=function t(e){function n(t){return(t=+t)*t*(e*(t-1)+t)}return e=+e,n.overshoot=t,n}(cs),ls=function t(e){function n(t){return--t*t*((t+1)*e+t)+1}return e=+e,n.overshoot=t,n}(cs),hs=function t(e){function n(t){return((t*=2)<1?t*t*((e+1)*t-e):(t-=2)*t*((e+1)*t+e)+2)/2}return e=+e,n.overshoot=t,n}(cs),fs=2*Math.PI,ds=function t(e,n){var r=Math.asin(1/(e=Math.max(1,e)))*(n/=fs);function i(t){return e*Qo(- --t)*Math.sin((r-t)/n)}return i.amplitude=function(e){return t(e,n*fs)},i.period=function(n){return t(e,n)},i}(1,.3),ps=function t(e,n){var r=Math.asin(1/(e=Math.max(1,e)))*(n/=fs);function i(t){return 1-e*Qo(t=+t)*Math.sin((t+r)/n)}return i.amplitude=function(e){return t(e,n*fs)},i.period=function(n){return t(e,n)},i}(1,.3),gs=function t(e,n){var r=Math.asin(1/(e=Math.max(1,e)))*(n/=fs);function i(t){return((t=2*t-1)<0?e*Qo(-t)*Math.sin((r-t)/n):2-e*Qo(t)*Math.sin((r+t)/n))/2}return i.amplitude=function(e){return t(e,n*fs)},i.period=function(n){return t(e,n)},i}(1,.3);function ys(t){if(!t.ok)throw new Error(t.status+" "+t.statusText);return t.blob()}function ms(t,e){return fetch(t,e).then(ys)}function vs(t){if(!t.ok)throw new Error(t.status+" "+t.statusText);return t.arrayBuffer()}function bs(t,e){return fetch(t,e).then(vs)}function _s(t){if(!t.ok)throw new Error(t.status+" "+t.statusText);return t.text()}function xs(t,e){return fetch(t,e).then(_s)}function ws(t){return function(e,n,r){return 2===arguments.length&&"function"==typeof n&&(r=n,n=void 0),xs(e,n).then((function(e){return t(e,r)}))}}function ks(t,e,n,r){3===arguments.length&&"function"==typeof n&&(r=n,n=void 0);var i=_o(t);return xs(e,n).then((function(t){return i.parse(t,r)}))}var Ts=ws(wo),Cs=ws(No);function Es(t,e){return new Promise((function(n,r){var i=new Image;for(var a in e)i[a]=e[a];i.onerror=r,i.onload=function(){n(i)},i.src=t}))}function Ss(t){if(!t.ok)throw new Error(t.status+" "+t.statusText);if(204!==t.status&&205!==t.status)return t.json()}function As(t,e){return fetch(t,e).then(Ss)}function Ms(t){return function(e,n){return xs(e,n).then((function(e){return(new DOMParser).parseFromString(e,t)}))}}const Ns=Ms("application/xml");var Ds=Ms("text/html"),Bs=Ms("image/svg+xml");function Ls(t,e){var n;function r(){var r,i,a=n.length,o=0,s=0;for(r=0;r=(a=(g+m)/2))?g=a:m=a,(l=n>=(o=(y+v)/2))?y=o:v=o,i=d,!(d=d[h=l<<1|u]))return i[h]=p,t;if(s=+t._x.call(null,d.data),c=+t._y.call(null,d.data),e===s&&n===c)return p.next=d,i?i[h]=p:t._root=p,t;do{i=i?i[h]=new Array(4):t._root=new Array(4),(u=e>=(a=(g+m)/2))?g=a:m=a,(l=n>=(o=(y+v)/2))?y=o:v=o}while((h=l<<1|u)==(f=(c>=o)<<1|s>=a));return i[f]=d,i[h]=p,t}function Fs(t,e,n,r,i){this.node=t,this.x0=e,this.y0=n,this.x1=r,this.y1=i}function Ps(t){return t[0]}function Ys(t){return t[1]}function js(t,e,n){var r=new Us(null==e?Ps:e,null==n?Ys:n,NaN,NaN,NaN,NaN);return null==t?r:r.addAll(t)}function Us(t,e,n,r,i,a){this._x=t,this._y=e,this._x0=n,this._y0=r,this._x1=i,this._y1=a,this._root=void 0}function zs(t){for(var e={data:t.data},n=e;t=t.next;)n=n.next={data:t.data};return e}var $s=js.prototype=Us.prototype;function qs(t){return t.x+t.vx}function Hs(t){return t.y+t.vy}function Ws(t){var e,n,r=1,i=1;function a(){for(var t,a,s,c,u,l,h,f=e.length,d=0;dc+d||iu+d||as.index){var p=c-o.x-o.vx,g=u-o.y-o.vy,y=p*p+g*g;yt.r&&(t.r=t[e].r)}function s(){if(e){var r,i,a=e.length;for(n=new Array(a),r=0;rl&&(l=r),ih&&(h=i));if(c>l||u>h)return this;for(this.cover(c,u).cover(l,h),n=0;nt||t>=i||r>e||e>=a;)switch(s=(ef||(a=c.y0)>d||(o=c.x1)=m)<<1|t>=y)&&(c=p[p.length-1],p[p.length-1]=p[p.length-1-u],p[p.length-1-u]=c)}else{var v=t-+this._x.call(null,g.data),b=e-+this._y.call(null,g.data),_=v*v+b*b;if(_=(s=(p+y)/2))?p=s:y=s,(l=o>=(c=(g+m)/2))?g=c:m=c,e=d,!(d=d[h=l<<1|u]))return this;if(!d.length)break;(e[h+1&3]||e[h+2&3]||e[h+3&3])&&(n=e,f=h)}for(;d.data!==t;)if(r=d,!(d=d.next))return this;return(i=d.next)&&delete d.next,r?(i?r.next=i:delete r.next,this):e?(i?e[h]=i:delete e[h],(d=e[0]||e[1]||e[2]||e[3])&&d===(e[3]||e[2]||e[1]||e[0])&&!d.length&&(n?n[f]=d:this._root=d),this):(this._root=i,this)},$s.removeAll=function(t){for(var e=0,n=t.length;e1?(null==n?s.remove(t):s.set(t,d(n)),e):s.get(t)},find:function(e,n,r){var i,a,o,s,c,u=0,l=t.length;for(null==r?r=1/0:r*=r,u=0;u1?(u.on(t,n),e):u.on(t)}}}function tc(){var t,e,n,r,i=Os(-30),a=1,o=1/0,s=.81;function c(r){var i,a=t.length,o=js(t,Zs,Qs).visitAfter(l);for(n=r,i=0;i=o)){(t.data!==e||t.next)&&(0===l&&(d+=(l=Is())*l),0===h&&(d+=(h=Is())*h),d1?r[0]+r.slice(2):r,+t.slice(n+1)]}function ac(t){return(t=ic(Math.abs(t)))?t[1]:NaN}var oc,sc=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function cc(t){if(!(e=sc.exec(t)))throw new Error("invalid format: "+t);var e;return new uc({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}function uc(t){this.fill=void 0===t.fill?" ":t.fill+"",this.align=void 0===t.align?">":t.align+"",this.sign=void 0===t.sign?"-":t.sign+"",this.symbol=void 0===t.symbol?"":t.symbol+"",this.zero=!!t.zero,this.width=void 0===t.width?void 0:+t.width,this.comma=!!t.comma,this.precision=void 0===t.precision?void 0:+t.precision,this.trim=!!t.trim,this.type=void 0===t.type?"":t.type+""}function lc(t,e){var n=ic(t,e);if(!n)return t+"";var r=n[0],i=n[1];return i<0?"0."+new Array(-i).join("0")+r:r.length>i+1?r.slice(0,i+1)+"."+r.slice(i+1):r+new Array(i-r.length+2).join("0")}cc.prototype=uc.prototype,uc.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};const hc={"%":function(t,e){return(100*t).toFixed(e)},b:function(t){return Math.round(t).toString(2)},c:function(t){return t+""},d:function(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)},e:function(t,e){return t.toExponential(e)},f:function(t,e){return t.toFixed(e)},g:function(t,e){return t.toPrecision(e)},o:function(t){return Math.round(t).toString(8)},p:function(t,e){return lc(100*t,e)},r:lc,s:function(t,e){var n=ic(t,e);if(!n)return t+"";var r=n[0],i=n[1],a=i-(oc=3*Math.max(-8,Math.min(8,Math.floor(i/3))))+1,o=r.length;return a===o?r:a>o?r+new Array(a-o+1).join("0"):a>0?r.slice(0,a)+"."+r.slice(a):"0."+new Array(1-a).join("0")+ic(t,Math.max(0,e+a-1))[0]},X:function(t){return Math.round(t).toString(16).toUpperCase()},x:function(t){return Math.round(t).toString(16)}};function fc(t){return t}var dc,pc,gc,yc=Array.prototype.map,mc=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function vc(t){var e,n,r=void 0===t.grouping||void 0===t.thousands?fc:(e=yc.call(t.grouping,Number),n=t.thousands+"",function(t,r){for(var i=t.length,a=[],o=0,s=e[0],c=0;i>0&&s>0&&(c+s+1>r&&(s=Math.max(1,r-c)),a.push(t.substring(i-=s,i+s)),!((c+=s+1)>r));)s=e[o=(o+1)%e.length];return a.reverse().join(n)}),i=void 0===t.currency?"":t.currency[0]+"",a=void 0===t.currency?"":t.currency[1]+"",o=void 0===t.decimal?".":t.decimal+"",s=void 0===t.numerals?fc:function(t){return function(e){return e.replace(/[0-9]/g,(function(e){return t[+e]}))}}(yc.call(t.numerals,String)),c=void 0===t.percent?"%":t.percent+"",u=void 0===t.minus?"-":t.minus+"",l=void 0===t.nan?"NaN":t.nan+"";function h(t){var e=(t=cc(t)).fill,n=t.align,h=t.sign,f=t.symbol,d=t.zero,p=t.width,g=t.comma,y=t.precision,m=t.trim,v=t.type;"n"===v?(g=!0,v="g"):hc[v]||(void 0===y&&(y=12),m=!0,v="g"),(d||"0"===e&&"="===n)&&(d=!0,e="0",n="=");var b="$"===f?i:"#"===f&&/[boxX]/.test(v)?"0"+v.toLowerCase():"",_="$"===f?a:/[%p]/.test(v)?c:"",x=hc[v],w=/[defgprs%]/.test(v);function k(t){var i,a,c,f=b,k=_;if("c"===v)k=x(t)+k,t="";else{var T=(t=+t)<0||1/t<0;if(t=isNaN(t)?l:x(Math.abs(t),y),m&&(t=function(t){t:for(var e,n=t.length,r=1,i=-1;r0&&(i=0)}return i>0?t.slice(0,i)+t.slice(e+1):t}(t)),T&&0==+t&&"+"!==h&&(T=!1),f=(T?"("===h?h:u:"-"===h||"("===h?"":h)+f,k=("s"===v?mc[8+oc/3]:"")+k+(T&&"("===h?")":""),w)for(i=-1,a=t.length;++i(c=t.charCodeAt(i))||c>57){k=(46===c?o+t.slice(i+1):t.slice(i))+k,t=t.slice(0,i);break}}g&&!d&&(t=r(t,1/0));var C=f.length+t.length+k.length,E=C>1)+f+t+k+E.slice(C);break;default:t=E+f+t+k}return s(t)}return y=void 0===y?6:/[gprs]/.test(v)?Math.max(1,Math.min(21,y)):Math.max(0,Math.min(20,y)),k.toString=function(){return t+""},k}return{format:h,formatPrefix:function(t,e){var n=h(((t=cc(t)).type="f",t)),r=3*Math.max(-8,Math.min(8,Math.floor(ac(e)/3))),i=Math.pow(10,-r),a=mc[8+r/3];return function(t){return n(i*t)+a}}}}function bc(t){return dc=vc(t),pc=dc.format,gc=dc.formatPrefix,dc}function _c(t){return Math.max(0,-ac(Math.abs(t)))}function xc(t,e){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(ac(e)/3)))-ac(Math.abs(t)))}function wc(t,e){return t=Math.abs(t),e=Math.abs(e)-t,Math.max(0,ac(e)-ac(t))+1}function kc(){return new Tc}function Tc(){this.reset()}bc({decimal:".",thousands:",",grouping:[3],currency:["$",""],minus:"-"}),Tc.prototype={constructor:Tc,reset:function(){this.s=this.t=0},add:function(t){Ec(Cc,t,this.t),Ec(this,Cc.s,this.s),this.s?this.t+=Cc.t:this.s=Cc.t},valueOf:function(){return this.s}};var Cc=new Tc;function Ec(t,e,n){var r=t.s=e+n,i=r-e,a=r-i;t.t=e-a+(n-i)}var Sc=1e-6,Ac=1e-12,Mc=Math.PI,Nc=Mc/2,Dc=Mc/4,Bc=2*Mc,Lc=180/Mc,Oc=Mc/180,Ic=Math.abs,Rc=Math.atan,Fc=Math.atan2,Pc=Math.cos,Yc=Math.ceil,jc=Math.exp,Uc=(Math.floor,Math.log),zc=Math.pow,$c=Math.sin,qc=Math.sign||function(t){return t>0?1:t<0?-1:0},Hc=Math.sqrt,Wc=Math.tan;function Vc(t){return t>1?0:t<-1?Mc:Math.acos(t)}function Gc(t){return t>1?Nc:t<-1?-Nc:Math.asin(t)}function Xc(t){return(t=$c(t/2))*t}function Zc(){}function Qc(t,e){t&&Jc.hasOwnProperty(t.type)&&Jc[t.type](t,e)}var Kc={Feature:function(t,e){Qc(t.geometry,e)},FeatureCollection:function(t,e){for(var n=t.features,r=-1,i=n.length;++r=0?1:-1,i=r*n,a=Pc(e=(e*=Oc)/2+Dc),o=$c(e),s=su*o,c=ou*a+s*Pc(i),u=s*r*$c(i);cu.add(Fc(u,c)),au=t,ou=a,su=o}function gu(t){return uu.reset(),nu(t,lu),2*uu}function yu(t){return[Fc(t[1],t[0]),Gc(t[2])]}function mu(t){var e=t[0],n=t[1],r=Pc(n);return[r*Pc(e),r*$c(e),$c(n)]}function vu(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function bu(t,e){return[t[1]*e[2]-t[2]*e[1],t[2]*e[0]-t[0]*e[2],t[0]*e[1]-t[1]*e[0]]}function _u(t,e){t[0]+=e[0],t[1]+=e[1],t[2]+=e[2]}function xu(t,e){return[t[0]*e,t[1]*e,t[2]*e]}function wu(t){var e=Hc(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=e,t[1]/=e,t[2]/=e}var ku,Tu,Cu,Eu,Su,Au,Mu,Nu,Du,Bu,Lu,Ou,Iu,Ru,Fu,Pu,Yu,ju,Uu,zu,$u,qu,Hu,Wu,Vu,Gu,Xu=kc(),Zu={point:Qu,lineStart:Ju,lineEnd:tl,polygonStart:function(){Zu.point=el,Zu.lineStart=nl,Zu.lineEnd=rl,Xu.reset(),lu.polygonStart()},polygonEnd:function(){lu.polygonEnd(),Zu.point=Qu,Zu.lineStart=Ju,Zu.lineEnd=tl,cu<0?(ku=-(Cu=180),Tu=-(Eu=90)):Xu>Sc?Eu=90:Xu<-1e-6&&(Tu=-90),Bu[0]=ku,Bu[1]=Cu},sphere:function(){ku=-(Cu=180),Tu=-(Eu=90)}};function Qu(t,e){Du.push(Bu=[ku=t,Cu=t]),eEu&&(Eu=e)}function Ku(t,e){var n=mu([t*Oc,e*Oc]);if(Nu){var r=bu(Nu,n),i=bu([r[1],-r[0],0],r);wu(i),i=yu(i);var a,o=t-Su,s=o>0?1:-1,c=i[0]*Lc*s,u=Ic(o)>180;u^(s*SuEu&&(Eu=a):u^(s*Su<(c=(c+360)%360-180)&&cEu&&(Eu=e)),u?til(ku,Cu)&&(Cu=t):il(t,Cu)>il(ku,Cu)&&(ku=t):Cu>=ku?(tCu&&(Cu=t)):t>Su?il(ku,t)>il(ku,Cu)&&(Cu=t):il(t,Cu)>il(ku,Cu)&&(ku=t)}else Du.push(Bu=[ku=t,Cu=t]);eEu&&(Eu=e),Nu=n,Su=t}function Ju(){Zu.point=Ku}function tl(){Bu[0]=ku,Bu[1]=Cu,Zu.point=Qu,Nu=null}function el(t,e){if(Nu){var n=t-Su;Xu.add(Ic(n)>180?n+(n>0?360:-360):n)}else Au=t,Mu=e;lu.point(t,e),Ku(t,e)}function nl(){lu.lineStart()}function rl(){el(Au,Mu),lu.lineEnd(),Ic(Xu)>Sc&&(ku=-(Cu=180)),Bu[0]=ku,Bu[1]=Cu,Nu=null}function il(t,e){return(e-=t)<0?e+360:e}function al(t,e){return t[0]-e[0]}function ol(t,e){return t[0]<=t[1]?t[0]<=e&&e<=t[1]:eil(r[0],r[1])&&(r[1]=i[1]),il(i[0],r[1])>il(r[0],r[1])&&(r[0]=i[0])):a.push(r=i);for(o=-1/0,e=0,r=a[n=a.length-1];e<=n;r=i,++e)i=a[e],(s=il(r[1],i[0]))>o&&(o=s,ku=i[0],Cu=r[1])}return Du=Bu=null,ku===1/0||Tu===1/0?[[NaN,NaN],[NaN,NaN]]:[[ku,Tu],[Cu,Eu]]}var cl={sphere:Zc,point:ul,lineStart:hl,lineEnd:pl,polygonStart:function(){cl.lineStart=gl,cl.lineEnd=yl},polygonEnd:function(){cl.lineStart=hl,cl.lineEnd=pl}};function ul(t,e){t*=Oc;var n=Pc(e*=Oc);ll(n*Pc(t),n*$c(t),$c(e))}function ll(t,e,n){++Lu,Iu+=(t-Iu)/Lu,Ru+=(e-Ru)/Lu,Fu+=(n-Fu)/Lu}function hl(){cl.point=fl}function fl(t,e){t*=Oc;var n=Pc(e*=Oc);Wu=n*Pc(t),Vu=n*$c(t),Gu=$c(e),cl.point=dl,ll(Wu,Vu,Gu)}function dl(t,e){t*=Oc;var n=Pc(e*=Oc),r=n*Pc(t),i=n*$c(t),a=$c(e),o=Fc(Hc((o=Vu*a-Gu*i)*o+(o=Gu*r-Wu*a)*o+(o=Wu*i-Vu*r)*o),Wu*r+Vu*i+Gu*a);Ou+=o,Pu+=o*(Wu+(Wu=r)),Yu+=o*(Vu+(Vu=i)),ju+=o*(Gu+(Gu=a)),ll(Wu,Vu,Gu)}function pl(){cl.point=ul}function gl(){cl.point=ml}function yl(){vl(qu,Hu),cl.point=ul}function ml(t,e){qu=t,Hu=e,t*=Oc,e*=Oc,cl.point=vl;var n=Pc(e);Wu=n*Pc(t),Vu=n*$c(t),Gu=$c(e),ll(Wu,Vu,Gu)}function vl(t,e){t*=Oc;var n=Pc(e*=Oc),r=n*Pc(t),i=n*$c(t),a=$c(e),o=Vu*a-Gu*i,s=Gu*r-Wu*a,c=Wu*i-Vu*r,u=Hc(o*o+s*s+c*c),l=Gc(u),h=u&&-l/u;Uu+=h*o,zu+=h*s,$u+=h*c,Ou+=l,Pu+=l*(Wu+(Wu=r)),Yu+=l*(Vu+(Vu=i)),ju+=l*(Gu+(Gu=a)),ll(Wu,Vu,Gu)}function bl(t){Lu=Ou=Iu=Ru=Fu=Pu=Yu=ju=Uu=zu=$u=0,nu(t,cl);var e=Uu,n=zu,r=$u,i=e*e+n*n+r*r;return iMc?t+Math.round(-t/Bc)*Bc:t,e]}function kl(t,e,n){return(t%=Bc)?e||n?xl(Cl(t),El(e,n)):Cl(t):e||n?El(e,n):wl}function Tl(t){return function(e,n){return[(e+=t)>Mc?e-Bc:e<-Mc?e+Bc:e,n]}}function Cl(t){var e=Tl(t);return e.invert=Tl(-t),e}function El(t,e){var n=Pc(t),r=$c(t),i=Pc(e),a=$c(e);function o(t,e){var o=Pc(e),s=Pc(t)*o,c=$c(t)*o,u=$c(e),l=u*n+s*r;return[Fc(c*i-l*a,s*n-u*r),Gc(l*i+c*a)]}return o.invert=function(t,e){var o=Pc(e),s=Pc(t)*o,c=$c(t)*o,u=$c(e),l=u*i-c*a;return[Fc(c*i+u*a,s*n+l*r),Gc(l*n-s*r)]},o}function Sl(t){function e(e){return(e=t(e[0]*Oc,e[1]*Oc))[0]*=Lc,e[1]*=Lc,e}return t=kl(t[0]*Oc,t[1]*Oc,t.length>2?t[2]*Oc:0),e.invert=function(e){return(e=t.invert(e[0]*Oc,e[1]*Oc))[0]*=Lc,e[1]*=Lc,e},e}function Al(t,e,n,r,i,a){if(n){var o=Pc(e),s=$c(e),c=r*n;null==i?(i=e+r*Bc,a=e-c/2):(i=Ml(o,i),a=Ml(o,a),(r>0?ia)&&(i+=r*Bc));for(var u,l=i;r>0?l>a:l1&&e.push(e.pop().concat(e.shift()))},result:function(){var n=e;return e=[],t=null,n}}}function Bl(t,e){return Ic(t[0]-e[0])=0;--a)i.point((l=u[a])[0],l[1]);else r(f.x,f.p.x,-1,i);f=f.p}u=(f=f.o).z,d=!d}while(!f.v);i.lineEnd()}}}function Il(t){if(e=t.length){for(var e,n,r=0,i=t[0];++r=0?1:-1,C=T*k,E=C>Mc,S=g*x;if(Rl.add(Fc(S*T*$c(C),y*w+S*Pc(C))),o+=E?k+T*Bc:k,E^d>=n^b>=n){var A=bu(mu(f),mu(v));wu(A);var M=bu(a,A);wu(M);var N=(E^k>=0?-1:1)*Gc(M[2]);(r>N||r===N&&(A[0]||A[1]))&&(s+=E^k>=0?1:-1)}}return(o<-1e-6||o0){for(h||(i.polygonStart(),h=!0),i.lineStart(),t=0;t1&&2&c&&f.push(f.pop().concat(f.shift())),o.push(f.filter(jl))}return f}}function jl(t){return t.length>1}function Ul(t,e){return((t=t.x)[0]<0?t[1]-Nc-Sc:Nc-t[1])-((e=e.x)[0]<0?e[1]-Nc-Sc:Nc-e[1])}const zl=Yl((function(){return!0}),(function(t){var e,n=NaN,r=NaN,i=NaN;return{lineStart:function(){t.lineStart(),e=1},point:function(a,o){var s=a>0?Mc:-Mc,c=Ic(a-n);Ic(c-Mc)0?Nc:-Nc),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(s,r),t.point(a,r),e=0):i!==s&&c>=Mc&&(Ic(n-i)Sc?Rc(($c(e)*(a=Pc(r))*$c(n)-$c(r)*(i=Pc(e))*$c(t))/(i*a*o)):(e+r)/2}(n,r,a,o),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(s,r),e=0),t.point(n=a,r=o),i=s},lineEnd:function(){t.lineEnd(),n=r=NaN},clean:function(){return 2-e}}}),(function(t,e,n,r){var i;if(null==t)i=n*Nc,r.point(-Mc,i),r.point(0,i),r.point(Mc,i),r.point(Mc,0),r.point(Mc,-i),r.point(0,-i),r.point(-Mc,-i),r.point(-Mc,0),r.point(-Mc,i);else if(Ic(t[0]-e[0])>Sc){var a=t[0]0,i=Ic(e)>Sc;function a(t,n){return Pc(t)*Pc(n)>e}function o(t,n,r){var i=[1,0,0],a=bu(mu(t),mu(n)),o=vu(a,a),s=a[0],c=o-s*s;if(!c)return!r&&t;var u=e*o/c,l=-e*s/c,h=bu(i,a),f=xu(i,u);_u(f,xu(a,l));var d=h,p=vu(f,d),g=vu(d,d),y=p*p-g*(vu(f,f)-1);if(!(y<0)){var m=Hc(y),v=xu(d,(-p-m)/g);if(_u(v,f),v=yu(v),!r)return v;var b,_=t[0],x=n[0],w=t[1],k=n[1];x<_&&(b=_,_=x,x=b);var T=x-_,C=Ic(T-Mc)0^v[1]<(Ic(v[0]-_)Mc^(_<=v[0]&&v[0]<=x)){var E=xu(d,(-p+m)/g);return _u(E,f),[v,yu(E)]}}}function s(e,n){var i=r?t:Mc-t,a=0;return e<-i?a|=1:e>i&&(a|=2),n<-i?a|=4:n>i&&(a|=8),a}return Yl(a,(function(t){var e,n,c,u,l;return{lineStart:function(){u=c=!1,l=1},point:function(h,f){var d,p=[h,f],g=a(h,f),y=r?g?0:s(h,f):g?s(h+(h<0?Mc:-Mc),f):0;if(!e&&(u=c=g)&&t.lineStart(),g!==c&&(!(d=o(e,p))||Bl(e,d)||Bl(p,d))&&(p[2]=1),g!==c)l=0,g?(t.lineStart(),d=o(p,e),t.point(d[0],d[1])):(d=o(e,p),t.point(d[0],d[1],2),t.lineEnd()),e=d;else if(i&&e&&r^g){var m;y&n||!(m=o(p,e,!0))||(l=0,r?(t.lineStart(),t.point(m[0][0],m[0][1]),t.point(m[1][0],m[1][1]),t.lineEnd()):(t.point(m[1][0],m[1][1]),t.lineEnd(),t.lineStart(),t.point(m[0][0],m[0][1],3)))}!g||e&&Bl(e,p)||t.point(p[0],p[1]),e=p,c=g,n=y},lineEnd:function(){c&&t.lineEnd(),e=null},clean:function(){return l|(u&&c)<<1}}}),(function(e,r,i,a){Al(a,t,n,i,e,r)}),r?[0,-t]:[-Mc,t-Mc])}var ql=1e9,Hl=-ql;function Wl(t,e,n,r){function i(i,a){return t<=i&&i<=n&&e<=a&&a<=r}function a(i,a,s,u){var l=0,h=0;if(null==i||(l=o(i,s))!==(h=o(a,s))||c(i,a)<0^s>0)do{u.point(0===l||3===l?t:n,l>1?r:e)}while((l=(l+s+4)%4)!==h);else u.point(a[0],a[1])}function o(r,i){return Ic(r[0]-t)0?0:3:Ic(r[0]-n)0?2:1:Ic(r[1]-e)0?1:0:i>0?3:2}function s(t,e){return c(t.x,e.x)}function c(t,e){var n=o(t,1),r=o(e,1);return n!==r?n-r:0===n?e[1]-t[1]:1===n?t[0]-e[0]:2===n?t[1]-e[1]:e[0]-t[0]}return function(o){var c,u,l,h,f,d,p,g,y,m,v,b=o,_=Dl(),x={point:w,lineStart:function(){x.point=k,u&&u.push(l=[]),m=!0,y=!1,p=g=NaN},lineEnd:function(){c&&(k(h,f),d&&y&&_.rejoin(),c.push(_.result())),x.point=w,y&&b.lineEnd()},polygonStart:function(){b=_,c=[],u=[],v=!0},polygonEnd:function(){var e=function(){for(var e=0,n=0,i=u.length;nr&&(f-a)*(r-o)>(d-o)*(t-a)&&++e:d<=r&&(f-a)*(r-o)<(d-o)*(t-a)&&--e;return e}(),n=v&&e,i=(c=P(c)).length;(n||i)&&(o.polygonStart(),n&&(o.lineStart(),a(null,null,1,o),o.lineEnd()),i&&Ol(c,s,e,a,o),o.polygonEnd()),b=o,c=u=l=null}};function w(t,e){i(t,e)&&b.point(t,e)}function k(a,o){var s=i(a,o);if(u&&l.push([a,o]),m)h=a,f=o,d=s,m=!1,s&&(b.lineStart(),b.point(a,o));else if(s&&y)b.point(a,o);else{var c=[p=Math.max(Hl,Math.min(ql,p)),g=Math.max(Hl,Math.min(ql,g))],_=[a=Math.max(Hl,Math.min(ql,a)),o=Math.max(Hl,Math.min(ql,o))];!function(t,e,n,r,i,a){var o,s=t[0],c=t[1],u=0,l=1,h=e[0]-s,f=e[1]-c;if(o=n-s,h||!(o>0)){if(o/=h,h<0){if(o0){if(o>l)return;o>u&&(u=o)}if(o=i-s,h||!(o<0)){if(o/=h,h<0){if(o>l)return;o>u&&(u=o)}else if(h>0){if(o0)){if(o/=f,f<0){if(o0){if(o>l)return;o>u&&(u=o)}if(o=a-c,f||!(o<0)){if(o/=f,f<0){if(o>l)return;o>u&&(u=o)}else if(f>0){if(o0&&(t[0]=s+u*h,t[1]=c+u*f),l<1&&(e[0]=s+l*h,e[1]=c+l*f),!0}}}}}(c,_,t,e,n,r)?s&&(b.lineStart(),b.point(a,o),v=!1):(y||(b.lineStart(),b.point(c[0],c[1])),b.point(_[0],_[1]),s||b.lineEnd(),v=!1)}p=a,g=o,y=s}return x}}function Vl(){var t,e,n,r=0,i=0,a=960,o=500;return n={stream:function(n){return t&&e===n?t:t=Wl(r,i,a,o)(e=n)},extent:function(s){return arguments.length?(r=+s[0][0],i=+s[0][1],a=+s[1][0],o=+s[1][1],t=e=null,n):[[r,i],[a,o]]}}}var Gl,Xl,Zl,Ql=kc(),Kl={sphere:Zc,point:Zc,lineStart:function(){Kl.point=th,Kl.lineEnd=Jl},lineEnd:Zc,polygonStart:Zc,polygonEnd:Zc};function Jl(){Kl.point=Kl.lineEnd=Zc}function th(t,e){Gl=t*=Oc,Xl=$c(e*=Oc),Zl=Pc(e),Kl.point=eh}function eh(t,e){t*=Oc;var n=$c(e*=Oc),r=Pc(e),i=Ic(t-Gl),a=Pc(i),o=r*$c(i),s=Zl*n-Xl*r*a,c=Xl*n+Zl*r*a;Ql.add(Fc(Hc(o*o+s*s),c)),Gl=t,Xl=n,Zl=r}function nh(t){return Ql.reset(),nu(t,Kl),+Ql}var rh=[null,null],ih={type:"LineString",coordinates:rh};function ah(t,e){return rh[0]=t,rh[1]=e,nh(ih)}var oh={Feature:function(t,e){return ch(t.geometry,e)},FeatureCollection:function(t,e){for(var n=t.features,r=-1,i=n.length;++r0&&(i=ah(t[a],t[a-1]))>0&&n<=i&&r<=i&&(n+r-i)*(1-Math.pow((n-r)/i,2))Sc})).map(c)).concat(k(Yc(a/d)*d,i,d).filter((function(t){return Ic(t%g)>Sc})).map(u))}return m.lines=function(){return v().map((function(t){return{type:"LineString",coordinates:t}}))},m.outline=function(){return{type:"Polygon",coordinates:[l(r).concat(h(o).slice(1),l(n).reverse().slice(1),h(s).reverse().slice(1))]}},m.extent=function(t){return arguments.length?m.extentMajor(t).extentMinor(t):m.extentMinor()},m.extentMajor=function(t){return arguments.length?(r=+t[0][0],n=+t[1][0],s=+t[0][1],o=+t[1][1],r>n&&(t=r,r=n,n=t),s>o&&(t=s,s=o,o=t),m.precision(y)):[[r,s],[n,o]]},m.extentMinor=function(n){return arguments.length?(e=+n[0][0],t=+n[1][0],a=+n[0][1],i=+n[1][1],e>t&&(n=e,e=t,t=n),a>i&&(n=a,a=i,i=n),m.precision(y)):[[e,a],[t,i]]},m.step=function(t){return arguments.length?m.stepMajor(t).stepMinor(t):m.stepMinor()},m.stepMajor=function(t){return arguments.length?(p=+t[0],g=+t[1],m):[p,g]},m.stepMinor=function(t){return arguments.length?(f=+t[0],d=+t[1],m):[f,d]},m.precision=function(f){return arguments.length?(y=+f,c=gh(a,i,90),u=yh(e,t,y),l=gh(s,o,90),h=yh(r,n,y),m):y},m.extentMajor([[-180,-89.999999],[180,89.999999]]).extentMinor([[-180,-80.000001],[180,80.000001]])}function vh(){return mh()()}function bh(t,e){var n=t[0]*Oc,r=t[1]*Oc,i=e[0]*Oc,a=e[1]*Oc,o=Pc(r),s=$c(r),c=Pc(a),u=$c(a),l=o*Pc(n),h=o*$c(n),f=c*Pc(i),d=c*$c(i),p=2*Gc(Hc(Xc(a-r)+o*c*Xc(i-n))),g=$c(p),y=p?function(t){var e=$c(t*=p)/g,n=$c(p-t)/g,r=n*l+e*f,i=n*h+e*d,a=n*s+e*u;return[Fc(i,r)*Lc,Fc(a,Hc(r*r+i*i))*Lc]}:function(){return[n*Lc,r*Lc]};return y.distance=p,y}function _h(t){return t}var xh,wh,kh,Th,Ch=kc(),Eh=kc(),Sh={point:Zc,lineStart:Zc,lineEnd:Zc,polygonStart:function(){Sh.lineStart=Ah,Sh.lineEnd=Dh},polygonEnd:function(){Sh.lineStart=Sh.lineEnd=Sh.point=Zc,Ch.add(Ic(Eh)),Eh.reset()},result:function(){var t=Ch/2;return Ch.reset(),t}};function Ah(){Sh.point=Mh}function Mh(t,e){Sh.point=Nh,xh=kh=t,wh=Th=e}function Nh(t,e){Eh.add(Th*t-kh*e),kh=t,Th=e}function Dh(){Nh(xh,wh)}const Bh=Sh;var Lh=1/0,Oh=Lh,Ih=-Lh,Rh=Ih,Fh={point:function(t,e){tIh&&(Ih=t),eRh&&(Rh=e)},lineStart:Zc,lineEnd:Zc,polygonStart:Zc,polygonEnd:Zc,result:function(){var t=[[Lh,Oh],[Ih,Rh]];return Ih=Rh=-(Oh=Lh=1/0),t}};const Ph=Fh;var Yh,jh,Uh,zh,$h=0,qh=0,Hh=0,Wh=0,Vh=0,Gh=0,Xh=0,Zh=0,Qh=0,Kh={point:Jh,lineStart:tf,lineEnd:rf,polygonStart:function(){Kh.lineStart=af,Kh.lineEnd=of},polygonEnd:function(){Kh.point=Jh,Kh.lineStart=tf,Kh.lineEnd=rf},result:function(){var t=Qh?[Xh/Qh,Zh/Qh]:Gh?[Wh/Gh,Vh/Gh]:Hh?[$h/Hh,qh/Hh]:[NaN,NaN];return $h=qh=Hh=Wh=Vh=Gh=Xh=Zh=Qh=0,t}};function Jh(t,e){$h+=t,qh+=e,++Hh}function tf(){Kh.point=ef}function ef(t,e){Kh.point=nf,Jh(Uh=t,zh=e)}function nf(t,e){var n=t-Uh,r=e-zh,i=Hc(n*n+r*r);Wh+=i*(Uh+t)/2,Vh+=i*(zh+e)/2,Gh+=i,Jh(Uh=t,zh=e)}function rf(){Kh.point=Jh}function af(){Kh.point=sf}function of(){cf(Yh,jh)}function sf(t,e){Kh.point=cf,Jh(Yh=Uh=t,jh=zh=e)}function cf(t,e){var n=t-Uh,r=e-zh,i=Hc(n*n+r*r);Wh+=i*(Uh+t)/2,Vh+=i*(zh+e)/2,Gh+=i,Xh+=(i=zh*t-Uh*e)*(Uh+t),Zh+=i*(zh+e),Qh+=3*i,Jh(Uh=t,zh=e)}const uf=Kh;function lf(t){this._context=t}lf.prototype={_radius:4.5,pointRadius:function(t){return this._radius=t,this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._context.closePath(),this._point=NaN},point:function(t,e){switch(this._point){case 0:this._context.moveTo(t,e),this._point=1;break;case 1:this._context.lineTo(t,e);break;default:this._context.moveTo(t+this._radius,e),this._context.arc(t,e,this._radius,0,Bc)}},result:Zc};var hf,ff,df,pf,gf,yf=kc(),mf={point:Zc,lineStart:function(){mf.point=vf},lineEnd:function(){hf&&bf(ff,df),mf.point=Zc},polygonStart:function(){hf=!0},polygonEnd:function(){hf=null},result:function(){var t=+yf;return yf.reset(),t}};function vf(t,e){mf.point=bf,ff=pf=t,df=gf=e}function bf(t,e){pf-=t,gf-=e,yf.add(Hc(pf*pf+gf*gf)),pf=t,gf=e}const _f=mf;function xf(){this._string=[]}function wf(t){return"m0,"+t+"a"+t+","+t+" 0 1,1 0,"+-2*t+"a"+t+","+t+" 0 1,1 0,"+2*t+"z"}function kf(t,e){var n,r,i=4.5;function a(t){return t&&("function"==typeof i&&r.pointRadius(+i.apply(this,arguments)),nu(t,n(r))),r.result()}return a.area=function(t){return nu(t,n(Bh)),Bh.result()},a.measure=function(t){return nu(t,n(_f)),_f.result()},a.bounds=function(t){return nu(t,n(Ph)),Ph.result()},a.centroid=function(t){return nu(t,n(uf)),uf.result()},a.projection=function(e){return arguments.length?(n=null==e?(t=null,_h):(t=e).stream,a):t},a.context=function(t){return arguments.length?(r=null==t?(e=null,new xf):new lf(e=t),"function"!=typeof i&&r.pointRadius(i),a):e},a.pointRadius=function(t){return arguments.length?(i="function"==typeof t?t:(r.pointRadius(+t),+t),a):i},a.projection(t).context(e)}function Tf(t){return{stream:Cf(t)}}function Cf(t){return function(e){var n=new Ef;for(var r in t)n[r]=t[r];return n.stream=e,n}}function Ef(){}function Sf(t,e,n){var r=t.clipExtent&&t.clipExtent();return t.scale(150).translate([0,0]),null!=r&&t.clipExtent(null),nu(n,t.stream(Ph)),e(Ph.result()),null!=r&&t.clipExtent(r),t}function Af(t,e,n){return Sf(t,(function(n){var r=e[1][0]-e[0][0],i=e[1][1]-e[0][1],a=Math.min(r/(n[1][0]-n[0][0]),i/(n[1][1]-n[0][1])),o=+e[0][0]+(r-a*(n[1][0]+n[0][0]))/2,s=+e[0][1]+(i-a*(n[1][1]+n[0][1]))/2;t.scale(150*a).translate([o,s])}),n)}function Mf(t,e,n){return Af(t,[[0,0],e],n)}function Nf(t,e,n){return Sf(t,(function(n){var r=+e,i=r/(n[1][0]-n[0][0]),a=(r-i*(n[1][0]+n[0][0]))/2,o=-i*n[0][1];t.scale(150*i).translate([a,o])}),n)}function Df(t,e,n){return Sf(t,(function(n){var r=+e,i=r/(n[1][1]-n[0][1]),a=-i*n[0][0],o=(r-i*(n[1][1]+n[0][1]))/2;t.scale(150*i).translate([a,o])}),n)}xf.prototype={_radius:4.5,_circle:wf(4.5),pointRadius:function(t){return(t=+t)!==this._radius&&(this._radius=t,this._circle=null),this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._string.push("Z"),this._point=NaN},point:function(t,e){switch(this._point){case 0:this._string.push("M",t,",",e),this._point=1;break;case 1:this._string.push("L",t,",",e);break;default:null==this._circle&&(this._circle=wf(this._radius)),this._string.push("M",t,",",e,this._circle)}},result:function(){if(this._string.length){var t=this._string.join("");return this._string=[],t}return null}},Ef.prototype={constructor:Ef,point:function(t,e){this.stream.point(t,e)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}};var Bf=Pc(30*Oc);function Lf(t,e){return+e?function(t,e){function n(r,i,a,o,s,c,u,l,h,f,d,p,g,y){var m=u-r,v=l-i,b=m*m+v*v;if(b>4*e&&g--){var _=o+f,x=s+d,w=c+p,k=Hc(_*_+x*x+w*w),T=Gc(w/=k),C=Ic(Ic(w)-1)e||Ic((m*M+v*N)/b-.5)>.3||o*f+s*d+c*p2?t[2]%360*Oc:0,M()):[y*Lc,m*Lc,v*Lc]},S.angle=function(t){return arguments.length?(b=t%360*Oc,M()):b*Lc},S.reflectX=function(t){return arguments.length?(_=t?-1:1,M()):_<0},S.reflectY=function(t){return arguments.length?(x=t?-1:1,M()):x<0},S.precision=function(t){return arguments.length?(o=Lf(s,E=t*t),N()):Hc(E)},S.fitExtent=function(t,e){return Af(S,t,e)},S.fitSize=function(t,e){return Mf(S,t,e)},S.fitWidth=function(t,e){return Nf(S,t,e)},S.fitHeight=function(t,e){return Df(S,t,e)},function(){return e=t.apply(this,arguments),S.invert=e.invert&&A,M()}}function Yf(t){var e=0,n=Mc/3,r=Pf(t),i=r(e,n);return i.parallels=function(t){return arguments.length?r(e=t[0]*Oc,n=t[1]*Oc):[e*Lc,n*Lc]},i}function jf(t,e){var n=$c(t),r=(n+$c(e))/2;if(Ic(r)=.12&&i<.234&&r>=-.425&&r<-.214?s:i>=.166&&i<.234&&r>=-.214&&r<-.115?c:o).invert(t)},l.stream=function(n){return t&&e===n?t:(r=[o.stream(e=n),s.stream(n),c.stream(n)],i=r.length,t={point:function(t,e){for(var n=-1;++n0?e<-Nc+Sc&&(e=-Nc+Sc):e>Nc-Sc&&(e=Nc-Sc);var n=i/zc(Jf(e),r);return[n*$c(r*t),i-n*Pc(r*t)]}return a.invert=function(t,e){var n=i-e,a=qc(r)*Hc(t*t+n*n),o=Fc(t,Ic(n))*qc(n);return n*r<0&&(o-=Mc*qc(t)*qc(n)),[o/r,2*Rc(zc(i/a,1/r))-Nc]},a}function ed(){return Yf(td).scale(109.5).parallels([30,30])}function nd(t,e){return[t,e]}function rd(){return Ff(nd).scale(152.63)}function id(t,e){var n=Pc(t),r=t===e?$c(t):(n-Pc(e))/(e-t),i=n/r+t;if(Ic(r)2?t[2]+90:90]):[(t=n())[0],t[1],t[2]-90]},n([0,0,90]).scale(159.155)}function Td(t,e){return t.parent===e.parent?1:2}function Cd(t,e){return t+e.x}function Ed(t,e){return Math.max(t,e.y)}function Sd(){var t=Td,e=1,n=1,r=!1;function i(i){var a,o=0;i.eachAfter((function(e){var n=e.children;n?(e.x=function(t){return t.reduce(Cd,0)/t.length}(n),e.y=function(t){return 1+t.reduce(Ed,0)}(n)):(e.x=a?o+=t(e,a):0,e.y=0,a=e)}));var s=function(t){for(var e;e=t.children;)t=e[0];return t}(i),c=function(t){for(var e;e=t.children;)t=e[e.length-1];return t}(i),u=s.x-t(s,c)/2,l=c.x+t(c,s)/2;return i.eachAfter(r?function(t){t.x=(t.x-i.x)*e,t.y=(i.y-t.y)*n}:function(t){t.x=(t.x-u)/(l-u)*e,t.y=(1-(i.y?t.y/i.y:1))*n})}return i.separation=function(e){return arguments.length?(t=e,i):t},i.size=function(t){return arguments.length?(r=!1,e=+t[0],n=+t[1],i):r?null:[e,n]},i.nodeSize=function(t){return arguments.length?(r=!0,e=+t[0],n=+t[1],i):r?[e,n]:null},i}function Ad(t){var e=0,n=t.children,r=n&&n.length;if(r)for(;--r>=0;)e+=n[r].value;else e=1;t.value=e}function Md(t,e){var n,r,i,a,o,s=new Ld(t),c=+t.value&&(s.value=t.value),u=[s];for(null==e&&(e=Nd);n=u.pop();)if(c&&(n.value=+n.data.value),(i=e(n.data))&&(o=i.length))for(n.children=new Array(o),a=o-1;a>=0;--a)u.push(r=n.children[a]=new Ld(i[a])),r.parent=n,r.depth=n.depth+1;return s.eachBefore(Bd)}function Nd(t){return t.children}function Dd(t){t.data=t.data.data}function Bd(t){var e=0;do{t.height=e}while((t=t.parent)&&t.height<++e)}function Ld(t){this.data=t,this.depth=this.height=0,this.parent=null}hd.invert=function(t,e){for(var n,r=e,i=r*r,a=i*i*i,o=0;o<12&&(a=(i=(r-=n=(r*(od+sd*i+a*(cd+ud*i))-e)/(od+3*sd*i+a*(7*cd+9*ud*i)))*r)*i*i,!(Ic(n)Sc&&--i>0);return[t/(.8707+(a=r*r)*(a*(a*a*a*(.003971-.001529*a)-.013791)-.131979)),r]},vd.invert=Hf(Gc),_d.invert=Hf((function(t){return 2*Rc(t)})),wd.invert=function(t,e){return[-e,2*Rc(jc(t))-Nc]},Ld.prototype=Md.prototype={constructor:Ld,count:function(){return this.eachAfter(Ad)},each:function(t){var e,n,r,i,a=this,o=[a];do{for(e=o.reverse(),o=[];a=e.pop();)if(t(a),n=a.children)for(r=0,i=n.length;r=0;--n)i.push(e[n]);return this},sum:function(t){return this.eachAfter((function(e){for(var n=+t(e.data)||0,r=e.children,i=r&&r.length;--i>=0;)n+=r[i].value;e.value=n}))},sort:function(t){return this.eachBefore((function(e){e.children&&e.children.sort(t)}))},path:function(t){for(var e=this,n=function(t,e){if(t===e)return t;var n=t.ancestors(),r=e.ancestors(),i=null;for(t=n.pop(),e=r.pop();t===e;)i=t,t=n.pop(),e=r.pop();return i}(e,t),r=[e];e!==n;)e=e.parent,r.push(e);for(var i=r.length;t!==n;)r.splice(i,0,t),t=t.parent;return r},ancestors:function(){for(var t=this,e=[t];t=t.parent;)e.push(t);return e},descendants:function(){var t=[];return this.each((function(e){t.push(e)})),t},leaves:function(){var t=[];return this.eachBefore((function(e){e.children||t.push(e)})),t},links:function(){var t=this,e=[];return t.each((function(n){n!==t&&e.push({source:n.parent,target:n})})),e},copy:function(){return Md(this).eachBefore(Dd)}};var Od=Array.prototype.slice;function Id(t){for(var e,n,r=0,i=(t=function(t){for(var e,n,r=t.length;r;)n=Math.random()*r--|0,e=t[r],t[r]=t[n],t[n]=e;return t}(Od.call(t))).length,a=[];r0&&n*n>r*r+i*i}function Yd(t,e){for(var n=0;n(o*=o)?(r=(u+o-i)/(2*u),a=Math.sqrt(Math.max(0,o/u-r*r)),n.x=t.x-r*s-a*c,n.y=t.y-r*c+a*s):(r=(u+i-o)/(2*u),a=Math.sqrt(Math.max(0,i/u-r*r)),n.x=e.x+r*s-a*c,n.y=e.y+r*c+a*s)):(n.x=e.x+n.r,n.y=e.y)}function qd(t,e){var n=t.r+e.r-1e-6,r=e.x-t.x,i=e.y-t.y;return n>0&&n*n>r*r+i*i}function Hd(t){var e=t._,n=t.next._,r=e.r+n.r,i=(e.x*n.r+n.x*e.r)/r,a=(e.y*n.r+n.y*e.r)/r;return i*i+a*a}function Wd(t){this._=t,this.next=null,this.previous=null}function Vd(t){if(!(i=t.length))return 0;var e,n,r,i,a,o,s,c,u,l,h;if((e=t[0]).x=0,e.y=0,!(i>1))return e.r;if(n=t[1],e.x=-n.r,n.x=e.r,n.y=0,!(i>2))return e.r+n.r;$d(n,e,r=t[2]),e=new Wd(e),n=new Wd(n),r=new Wd(r),e.next=r.previous=n,n.next=e.previous=r,r.next=n.previous=e;t:for(s=3;s0)throw new Error("cycle");return a}return n.id=function(e){return arguments.length?(t=Zd(e),n):t},n.parentId=function(t){return arguments.length?(e=Zd(t),n):e},n}function fp(t,e){return t.parent===e.parent?1:2}function dp(t){var e=t.children;return e?e[0]:t.t}function pp(t){var e=t.children;return e?e[e.length-1]:t.t}function gp(t,e,n){var r=n/(e.i-t.i);e.c-=r,e.s+=n,t.c+=r,e.z+=n,e.m+=n}function yp(t,e,n){return t.a.parent===e.parent?t.a:n}function mp(t,e){this._=t,this.parent=null,this.children=null,this.A=null,this.a=this,this.z=0,this.m=0,this.c=0,this.s=0,this.t=null,this.i=e}function vp(){var t=fp,e=1,n=1,r=null;function i(i){var c=function(t){for(var e,n,r,i,a,o=new mp(t,0),s=[o];e=s.pop();)if(r=e._.children)for(e.children=new Array(a=r.length),i=a-1;i>=0;--i)s.push(n=e.children[i]=new mp(r[i],i)),n.parent=e;return(o.parent=new mp(null,0)).children=[o],o}(i);if(c.eachAfter(a),c.parent.m=-c.z,c.eachBefore(o),r)i.eachBefore(s);else{var u=i,l=i,h=i;i.eachBefore((function(t){t.xl.x&&(l=t),t.depth>h.depth&&(h=t)}));var f=u===l?1:t(u,l)/2,d=f-u.x,p=e/(l.x+f+d),g=n/(h.depth||1);i.eachBefore((function(t){t.x=(t.x+d)*p,t.y=t.depth*g}))}return i}function a(e){var n=e.children,r=e.parent.children,i=e.i?r[e.i-1]:null;if(n){!function(t){for(var e,n=0,r=0,i=t.children,a=i.length;--a>=0;)(e=i[a]).z+=n,e.m+=n,n+=e.s+(r+=e.c)}(e);var a=(n[0].z+n[n.length-1].z)/2;i?(e.z=i.z+t(e._,i._),e.m=e.z-a):e.z=a}else i&&(e.z=i.z+t(e._,i._));e.parent.A=function(e,n,r){if(n){for(var i,a=e,o=e,s=n,c=a.parent.children[0],u=a.m,l=o.m,h=s.m,f=c.m;s=pp(s),a=dp(a),s&&a;)c=dp(c),(o=pp(o)).a=e,(i=s.z+h-a.z-u+t(s._,a._))>0&&(gp(yp(s,e,r),e,i),u+=i,l+=i),h+=s.m,u+=a.m,f+=c.m,l+=o.m;s&&!pp(o)&&(o.t=s,o.m+=h-l),a&&!dp(c)&&(c.t=a,c.m+=u-f,r=e)}return r}(e,i,e.parent.A||r[0])}function o(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}function s(t){t.x*=e,t.y=t.depth*n}return i.separation=function(e){return arguments.length?(t=e,i):t},i.size=function(t){return arguments.length?(r=!1,e=+t[0],n=+t[1],i):r?null:[e,n]},i.nodeSize=function(t){return arguments.length?(r=!0,e=+t[0],n=+t[1],i):r?[e,n]:null},i}function bp(t,e,n,r,i){for(var a,o=t.children,s=-1,c=o.length,u=t.value&&(i-n)/t.value;++sf&&(f=s),y=l*l*g,(d=Math.max(f/y,y/h))>p){l-=s;break}p=d}m.push(o={value:l,dice:c1?e:1)},n}(_p);function kp(){var t=wp,e=!1,n=1,r=1,i=[0],a=Qd,o=Qd,s=Qd,c=Qd,u=Qd;function l(t){return t.x0=t.y0=0,t.x1=n,t.y1=r,t.eachBefore(h),i=[0],e&&t.eachBefore(ip),t}function h(e){var n=i[e.depth],r=e.x0+n,l=e.y0+n,h=e.x1-n,f=e.y1-n;h=n-1){var l=s[e];return l.x0=i,l.y0=a,l.x1=o,void(l.y1=c)}for(var h=u[e],f=r/2+h,d=e+1,p=n-1;d>>1;u[g]c-a){var v=(i*m+o*y)/r;t(e,d,y,i,a,v,c),t(d,n,m,v,a,o,c)}else{var b=(a*m+c*y)/r;t(e,d,y,i,a,o,b),t(d,n,m,i,b,o,c)}}(0,c,t.value,e,n,r,i)}function Cp(t,e,n,r,i){(1&t.depth?bp:ap)(t,e,n,r,i)}const Ep=function t(e){function n(t,n,r,i,a){if((o=t._squarify)&&o.ratio===e)for(var o,s,c,u,l,h=-1,f=o.length,d=t.value;++h1?e:1)},n}(_p);function Sp(t){var e=t.length;return function(n){return t[Math.max(0,Math.min(e-1,Math.floor(n*e)))]}}function Ap(t,e){var n=dn(+t,+e);return function(t){var e=n(t);return e-360*Math.floor(e/360)}}function Mp(t,e){return t=+t,e=+e,function(n){return Math.round(t*(1-n)+e*n)}}var Np=Math.SQRT2;function Dp(t){return((t=Math.exp(t))+1/t)/2}function Bp(t,e){var n,r,i=t[0],a=t[1],o=t[2],s=e[0],c=e[1],u=e[2],l=s-i,h=c-a,f=l*l+h*h;if(f<1e-12)r=Math.log(u/o)/Np,n=function(t){return[i+t*l,a+t*h,o*Math.exp(Np*t*r)]};else{var d=Math.sqrt(f),p=(u*u-o*o+4*f)/(2*o*2*d),g=(u*u-o*o-4*f)/(2*u*2*d),y=Math.log(Math.sqrt(p*p+1)-p),m=Math.log(Math.sqrt(g*g+1)-g);r=(m-y)/Np,n=function(t){var e,n=t*r,s=Dp(y),c=o/(2*d)*(s*(e=Np*n+y,((e=Math.exp(2*e))-1)/(e+1))-function(t){return((t=Math.exp(t))-1/t)/2}(y));return[i+c*l,a+c*h,o*s/Dp(Np*n+y)]}}return n.duration=1e3*r,n}function Lp(t){return function(e,n){var r=t((e=an(e)).h,(n=an(n)).h),i=pn(e.s,n.s),a=pn(e.l,n.l),o=pn(e.opacity,n.opacity);return function(t){return e.h=r(t),e.s=i(t),e.l=a(t),e.opacity=o(t),e+""}}}const Op=Lp(dn);var Ip=Lp(pn);function Rp(t,e){var n=pn((t=Ta(t)).l,(e=Ta(e)).l),r=pn(t.a,e.a),i=pn(t.b,e.b),a=pn(t.opacity,e.opacity);return function(e){return t.l=n(e),t.a=r(e),t.b=i(e),t.opacity=a(e),t+""}}function Fp(t){return function(e,n){var r=t((e=Ba(e)).h,(n=Ba(n)).h),i=pn(e.c,n.c),a=pn(e.l,n.l),o=pn(e.opacity,n.opacity);return function(t){return e.h=r(t),e.c=i(t),e.l=a(t),e.opacity=o(t),e+""}}}const Pp=Fp(dn);var Yp=Fp(pn);function jp(t){return function e(n){function r(e,r){var i=t((e=qa(e)).h,(r=qa(r)).h),a=pn(e.s,r.s),o=pn(e.l,r.l),s=pn(e.opacity,r.opacity);return function(t){return e.h=i(t),e.s=a(t),e.l=o(Math.pow(t,n)),e.opacity=s(t),e+""}}return n=+n,r.gamma=e,r}(1)}const Up=jp(dn);var zp=jp(pn);function $p(t,e){for(var n=0,r=e.length-1,i=e[0],a=new Array(r<0?0:r);n1&&Vp(t[n[r-2]],t[n[r-1]],t[i])<=0;)--r;n[r++]=i}return n.slice(0,r)}function Zp(t){if((n=t.length)<3)return null;var e,n,r=new Array(n),i=new Array(n);for(e=0;e=0;--e)u.push(t[r[a[e]][2]]);for(e=+s;es!=u>s&&o<(c-n)*(s-r)/(u-r)+n&&(l=!l),c=n,u=r;return l}function Kp(t){for(var e,n,r=-1,i=t.length,a=t[i-1],o=a[0],s=a[1],c=0;++r1);return t+n*a*Math.sqrt(-2*Math.log(i)/i)}}return n.source=t,n}(Jp),ng=function t(e){function n(){var t=eg.source(e).apply(this,arguments);return function(){return Math.exp(t())}}return n.source=t,n}(Jp),rg=function t(e){function n(t){return function(){for(var n=0,r=0;rr&&(e=n,n=r,r=e),function(t){return Math.max(n,Math.min(r,t))}}function xg(t,e,n){var r=t[0],i=t[1],a=e[0],o=e[1];return i2?wg:xg,i=a=null,h}function h(e){return isNaN(e=+e)?n:(i||(i=r(o.map(t),s,c)))(t(u(e)))}return h.invert=function(n){return u(e((a||(a=r(s,o.map(t),Tn)))(n)))},h.domain=function(t){return arguments.length?(o=ug.call(t,yg),u===vg||(u=_g(o)),l()):o.slice()},h.range=function(t){return arguments.length?(s=lg.call(t),l()):s.slice()},h.rangeRound=function(t){return s=lg.call(t),c=Mp,l()},h.clamp=function(t){return arguments.length?(u=t?_g(o):vg,h):u!==vg},h.interpolate=function(t){return arguments.length?(c=t,l()):c},h.unknown=function(t){return arguments.length?(n=t,h):n},function(n,r){return t=n,e=r,l()}}function Cg(t,e){return Tg()(t,e)}function Eg(t,e,n,r){var i,a=M(t,e,n);switch((r=cc(null==r?",f":r)).type){case"s":var o=Math.max(Math.abs(t),Math.abs(e));return null!=r.precision||isNaN(i=xc(a,o))||(r.precision=i),gc(r,o);case"":case"e":case"g":case"p":case"r":null!=r.precision||isNaN(i=wc(a,Math.max(Math.abs(t),Math.abs(e))))||(r.precision=i-("e"===r.type));break;case"f":case"%":null!=r.precision||isNaN(i=_c(a))||(r.precision=i-2*("%"===r.type))}return pc(r)}function Sg(t){var e=t.domain;return t.ticks=function(t){var n=e();return S(n[0],n[n.length-1],null==t?10:t)},t.tickFormat=function(t,n){var r=e();return Eg(r[0],r[r.length-1],null==t?10:t,n)},t.nice=function(n){null==n&&(n=10);var r,i=e(),a=0,o=i.length-1,s=i[a],c=i[o];return c0?r=A(s=Math.floor(s/r)*r,c=Math.ceil(c/r)*r,n):r<0&&(r=A(s=Math.ceil(s*r)/r,c=Math.floor(c*r)/r,n)),r>0?(i[a]=Math.floor(s/r)*r,i[o]=Math.ceil(c/r)*r,e(i)):r<0&&(i[a]=Math.ceil(s*r)/r,i[o]=Math.floor(c*r)/r,e(i)),t},t}function Ag(){var t=Cg(vg,vg);return t.copy=function(){return kg(t,Ag())},og.apply(t,arguments),Sg(t)}function Mg(t){var e;function n(t){return isNaN(t=+t)?e:t}return n.invert=n,n.domain=n.range=function(e){return arguments.length?(t=ug.call(e,yg),n):t.slice()},n.unknown=function(t){return arguments.length?(e=t,n):e},n.copy=function(){return Mg(t).unknown(e)},t=arguments.length?ug.call(t,yg):[0,1],Sg(n)}function Ng(t,e){var n,r=0,i=(t=t.slice()).length-1,a=t[r],o=t[i];return o0){for(;fc)break;g.push(h)}}else for(;f=1;--l)if(!((h=u*l)c)break;g.push(h)}}else g=S(f,d,Math.min(d-f,p)).map(n);return r?g.reverse():g},r.tickFormat=function(t,i){if(null==i&&(i=10===a?".0e":","),"function"!=typeof i&&(i=pc(i)),t===1/0)return i;null==t&&(t=10);var o=Math.max(1,a*t/r.ticks().length);return function(t){var r=t/n(Math.round(e(t)));return r*a0?r[i-1]:e[0],i=r?[i[r-1],n]:[i[o-1],i[o]]},o.unknown=function(e){return arguments.length?(t=e,o):o},o.thresholds=function(){return i.slice()},o.copy=function(){return Zg().domain([e,n]).range(a).unknown(t)},og.apply(Sg(o),arguments)}function Qg(){var t,e=[.5],n=[0,1],r=1;function i(i){return i<=i?n[u(e,i,0,r)]:t}return i.domain=function(t){return arguments.length?(e=lg.call(t),r=Math.min(e.length,n.length-1),i):e.slice()},i.range=function(t){return arguments.length?(n=lg.call(t),r=Math.min(e.length,n.length-1),i):n.slice()},i.invertExtent=function(t){var r=n.indexOf(t);return[e[r-1],e[r]]},i.unknown=function(e){return arguments.length?(t=e,i):t},i.copy=function(){return Qg().domain(e).range(n).unknown(t)},og.apply(i,arguments)}var Kg=new Date,Jg=new Date;function ty(t,e,n,r){function i(e){return t(e=0===arguments.length?new Date:new Date(+e)),e}return i.floor=function(e){return t(e=new Date(+e)),e},i.ceil=function(n){return t(n=new Date(n-1)),e(n,1),t(n),n},i.round=function(t){var e=i(t),n=i.ceil(t);return t-e0))return s;do{s.push(o=new Date(+n)),e(n,a),t(n)}while(o=e)for(;t(e),!n(e);)e.setTime(e-1)}),(function(t,r){if(t>=t)if(r<0)for(;++r<=0;)for(;e(t,-1),!n(t););else for(;--r>=0;)for(;e(t,1),!n(t););}))},n&&(i.count=function(e,r){return Kg.setTime(+e),Jg.setTime(+r),t(Kg),t(Jg),Math.floor(n(Kg,Jg))},i.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?i.filter(r?function(e){return r(e)%t==0}:function(e){return i.count(0,e)%t==0}):i:null}),i}var ey=ty((function(t){t.setMonth(0,1),t.setHours(0,0,0,0)}),(function(t,e){t.setFullYear(t.getFullYear()+e)}),(function(t,e){return e.getFullYear()-t.getFullYear()}),(function(t){return t.getFullYear()}));ey.every=function(t){return isFinite(t=Math.floor(t))&&t>0?ty((function(e){e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)}),(function(e,n){e.setFullYear(e.getFullYear()+n*t)})):null};const ny=ey;var ry=ey.range,iy=ty((function(t){t.setDate(1),t.setHours(0,0,0,0)}),(function(t,e){t.setMonth(t.getMonth()+e)}),(function(t,e){return e.getMonth()-t.getMonth()+12*(e.getFullYear()-t.getFullYear())}),(function(t){return t.getMonth()}));const ay=iy;var oy=iy.range,sy=1e3,cy=6e4,uy=36e5,ly=864e5,hy=6048e5;function fy(t){return ty((function(e){e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)}),(function(t,e){t.setDate(t.getDate()+7*e)}),(function(t,e){return(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*cy)/hy}))}var dy=fy(0),py=fy(1),gy=fy(2),yy=fy(3),my=fy(4),vy=fy(5),by=fy(6),_y=dy.range,xy=py.range,wy=gy.range,ky=yy.range,Ty=my.range,Cy=vy.range,Ey=by.range,Sy=ty((function(t){t.setHours(0,0,0,0)}),(function(t,e){t.setDate(t.getDate()+e)}),(function(t,e){return(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*cy)/ly}),(function(t){return t.getDate()-1}));const Ay=Sy;var My=Sy.range,Ny=ty((function(t){t.setTime(t-t.getMilliseconds()-t.getSeconds()*sy-t.getMinutes()*cy)}),(function(t,e){t.setTime(+t+e*uy)}),(function(t,e){return(e-t)/uy}),(function(t){return t.getHours()}));const Dy=Ny;var By=Ny.range,Ly=ty((function(t){t.setTime(t-t.getMilliseconds()-t.getSeconds()*sy)}),(function(t,e){t.setTime(+t+e*cy)}),(function(t,e){return(e-t)/cy}),(function(t){return t.getMinutes()}));const Oy=Ly;var Iy=Ly.range,Ry=ty((function(t){t.setTime(t-t.getMilliseconds())}),(function(t,e){t.setTime(+t+e*sy)}),(function(t,e){return(e-t)/sy}),(function(t){return t.getUTCSeconds()}));const Fy=Ry;var Py=Ry.range,Yy=ty((function(){}),(function(t,e){t.setTime(+t+e)}),(function(t,e){return e-t}));Yy.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?ty((function(e){e.setTime(Math.floor(e/t)*t)}),(function(e,n){e.setTime(+e+n*t)}),(function(e,n){return(n-e)/t})):Yy:null};const jy=Yy;var Uy=Yy.range;function zy(t){return ty((function(e){e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCDate(t.getUTCDate()+7*e)}),(function(t,e){return(e-t)/hy}))}var $y=zy(0),qy=zy(1),Hy=zy(2),Wy=zy(3),Vy=zy(4),Gy=zy(5),Xy=zy(6),Zy=$y.range,Qy=qy.range,Ky=Hy.range,Jy=Wy.range,tm=Vy.range,em=Gy.range,nm=Xy.range,rm=ty((function(t){t.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCDate(t.getUTCDate()+e)}),(function(t,e){return(e-t)/ly}),(function(t){return t.getUTCDate()-1}));const im=rm;var am=rm.range,om=ty((function(t){t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCFullYear(t.getUTCFullYear()+e)}),(function(t,e){return e.getUTCFullYear()-t.getUTCFullYear()}),(function(t){return t.getUTCFullYear()}));om.every=function(t){return isFinite(t=Math.floor(t))&&t>0?ty((function(e){e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)}),(function(e,n){e.setUTCFullYear(e.getUTCFullYear()+n*t)})):null};const sm=om;var cm=om.range;function um(t){if(0<=t.y&&t.y<100){var e=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return e.setFullYear(t.y),e}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function lm(t){if(0<=t.y&&t.y<100){var e=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return e.setUTCFullYear(t.y),e}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function hm(t,e,n){return{y:t,m:e,d:n,H:0,M:0,S:0,L:0}}function fm(t){var e=t.dateTime,n=t.date,r=t.time,i=t.periods,a=t.days,o=t.shortDays,s=t.months,c=t.shortMonths,u=Tm(i),l=Cm(i),h=Tm(a),f=Cm(a),d=Tm(o),p=Cm(o),g=Tm(s),y=Cm(s),m=Tm(c),v=Cm(c),b={a:function(t){return o[t.getDay()]},A:function(t){return a[t.getDay()]},b:function(t){return c[t.getMonth()]},B:function(t){return s[t.getMonth()]},c:null,d:Wm,e:Wm,f:Qm,g:cv,G:lv,H:Vm,I:Gm,j:Xm,L:Zm,m:Km,M:Jm,p:function(t){return i[+(t.getHours()>=12)]},q:function(t){return 1+~~(t.getMonth()/3)},Q:Lv,s:Ov,S:tv,u:ev,U:nv,V:iv,w:av,W:ov,x:null,X:null,y:sv,Y:uv,Z:hv,"%":Bv},_={a:function(t){return o[t.getUTCDay()]},A:function(t){return a[t.getUTCDay()]},b:function(t){return c[t.getUTCMonth()]},B:function(t){return s[t.getUTCMonth()]},c:null,d:fv,e:fv,f:mv,g:Av,G:Nv,H:dv,I:pv,j:gv,L:yv,m:vv,M:bv,p:function(t){return i[+(t.getUTCHours()>=12)]},q:function(t){return 1+~~(t.getUTCMonth()/3)},Q:Lv,s:Ov,S:_v,u:xv,U:wv,V:Tv,w:Cv,W:Ev,x:null,X:null,y:Sv,Y:Mv,Z:Dv,"%":Bv},x={a:function(t,e,n){var r=d.exec(e.slice(n));return r?(t.w=p[r[0].toLowerCase()],n+r[0].length):-1},A:function(t,e,n){var r=h.exec(e.slice(n));return r?(t.w=f[r[0].toLowerCase()],n+r[0].length):-1},b:function(t,e,n){var r=m.exec(e.slice(n));return r?(t.m=v[r[0].toLowerCase()],n+r[0].length):-1},B:function(t,e,n){var r=g.exec(e.slice(n));return r?(t.m=y[r[0].toLowerCase()],n+r[0].length):-1},c:function(t,n,r){return T(t,e,n,r)},d:Rm,e:Rm,f:zm,g:Bm,G:Dm,H:Pm,I:Pm,j:Fm,L:Um,m:Im,M:Ym,p:function(t,e,n){var r=u.exec(e.slice(n));return r?(t.p=l[r[0].toLowerCase()],n+r[0].length):-1},q:Om,Q:qm,s:Hm,S:jm,u:Sm,U:Am,V:Mm,w:Em,W:Nm,x:function(t,e,r){return T(t,n,e,r)},X:function(t,e,n){return T(t,r,e,n)},y:Bm,Y:Dm,Z:Lm,"%":$m};function w(t,e){return function(n){var r,i,a,o=[],s=-1,c=0,u=t.length;for(n instanceof Date||(n=new Date(+n));++s53)return null;"w"in a||(a.w=1),"Z"in a?(i=(r=lm(hm(a.y,0,1))).getUTCDay(),r=i>4||0===i?qy.ceil(r):qy(r),r=im.offset(r,7*(a.V-1)),a.y=r.getUTCFullYear(),a.m=r.getUTCMonth(),a.d=r.getUTCDate()+(a.w+6)%7):(i=(r=um(hm(a.y,0,1))).getDay(),r=i>4||0===i?py.ceil(r):py(r),r=Ay.offset(r,7*(a.V-1)),a.y=r.getFullYear(),a.m=r.getMonth(),a.d=r.getDate()+(a.w+6)%7)}else("W"in a||"U"in a)&&("w"in a||(a.w="u"in a?a.u%7:"W"in a?1:0),i="Z"in a?lm(hm(a.y,0,1)).getUTCDay():um(hm(a.y,0,1)).getDay(),a.m=0,a.d="W"in a?(a.w+6)%7+7*a.W-(i+5)%7:a.w+7*a.U-(i+6)%7);return"Z"in a?(a.H+=a.Z/100|0,a.M+=a.Z%100,lm(a)):um(a)}}function T(t,e,n,r){for(var i,a,o=0,s=e.length,c=n.length;o=c)return-1;if(37===(i=e.charCodeAt(o++))){if(i=e.charAt(o++),!(a=x[i in vm?e.charAt(o++):i])||(r=a(t,n,r))<0)return-1}else if(i!=n.charCodeAt(r++))return-1}return r}return b.x=w(n,b),b.X=w(r,b),b.c=w(e,b),_.x=w(n,_),_.X=w(r,_),_.c=w(e,_),{format:function(t){var e=w(t+="",b);return e.toString=function(){return t},e},parse:function(t){var e=k(t+="",!1);return e.toString=function(){return t},e},utcFormat:function(t){var e=w(t+="",_);return e.toString=function(){return t},e},utcParse:function(t){var e=k(t+="",!0);return e.toString=function(){return t},e}}}var dm,pm,gm,ym,mm,vm={"-":"",_:" ",0:"0"},bm=/^\s*\d+/,_m=/^%/,xm=/[\\^$*+?|[\]().{}]/g;function wm(t,e,n){var r=t<0?"-":"",i=(r?-t:t)+"",a=i.length;return r+(a68?1900:2e3),n+r[0].length):-1}function Lm(t,e,n){var r=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(n,n+6));return r?(t.Z=r[1]?0:-(r[2]+(r[3]||"00")),n+r[0].length):-1}function Om(t,e,n){var r=bm.exec(e.slice(n,n+1));return r?(t.q=3*r[0]-3,n+r[0].length):-1}function Im(t,e,n){var r=bm.exec(e.slice(n,n+2));return r?(t.m=r[0]-1,n+r[0].length):-1}function Rm(t,e,n){var r=bm.exec(e.slice(n,n+2));return r?(t.d=+r[0],n+r[0].length):-1}function Fm(t,e,n){var r=bm.exec(e.slice(n,n+3));return r?(t.m=0,t.d=+r[0],n+r[0].length):-1}function Pm(t,e,n){var r=bm.exec(e.slice(n,n+2));return r?(t.H=+r[0],n+r[0].length):-1}function Ym(t,e,n){var r=bm.exec(e.slice(n,n+2));return r?(t.M=+r[0],n+r[0].length):-1}function jm(t,e,n){var r=bm.exec(e.slice(n,n+2));return r?(t.S=+r[0],n+r[0].length):-1}function Um(t,e,n){var r=bm.exec(e.slice(n,n+3));return r?(t.L=+r[0],n+r[0].length):-1}function zm(t,e,n){var r=bm.exec(e.slice(n,n+6));return r?(t.L=Math.floor(r[0]/1e3),n+r[0].length):-1}function $m(t,e,n){var r=_m.exec(e.slice(n,n+1));return r?n+r[0].length:-1}function qm(t,e,n){var r=bm.exec(e.slice(n));return r?(t.Q=+r[0],n+r[0].length):-1}function Hm(t,e,n){var r=bm.exec(e.slice(n));return r?(t.s=+r[0],n+r[0].length):-1}function Wm(t,e){return wm(t.getDate(),e,2)}function Vm(t,e){return wm(t.getHours(),e,2)}function Gm(t,e){return wm(t.getHours()%12||12,e,2)}function Xm(t,e){return wm(1+Ay.count(ny(t),t),e,3)}function Zm(t,e){return wm(t.getMilliseconds(),e,3)}function Qm(t,e){return Zm(t,e)+"000"}function Km(t,e){return wm(t.getMonth()+1,e,2)}function Jm(t,e){return wm(t.getMinutes(),e,2)}function tv(t,e){return wm(t.getSeconds(),e,2)}function ev(t){var e=t.getDay();return 0===e?7:e}function nv(t,e){return wm(dy.count(ny(t)-1,t),e,2)}function rv(t){var e=t.getDay();return e>=4||0===e?my(t):my.ceil(t)}function iv(t,e){return t=rv(t),wm(my.count(ny(t),t)+(4===ny(t).getDay()),e,2)}function av(t){return t.getDay()}function ov(t,e){return wm(py.count(ny(t)-1,t),e,2)}function sv(t,e){return wm(t.getFullYear()%100,e,2)}function cv(t,e){return wm((t=rv(t)).getFullYear()%100,e,2)}function uv(t,e){return wm(t.getFullYear()%1e4,e,4)}function lv(t,e){var n=t.getDay();return wm((t=n>=4||0===n?my(t):my.ceil(t)).getFullYear()%1e4,e,4)}function hv(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+wm(e/60|0,"0",2)+wm(e%60,"0",2)}function fv(t,e){return wm(t.getUTCDate(),e,2)}function dv(t,e){return wm(t.getUTCHours(),e,2)}function pv(t,e){return wm(t.getUTCHours()%12||12,e,2)}function gv(t,e){return wm(1+im.count(sm(t),t),e,3)}function yv(t,e){return wm(t.getUTCMilliseconds(),e,3)}function mv(t,e){return yv(t,e)+"000"}function vv(t,e){return wm(t.getUTCMonth()+1,e,2)}function bv(t,e){return wm(t.getUTCMinutes(),e,2)}function _v(t,e){return wm(t.getUTCSeconds(),e,2)}function xv(t){var e=t.getUTCDay();return 0===e?7:e}function wv(t,e){return wm($y.count(sm(t)-1,t),e,2)}function kv(t){var e=t.getUTCDay();return e>=4||0===e?Vy(t):Vy.ceil(t)}function Tv(t,e){return t=kv(t),wm(Vy.count(sm(t),t)+(4===sm(t).getUTCDay()),e,2)}function Cv(t){return t.getUTCDay()}function Ev(t,e){return wm(qy.count(sm(t)-1,t),e,2)}function Sv(t,e){return wm(t.getUTCFullYear()%100,e,2)}function Av(t,e){return wm((t=kv(t)).getUTCFullYear()%100,e,2)}function Mv(t,e){return wm(t.getUTCFullYear()%1e4,e,4)}function Nv(t,e){var n=t.getUTCDay();return wm((t=n>=4||0===n?Vy(t):Vy.ceil(t)).getUTCFullYear()%1e4,e,4)}function Dv(){return"+0000"}function Bv(){return"%"}function Lv(t){return+t}function Ov(t){return Math.floor(+t/1e3)}function Iv(t){return dm=fm(t),pm=dm.format,gm=dm.parse,ym=dm.utcFormat,mm=dm.utcParse,dm}Iv({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});var Rv=31536e6;function Fv(t){return new Date(t)}function Pv(t){return t instanceof Date?+t:+new Date(+t)}function Yv(t,e,n,r,i,o,s,c,u){var l=Cg(vg,vg),h=l.invert,f=l.domain,d=u(".%L"),p=u(":%S"),g=u("%I:%M"),y=u("%I %p"),m=u("%a %d"),v=u("%b %d"),b=u("%B"),_=u("%Y"),x=[[s,1,1e3],[s,5,5e3],[s,15,15e3],[s,30,3e4],[o,1,6e4],[o,5,3e5],[o,15,9e5],[o,30,18e5],[i,1,36e5],[i,3,108e5],[i,6,216e5],[i,12,432e5],[r,1,864e5],[r,2,1728e5],[n,1,6048e5],[e,1,2592e6],[e,3,7776e6],[t,1,Rv]];function w(a){return(s(a)1)&&(t-=Math.floor(t));var e=Math.abs(t-.5);return S_.h=360*t-100,S_.s=1.5-1.5*e,S_.l=.8-.9*e,S_+""}var M_=Qe(),N_=Math.PI/3,D_=2*Math.PI/3;function B_(t){var e;return t=(.5-t)*Math.PI,M_.r=255*(e=Math.sin(t))*e,M_.g=255*(e=Math.sin(t+N_))*e,M_.b=255*(e=Math.sin(t+D_))*e,M_+""}function L_(t){return t=Math.max(0,Math.min(1,t)),"rgb("+Math.max(0,Math.min(255,Math.round(34.61+t*(1172.33-t*(10793.56-t*(33300.12-t*(38394.49-14825.05*t)))))))+", "+Math.max(0,Math.min(255,Math.round(23.31+t*(557.33+t*(1225.33-t*(3574.96-t*(1073.77+707.56*t)))))))+", "+Math.max(0,Math.min(255,Math.round(27.2+t*(3211.1-t*(15327.97-t*(27814-t*(22569.18-6838.66*t)))))))+")"}function O_(t){var e=t.length;return function(n){return t[Math.max(0,Math.min(e-1,Math.floor(n*e)))]}}const I_=O_(hb("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725"));var R_=O_(hb("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")),F_=O_(hb("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")),P_=O_(hb("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));function Y_(t){return Te(ie(t).call(document.documentElement))}var j_=0;function U_(){return new z_}function z_(){this._="@"+(++j_).toString(36)}function $_(t){return"string"==typeof t?new xe([document.querySelectorAll(t)],[document.documentElement]):new xe([null==t?[]:t],_e)}function q_(t,e){null==e&&(e=Nn().touches);for(var n=0,r=e?e.length:0,i=new Array(r);n1?0:t<-1?tx:Math.acos(t)}function ix(t){return t>=1?ex:t<=-1?-ex:Math.asin(t)}function ax(t){return t.innerRadius}function ox(t){return t.outerRadius}function sx(t){return t.startAngle}function cx(t){return t.endAngle}function ux(t){return t&&t.padAngle}function lx(t,e,n,r,i,a,o,s){var c=n-t,u=r-e,l=o-i,h=s-a,f=h*c-l*u;if(!(f*fN*N+D*D&&(T=E,C=S),{cx:T,cy:C,x01:-l,y01:-h,x11:T*(i/x-1),y11:C*(i/x-1)}}function fx(){var t=ax,e=ox,n=H_(0),r=null,i=sx,a=cx,o=ux,s=null;function c(){var c,u,l=+t.apply(this,arguments),h=+e.apply(this,arguments),f=i.apply(this,arguments)-ex,d=a.apply(this,arguments)-ex,p=W_(d-f),g=d>f;if(s||(s=c=Wi()),hJ_)if(p>nx-J_)s.moveTo(h*G_(f),h*Q_(f)),s.arc(0,0,h,f,d,!g),l>J_&&(s.moveTo(l*G_(d),l*Q_(d)),s.arc(0,0,l,d,f,g));else{var y,m,v=f,b=d,_=f,x=d,w=p,k=p,T=o.apply(this,arguments)/2,C=T>J_&&(r?+r.apply(this,arguments):K_(l*l+h*h)),E=Z_(W_(h-l)/2,+n.apply(this,arguments)),S=E,A=E;if(C>J_){var M=ix(C/l*Q_(T)),N=ix(C/h*Q_(T));(w-=2*M)>J_?(_+=M*=g?1:-1,x-=M):(w=0,_=x=(f+d)/2),(k-=2*N)>J_?(v+=N*=g?1:-1,b-=N):(k=0,v=b=(f+d)/2)}var D=h*G_(v),B=h*Q_(v),L=l*G_(x),O=l*Q_(x);if(E>J_){var I,R=h*G_(b),F=h*Q_(b),P=l*G_(_),Y=l*Q_(_);if(pJ_?A>J_?(y=hx(P,Y,D,B,h,A,g),m=hx(R,F,L,O,h,A,g),s.moveTo(y.cx+y.x01,y.cy+y.y01),AJ_&&w>J_?S>J_?(y=hx(L,O,R,F,l,-S,g),m=hx(D,B,P,Y,l,-S,g),s.lineTo(y.cx+y.x01,y.cy+y.y01),S=l;--h)s.point(y[h],m[h]);s.lineEnd(),s.areaEnd()}g&&(y[u]=+t(f,u,c),m[u]=+n(f,u,c),s.point(e?+e(f,u,c):y[u],r?+r(f,u,c):m[u]))}if(d)return s=null,d+""||null}function u(){return mx().defined(i).curve(o).context(a)}return c.x=function(n){return arguments.length?(t="function"==typeof n?n:H_(+n),e=null,c):t},c.x0=function(e){return arguments.length?(t="function"==typeof e?e:H_(+e),c):t},c.x1=function(t){return arguments.length?(e=null==t?null:"function"==typeof t?t:H_(+t),c):e},c.y=function(t){return arguments.length?(n="function"==typeof t?t:H_(+t),r=null,c):n},c.y0=function(t){return arguments.length?(n="function"==typeof t?t:H_(+t),c):n},c.y1=function(t){return arguments.length?(r=null==t?null:"function"==typeof t?t:H_(+t),c):r},c.lineX0=c.lineY0=function(){return u().x(t).y(n)},c.lineY1=function(){return u().x(t).y(r)},c.lineX1=function(){return u().x(e).y(n)},c.defined=function(t){return arguments.length?(i="function"==typeof t?t:H_(!!t),c):i},c.curve=function(t){return arguments.length?(o=t,null!=a&&(s=o(a)),c):o},c.context=function(t){return arguments.length?(null==t?a=s=null:s=o(a=t),c):a},c}function bx(t,e){return et?1:e>=t?0:NaN}function _x(t){return t}function xx(){var t=_x,e=bx,n=null,r=H_(0),i=H_(nx),a=H_(0);function o(o){var s,c,u,l,h,f=o.length,d=0,p=new Array(f),g=new Array(f),y=+r.apply(this,arguments),m=Math.min(nx,Math.max(-nx,i.apply(this,arguments)-y)),v=Math.min(Math.abs(m)/f,a.apply(this,arguments)),b=v*(m<0?-1:1);for(s=0;s0&&(d+=h);for(null!=e?p.sort((function(t,n){return e(g[t],g[n])})):null!=n&&p.sort((function(t,e){return n(o[t],o[e])})),s=0,u=d?(m-f*b)/d:0;s0?h*u:0)+b,g[c]={data:o[c],index:s,value:h,startAngle:y,endAngle:l,padAngle:v};return g}return o.value=function(e){return arguments.length?(t="function"==typeof e?e:H_(+e),o):t},o.sortValues=function(t){return arguments.length?(e=t,n=null,o):e},o.sort=function(t){return arguments.length?(n=t,e=null,o):n},o.startAngle=function(t){return arguments.length?(r="function"==typeof t?t:H_(+t),o):r},o.endAngle=function(t){return arguments.length?(i="function"==typeof t?t:H_(+t),o):i},o.padAngle=function(t){return arguments.length?(a="function"==typeof t?t:H_(+t),o):a},o}dx.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:this._context.lineTo(t,e)}}};var wx=Tx(px);function kx(t){this._curve=t}function Tx(t){function e(e){return new kx(t(e))}return e._curve=t,e}function Cx(t){var e=t.curve;return t.angle=t.x,delete t.x,t.radius=t.y,delete t.y,t.curve=function(t){return arguments.length?e(Tx(t)):e()._curve},t}function Ex(){return Cx(mx().curve(wx))}function Sx(){var t=vx().curve(wx),e=t.curve,n=t.lineX0,r=t.lineX1,i=t.lineY0,a=t.lineY1;return t.angle=t.x,delete t.x,t.startAngle=t.x0,delete t.x0,t.endAngle=t.x1,delete t.x1,t.radius=t.y,delete t.y,t.innerRadius=t.y0,delete t.y0,t.outerRadius=t.y1,delete t.y1,t.lineStartAngle=function(){return Cx(n())},delete t.lineX0,t.lineEndAngle=function(){return Cx(r())},delete t.lineX1,t.lineInnerRadius=function(){return Cx(i())},delete t.lineY0,t.lineOuterRadius=function(){return Cx(a())},delete t.lineY1,t.curve=function(t){return arguments.length?e(Tx(t)):e()._curve},t}function Ax(t,e){return[(e=+e)*Math.cos(t-=Math.PI/2),e*Math.sin(t)]}kx.prototype={areaStart:function(){this._curve.areaStart()},areaEnd:function(){this._curve.areaEnd()},lineStart:function(){this._curve.lineStart()},lineEnd:function(){this._curve.lineEnd()},point:function(t,e){this._curve.point(e*Math.sin(t),e*-Math.cos(t))}};var Mx=Array.prototype.slice;function Nx(t){return t.source}function Dx(t){return t.target}function Bx(t){var e=Nx,n=Dx,r=gx,i=yx,a=null;function o(){var o,s=Mx.call(arguments),c=e.apply(this,s),u=n.apply(this,s);if(a||(a=o=Wi()),t(a,+r.apply(this,(s[0]=c,s)),+i.apply(this,s),+r.apply(this,(s[0]=u,s)),+i.apply(this,s)),o)return a=null,o+""||null}return o.source=function(t){return arguments.length?(e=t,o):e},o.target=function(t){return arguments.length?(n=t,o):n},o.x=function(t){return arguments.length?(r="function"==typeof t?t:H_(+t),o):r},o.y=function(t){return arguments.length?(i="function"==typeof t?t:H_(+t),o):i},o.context=function(t){return arguments.length?(a=null==t?null:t,o):a},o}function Lx(t,e,n,r,i){t.moveTo(e,n),t.bezierCurveTo(e=(e+r)/2,n,e,i,r,i)}function Ox(t,e,n,r,i){t.moveTo(e,n),t.bezierCurveTo(e,n=(n+i)/2,r,n,r,i)}function Ix(t,e,n,r,i){var a=Ax(e,n),o=Ax(e,n=(n+i)/2),s=Ax(r,n),c=Ax(r,i);t.moveTo(a[0],a[1]),t.bezierCurveTo(o[0],o[1],s[0],s[1],c[0],c[1])}function Rx(){return Bx(Lx)}function Fx(){return Bx(Ox)}function Px(){var t=Bx(Ix);return t.angle=t.x,delete t.x,t.radius=t.y,delete t.y,t}const Yx={draw:function(t,e){var n=Math.sqrt(e/tx);t.moveTo(n,0),t.arc(0,0,n,0,nx)}},jx={draw:function(t,e){var n=Math.sqrt(e/5)/2;t.moveTo(-3*n,-n),t.lineTo(-n,-n),t.lineTo(-n,-3*n),t.lineTo(n,-3*n),t.lineTo(n,-n),t.lineTo(3*n,-n),t.lineTo(3*n,n),t.lineTo(n,n),t.lineTo(n,3*n),t.lineTo(-n,3*n),t.lineTo(-n,n),t.lineTo(-3*n,n),t.closePath()}};var Ux=Math.sqrt(1/3),zx=2*Ux;const $x={draw:function(t,e){var n=Math.sqrt(e/zx),r=n*Ux;t.moveTo(0,-n),t.lineTo(r,0),t.lineTo(0,n),t.lineTo(-r,0),t.closePath()}};var qx=Math.sin(tx/10)/Math.sin(7*tx/10),Hx=Math.sin(nx/10)*qx,Wx=-Math.cos(nx/10)*qx;const Vx={draw:function(t,e){var n=Math.sqrt(.8908130915292852*e),r=Hx*n,i=Wx*n;t.moveTo(0,-n),t.lineTo(r,i);for(var a=1;a<5;++a){var o=nx*a/5,s=Math.cos(o),c=Math.sin(o);t.lineTo(c*n,-s*n),t.lineTo(s*r-c*i,c*r+s*i)}t.closePath()}},Gx={draw:function(t,e){var n=Math.sqrt(e),r=-n/2;t.rect(r,r,n,n)}};var Xx=Math.sqrt(3);const Zx={draw:function(t,e){var n=-Math.sqrt(e/(3*Xx));t.moveTo(0,2*n),t.lineTo(-Xx*n,-n),t.lineTo(Xx*n,-n),t.closePath()}};var Qx=-.5,Kx=Math.sqrt(3)/2,Jx=1/Math.sqrt(12),tw=3*(Jx/2+1);const ew={draw:function(t,e){var n=Math.sqrt(e/tw),r=n/2,i=n*Jx,a=r,o=n*Jx+n,s=-a,c=o;t.moveTo(r,i),t.lineTo(a,o),t.lineTo(s,c),t.lineTo(Qx*r-Kx*i,Kx*r+Qx*i),t.lineTo(Qx*a-Kx*o,Kx*a+Qx*o),t.lineTo(Qx*s-Kx*c,Kx*s+Qx*c),t.lineTo(Qx*r+Kx*i,Qx*i-Kx*r),t.lineTo(Qx*a+Kx*o,Qx*o-Kx*a),t.lineTo(Qx*s+Kx*c,Qx*c-Kx*s),t.closePath()}};var nw=[Yx,jx,$x,Gx,Vx,Zx,ew];function rw(){var t=H_(Yx),e=H_(64),n=null;function r(){var r;if(n||(n=r=Wi()),t.apply(this,arguments).draw(n,+e.apply(this,arguments)),r)return n=null,r+""||null}return r.type=function(e){return arguments.length?(t="function"==typeof e?e:H_(e),r):t},r.size=function(t){return arguments.length?(e="function"==typeof t?t:H_(+t),r):e},r.context=function(t){return arguments.length?(n=null==t?null:t,r):n},r}function iw(){}function aw(t,e,n){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+e)/6,(t._y0+4*t._y1+n)/6)}function ow(t){this._context=t}function sw(t){return new ow(t)}function cw(t){this._context=t}function uw(t){return new cw(t)}function lw(t){this._context=t}function hw(t){return new lw(t)}function fw(t,e){this._basis=new ow(t),this._beta=e}ow.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:aw(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:aw(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}},cw.prototype={areaStart:iw,areaEnd:iw,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x2,this._y2),this._context.closePath();break;case 2:this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break;case 3:this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4)}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x2=t,this._y2=e;break;case 1:this._point=2,this._x3=t,this._y3=e;break;case 2:this._point=3,this._x4=t,this._y4=e,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+e)/6);break;default:aw(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}},lw.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var n=(this._x0+4*this._x1+t)/6,r=(this._y0+4*this._y1+e)/6;this._line?this._context.lineTo(n,r):this._context.moveTo(n,r);break;case 3:this._point=4;default:aw(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}},fw.prototype={lineStart:function(){this._x=[],this._y=[],this._basis.lineStart()},lineEnd:function(){var t=this._x,e=this._y,n=t.length-1;if(n>0)for(var r,i=t[0],a=e[0],o=t[n]-i,s=e[n]-a,c=-1;++c<=n;)r=c/n,this._basis.point(this._beta*t[c]+(1-this._beta)*(i+r*o),this._beta*e[c]+(1-this._beta)*(a+r*s));this._x=this._y=null,this._basis.lineEnd()},point:function(t,e){this._x.push(+t),this._y.push(+e)}};const dw=function t(e){function n(t){return 1===e?new ow(t):new fw(t,e)}return n.beta=function(e){return t(+e)},n}(.85);function pw(t,e,n){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-e),t._y2+t._k*(t._y1-n),t._x2,t._y2)}function gw(t,e){this._context=t,this._k=(1-e)/6}gw.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:pw(this,this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2,this._x1=t,this._y1=e;break;case 2:this._point=3;default:pw(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const yw=function t(e){function n(t){return new gw(t,e)}return n.tension=function(e){return t(+e)},n}(0);function mw(t,e){this._context=t,this._k=(1-e)/6}mw.prototype={areaStart:iw,areaEnd:iw,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:pw(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const vw=function t(e){function n(t){return new mw(t,e)}return n.tension=function(e){return t(+e)},n}(0);function bw(t,e){this._context=t,this._k=(1-e)/6}bw.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:pw(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const _w=function t(e){function n(t){return new bw(t,e)}return n.tension=function(e){return t(+e)},n}(0);function xw(t,e,n){var r=t._x1,i=t._y1,a=t._x2,o=t._y2;if(t._l01_a>J_){var s=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,c=3*t._l01_a*(t._l01_a+t._l12_a);r=(r*s-t._x0*t._l12_2a+t._x2*t._l01_2a)/c,i=(i*s-t._y0*t._l12_2a+t._y2*t._l01_2a)/c}if(t._l23_a>J_){var u=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,l=3*t._l23_a*(t._l23_a+t._l12_a);a=(a*u+t._x1*t._l23_2a-e*t._l12_2a)/l,o=(o*u+t._y1*t._l23_2a-n*t._l12_2a)/l}t._context.bezierCurveTo(r,i,a,o,t._x2,t._y2)}function ww(t,e){this._context=t,this._alpha=e}ww.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,r=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3;default:xw(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const kw=function t(e){function n(t){return e?new ww(t,e):new gw(t,0)}return n.alpha=function(e){return t(+e)},n}(.5);function Tw(t,e){this._context=t,this._alpha=e}Tw.prototype={areaStart:iw,areaEnd:iw,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,r=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:xw(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const Cw=function t(e){function n(t){return e?new Tw(t,e):new mw(t,0)}return n.alpha=function(e){return t(+e)},n}(.5);function Ew(t,e){this._context=t,this._alpha=e}Ew.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,r=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+r*r,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:xw(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const Sw=function t(e){function n(t){return e?new Ew(t,e):new bw(t,0)}return n.alpha=function(e){return t(+e)},n}(.5);function Aw(t){this._context=t}function Mw(t){return new Aw(t)}function Nw(t){return t<0?-1:1}function Dw(t,e,n){var r=t._x1-t._x0,i=e-t._x1,a=(t._y1-t._y0)/(r||i<0&&-0),o=(n-t._y1)/(i||r<0&&-0),s=(a*i+o*r)/(r+i);return(Nw(a)+Nw(o))*Math.min(Math.abs(a),Math.abs(o),.5*Math.abs(s))||0}function Bw(t,e){var n=t._x1-t._x0;return n?(3*(t._y1-t._y0)/n-e)/2:e}function Lw(t,e,n){var r=t._x0,i=t._y0,a=t._x1,o=t._y1,s=(a-r)/3;t._context.bezierCurveTo(r+s,i+s*e,a-s,o-s*n,a,o)}function Ow(t){this._context=t}function Iw(t){this._context=new Rw(t)}function Rw(t){this._context=t}function Fw(t){return new Ow(t)}function Pw(t){return new Iw(t)}function Yw(t){this._context=t}function jw(t){var e,n,r=t.length-1,i=new Array(r),a=new Array(r),o=new Array(r);for(i[0]=0,a[0]=2,o[0]=t[0]+2*t[1],e=1;e=0;--e)i[e]=(o[e]-i[e+1])/a[e];for(a[r-1]=(t[r]+i[r-1])/2,e=0;e1)for(var n,r,i,a=1,o=t[e[0]],s=o.length;a=0;)n[e]=e;return n}function Gw(t,e){return t[e]}function Xw(){var t=H_([]),e=Vw,n=Ww,r=Gw;function i(i){var a,o,s=t.apply(this,arguments),c=i.length,u=s.length,l=new Array(u);for(a=0;a0){for(var n,r,i,a=0,o=t[0].length;a0)for(var n,r,i,a,o,s,c=0,u=t[e[0]].length;c0?(r[0]=a,r[1]=a+=i):i<0?(r[1]=o,r[0]=o+=i):(r[0]=0,r[1]=i)}function Kw(t,e){if((n=t.length)>0){for(var n,r=0,i=t[e[0]],a=i.length;r0&&(r=(n=t[e[0]]).length)>0){for(var n,r,i,a=0,o=1;oa&&(a=e,r=n);return r}function nk(t){var e=t.map(rk);return Vw(t).sort((function(t,n){return e[t]-e[n]}))}function rk(t){for(var e,n=0,r=-1,i=t.length;++r=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,e),this._context.lineTo(t,e);else{var n=this._x*(1-this._t)+t*this._t;this._context.lineTo(n,this._y),this._context.lineTo(n,e)}}this._x=t,this._y=e}};var sk="%Y-%m-%dT%H:%M:%S.%LZ",ck=Date.prototype.toISOString?function(t){return t.toISOString()}:ym(sk);const uk=ck;var lk=+new Date("2000-01-01T00:00:00.000Z")?function(t){var e=new Date(t);return isNaN(e)?null:e}:mm(sk);const hk=lk;function fk(t,e,n){var r=new Wn,i=e;return null==e?(r.restart(t,e,n),r):(e=+e,n=null==n?qn():+n,r.restart((function a(o){o+=i,r.restart(a,i+=e,n),t(o)}),e,n),r)}function dk(t){return function(){return t}}function pk(t){return t[0]}function gk(t){return t[1]}function yk(){this._=null}function mk(t){t.U=t.C=t.L=t.R=t.P=t.N=null}function vk(t,e){var n=e,r=e.R,i=n.U;i?i.L===n?i.L=r:i.R=r:t._=r,r.U=i,n.U=r,n.R=r.L,n.R&&(n.R.U=n),r.L=n}function bk(t,e){var n=e,r=e.L,i=n.U;i?i.L===n?i.L=r:i.R=r:t._=r,r.U=i,n.U=r,n.L=r.R,n.L&&(n.L.U=n),r.R=n}function _k(t){for(;t.L;)t=t.L;return t}yk.prototype={constructor:yk,insert:function(t,e){var n,r,i;if(t){if(e.P=t,e.N=t.N,t.N&&(t.N.P=e),t.N=e,t.R){for(t=t.R;t.L;)t=t.L;t.L=e}else t.R=e;n=t}else this._?(t=_k(this._),e.P=null,e.N=t,t.P=t.L=e,n=t):(e.P=e.N=null,this._=e,n=null);for(e.L=e.R=null,e.U=n,e.C=!0,t=e;n&&n.C;)n===(r=n.U).L?(i=r.R)&&i.C?(n.C=i.C=!1,r.C=!0,t=r):(t===n.R&&(vk(this,n),n=(t=n).U),n.C=!1,r.C=!0,bk(this,r)):(i=r.L)&&i.C?(n.C=i.C=!1,r.C=!0,t=r):(t===n.L&&(bk(this,n),n=(t=n).U),n.C=!1,r.C=!0,vk(this,r)),n=t.U;this._.C=!1},remove:function(t){t.N&&(t.N.P=t.P),t.P&&(t.P.N=t.N),t.N=t.P=null;var e,n,r,i=t.U,a=t.L,o=t.R;if(n=a?o?_k(o):a:o,i?i.L===t?i.L=n:i.R=n:this._=n,a&&o?(r=n.C,n.C=t.C,n.L=a,a.U=n,n!==o?(i=n.U,n.U=t.U,t=n.R,i.L=t,n.R=o,o.U=n):(n.U=i,i=n,t=n.R)):(r=t.C,t=n),t&&(t.U=i),!r)if(t&&t.C)t.C=!1;else{do{if(t===this._)break;if(t===i.L){if((e=i.R).C&&(e.C=!1,i.C=!0,vk(this,i),e=i.R),e.L&&e.L.C||e.R&&e.R.C){e.R&&e.R.C||(e.L.C=!1,e.C=!0,bk(this,e),e=i.R),e.C=i.C,i.C=e.R.C=!1,vk(this,i),t=this._;break}}else if((e=i.L).C&&(e.C=!1,i.C=!0,bk(this,i),e=i.L),e.L&&e.L.C||e.R&&e.R.C){e.L&&e.L.C||(e.R.C=!1,e.C=!0,vk(this,e),e=i.L),e.C=i.C,i.C=e.L.C=!1,bk(this,i),t=this._;break}e.C=!0,t=i,i=i.U}while(!t.C);t&&(t.C=!1)}}};const xk=yk;function wk(t,e,n,r){var i=[null,null],a=Wk.push(i)-1;return i.left=t,i.right=e,n&&Tk(i,t,e,n),r&&Tk(i,e,t,r),qk[t.index].halfedges.push(a),qk[e.index].halfedges.push(a),i}function kk(t,e,n){var r=[e,n];return r.left=t,r}function Tk(t,e,n,r){t[0]||t[1]?t.left===n?t[1]=r:t[0]=r:(t[0]=r,t.left=e,t.right=n)}function Ck(t,e,n,r,i){var a,o=t[0],s=t[1],c=o[0],u=o[1],l=0,h=1,f=s[0]-c,d=s[1]-u;if(a=e-c,f||!(a>0)){if(a/=f,f<0){if(a0){if(a>h)return;a>l&&(l=a)}if(a=r-c,f||!(a<0)){if(a/=f,f<0){if(a>h)return;a>l&&(l=a)}else if(f>0){if(a0)){if(a/=d,d<0){if(a0){if(a>h)return;a>l&&(l=a)}if(a=i-u,d||!(a<0)){if(a/=d,d<0){if(a>h)return;a>l&&(l=a)}else if(d>0){if(a0||h<1)||(l>0&&(t[0]=[c+l*f,u+l*d]),h<1&&(t[1]=[c+h*f,u+h*d]),!0)}}}}}function Ek(t,e,n,r,i){var a=t[1];if(a)return!0;var o,s,c=t[0],u=t.left,l=t.right,h=u[0],f=u[1],d=l[0],p=l[1],g=(h+d)/2,y=(f+p)/2;if(p===f){if(g=r)return;if(h>d){if(c){if(c[1]>=i)return}else c=[g,n];a=[g,i]}else{if(c){if(c[1]1)if(h>d){if(c){if(c[1]>=i)return}else c=[(n-s)/o,n];a=[(i-s)/o,i]}else{if(c){if(c[1]=r)return}else c=[e,o*e+s];a=[r,o*r+s]}else{if(c){if(c[0]=-Gk)){var d=c*c+u*u,p=l*l+h*h,g=(h*d-u*p)/f,y=(c*p-l*d)/f,m=Dk.pop()||new Bk;m.arc=t,m.site=i,m.x=g+o,m.y=(m.cy=y+s)+Math.sqrt(g*g+y*y),t.circle=m;for(var v=null,b=Hk._;b;)if(m.yVk)s=s.L;else{if(!((i=a-zk(s,o))>Vk)){r>-Vk?(e=s.P,n=s):i>-Vk?(e=s,n=s.N):e=n=s;break}if(!s.R){e=s;break}s=s.R}!function(t){qk[t.index]={site:t,halfedges:[]}}(t);var c=Fk(t);if($k.insert(e,c),e||n){if(e===n)return Ok(e),n=Fk(e.site),$k.insert(c,n),c.edge=n.edge=wk(e.site,c.site),Lk(e),void Lk(n);if(n){Ok(e),Ok(n);var u=e.site,l=u[0],h=u[1],f=t[0]-l,d=t[1]-h,p=n.site,g=p[0]-l,y=p[1]-h,m=2*(f*y-d*g),v=f*f+d*d,b=g*g+y*y,_=[(y*v-d*b)/m+l,(f*b-g*v)/m+h];Tk(n.edge,u,p,_),c.edge=wk(u,t,null,_),n.edge=wk(t,p,null,_),Lk(e),Lk(n)}else c.edge=wk(e.site,c.site)}}function Uk(t,e){var n=t.site,r=n[0],i=n[1],a=i-e;if(!a)return r;var o=t.P;if(!o)return-1/0;var s=(n=o.site)[0],c=n[1],u=c-e;if(!u)return s;var l=s-r,h=1/a-1/u,f=l/u;return h?(-f+Math.sqrt(f*f-2*h*(l*l/(-2*u)-c+u/2+i-a/2)))/h+r:(r+s)/2}function zk(t,e){var n=t.N;if(n)return Uk(n,e);var r=t.site;return r[1]===e?r[0]:1/0}var $k,qk,Hk,Wk,Vk=1e-6,Gk=1e-12;function Xk(t,e,n){return(t[0]-n[0])*(e[1]-t[1])-(t[0]-e[0])*(n[1]-t[1])}function Zk(t,e){return e[1]-t[1]||e[0]-t[0]}function Qk(t,e){var n,r,i,a=t.sort(Zk).pop();for(Wk=[],qk=new Array(t.length),$k=new xk,Hk=new xk;;)if(i=Nk,a&&(!i||a[1]Vk||Math.abs(i[0][1]-i[1][1])>Vk)||delete Wk[a]}(o,s,c,u),function(t,e,n,r){var i,a,o,s,c,u,l,h,f,d,p,g,y=qk.length,m=!0;for(i=0;iVk||Math.abs(g-f)>Vk)&&(c.splice(s,0,Wk.push(kk(o,d,Math.abs(p-t)Vk?[t,Math.abs(h-t)Vk?[Math.abs(f-r)Vk?[n,Math.abs(h-n)Vk?[Math.abs(f-e)=s)return null;var c=t-i.site[0],u=e-i.site[1],l=c*c+u*u;do{i=a.cells[r=o],o=null,i.halfedges.forEach((function(n){var r=a.edges[n],s=r.left;if(s!==i.site&&s||(s=r.right)){var c=t-s[0],u=e-s[1],h=c*c+u*u;hr?(r+i)/2:Math.min(0,r)||Math.max(0,i),o>a?(a+o)/2:Math.min(0,a)||Math.max(0,o))}function fT(){var t,e,n=oT,r=sT,i=hT,a=uT,o=lT,s=[0,1/0],c=[[-1/0,-1/0],[1/0,1/0]],u=250,l=Bp,h=ft("start","zoom","end"),f=500,d=0;function p(t){t.property("__zoom",cT).on("wheel.zoom",x).on("mousedown.zoom",w).on("dblclick.zoom",k).filter(o).on("touchstart.zoom",T).on("touchmove.zoom",C).on("touchend.zoom touchcancel.zoom",E).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function g(t,e){return(e=Math.max(s[0],Math.min(s[1],e)))===t.k?t:new eT(e,t.x,t.y)}function y(t,e,n){var r=e[0]-n[0]*t.k,i=e[1]-n[1]*t.k;return r===t.x&&i===t.y?t:new eT(t.k,r,i)}function m(t){return[(+t[0][0]+ +t[1][0])/2,(+t[0][1]+ +t[1][1])/2]}function v(t,e,n){t.on("start.zoom",(function(){b(this,arguments).start()})).on("interrupt.zoom end.zoom",(function(){b(this,arguments).end()})).tween("zoom",(function(){var t=this,i=arguments,a=b(t,i),o=r.apply(t,i),s=null==n?m(o):"function"==typeof n?n.apply(t,i):n,c=Math.max(o[1][0]-o[0][0],o[1][1]-o[0][1]),u=t.__zoom,h="function"==typeof e?e.apply(t,i):e,f=l(u.invert(s).concat(c/u.k),h.invert(s).concat(c/h.k));return function(t){if(1===t)t=h;else{var e=f(t),n=c/e[2];t=new eT(n,s[0]-e[0]*n,s[1]-e[1]*n)}a.zoom(null,t)}}))}function b(t,e,n){return!n&&t.__zooming||new _(t,e)}function _(t,e){this.that=t,this.args=e,this.active=0,this.extent=r.apply(t,e),this.taps=0}function x(){if(n.apply(this,arguments)){var t=b(this,arguments),e=this.__zoom,r=Math.max(s[0],Math.min(s[1],e.k*Math.pow(2,a.apply(this,arguments)))),o=Ln(this);if(t.wheel)t.mouse[0][0]===o[0]&&t.mouse[0][1]===o[1]||(t.mouse[1]=e.invert(t.mouse[0]=o)),clearTimeout(t.wheel);else{if(e.k===r)return;t.mouse=[o,e.invert(o)],ar(this),t.start()}aT(),t.wheel=setTimeout(u,150),t.zoom("mouse",i(y(g(e,r),t.mouse[0],t.mouse[1]),t.extent,c))}function u(){t.wheel=null,t.end()}}function w(){if(!e&&n.apply(this,arguments)){var t=b(this,arguments,!0),r=Te(le.view).on("mousemove.zoom",u,!0).on("mouseup.zoom",l,!0),a=Ln(this),o=le.clientX,s=le.clientY;Se(le.view),iT(),t.mouse=[a,this.__zoom.invert(a)],ar(this),t.start()}function u(){if(aT(),!t.moved){var e=le.clientX-o,n=le.clientY-s;t.moved=e*e+n*n>d}t.zoom("mouse",i(y(t.that.__zoom,t.mouse[0]=Ln(t.that),t.mouse[1]),t.extent,c))}function l(){r.on("mousemove.zoom mouseup.zoom",null),Ae(le.view,t.moved),aT(),t.end()}}function k(){if(n.apply(this,arguments)){var t=this.__zoom,e=Ln(this),a=t.invert(e),o=t.k*(le.shiftKey?.5:2),s=i(y(g(t,o),e,a),r.apply(this,arguments),c);aT(),u>0?Te(this).transition().duration(u).call(v,s,e):Te(this).call(p.transform,s)}}function T(){if(n.apply(this,arguments)){var e,r,i,a,o=le.touches,s=o.length,c=b(this,arguments,le.changedTouches.length===s);for(iT(),r=0;r{t.exports={graphlib:n(574),layout:n(8123),debug:n(7570),util:{time:n(1138).time,notime:n(1138).notime},version:n(8177)}},2188:(t,e,n)=>{"use strict";var r=n(8436),i=n(4079);t.exports={run:function(t){var e="greedy"===t.graph().acyclicer?i(t,function(t){return function(e){return t.edge(e).weight}}(t)):function(t){var e=[],n={},i={};return r.forEach(t.nodes(),(function a(o){r.has(i,o)||(i[o]=!0,n[o]=!0,r.forEach(t.outEdges(o),(function(t){r.has(n,t.w)?e.push(t):a(t.w)})),delete n[o])})),e}(t);r.forEach(e,(function(e){var n=t.edge(e);t.removeEdge(e),n.forwardName=e.name,n.reversed=!0,t.setEdge(e.w,e.v,n,r.uniqueId("rev"))}))},undo:function(t){r.forEach(t.edges(),(function(e){var n=t.edge(e);if(n.reversed){t.removeEdge(e);var r=n.forwardName;delete n.reversed,delete n.forwardName,t.setEdge(e.w,e.v,n,r)}}))}}},1133:(t,e,n)=>{var r=n(8436),i=n(1138);function a(t,e,n,r,a,o){var s={width:0,height:0,rank:o,borderType:e},c=a[e][o-1],u=i.addDummyNode(t,"border",s,n);a[e][o]=u,t.setParent(u,r),c&&t.setEdge(c,u,{weight:1})}t.exports=function(t){r.forEach(t.children(),(function e(n){var i=t.children(n),o=t.node(n);if(i.length&&r.forEach(i,e),r.has(o,"minRank")){o.borderLeft=[],o.borderRight=[];for(var s=o.minRank,c=o.maxRank+1;s{"use strict";var r=n(8436);function i(t){r.forEach(t.nodes(),(function(e){a(t.node(e))})),r.forEach(t.edges(),(function(e){a(t.edge(e))}))}function a(t){var e=t.width;t.width=t.height,t.height=e}function o(t){t.y=-t.y}function s(t){var e=t.x;t.x=t.y,t.y=e}t.exports={adjust:function(t){var e=t.graph().rankdir.toLowerCase();"lr"!==e&&"rl"!==e||i(t)},undo:function(t){var e=t.graph().rankdir.toLowerCase();"bt"!==e&&"rl"!==e||function(t){r.forEach(t.nodes(),(function(e){o(t.node(e))})),r.forEach(t.edges(),(function(e){var n=t.edge(e);r.forEach(n.points,o),r.has(n,"y")&&o(n)}))}(t),"lr"!==e&&"rl"!==e||(function(t){r.forEach(t.nodes(),(function(e){s(t.node(e))})),r.forEach(t.edges(),(function(e){var n=t.edge(e);r.forEach(n.points,s),r.has(n,"x")&&s(n)}))}(t),i(t))}}},7822:t=>{function e(){var t={};t._next=t._prev=t,this._sentinel=t}function n(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function r(t,e){if("_next"!==t&&"_prev"!==t)return e}t.exports=e,e.prototype.dequeue=function(){var t=this._sentinel,e=t._prev;if(e!==t)return n(e),e},e.prototype.enqueue=function(t){var e=this._sentinel;t._prev&&t._next&&n(t),t._next=e._next,e._next._prev=t,e._next=t,t._prev=e},e.prototype.toString=function(){for(var t=[],e=this._sentinel,n=e._prev;n!==e;)t.push(JSON.stringify(n,r)),n=n._prev;return"["+t.join(", ")+"]"}},7570:(t,e,n)=>{var r=n(8436),i=n(1138),a=n(574).Graph;t.exports={debugOrdering:function(t){var e=i.buildLayerMatrix(t),n=new a({compound:!0,multigraph:!0}).setGraph({});return r.forEach(t.nodes(),(function(e){n.setNode(e,{label:e}),n.setParent(e,"layer"+t.node(e).rank)})),r.forEach(t.edges(),(function(t){n.setEdge(t.v,t.w,{},t.name)})),r.forEach(e,(function(t,e){var i="layer"+e;n.setNode(i,{rank:"same"}),r.reduce(t,(function(t,e){return n.setEdge(t,e,{style:"invis"}),e}))})),n}}},574:(t,e,n)=>{var r;try{r=n(8282)}catch(t){}r||(r=window.graphlib),t.exports=r},4079:(t,e,n)=>{var r=n(8436),i=n(574).Graph,a=n(7822);t.exports=function(t,e){if(t.nodeCount()<=1)return[];var n=function(t,e){var n=new i,o=0,s=0;r.forEach(t.nodes(),(function(t){n.setNode(t,{v:t,in:0,out:0})})),r.forEach(t.edges(),(function(t){var r=n.edge(t.v,t.w)||0,i=e(t),a=r+i;n.setEdge(t.v,t.w,a),s=Math.max(s,n.node(t.v).out+=i),o=Math.max(o,n.node(t.w).in+=i)}));var u=r.range(s+o+3).map((function(){return new a})),l=o+1;return r.forEach(n.nodes(),(function(t){c(u,l,n.node(t))})),{graph:n,buckets:u,zeroIdx:l}}(t,e||o),u=function(t,e,n){for(var r,i=[],a=e[e.length-1],o=e[0];t.nodeCount();){for(;r=o.dequeue();)s(t,e,n,r);for(;r=a.dequeue();)s(t,e,n,r);if(t.nodeCount())for(var c=e.length-2;c>0;--c)if(r=e[c].dequeue()){i=i.concat(s(t,e,n,r,!0));break}}return i}(n.graph,n.buckets,n.zeroIdx);return r.flatten(r.map(u,(function(e){return t.outEdges(e.v,e.w)})),!0)};var o=r.constant(1);function s(t,e,n,i,a){var o=a?[]:void 0;return r.forEach(t.inEdges(i.v),(function(r){var i=t.edge(r),s=t.node(r.v);a&&o.push({v:r.v,w:r.w}),s.out-=i,c(e,n,s)})),r.forEach(t.outEdges(i.v),(function(r){var i=t.edge(r),a=r.w,o=t.node(a);o.in-=i,c(e,n,o)})),t.removeNode(i.v),o}function c(t,e,n){n.out?n.in?t[n.out-n.in+e].enqueue(n):t[t.length-1].enqueue(n):t[0].enqueue(n)}},8123:(t,e,n)=>{"use strict";var r=n(8436),i=n(2188),a=n(5995),o=n(8093),s=n(1138).normalizeRanks,c=n(4219),u=n(1138).removeEmptyRanks,l=n(2981),h=n(1133),f=n(3258),d=n(3408),p=n(7873),g=n(1138),y=n(574).Graph;t.exports=function(t,e){var n=e&&e.debugTiming?g.time:g.notime;n("layout",(function(){var e=n(" buildLayoutGraph",(function(){return function(t){var e=new y({multigraph:!0,compound:!0}),n=E(t.graph());return e.setGraph(r.merge({},v,C(n,m),r.pick(n,b))),r.forEach(t.nodes(),(function(n){var i=E(t.node(n));e.setNode(n,r.defaults(C(i,_),x)),e.setParent(n,t.parent(n))})),r.forEach(t.edges(),(function(n){var i=E(t.edge(n));e.setEdge(n,r.merge({},k,C(i,w),r.pick(i,T)))})),e}(t)}));n(" runLayout",(function(){!function(t,e){e(" makeSpaceForEdgeLabels",(function(){!function(t){var e=t.graph();e.ranksep/=2,r.forEach(t.edges(),(function(n){var r=t.edge(n);r.minlen*=2,"c"!==r.labelpos.toLowerCase()&&("TB"===e.rankdir||"BT"===e.rankdir?r.width+=r.labeloffset:r.height+=r.labeloffset)}))}(t)})),e(" removeSelfEdges",(function(){!function(t){r.forEach(t.edges(),(function(e){if(e.v===e.w){var n=t.node(e.v);n.selfEdges||(n.selfEdges=[]),n.selfEdges.push({e,label:t.edge(e)}),t.removeEdge(e)}}))}(t)})),e(" acyclic",(function(){i.run(t)})),e(" nestingGraph.run",(function(){l.run(t)})),e(" rank",(function(){o(g.asNonCompoundGraph(t))})),e(" injectEdgeLabelProxies",(function(){!function(t){r.forEach(t.edges(),(function(e){var n=t.edge(e);if(n.width&&n.height){var r=t.node(e.v),i={rank:(t.node(e.w).rank-r.rank)/2+r.rank,e};g.addDummyNode(t,"edge-proxy",i,"_ep")}}))}(t)})),e(" removeEmptyRanks",(function(){u(t)})),e(" nestingGraph.cleanup",(function(){l.cleanup(t)})),e(" normalizeRanks",(function(){s(t)})),e(" assignRankMinMax",(function(){!function(t){var e=0;r.forEach(t.nodes(),(function(n){var i=t.node(n);i.borderTop&&(i.minRank=t.node(i.borderTop).rank,i.maxRank=t.node(i.borderBottom).rank,e=r.max(e,i.maxRank))})),t.graph().maxRank=e}(t)})),e(" removeEdgeLabelProxies",(function(){!function(t){r.forEach(t.nodes(),(function(e){var n=t.node(e);"edge-proxy"===n.dummy&&(t.edge(n.e).labelRank=n.rank,t.removeNode(e))}))}(t)})),e(" normalize.run",(function(){a.run(t)})),e(" parentDummyChains",(function(){c(t)})),e(" addBorderSegments",(function(){h(t)})),e(" order",(function(){d(t)})),e(" insertSelfEdges",(function(){!function(t){var e=g.buildLayerMatrix(t);r.forEach(e,(function(e){var n=0;r.forEach(e,(function(e,i){var a=t.node(e);a.order=i+n,r.forEach(a.selfEdges,(function(e){g.addDummyNode(t,"selfedge",{width:e.label.width,height:e.label.height,rank:a.rank,order:i+ ++n,e:e.e,label:e.label},"_se")})),delete a.selfEdges}))}))}(t)})),e(" adjustCoordinateSystem",(function(){f.adjust(t)})),e(" position",(function(){p(t)})),e(" positionSelfEdges",(function(){!function(t){r.forEach(t.nodes(),(function(e){var n=t.node(e);if("selfedge"===n.dummy){var r=t.node(n.e.v),i=r.x+r.width/2,a=r.y,o=n.x-i,s=r.height/2;t.setEdge(n.e,n.label),t.removeNode(e),n.label.points=[{x:i+2*o/3,y:a-s},{x:i+5*o/6,y:a-s},{x:i+o,y:a},{x:i+5*o/6,y:a+s},{x:i+2*o/3,y:a+s}],n.label.x=n.x,n.label.y=n.y}}))}(t)})),e(" removeBorderNodes",(function(){!function(t){r.forEach(t.nodes(),(function(e){if(t.children(e).length){var n=t.node(e),i=t.node(n.borderTop),a=t.node(n.borderBottom),o=t.node(r.last(n.borderLeft)),s=t.node(r.last(n.borderRight));n.width=Math.abs(s.x-o.x),n.height=Math.abs(a.y-i.y),n.x=o.x+n.width/2,n.y=i.y+n.height/2}})),r.forEach(t.nodes(),(function(e){"border"===t.node(e).dummy&&t.removeNode(e)}))}(t)})),e(" normalize.undo",(function(){a.undo(t)})),e(" fixupEdgeLabelCoords",(function(){!function(t){r.forEach(t.edges(),(function(e){var n=t.edge(e);if(r.has(n,"x"))switch("l"!==n.labelpos&&"r"!==n.labelpos||(n.width-=n.labeloffset),n.labelpos){case"l":n.x-=n.width/2+n.labeloffset;break;case"r":n.x+=n.width/2+n.labeloffset}}))}(t)})),e(" undoCoordinateSystem",(function(){f.undo(t)})),e(" translateGraph",(function(){!function(t){var e=Number.POSITIVE_INFINITY,n=0,i=Number.POSITIVE_INFINITY,a=0,o=t.graph(),s=o.marginx||0,c=o.marginy||0;function u(t){var r=t.x,o=t.y,s=t.width,c=t.height;e=Math.min(e,r-s/2),n=Math.max(n,r+s/2),i=Math.min(i,o-c/2),a=Math.max(a,o+c/2)}r.forEach(t.nodes(),(function(e){u(t.node(e))})),r.forEach(t.edges(),(function(e){var n=t.edge(e);r.has(n,"x")&&u(n)})),e-=s,i-=c,r.forEach(t.nodes(),(function(n){var r=t.node(n);r.x-=e,r.y-=i})),r.forEach(t.edges(),(function(n){var a=t.edge(n);r.forEach(a.points,(function(t){t.x-=e,t.y-=i})),r.has(a,"x")&&(a.x-=e),r.has(a,"y")&&(a.y-=i)})),o.width=n-e+s,o.height=a-i+c}(t)})),e(" assignNodeIntersects",(function(){!function(t){r.forEach(t.edges(),(function(e){var n,r,i=t.edge(e),a=t.node(e.v),o=t.node(e.w);i.points?(n=i.points[0],r=i.points[i.points.length-1]):(i.points=[],n=o,r=a),i.points.unshift(g.intersectRect(a,n)),i.points.push(g.intersectRect(o,r))}))}(t)})),e(" reversePoints",(function(){!function(t){r.forEach(t.edges(),(function(e){var n=t.edge(e);n.reversed&&n.points.reverse()}))}(t)})),e(" acyclic.undo",(function(){i.undo(t)}))}(e,n)})),n(" updateInputGraph",(function(){!function(t,e){r.forEach(t.nodes(),(function(n){var r=t.node(n),i=e.node(n);r&&(r.x=i.x,r.y=i.y,e.children(n).length&&(r.width=i.width,r.height=i.height))})),r.forEach(t.edges(),(function(n){var i=t.edge(n),a=e.edge(n);i.points=a.points,r.has(a,"x")&&(i.x=a.x,i.y=a.y)})),t.graph().width=e.graph().width,t.graph().height=e.graph().height}(t,e)}))}))};var m=["nodesep","edgesep","ranksep","marginx","marginy"],v={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},b=["acyclicer","ranker","rankdir","align"],_=["width","height"],x={width:0,height:0},w=["minlen","weight","width","height","labeloffset"],k={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},T=["labelpos"];function C(t,e){return r.mapValues(r.pick(t,e),Number)}function E(t){var e={};return r.forEach(t,(function(t,n){e[n.toLowerCase()]=t})),e}},8436:(t,e,n)=>{var r;try{r={cloneDeep:n(361),constant:n(5703),defaults:n(1747),each:n(6073),filter:n(3105),find:n(3311),flatten:n(5564),forEach:n(4486),forIn:n(2620),has:n(8721),isUndefined:n(2353),last:n(928),map:n(5161),mapValues:n(6604),max:n(6162),merge:n(3857),min:n(3632),minBy:n(2762),now:n(7771),pick:n(9722),range:n(6026),reduce:n(4061),sortBy:n(9734),uniqueId:n(3955),values:n(2628),zipObject:n(7287)}}catch(t){}r||(r=window._),t.exports=r},2981:(t,e,n)=>{var r=n(8436),i=n(1138);function a(t,e,n,o,s,c,u){var l=t.children(u);if(l.length){var h=i.addBorderNode(t,"_bt"),f=i.addBorderNode(t,"_bb"),d=t.node(u);t.setParent(h,u),d.borderTop=h,t.setParent(f,u),d.borderBottom=f,r.forEach(l,(function(r){a(t,e,n,o,s,c,r);var i=t.node(r),l=i.borderTop?i.borderTop:r,d=i.borderBottom?i.borderBottom:r,p=i.borderTop?o:2*o,g=l!==d?1:s-c[u]+1;t.setEdge(h,l,{weight:p,minlen:g,nestingEdge:!0}),t.setEdge(d,f,{weight:p,minlen:g,nestingEdge:!0})})),t.parent(u)||t.setEdge(e,h,{weight:0,minlen:s+c[u]})}else u!==e&&t.setEdge(e,u,{weight:0,minlen:n})}t.exports={run:function(t){var e=i.addDummyNode(t,"root",{},"_root"),n=function(t){var e={};function n(i,a){var o=t.children(i);o&&o.length&&r.forEach(o,(function(t){n(t,a+1)})),e[i]=a}return r.forEach(t.children(),(function(t){n(t,1)})),e}(t),o=r.max(r.values(n))-1,s=2*o+1;t.graph().nestingRoot=e,r.forEach(t.edges(),(function(e){t.edge(e).minlen*=s}));var c=function(t){return r.reduce(t.edges(),(function(e,n){return e+t.edge(n).weight}),0)}(t)+1;r.forEach(t.children(),(function(r){a(t,e,s,c,o,n,r)})),t.graph().nodeRankFactor=s},cleanup:function(t){var e=t.graph();t.removeNode(e.nestingRoot),delete e.nestingRoot,r.forEach(t.edges(),(function(e){t.edge(e).nestingEdge&&t.removeEdge(e)}))}}},5995:(t,e,n)=>{"use strict";var r=n(8436),i=n(1138);t.exports={run:function(t){t.graph().dummyChains=[],r.forEach(t.edges(),(function(e){!function(t,e){var n,r,a,o=e.v,s=t.node(o).rank,c=e.w,u=t.node(c).rank,l=e.name,h=t.edge(e),f=h.labelRank;if(u!==s+1){for(t.removeEdge(e),a=0,++s;s{var r=n(8436);t.exports=function(t,e,n){var i,a={};r.forEach(n,(function(n){for(var r,o,s=t.parent(n);s;){if((r=t.parent(s))?(o=a[r],a[r]=s):(o=i,i=s),o&&o!==s)return void e.setEdge(o,s);s=r}}))}},5439:(t,e,n)=>{var r=n(8436);t.exports=function(t,e){return r.map(e,(function(e){var n=t.inEdges(e);if(n.length){var i=r.reduce(n,(function(e,n){var r=t.edge(n),i=t.node(n.v);return{sum:e.sum+r.weight*i.order,weight:e.weight+r.weight}}),{sum:0,weight:0});return{v:e,barycenter:i.sum/i.weight,weight:i.weight}}return{v:e}}))}},3128:(t,e,n)=>{var r=n(8436),i=n(574).Graph;t.exports=function(t,e,n){var a=function(t){for(var e;t.hasNode(e=r.uniqueId("_root")););return e}(t),o=new i({compound:!0}).setGraph({root:a}).setDefaultNodeLabel((function(e){return t.node(e)}));return r.forEach(t.nodes(),(function(i){var s=t.node(i),c=t.parent(i);(s.rank===e||s.minRank<=e&&e<=s.maxRank)&&(o.setNode(i),o.setParent(i,c||a),r.forEach(t[n](i),(function(e){var n=e.v===i?e.w:e.v,a=o.edge(n,i),s=r.isUndefined(a)?0:a.weight;o.setEdge(n,i,{weight:t.edge(e).weight+s})})),r.has(s,"minRank")&&o.setNode(i,{borderLeft:s.borderLeft[e],borderRight:s.borderRight[e]}))})),o}},6630:(t,e,n)=>{"use strict";var r=n(8436);function i(t,e,n){for(var i=r.zipObject(n,r.map(n,(function(t,e){return e}))),a=r.flatten(r.map(e,(function(e){return r.sortBy(r.map(t.outEdges(e),(function(e){return{pos:i[e.w],weight:t.edge(e).weight}})),"pos")})),!0),o=1;o0;)e%2&&(n+=c[e+1]),c[e=e-1>>1]+=t.weight;u+=t.weight*n}))),u}t.exports=function(t,e){for(var n=0,r=1;r{"use strict";var r=n(8436),i=n(2588),a=n(6630),o=n(1026),s=n(3128),c=n(5093),u=n(574).Graph,l=n(1138);function h(t,e,n){return r.map(e,(function(e){return s(t,e,n)}))}function f(t,e){var n=new u;r.forEach(t,(function(t){var i=t.graph().root,a=o(t,i,n,e);r.forEach(a.vs,(function(e,n){t.node(e).order=n})),c(t,n,a.vs)}))}function d(t,e){r.forEach(e,(function(e){r.forEach(e,(function(e,n){t.node(e).order=n}))}))}t.exports=function(t){var e=l.maxRank(t),n=h(t,r.range(1,e+1),"inEdges"),o=h(t,r.range(e-1,-1,-1),"outEdges"),s=i(t);d(t,s);for(var c,u=Number.POSITIVE_INFINITY,p=0,g=0;g<4;++p,++g){f(p%2?n:o,p%4>=2),s=l.buildLayerMatrix(t);var y=a(t,s);y{"use strict";var r=n(8436);t.exports=function(t){var e={},n=r.filter(t.nodes(),(function(e){return!t.children(e).length})),i=r.max(r.map(n,(function(e){return t.node(e).rank}))),a=r.map(r.range(i+1),(function(){return[]})),o=r.sortBy(n,(function(e){return t.node(e).rank}));return r.forEach(o,(function n(i){if(!r.has(e,i)){e[i]=!0;var o=t.node(i);a[o.rank].push(i),r.forEach(t.successors(i),n)}})),a}},9567:(t,e,n)=>{"use strict";var r=n(8436);t.exports=function(t,e){var n={};return r.forEach(t,(function(t,e){var i=n[t.v]={indegree:0,in:[],out:[],vs:[t.v],i:e};r.isUndefined(t.barycenter)||(i.barycenter=t.barycenter,i.weight=t.weight)})),r.forEach(e.edges(),(function(t){var e=n[t.v],i=n[t.w];r.isUndefined(e)||r.isUndefined(i)||(i.indegree++,e.out.push(n[t.w]))})),function(t){var e=[];function n(t){return function(e){var n,i,a,o;e.merged||(r.isUndefined(e.barycenter)||r.isUndefined(t.barycenter)||e.barycenter>=t.barycenter)&&(i=e,a=0,o=0,(n=t).weight&&(a+=n.barycenter*n.weight,o+=n.weight),i.weight&&(a+=i.barycenter*i.weight,o+=i.weight),n.vs=i.vs.concat(n.vs),n.barycenter=a/o,n.weight=o,n.i=Math.min(i.i,n.i),i.merged=!0)}}function i(e){return function(n){n.in.push(e),0==--n.indegree&&t.push(n)}}for(;t.length;){var a=t.pop();e.push(a),r.forEach(a.in.reverse(),n(a)),r.forEach(a.out,i(a))}return r.map(r.filter(e,(function(t){return!t.merged})),(function(t){return r.pick(t,["vs","i","barycenter","weight"])}))}(r.filter(n,(function(t){return!t.indegree})))}},1026:(t,e,n)=>{var r=n(8436),i=n(5439),a=n(9567),o=n(7304);t.exports=function t(e,n,s,c){var u=e.children(n),l=e.node(n),h=l?l.borderLeft:void 0,f=l?l.borderRight:void 0,d={};h&&(u=r.filter(u,(function(t){return t!==h&&t!==f})));var p=i(e,u);r.forEach(p,(function(n){if(e.children(n.v).length){var i=t(e,n.v,s,c);d[n.v]=i,r.has(i,"barycenter")&&(a=n,o=i,r.isUndefined(a.barycenter)?(a.barycenter=o.barycenter,a.weight=o.weight):(a.barycenter=(a.barycenter*a.weight+o.barycenter*o.weight)/(a.weight+o.weight),a.weight+=o.weight))}var a,o}));var g=a(p,s);!function(t,e){r.forEach(t,(function(t){t.vs=r.flatten(t.vs.map((function(t){return e[t]?e[t].vs:t})),!0)}))}(g,d);var y=o(g,c);if(h&&(y.vs=r.flatten([h,y.vs,f],!0),e.predecessors(h).length)){var m=e.node(e.predecessors(h)[0]),v=e.node(e.predecessors(f)[0]);r.has(y,"barycenter")||(y.barycenter=0,y.weight=0),y.barycenter=(y.barycenter*y.weight+m.order+v.order)/(y.weight+2),y.weight+=2}return y}},7304:(t,e,n)=>{var r=n(8436),i=n(1138);function a(t,e,n){for(var i;e.length&&(i=r.last(e)).i<=n;)e.pop(),t.push(i.vs),n++;return n}t.exports=function(t,e){var n,o=i.partition(t,(function(t){return r.has(t,"barycenter")})),s=o.lhs,c=r.sortBy(o.rhs,(function(t){return-t.i})),u=[],l=0,h=0,f=0;s.sort((n=!!e,function(t,e){return t.barycentere.barycenter?1:n?e.i-t.i:t.i-e.i})),f=a(u,c,f),r.forEach(s,(function(t){f+=t.vs.length,u.push(t.vs),l+=t.barycenter*t.weight,h+=t.weight,f=a(u,c,f)}));var d={vs:r.flatten(u,!0)};return h&&(d.barycenter=l/h,d.weight=h),d}},4219:(t,e,n)=>{var r=n(8436);t.exports=function(t){var e=function(t){var e={},n=0;return r.forEach(t.children(),(function i(a){var o=n;r.forEach(t.children(a),i),e[a]={low:o,lim:n++}})),e}(t);r.forEach(t.graph().dummyChains,(function(n){for(var r=t.node(n),i=r.edgeObj,a=function(t,e,n,r){var i,a,o=[],s=[],c=Math.min(e[n].low,e[r].low),u=Math.max(e[n].lim,e[r].lim);i=n;do{i=t.parent(i),o.push(i)}while(i&&(e[i].low>c||u>e[i].lim));for(a=i,i=r;(i=t.parent(i))!==a;)s.push(i);return{path:o.concat(s.reverse()),lca:a}}(t,e,i.v,i.w),o=a.path,s=a.lca,c=0,u=o[c],l=!0;n!==i.w;){if(r=t.node(n),l){for(;(u=o[c])!==s&&t.node(u).maxRank{"use strict";var r=n(8436),i=n(574).Graph,a=n(1138);function o(t,e){var n={};return r.reduce(e,(function(e,i){var a=0,o=0,s=e.length,u=r.last(i);return r.forEach(i,(function(e,l){var h=function(t,e){if(t.node(e).dummy)return r.find(t.predecessors(e),(function(e){return t.node(e).dummy}))}(t,e),f=h?t.node(h).order:s;(h||e===u)&&(r.forEach(i.slice(o,l+1),(function(e){r.forEach(t.predecessors(e),(function(r){var i=t.node(r),o=i.order;!(os)&&c(n,e,u)}))}))}return r.reduce(e,(function(e,n){var a,o=-1,s=0;return r.forEach(n,(function(r,c){if("border"===t.node(r).dummy){var u=t.predecessors(r);u.length&&(a=t.node(u[0]).order,i(n,s,c,o,a),s=c,o=a)}i(n,s,n.length,a,e.length)})),n})),n}function c(t,e,n){if(e>n){var r=e;e=n,n=r}var i=t[e];i||(t[e]=i={}),i[n]=!0}function u(t,e,n){if(e>n){var i=e;e=n,n=i}return r.has(t[e],n)}function l(t,e,n,i){var a={},o={},s={};return r.forEach(e,(function(t){r.forEach(t,(function(t,e){a[t]=t,o[t]=t,s[t]=e}))})),r.forEach(e,(function(t){var e=-1;r.forEach(t,(function(t){var c=i(t);if(c.length){c=r.sortBy(c,(function(t){return s[t]}));for(var l=(c.length-1)/2,h=Math.floor(l),f=Math.ceil(l);h<=f;++h){var d=c[h];o[t]===t&&e{"use strict";var r=n(8436),i=n(1138),a=n(3573).positionX;t.exports=function(t){(function(t){var e=i.buildLayerMatrix(t),n=t.graph().ranksep,a=0;r.forEach(e,(function(e){var i=r.max(r.map(e,(function(e){return t.node(e).height})));r.forEach(e,(function(e){t.node(e).y=a+i/2})),a+=i+n}))})(t=i.asNonCompoundGraph(t)),r.forEach(a(t),(function(e,n){t.node(n).x=e}))}},300:(t,e,n)=>{"use strict";var r=n(8436),i=n(574).Graph,a=n(6681).slack;function o(t,e){return r.forEach(t.nodes(),(function n(i){r.forEach(e.nodeEdges(i),(function(r){var o=r.v,s=i===o?r.w:o;t.hasNode(s)||a(e,r)||(t.setNode(s,{}),t.setEdge(i,s,{}),n(s))}))})),t.nodeCount()}function s(t,e){return r.minBy(e.edges(),(function(n){if(t.hasNode(n.v)!==t.hasNode(n.w))return a(e,n)}))}function c(t,e,n){r.forEach(t.nodes(),(function(t){e.node(t).rank+=n}))}t.exports=function(t){var e,n,r=new i({directed:!1}),u=t.nodes()[0],l=t.nodeCount();for(r.setNode(u,{});o(r,t){"use strict";var r=n(6681).longestPath,i=n(300),a=n(2472);t.exports=function(t){switch(t.graph().ranker){case"network-simplex":default:!function(t){a(t)}(t);break;case"tight-tree":!function(t){r(t),i(t)}(t);break;case"longest-path":o(t)}};var o=r},2472:(t,e,n)=>{"use strict";var r=n(8436),i=n(300),a=n(6681).slack,o=n(6681).longestPath,s=n(574).alg.preorder,c=n(574).alg.postorder,u=n(1138).simplify;function l(t){t=u(t),o(t);var e,n=i(t);for(d(n),h(n,t);e=g(n);)m(n,t,e,y(n,t,e))}function h(t,e){var n=c(t,t.nodes());n=n.slice(0,n.length-1),r.forEach(n,(function(n){!function(t,e,n){var r=t.node(n).parent;t.edge(n,r).cutvalue=f(t,e,n)}(t,e,n)}))}function f(t,e,n){var i=t.node(n).parent,a=!0,o=e.edge(n,i),s=0;return o||(a=!1,o=e.edge(i,n)),s=o.weight,r.forEach(e.nodeEdges(n),(function(r){var o,c,u=r.v===n,l=u?r.w:r.v;if(l!==i){var h=u===a,f=e.edge(r).weight;if(s+=h?f:-f,o=n,c=l,t.hasEdge(o,c)){var d=t.edge(n,l).cutvalue;s+=h?-d:d}}})),s}function d(t,e){arguments.length<2&&(e=t.nodes()[0]),p(t,{},1,e)}function p(t,e,n,i,a){var o=n,s=t.node(i);return e[i]=!0,r.forEach(t.neighbors(i),(function(a){r.has(e,a)||(n=p(t,e,n,a,i))})),s.low=o,s.lim=n++,a?s.parent=a:delete s.parent,n}function g(t){return r.find(t.edges(),(function(e){return t.edge(e).cutvalue<0}))}function y(t,e,n){var i=n.v,o=n.w;e.hasEdge(i,o)||(i=n.w,o=n.v);var s=t.node(i),c=t.node(o),u=s,l=!1;s.lim>c.lim&&(u=c,l=!0);var h=r.filter(e.edges(),(function(e){return l===v(0,t.node(e.v),u)&&l!==v(0,t.node(e.w),u)}));return r.minBy(h,(function(t){return a(e,t)}))}function m(t,e,n,i){var a=n.v,o=n.w;t.removeEdge(a,o),t.setEdge(i.v,i.w,{}),d(t),h(t,e),function(t,e){var n=r.find(t.nodes(),(function(t){return!e.node(t).parent})),i=s(t,n);i=i.slice(1),r.forEach(i,(function(n){var r=t.node(n).parent,i=e.edge(n,r),a=!1;i||(i=e.edge(r,n),a=!0),e.node(n).rank=e.node(r).rank+(a?i.minlen:-i.minlen)}))}(t,e)}function v(t,e,n){return n.low<=e.lim&&e.lim<=n.lim}t.exports=l,l.initLowLimValues=d,l.initCutValues=h,l.calcCutValue=f,l.leaveEdge=g,l.enterEdge=y,l.exchangeEdges=m},6681:(t,e,n)=>{"use strict";var r=n(8436);t.exports={longestPath:function(t){var e={};r.forEach(t.sources(),(function n(i){var a=t.node(i);if(r.has(e,i))return a.rank;e[i]=!0;var o=r.min(r.map(t.outEdges(i),(function(e){return n(e.w)-t.edge(e).minlen})));return o!==Number.POSITIVE_INFINITY&&null!=o||(o=0),a.rank=o}))},slack:function(t,e){return t.node(e.w).rank-t.node(e.v).rank-t.edge(e).minlen}}},1138:(t,e,n)=>{"use strict";var r=n(8436),i=n(574).Graph;function a(t,e,n,i){var a;do{a=r.uniqueId(i)}while(t.hasNode(a));return n.dummy=e,t.setNode(a,n),a}function o(t){return r.max(r.map(t.nodes(),(function(e){var n=t.node(e).rank;if(!r.isUndefined(n))return n})))}t.exports={addDummyNode:a,simplify:function(t){var e=(new i).setGraph(t.graph());return r.forEach(t.nodes(),(function(n){e.setNode(n,t.node(n))})),r.forEach(t.edges(),(function(n){var r=e.edge(n.v,n.w)||{weight:0,minlen:1},i=t.edge(n);e.setEdge(n.v,n.w,{weight:r.weight+i.weight,minlen:Math.max(r.minlen,i.minlen)})})),e},asNonCompoundGraph:function(t){var e=new i({multigraph:t.isMultigraph()}).setGraph(t.graph());return r.forEach(t.nodes(),(function(n){t.children(n).length||e.setNode(n,t.node(n))})),r.forEach(t.edges(),(function(n){e.setEdge(n,t.edge(n))})),e},successorWeights:function(t){var e=r.map(t.nodes(),(function(e){var n={};return r.forEach(t.outEdges(e),(function(e){n[e.w]=(n[e.w]||0)+t.edge(e).weight})),n}));return r.zipObject(t.nodes(),e)},predecessorWeights:function(t){var e=r.map(t.nodes(),(function(e){var n={};return r.forEach(t.inEdges(e),(function(e){n[e.v]=(n[e.v]||0)+t.edge(e).weight})),n}));return r.zipObject(t.nodes(),e)},intersectRect:function(t,e){var n,r,i=t.x,a=t.y,o=e.x-i,s=e.y-a,c=t.width/2,u=t.height/2;if(!o&&!s)throw new Error("Not possible to find intersection inside of the rectangle");return Math.abs(s)*c>Math.abs(o)*u?(s<0&&(u=-u),n=u*o/s,r=u):(o<0&&(c=-c),n=c,r=c*s/o),{x:i+n,y:a+r}},buildLayerMatrix:function(t){var e=r.map(r.range(o(t)+1),(function(){return[]}));return r.forEach(t.nodes(),(function(n){var i=t.node(n),a=i.rank;r.isUndefined(a)||(e[a][i.order]=n)})),e},normalizeRanks:function(t){var e=r.min(r.map(t.nodes(),(function(e){return t.node(e).rank})));r.forEach(t.nodes(),(function(n){var i=t.node(n);r.has(i,"rank")&&(i.rank-=e)}))},removeEmptyRanks:function(t){var e=r.min(r.map(t.nodes(),(function(e){return t.node(e).rank}))),n=[];r.forEach(t.nodes(),(function(r){var i=t.node(r).rank-e;n[i]||(n[i]=[]),n[i].push(r)}));var i=0,a=t.graph().nodeRankFactor;r.forEach(n,(function(e,n){r.isUndefined(e)&&n%a!=0?--i:i&&r.forEach(e,(function(e){t.node(e).rank+=i}))}))},addBorderNode:function(t,e,n,r){var i={width:0,height:0};return arguments.length>=4&&(i.rank=n,i.order=r),a(t,"border",i,e)},maxRank:o,partition:function(t,e){var n={lhs:[],rhs:[]};return r.forEach(t,(function(t){e(t)?n.lhs.push(t):n.rhs.push(t)})),n},time:function(t,e){var n=r.now();try{return e()}finally{console.log(t+" time: "+(r.now()-n)+"ms")}},notime:function(t,e){return e()}}},8177:t=>{t.exports="0.8.5"},7856:function(t){t.exports=function(){"use strict";var t=Object.hasOwnProperty,e=Object.setPrototypeOf,n=Object.isFrozen,r=Object.getPrototypeOf,i=Object.getOwnPropertyDescriptor,a=Object.freeze,o=Object.seal,s=Object.create,c="undefined"!=typeof Reflect&&Reflect,u=c.apply,l=c.construct;u||(u=function(t,e,n){return t.apply(e,n)}),a||(a=function(t){return t}),o||(o=function(t){return t}),l||(l=function(t,e){return new(Function.prototype.bind.apply(t,[null].concat(function(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1?n-1:0),i=1;i/gm),Y=o(/^data-[\-\w.\u00B7-\uFFFF]/),j=o(/^aria-[\-\w]+$/),U=o(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),z=o(/^(?:\w+script|data):/i),$=o(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),q=o(/^html$/i),H="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};function W(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e0&&void 0!==arguments[0]?arguments[0]:V(),n=function(e){return t(e)};if(n.version="2.3.6",n.removed=[],!e||!e.document||9!==e.document.nodeType)return n.isSupported=!1,n;var r=e.document,i=e.document,o=e.DocumentFragment,s=e.HTMLTemplateElement,c=e.Node,u=e.Element,l=e.NodeFilter,h=e.NamedNodeMap,w=void 0===h?e.NamedNodeMap||e.MozNamedAttrMap:h,X=e.HTMLFormElement,Z=e.DOMParser,Q=e.trustedTypes,K=u.prototype,J=C(K,"cloneNode"),tt=C(K,"nextSibling"),et=C(K,"childNodes"),nt=C(K,"parentNode");if("function"==typeof s){var rt=i.createElement("template");rt.content&&rt.content.ownerDocument&&(i=rt.content.ownerDocument)}var it=G(Q,r),at=it?it.createHTML(""):"",ot=i,st=ot.implementation,ct=ot.createNodeIterator,ut=ot.createDocumentFragment,lt=ot.getElementsByTagName,ht=r.importNode,ft={};try{ft=T(i).documentMode?i.documentMode:{}}catch(t){}var dt={};n.isSupported="function"==typeof nt&&st&&void 0!==st.createHTMLDocument&&9!==ft;var pt=F,gt=P,yt=Y,mt=j,vt=z,bt=$,_t=U,xt=null,wt=k({},[].concat(W(E),W(S),W(A),W(N),W(B))),kt=null,Tt=k({},[].concat(W(L),W(O),W(I),W(R))),Ct=Object.seal(Object.create(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Et=null,St=null,At=!0,Mt=!0,Nt=!1,Dt=!1,Bt=!1,Lt=!1,Ot=!1,It=!1,Rt=!1,Ft=!1,Pt=!0,Yt=!0,jt=!1,Ut={},zt=null,$t=k({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),qt=null,Ht=k({},["audio","video","img","source","image","track"]),Wt=null,Vt=k({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Gt="http://www.w3.org/1998/Math/MathML",Xt="http://www.w3.org/2000/svg",Zt="http://www.w3.org/1999/xhtml",Qt=Zt,Kt=!1,Jt=void 0,te=["application/xhtml+xml","text/html"],ee="text/html",ne=void 0,re=null,ie=i.createElement("form"),ae=function(t){return t instanceof RegExp||t instanceof Function},oe=function(t){re&&re===t||(t&&"object"===(void 0===t?"undefined":H(t))||(t={}),t=T(t),xt="ALLOWED_TAGS"in t?k({},t.ALLOWED_TAGS):wt,kt="ALLOWED_ATTR"in t?k({},t.ALLOWED_ATTR):Tt,Wt="ADD_URI_SAFE_ATTR"in t?k(T(Vt),t.ADD_URI_SAFE_ATTR):Vt,qt="ADD_DATA_URI_TAGS"in t?k(T(Ht),t.ADD_DATA_URI_TAGS):Ht,zt="FORBID_CONTENTS"in t?k({},t.FORBID_CONTENTS):$t,Et="FORBID_TAGS"in t?k({},t.FORBID_TAGS):{},St="FORBID_ATTR"in t?k({},t.FORBID_ATTR):{},Ut="USE_PROFILES"in t&&t.USE_PROFILES,At=!1!==t.ALLOW_ARIA_ATTR,Mt=!1!==t.ALLOW_DATA_ATTR,Nt=t.ALLOW_UNKNOWN_PROTOCOLS||!1,Dt=t.SAFE_FOR_TEMPLATES||!1,Bt=t.WHOLE_DOCUMENT||!1,It=t.RETURN_DOM||!1,Rt=t.RETURN_DOM_FRAGMENT||!1,Ft=t.RETURN_TRUSTED_TYPE||!1,Ot=t.FORCE_BODY||!1,Pt=!1!==t.SANITIZE_DOM,Yt=!1!==t.KEEP_CONTENT,jt=t.IN_PLACE||!1,_t=t.ALLOWED_URI_REGEXP||_t,Qt=t.NAMESPACE||Zt,t.CUSTOM_ELEMENT_HANDLING&&ae(t.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(Ct.tagNameCheck=t.CUSTOM_ELEMENT_HANDLING.tagNameCheck),t.CUSTOM_ELEMENT_HANDLING&&ae(t.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(Ct.attributeNameCheck=t.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),t.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof t.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(Ct.allowCustomizedBuiltInElements=t.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Jt=Jt=-1===te.indexOf(t.PARSER_MEDIA_TYPE)?ee:t.PARSER_MEDIA_TYPE,ne="application/xhtml+xml"===Jt?function(t){return t}:g,Dt&&(Mt=!1),Rt&&(It=!0),Ut&&(xt=k({},[].concat(W(B))),kt=[],!0===Ut.html&&(k(xt,E),k(kt,L)),!0===Ut.svg&&(k(xt,S),k(kt,O),k(kt,R)),!0===Ut.svgFilters&&(k(xt,A),k(kt,O),k(kt,R)),!0===Ut.mathMl&&(k(xt,N),k(kt,I),k(kt,R))),t.ADD_TAGS&&(xt===wt&&(xt=T(xt)),k(xt,t.ADD_TAGS)),t.ADD_ATTR&&(kt===Tt&&(kt=T(kt)),k(kt,t.ADD_ATTR)),t.ADD_URI_SAFE_ATTR&&k(Wt,t.ADD_URI_SAFE_ATTR),t.FORBID_CONTENTS&&(zt===$t&&(zt=T(zt)),k(zt,t.FORBID_CONTENTS)),Yt&&(xt["#text"]=!0),Bt&&k(xt,["html","head","body"]),xt.table&&(k(xt,["tbody"]),delete Et.tbody),a&&a(t),re=t)},se=k({},["mi","mo","mn","ms","mtext"]),ce=k({},["foreignobject","desc","title","annotation-xml"]),ue=k({},S);k(ue,A),k(ue,M);var le=k({},N);k(le,D);var he=function(t){var e=nt(t);e&&e.tagName||(e={namespaceURI:Zt,tagName:"template"});var n=g(t.tagName),r=g(e.tagName);if(t.namespaceURI===Xt)return e.namespaceURI===Zt?"svg"===n:e.namespaceURI===Gt?"svg"===n&&("annotation-xml"===r||se[r]):Boolean(ue[n]);if(t.namespaceURI===Gt)return e.namespaceURI===Zt?"math"===n:e.namespaceURI===Xt?"math"===n&&ce[r]:Boolean(le[n]);if(t.namespaceURI===Zt){if(e.namespaceURI===Xt&&!ce[r])return!1;if(e.namespaceURI===Gt&&!se[r])return!1;var i=k({},["title","style","font","a","script"]);return!le[n]&&(i[n]||!ue[n])}return!1},fe=function(t){p(n.removed,{element:t});try{t.parentNode.removeChild(t)}catch(e){try{t.outerHTML=at}catch(e){t.remove()}}},de=function(t,e){try{p(n.removed,{attribute:e.getAttributeNode(t),from:e})}catch(t){p(n.removed,{attribute:null,from:e})}if(e.removeAttribute(t),"is"===t&&!kt[t])if(It||Rt)try{fe(e)}catch(t){}else try{e.setAttribute(t,"")}catch(t){}},pe=function(t){var e=void 0,n=void 0;if(Ot)t=""+t;else{var r=y(t,/^[\r\n\t ]+/);n=r&&r[0]}"application/xhtml+xml"===Jt&&(t=''+t+"");var a=it?it.createHTML(t):t;if(Qt===Zt)try{e=(new Z).parseFromString(a,Jt)}catch(t){}if(!e||!e.documentElement){e=st.createDocument(Qt,"template",null);try{e.documentElement.innerHTML=Kt?"":a}catch(t){}}var o=e.body||e.documentElement;return t&&n&&o.insertBefore(i.createTextNode(n),o.childNodes[0]||null),Qt===Zt?lt.call(e,Bt?"html":"body")[0]:Bt?e.documentElement:o},ge=function(t){return ct.call(t.ownerDocument||t,t,l.SHOW_ELEMENT|l.SHOW_COMMENT|l.SHOW_TEXT,null,!1)},ye=function(t){return t instanceof X&&("string"!=typeof t.nodeName||"string"!=typeof t.textContent||"function"!=typeof t.removeChild||!(t.attributes instanceof w)||"function"!=typeof t.removeAttribute||"function"!=typeof t.setAttribute||"string"!=typeof t.namespaceURI||"function"!=typeof t.insertBefore)},me=function(t){return"object"===(void 0===c?"undefined":H(c))?t instanceof c:t&&"object"===(void 0===t?"undefined":H(t))&&"number"==typeof t.nodeType&&"string"==typeof t.nodeName},ve=function(t,e,r){dt[t]&&f(dt[t],(function(t){t.call(n,e,r,re)}))},be=function(t){var e=void 0;if(ve("beforeSanitizeElements",t,null),ye(t))return fe(t),!0;if(y(t.nodeName,/[\u0080-\uFFFF]/))return fe(t),!0;var r=ne(t.nodeName);if(ve("uponSanitizeElement",t,{tagName:r,allowedTags:xt}),!me(t.firstElementChild)&&(!me(t.content)||!me(t.content.firstElementChild))&&_(/<[/\w]/g,t.innerHTML)&&_(/<[/\w]/g,t.textContent))return fe(t),!0;if("select"===r&&_(/