working on velnet docs

main
Anton Franzluebbers 2023-08-04 17:22:52 -04:00
parent a300b2b5e4
commit 9302251a02
10 changed files with 1039 additions and 20 deletions

View File

@ -9,6 +9,7 @@
"dependencies": {
"@astrojs/mdx": "^0.19.7",
"@astrojs/tailwind": "^4.0.0",
"@picocss/pico": "^1.5.10",
"astro": "^2.10.1",
"tailwindcss": "^3.3.3"
}
@ -976,6 +977,11 @@
"node": ">= 8"
}
},
"node_modules/@picocss/pico": {
"version": "1.5.10",
"resolved": "https://registry.npmjs.org/@picocss/pico/-/pico-1.5.10.tgz",
"integrity": "sha512-+LafMsrwPxXQMk6sI///TmSInCwwZmq+K7SikyL3N/4GhhwzyPC+TQLUEqmrLyjluR+uIpFFcqjty30Rtr6GxQ=="
},
"node_modules/@pkgr/utils": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz",

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,38 @@
---
---
<footer>
<ul class="footer-links">
<li>
<a href="https://vel.engr.uga.edu"> Virtual Experiences Laboratory</a>
</li>
</ul>
</footer>
<style>
footer {
padding: 6rem 0 2rem;
text-align: center;
color: var(--theme-text-lighter);
font-size: var(--theme-text-xs);
}
.footer-links {
display: flex;
gap: 1.5em;
justify-content: center;
list-style: none;
padding: 0;
}
.footer-links a {
color: var(--theme-text-lighter);
text-decoration: none;
}
.footer-links a:focus,
.footer-links a:hover {
color: var(--theme-text);
text-decoration: underline;
}
</style>

View File

@ -0,0 +1,201 @@
---
const { currentPage } = Astro.props;
---
<header>
<nav class="nav-wrapper">
<div dir="ltr" lang="en" class="logo flex">
<ul>
<li>
<a class="astro" href="https://astro.build/">
<span class="sr-only">Astro</span>
<svg
xmlns="http://www.w3.org/2000/svg"
width="363"
height="102"
viewBox="0 0 363 102"
fill="none"
aria-hidden="true"
>
<style>
.text {
fill: var(--theme-text);
}
.hover {
fill: var(--theme-accent);
}
</style>
<path
class="text"
fill-rule="evenodd"
d="M55.07 14.216l16.81 54.865a72.6 72.6 0 00-20.765-6.984L39.808 24.135a1.475 1.475 0 00-2.827.005L25.81 62.078a72.598 72.598 0 00-20.859 6.995L21.847 14.2c.998-3.243 1.497-4.865 2.47-6.066a8 8 0 013.239-2.392c1.434-.576 3.13-.576 6.524-.576h8.751c3.398 0 5.097 0 6.532.577a8 8 0 013.241 2.397c.972 1.203 1.47 2.827 2.465 6.076z"
clip-rule="evenodd"></path>
<path
fill="#FF5D01"
fill-rule="evenodd"
d="M54.618 71.779c-2.863 2.432-8.578 4.091-15.161 4.091-8.08 0-14.852-2.499-16.649-5.86-.642 1.926-.786 4.13-.786 5.539 0 0-.423 6.915 4.418 11.725 0-2.498 2.037-4.522 4.551-4.522 4.309 0 4.304 3.734 4.3 6.764v.27c0 4.6 2.829 8.541 6.852 10.203a9.22 9.22 0 01-.938-4.064c0-4.386 2.592-6.02 5.604-7.917 2.396-1.51 5.06-3.188 6.894-6.554a12.297 12.297 0 001.502-5.905c0-1.314-.206-2.581-.587-3.77z"
clip-rule="evenodd"></path>
<path
class="text"
d="M126.554 69c13.115 0 21.047-3.14 25.68-9.654 0 2.904.157 5.651.55 8.163h7.774c-.706-4.082-.863-6.75-.863-14.128V43.334c0-10.831-8.403-16.56-24.424-16.56-15.47 0-25.522 5.964-26.779 14.598h8.246c1.256-5.808 7.774-8.87 18.533-8.87 10.602 0 16.885 3.69 16.885 9.969v.785l-24.502 1.413c-9.974.549-13.665 1.962-16.492 4.003-2.67 1.962-4.162 5.023-4.162 8.555C107 64.683 114.696 69 126.554 69zm2.513-5.573c-9.109 0-14.135-2.119-14.135-6.357 0-4.553 3.141-6.593 14.214-7.3l23.01-1.412v1.805c0 8.241-9.66 13.264-23.089 13.264zM196.086 69c16.256 0 22.775-5.337 22.775-13.108 0-6.436-4.006-9.732-14.215-10.596l-19.083-1.49c-5.183-.393-8.088-1.884-8.088-5.102 0-4.082 4.476-6.201 14.135-6.201 10.995 0 16.727 2.198 20.497 7.064l6.361-3.061c-3.927-6.122-12.644-9.733-26.151-9.733-13.9 0-22.224 4.631-22.224 12.244 0 6.829 4.947 10.125 14.292 10.91l18.926 1.492c6.204.47 8.089 1.726 8.089 4.944 0 4.631-4.79 6.829-14.293 6.829-11.544 0-18.847-3.14-22.381-8.87l-6.204 3.376C173.312 64.918 181.715 69 196.086 69zM234.929 34.151v18.916c0 7.77 2.67 15.54 17.198 15.54 3.691 0 8.167-.706 10.131-1.57V60.68c-2.749.628-6.047 1.1-9.267 1.1-6.832 0-10.523-2.67-10.523-9.42V34.151h19.633v-5.887h-19.633V15l-7.539 3.061v10.204h-12.33v5.886h12.33zM280.823 28.265h-6.911v39.244h7.461V52.83c0-5.65 1.099-10.439 4.24-13.735 2.749-3.061 6.283-4.788 12.487-4.788 2.12 0 3.455.157 5.262.471v-7.22c-1.65-.393-3.063-.472-5.184-.472-8.402 0-15.078 4.945-17.355 12.558v-11.38zM334.807 69C351.534 69 363 60.523 363 47.887c0-12.637-11.466-21.114-28.193-21.114-16.727 0-28.193 8.477-28.193 21.114C306.614 60.523 318.08 69 334.807 69zm0-6.2c-12.329 0-20.261-5.809-20.261-14.913 0-9.105 7.932-14.913 20.261-14.913 12.251 0 20.261 5.808 20.261 14.913 0 9.104-8.01 14.912-20.261 14.912z"
></path>
</svg>
</a>
</li>
<li>
<a class="docs" href={`/getting-started/`}>
<span class="sr-only">Docs</span>
<svg
xmlns="http://www.w3.org/2000/svg"
width="226"
height="102"
viewBox="0 0 226 102"
fill="none"
aria-hidden="true"
>
<path
class="docs-path"
fill="currentColor"
d="M25.805 68c14.688 0 24.883-8.41 24.883-21.14 0-12.786-9.62-19.756-24.653-19.756H0V68h25.805zm-14.17-33.005H24.25c8.352 0 14.17 4.09 14.17 12.039 0 8.236-5.3 13.075-14.113 13.075H11.635V34.995zM82.673 69.382c16.704 0 27.418-8.582 27.418-21.83 0-13.248-10.771-21.83-27.418-21.83-16.589 0-27.418 8.582-27.418 21.83 0 13.19 10.83 21.83 27.418 21.83zm0-8.64c-9.1 0-15.149-5.299-15.149-13.19 0-7.891 6.048-13.19 15.15-13.19 9.1 0 15.205 5.299 15.205 13.19 0 7.891-6.105 13.19-15.206 13.19zM141.497 69.382c13.306 0 22.637-5.299 25.978-14.572l-11.866-2.535c-1.67 5.415-6.393 8.295-13.709 8.295-9.216 0-15.033-5.127-15.033-13.018 0-8.006 5.702-13.018 14.918-13.018 7.43 0 12.154 3.053 13.709 8.64l12.038-2.13c-2.707-9.562-12.268-15.322-25.574-15.322-16.128 0-27.302 9.043-27.302 22.003 0 13.133 10.425 21.657 26.841 21.657zM194.94 69.382c14.745 0 23.212-5.01 23.212-14.054 0-7.603-4.665-10.944-15.955-12.096l-11.289-1.094c-5.242-.576-6.97-1.556-6.97-4.09 0-2.765 3.456-4.262 9.792-4.262 7.834 0 13.709 2.476 16.762 6.508l7.315-6.163c-5.069-5.702-13.133-8.41-23.501-8.41-13.997 0-21.888 4.781-21.888 12.903 0 7.546 4.781 11.232 14.803 12.326l12.557 1.383c4.896.518 6.624 1.555 6.624 4.09 0 3.225-3.456 4.723-10.886 4.723-8.352 0-14.688-3.226-18.087-8.007l-8.294 5.818c4.205 6.451 13.709 10.425 25.805 10.425z"
></path>
</svg>
</a>
</li>
</ul>
</div>
</nav>
</header>
<style>
header {
position: fixed;
left: 0;
top: 0;
right: 0;
height: var(--theme-navbar-height);
z-index: 11;
padding: 2rem 0;
background-color: var(--theme-navbar-bg);
display: flex;
align-items: center;
justify-content: left;
overflow: hidden;
}
ul,
li {
all: inherit;
flex-grow: 0;
}
.nav-wrapper {
display: flex;
align-items: center;
justify-content: center;
gap: 0.75rem;
width: 100%;
padding-inline: var(--min-spacing-inline);
}
/* If the device is likely to show a scrollbar gutter, reserve space for it */
@media (hover: hover) {
.nav-wrapper {
max-width: calc(100vw - 1.1rem);
}
}
.logo {
display: flex;
justify-content: flex-start;
font-size: 1rem;
flex-grow: 1;
flex-shrink: 0;
font-weight: 600;
line-height: 1;
color: hsla(var(--color-base-white), 100%, 1);
text-decoration: none;
gap: 0.5em;
}
:global([dir='rtl']) .logo {
justify-content: flex-end;
}
.logo a {
padding: 0.5em 0.25em;
margin: -0.5em -0.25em;
}
.logo svg {
height: 40px;
width: auto;
display: block;
color: var(--theme-accent);
}
.logo .hover {
opacity: 0;
}
.logo a {
transition: transform 180ms ease-out;
}
.logo a:hover,
.logo a:focus {
opacity: 1;
transform: translateY(-2px);
}
.logo a:focus:not(:focus-visible) {
outline: none;
}
.logo h1 {
font: inherit;
color: inherit;
margin: 0;
}
.astro {
overflow: hidden;
width: 41px;
}
.docs {
display: none;
}
@media (min-width: 20em) {
.docs {
display: inherit;
max-width: 80px;
}
}
@media (min-width: 23.5em) {
.docs {
max-width: none;
}
.nav-wrapper {
gap: 1rem;
}
}
@media (min-width: 50em) {
header {
padding: 2.5rem 0 1.5rem 0;
}
.astro {
width: auto;
}
}
@media (forced-colors: active) {
.text {
fill: LinkText;
}
.docs-path {
fill: ActiveText;
}
}
</style>

View File

@ -0,0 +1,235 @@
---
import { removeLeadingSlash, removeTrailingSlash } from "../util";
export interface Props {
currentPage: string;
}
const { currentPage } = Astro.props as Props;
const currentPageMatch = removeLeadingSlash(removeTrailingSlash(currentPage));
const content = [
{
title: "Setup",
children: [
{
title: "Getting Started",
url: "/getting_started",
},
],
},
{
title: "Guides",
children: [],
},
{
title: "Classes",
children: [],
},
];
---
<nav>
<ul class={`nav-groups`}>
{
content.map((section) => (
<li class:list={["nav-group"]}>
<details open>
<summary class="nav-group-title">
<h2>
{section.title}
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 1 16 16"
width="16"
height="16"
aria-hidden="true"
>
<path
fill-rule="evenodd"
d="M6.22 3.22a.75.75 0 011.06 0l4.25 4.25a.75.75 0 010 1.06l-4.25 4.25a.75.75 0 01-1.06-1.06L9.94 8 6.22 4.28a.75.75 0 010-1.06z"
/>
</svg>
</h2>
</summary>
<ul>
{section.children.map((child) => (
<li class="nav-link">
<a
href={child.url}
aria-current={`${
currentPageMatch.endsWith(child.url) ? "page" : "false"
}`}
/>
</li>
))}
</ul>
</details>
</li>
))
}
</ul>
</nav>
<!-- Preserve sidebar scroll across page loads -->
<script is:inline>
{
const leftSidebar = document.querySelector(".nav-groups");
const leftSidebarScroll = localStorage.getItem("sidebar-scroll");
if (leftSidebarScroll !== null) {
leftSidebar.scrollTop = parseInt(leftSidebarScroll, 10);
}
window.addEventListener("beforeunload", () => {
localStorage.setItem("sidebar-scroll", leftSidebar.scrollTop);
});
}
</script>
<style>
nav {
width: 100%;
height: 100%;
font-size: var(--theme-text-sm);
}
.nav-groups {
padding-top: 1rem;
max-height: 100%;
overflow-x: visible;
overflow-y: auto;
}
@media (min-width: 50em) {
.nav-groups {
position: fixed;
top: calc(var(--theme-navbar-height) + 3rem);
bottom: 0;
width: calc(
var(--theme-left-sidebar-width) - var(--min-spacing-inline) * 1.6
);
}
}
@media not screen and (min-width: 50em) {
nav :global(.TabGroup) {
display: none;
}
}
.nav-group {
margin-bottom: 1rem;
}
.nav-group .placeholder {
opacity: 0.6;
text-align: center;
display: block;
}
@media (max-width: 50em) {
.sm-hidden {
display: none !important;
}
}
@media (min-width: 50em) {
.nav-group {
display: none;
margin-bottom: 1.75rem;
}
}
.nav-group.active {
display: block;
}
.nav-group-title {
font-size: 1em;
font-weight: 600;
padding: 0.3rem 2rem;
}
.nav-link a {
margin: 1px;
padding: 0.3rem 2rem;
font: inherit;
color: var(--theme-text-lighter);
text-decoration: none;
display: block;
&:hover,
&:focus {
background-color: var(--theme-bg-hover);
}
&[aria-current="page"],
&[data-current-parent="true"] {
color: var(--theme-text);
background-color: var(--theme-bg-accent);
font-weight: 500;
/* Indicates the current page for forced colors users in older browsers */
outline: 1px solid transparent;
&:focus {
outline: 2px solid;
}
}
@media (forced-colors: active) {
&[aria-current="page"],
&[data-current-parent="true"] {
border: 1px solid LinkText;
}
}
}
@media (min-width: 50em) {
.nav-group-title,
.nav-link a {
padding: 0.2rem 1rem;
}
}
:global(:root.theme-dark) .nav-link a[aria-current="page"],
:global(:root.theme-dark) .nav-link a[data-current-parent="true"] {
color: hsla(var(--color-base-white), 100%, 1);
}
.fallback {
font-size: 0.75em;
line-height: 1;
font-weight: bold;
color: var(--theme-text-light);
}
details > summary {
list-style: none;
}
details > summary::marker,
details > summary::-webkit-details-marker {
display: none;
}
details[open] > summary svg {
transform: rotate(90deg);
}
summary {
cursor: pointer;
}
summary h2 {
all: inherit;
margin: 0;
padding: 0;
}
svg {
transform: rotate(0);
transition: 0.15s transform ease;
vertical-align: middle;
}
:global([dir="rtl"]) svg {
transform: rotate(180deg);
}
svg path {
fill: currentColor;
}
</style>

View File

@ -1,10 +1,16 @@
---
import Header from "../components/Header.astro";
import Footer from "../components/Footer.astro";
import LeftSidebar from "../components/LeftSidebar.astro";
interface Props {
title: string;
description: string;
}
const { title, description } = Astro.props;
const url = Astro.url;
const currentPage = url.pathname;
---
<!DOCTYPE html>
@ -16,31 +22,78 @@ const { title, description } = Astro.props;
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="generator" content={Astro.generator} />
<title>{title}</title>
<link rel="stylesheet" href="/css/retro.css" />
<!-- <link rel="stylesheet" href="/css/theme.css" />
<link rel="stylesheet" href="/css/index.css" /> -->
<link rel="stylesheet" href="/css/pico.classless.min.css" />
</head>
<body>
<slot />
<!-- Header -->
<header>
<hgroup>
<h1>VelNet Unity</h1>
<h2>An open source networking library for Unity</h2>
</hgroup>
</header>
</body>
<!-- ./ Header -->
<!-- Main -->
<main>
<grid>
<aside>
<LeftSidebar currentPage={currentPage} />
</aside>
<div>
<slot />
</div>
</grid>
</main>
<!-- ./ Main -->
<!-- Footer -->
<footer>
<small
>Built with <a href="https://picocss.com">Pico</a> •
<a
href="https://github.com/picocss/examples/blob/master/v1-classless/index.html"
>Source code</a
></small
>
</footer>
<!-- ./ Footer -->
<!-- Minimal theme switcher -->
<!-- <script src="js/minimal-theme-switcher.js"></script> -->
</html>
<style is:global>
/* :root {
--accent: 136, 58, 234;
--accent-light: 224, 204, 250;
--accent-dark: 49, 10, 101;
--accent-gradient: linear-gradient(
45deg,
rgb(var(--accent)),
rgb(var(--accent-light)) 30%,
white 60%
);
/* Red Light scheme (Default) */
/* Can be forced with data-theme="light" */
[data-theme="light"],
:root:not([data-theme="dark"]) {
--primary: #e53935;
--primary-hover: #d32f2f;
--primary-focus: rgba(229, 57, 53, 0.125);
--primary-inverse: #fff;
}
html {
font-family: system-ui, sans-serif;
background: #13151a;
background-size: 224px;
/* Red Dark scheme (Auto) */
/* Automatically enabled if user has Dark mode enabled */
@media only screen and (prefers-color-scheme: dark) {
:root:not([data-theme]) {
--primary: #e53935;
--primary-hover: #f44336;
--primary-focus: rgba(229, 57, 53, 0.25);
--primary-inverse: #fff;
--background-color: #222;
}
}
/* Red (Common styles) */
:root {
/* --form-element-active-border-color: var(--primary);
--form-element-focus-color: var(--primary-focus); */
--switch-color: var(--primary-inverse);
--switch-checked-background-color: var(--primary);
}
code {
font-family: Menlo, Monaco, Lucida Console, Liberation Mono,
DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace;
} */
</style>

View File

@ -0,0 +1,472 @@
<!-- Header -->
<header>
<hgroup>
<h1>Classless example</h1>
<h2>Just a pure semantic HTML markup, without <code>.classes</code></h2>
</hgroup>
<nav>
<ul>
<li>
<details role="list">
<summary aria-haspopup="listbox" role="button">Theme</summary>
<ul role="listbox">
<li><a href="#" data-theme-switcher="auto">Auto</a></li>
<li><a href="#" data-theme-switcher="light">Light</a></li>
<li><a href="#" data-theme-switcher="dark">Dark</a></li>
</ul>
</details>
</li>
<li>
<details role="list">
<summary aria-haspopup="listbox">Examples (v1)</summary>
<ul role="listbox">
<li><a href="../v1-preview/">Preview</a></li>
<li><a href="../v1-preview-rtl/">Right-to-left</a></li>
<li><a href="../v1-classless/">Classless</a></li>
<li><a href="../v1-basic-template/">Basic template</a></li>
<li><a href="../v1-company/">Company</a></li>
<li><a href="../v1-google-amp/">Google Amp</a></li>
<li><a href="../v1-sign-in/">Sign in</a></li>
<li><a href="../v1-bootstrap-grid/">Bootstrap grid</a></li>
</ul>
</details>
</li>
</ul>
</nav>
</header>
<!-- ./ Header -->
<!-- Main -->
<main>
<!-- Preview -->
<section id="preview">
<h2>Preview</h2>
<p>
Sed ultricies dolor non ante vulputate hendrerit. Vivamus sit amet
suscipit sapien. Nulla iaculis eros a elit pharetra egestas.
</p>
<form>
<input
type="text"
name="firstname"
placeholder="First name"
aria-label="First name"
required
/>
<input
type="email"
name="email"
placeholder="Email address"
aria-label="Email address"
required
/>
<fieldset>
<label for="terms">
<input type="checkbox" role="switch" id="terms" name="terms" />
I agree to the <a href="#" onclick="event.preventDefault()"
>Privacy Policy</a
>
</label>
</fieldset>
<button type="submit">Subscribe</button>
</form>
</section>
<!-- ./ Preview -->
<!-- Typography-->
<section id="typography">
<h2>Typography</h2>
<p>
Aliquam lobortis vitae nibh nec rhoncus. Morbi mattis neque eget efficitur
feugiat. Vivamus porta nunc a erat mattis, mattis feugiat turpis pretium.
Quisque sed tristique felis.
</p>
<!-- Blockquote-->
<blockquote>
"Maecenas vehicula metus tellus, vitae congue turpis hendrerit non. Nam at
dui sit amet ipsum cursus ornare."
<footer>
<cite>- Phasellus eget lacinia</cite>
</footer>
</blockquote>
<!-- Lists-->
<h3>Lists</h3>
<ul>
<li>Aliquam lobortis lacus eu libero ornare facilisis.</li>
<li>Nam et magna at libero scelerisque egestas.</li>
<li>Suspendisse id nisl ut leo finibus vehicula quis eu ex.</li>
<li>Proin ultricies turpis et volutpat vehicula.</li>
</ul>
<!-- Inline text elements-->
<h3>Inline text elements</h3>
<figure>
<table>
<tbody>
<tr>
<td><a href="#" onclick="event.preventDefault()">Link</a></td>
<td><strong>Bold</strong></td>
<td><em>Italic</em></td>
</tr>
<tr>
<td><u>Underline</u></td>
<td><del>Deleted</del></td>
<td><ins>Inserted</ins></td>
</tr>
<tr>
<td><s>Strikethrough</s></td>
<td><small>Small</small></td>
<td
><abbr title="Abbreviation" data-tooltip="Abbreviation"
>Abbr.</abbr
></td
>
</tr>
<tr>
<td>Text <sub>Sub</sub></td>
<td>Text <sup>Sup</sup></td>
<td><kbd>Kbd</kbd></td>
</tr>
<tr>
<td><mark>Highlighted</mark></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
</tbody>
</table>
</figure>
<!-- Headings-->
<h3>Heading 3</h3>
<p>
Integer bibendum malesuada libero vel eleifend. Fusce iaculis turpis
ipsum, at efficitur sem scelerisque vel. Aliquam auctor diam ut purus
cursus fringilla. Class aptent taciti sociosqu ad litora torquent per
conubia nostra, per inceptos himenaeos.
</p>
<h4>Heading 4</h4>
<p>
Cras fermentum velit vitae auctor aliquet. Nunc non congue urna, at
blandit nibh. Donec ac fermentum felis. Vivamus tincidunt arcu ut lacus
hendrerit, eget mattis dui finibus.
</p>
<h5>Heading 5</h5>
<p>
Donec nec egestas nulla. Sed varius placerat felis eu suscipit. Mauris
maximus ante in consequat luctus. Morbi euismod sagittis efficitur. Aenean
non eros orci. Vivamus ut diam sem.
</p>
<h6>Heading 6</h6>
<p>
Ut sed quam non mauris placerat consequat vitae id risus. Vestibulum
tincidunt nulla ut tortor posuere, vitae malesuada tortor molestie. Sed
nec interdum dolor. Vestibulum id auctor nisi, a efficitur sem. Aliquam
sollicitudin efficitur turpis, sollicitudin hendrerit ligula semper id.
Nunc risus felis, egestas eu tristique eget, convallis in velit.
</p>
<!-- Medias-->
<figure>
<img
src="img/aleksandar-jason-a562ZEFKW8I-unsplash-2000x1000.jpg"
alt="Minimal landscape"
/>
<figcaption>
Image from
<a href="https://unsplash.com/photos/a562ZEFKW8I" target="_blank"
>unsplash.com</a
>
</figcaption>
</figure>
</section>
<!-- ./ Typography-->
<!-- Button-->
<section id="button">
<h2>Button</h2>
<button>Primary</button>
</section>
<!-- ./ Button -->
<!-- Form elements-->
<section id="form">
<form>
<h2>Form elements</h2>
<!-- Search -->
<label for="search">Search</label>
<input type="search" id="search" name="search" placeholder="Search" />
<!-- Text -->
<label for="text">Text</label>
<input type="text" id="text" name="text" placeholder="Text" />
<small>Curabitur consequat lacus at lacus porta finibus.</small>
<!-- Select -->
<label for="select">Select</label>
<select id="select" name="select" required>
<option value="" selected>Select…</option>
<option>…</option>
</select>
<!-- File browser -->
<label for="file"
>File browser
<input type="file" id="file" name="file" />
</label>
<!-- Range slider control -->
<label for="range"
>Range slider
<input
type="range"
min="0"
max="100"
value="50"
id="range"
name="range"
/>
</label>
<!-- Valid -->
<label for="valid">
Valid
<input
type="text"
id="valid"
name="valid"
placeholder="Valid"
aria-invalid="false"
/>
</label>
<!-- Invalid -->
<label for="invalid">
Invalid
<input
type="text"
id="invalid"
name="invalid"
placeholder="Invalid"
aria-invalid="true"
/>
</label>
<!-- Disabled -->
<label for="disabled">
Disabled
<input
type="text"
id="disabled"
name="disabled"
placeholder="Disabled"
disabled
/>
</label>
<!-- Date-->
<label for="date"
>Date
<input type="date" id="date" name="date" />
</label>
<!-- Time-->
<label for="time"
>Time
<input type="time" id="time" name="time" />
</label>
<!-- Color-->
<label for="color"
>Color
<input type="color" id="color" name="color" value="#0eaaaa" />
</label>
<!-- Checkboxes -->
<fieldset>
<legend><strong>Checkboxes</strong></legend>
<label for="checkbox-1">
<input type="checkbox" id="checkbox-1" name="checkbox-1" checked />
Checkbox
</label>
<label for="checkbox-2">
<input type="checkbox" id="checkbox-2" name="checkbox-2" />
Checkbox
</label>
</fieldset>
<!-- Radio buttons -->
<fieldset>
<legend><strong>Radio buttons</strong></legend>
<label for="radio-1">
<input
type="radio"
id="radio-1"
name="radio"
value="radio-1"
checked
/>
Radio button
</label>
<label for="radio-2">
<input type="radio" id="radio-2" name="radio" value="radio-2" />
Radio button
</label>
</fieldset>
<!-- Switch -->
<fieldset>
<legend><strong>Switches</strong></legend>
<label for="switch-1">
<input
type="checkbox"
id="switch-1"
name="switch-1"
role="switch"
checked
/>
Switch
</label>
<label for="switch-2">
<input type="checkbox" id="switch-2" name="switch-2" role="switch" />
Switch
</label>
</fieldset>
<!-- Buttons -->
<input type="reset" value="Reset" onclick="event.preventDefault()" />
<input type="submit" value="Submit" onclick="event.preventDefault()" />
</form>
</section>
<!-- ./ Form elements-->
<!-- Tables -->
<section id="tables">
<h2>Tables</h2>
<figure>
<table role="grid">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Heading</th>
<th scope="col">Heading</th>
<th scope="col">Heading</th>
<th scope="col">Heading</th>
<th scope="col">Heading</th>
<th scope="col">Heading</th>
<th scope="col">Heading</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">1</th>
<td>Cell</td>
<td>Cell</td>
<td>Cell</td>
<td>Cell</td>
<td>Cell</td>
<td>Cell</td>
<td>Cell</td>
</tr>
<tr>
<th scope="row">2</th>
<td>Cell</td>
<td>Cell</td>
<td>Cell</td>
<td>Cell</td>
<td>Cell</td>
<td>Cell</td>
<td>Cell</td>
</tr>
<tr>
<th scope="row">3</th>
<td>Cell</td>
<td>Cell</td>
<td>Cell</td>
<td>Cell</td>
<td>Cell</td>
<td>Cell</td>
<td>Cell</td>
</tr>
</tbody>
</table>
</figure>
</section>
<!-- ./ Tables -->
<!-- Accordions -->
<section id="accordions">
<h2>Accordions</h2>
<details>
<summary>Accordion 1</summary>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque
urna diam, tincidunt nec porta sed, auctor id velit. Etiam venenatis
nisl ut orci consequat, vitae tempus quam commodo. Nulla non mauris
ipsum. Aliquam eu posuere orci. Nulla convallis lectus rutrum quam
hendrerit, in facilisis elit sollicitudin. Mauris pulvinar pulvinar mi,
dictum tristique elit auctor quis. Maecenas ac ipsum ultrices, porta
turpis sit amet, congue turpis.
</p>
</details>
<details open>
<summary>Accordion 2</summary>
<ul>
<li>Vestibulum id elit quis massa interdum sodales.</li>
<li>Nunc quis eros vel odio pretium tincidunt nec quis neque.</li>
<li>Quisque sed eros non eros ornare elementum.</li>
<li>Cras sed libero aliquet, porta dolor quis, dapibus ipsum.</li>
</ul>
</details>
</section>
<!-- ./ Accordions -->
<!-- Article-->
<article id="article">
<h2>Article</h2>
<p>
Nullam dui arcu, malesuada et sodales eu, efficitur vitae dolor. Sed
ultricies dolor non ante vulputate hendrerit. Vivamus sit amet suscipit
sapien. Nulla iaculis eros a elit pharetra egestas. Nunc placerat
facilisis cursus. Sed vestibulum metus eget dolor pharetra rutrum.
</p>
<footer>
<small>Duis nec elit placerat, suscipit nibh quis, finibus neque.</small>
</footer>
</article>
<!-- ./ Article-->
<!-- Progress -->
<section id="progress">
<h2>Progress bar</h2>
<progress id="progress-1" value="25" max="100"></progress>
<progress id="progress-2"></progress>
</section>
<!-- ./ Progress -->
<!-- Loading -->
<section id="loading">
<h2>Loading</h2>
<article aria-busy="true"></article>
<button aria-busy="true">Please wait…</button>
</section>
<!-- ./ Loading -->
</main>
<!-- ./ Main -->
<!-- Footer -->
<footer>
<small
>Built with <a href="https://picocss.com">Pico</a> •
<a
href="https://github.com/picocss/examples/blob/master/v1-classless/index.html"
>Source code</a
></small
>
</footer>
<!-- ./ Footer -->
<!-- Minimal theme switcher -->
<!-- <script src="js/minimal-theme-switcher.js"></script> -->

View File

@ -0,0 +1,9 @@
/** Remove \ and / from beginning of string */
export function removeLeadingSlash(path: string) {
return path.replace(/^[/\\]+/, '');
}
/** Remove \ and / from end of string */
export function removeTrailingSlash(path: string) {
return path.replace(/[/\\]+$/, '');
}