mirror of
https://github.com/shoelace-style/webawesome.git
synced 2026-01-12 12:09:26 +00:00
migrating to monorepo
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -8,3 +8,5 @@ src/react
|
||||
cdn/
|
||||
yarn.lock
|
||||
_bundle_
|
||||
/packages/webawesome-pro
|
||||
/packages/webawesome-app
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
# Web Awesome Pro
|
||||
|
||||
## Local Development
|
||||
|
||||
- Refer to <https://github.com/shoelace-style/webawesome> for instructions.
|
||||
@@ -1 +0,0 @@
|
||||
export { default } from "../webawesome/custom-elements-manifest.js"
|
||||
@@ -1,32 +0,0 @@
|
||||
import * as path from "node:path";
|
||||
import * as url from 'url';
|
||||
const __dirname = url.fileURLToPath(new URL('.', import.meta.url));
|
||||
|
||||
|
||||
export default async function (eleventyConfig) {
|
||||
const webawesomeDir = path.resolve(path.join(__dirname, "..", "..", "..", "webawesome"))
|
||||
const baseConfig = (await import(path.join(webawesomeDir, "docs", ".eleventy.js"))).default
|
||||
process.env.UNBUNDLED_DIST_DIRECTORY = path.join("dist")
|
||||
|
||||
/**
|
||||
* This ENV variable is what gets pass through copying working.
|
||||
*/
|
||||
process.env.BASE_DIR = "_bundle_/pages/docs"
|
||||
|
||||
baseConfig(eleventyConfig)
|
||||
|
||||
// _bundle_ is a gitignored file because it combines webawesome docs and webawesome-app pages.
|
||||
// https://www.11ty.dev/docs/ignores/#opt-out-of-using-gitignore
|
||||
eleventyConfig.setUseGitIgnore(false);
|
||||
}
|
||||
|
||||
export const config = {
|
||||
markdownTemplateEngine: 'njk',
|
||||
dir: {
|
||||
input: '_bundle_/pages',
|
||||
includes: '_includes',
|
||||
layouts: '_layouts',
|
||||
},
|
||||
templateFormats: ['njk', 'md'],
|
||||
};
|
||||
|
||||
@@ -1,212 +0,0 @@
|
||||
---
|
||||
title: Code Demo
|
||||
description: Code demos can be used to render code examples as inline live demos.
|
||||
tags: component
|
||||
isPro: true
|
||||
---
|
||||
|
||||
```html {.example}
|
||||
<wa-code-demo>
|
||||
<pre><code class="language-html">
|
||||
<button>Click me!</button>
|
||||
<wa-button>Click me!</wa-button>
|
||||
</code></pre>
|
||||
</wa-code-demo>
|
||||
```
|
||||
|
||||
This component is used right here in the docs to render code examples.
|
||||
|
||||
:::warning
|
||||
Do not render untrusted content in a `<wa-code-demo>` element. This component renders the content as HTML, which introduces XSS vulnerabilities if used with untrusted content.
|
||||
:::
|
||||
|
||||
## Examples
|
||||
|
||||
### Open by default
|
||||
|
||||
```html {.example}
|
||||
<wa-code-demo open>
|
||||
<pre><code class="language-html">
|
||||
<button>Click me!</button>
|
||||
<wa-button>Click me!</wa-button>
|
||||
</code></pre>
|
||||
</wa-code-demo>
|
||||
```
|
||||
|
||||
### Custom previews
|
||||
|
||||
In some cases you may want to preprocess the code displayed, for example to sanitize HTML, remove irrelevant elements or attributes, fix whitespace, or do server-side rendering (SSR).
|
||||
For these cases, you can slot in a custom preview:
|
||||
|
||||
```html {.example}
|
||||
<wa-code-demo>
|
||||
<wa-button slot="preview">Click me!</wa-button>
|
||||
<pre><code class="language-html">
|
||||
<button>Click me!</button>
|
||||
</code></pre>
|
||||
</wa-code-demo>
|
||||
```
|
||||
|
||||
Note that this means the preview will be in the light DOM, and can conflict with other things on the page.
|
||||
To only render the custom preview within the component’s shadow DOM, or to display raw text, you can wrap it in a `<template>` element:
|
||||
|
||||
```html {.example}
|
||||
<wa-code-demo>
|
||||
<template slot="preview">
|
||||
<wa-button>Click me!</wa-button>
|
||||
</template>
|
||||
<pre><code class="language-html">
|
||||
<button>Click me!</button>
|
||||
</code></pre>
|
||||
</wa-code-demo>
|
||||
```
|
||||
|
||||
### Including resources (CSS, scripts, etc.)
|
||||
|
||||
Demos are rendered in the shadow DOM of the component, so any resources (stylesheets, scripts, etc.) must be included anew.
|
||||
The same applies to isolated demos (see below), opening demos in a new tab, or editing them on CodePen.
|
||||
|
||||
While you _could_ manually include all of these on every single demo, it would get tedious to write,
|
||||
and it would add noise for the reader.
|
||||
|
||||
Instead, `<wa-code-demo>` provides several better ways to include resources.
|
||||
The core idea is that rather than specifying these resources over and over on each demo,
|
||||
you would **point to elements** which would then be cloned into the demo, at the beginning.
|
||||
|
||||
There are two ways to point to elements:
|
||||
- Add a `wa-code-demo-include` class to them
|
||||
- Specify a CSS selector for which resources to look for in the demo’s `include` attribute.
|
||||
|
||||
There are certain types of elements that are handled specially:
|
||||
- `<template>`: contents are cloned instead of the element itself.
|
||||
This is useful for including resources in your demo that you don't want rendered outside the demo.
|
||||
|
||||
The following example shows both methods.
|
||||
It includes all stylesheets on this page whose URLs start with `/dist/styles/themes/`,
|
||||
plus any other elements with the class `.demo-import`, plus a CSS file with the class `wa-code-demo-include`:
|
||||
|
||||
```html {.example}
|
||||
<template class="wa-code-demo-include-isolated">
|
||||
<script type="module" src="/dist/webawesome.loader.js"></script>
|
||||
<style>wa-callout { font-size: var(--wa-font-size-2xl) }</style>
|
||||
<script>console.log('Hello!')</script>
|
||||
</template>
|
||||
<wa-code-demo include="link[rel=stylesheet]">
|
||||
<pre><code class="language-html">
|
||||
<wa-callout>Helloooo!</wa-callout>
|
||||
</code></pre>
|
||||
</wa-code-demo>
|
||||
```
|
||||
|
||||
|
||||
### Isolated viewports
|
||||
|
||||
Often you may want to render your demo in a separate viewport, e.g. when it’s about a whole page.
|
||||
Or, you may want to sandbox it.
|
||||
For these cases, you can use the `viewport` attribute, which renders the demo in an iframe:
|
||||
|
||||
```html {.example}
|
||||
<wa-code-demo viewport>
|
||||
<pre><code class="language-html">
|
||||
<button>Click me!</button>
|
||||
</code></pre>
|
||||
</wa-code-demo>
|
||||
```
|
||||
|
||||
### Viewport Emulation
|
||||
|
||||
When you use the `viewport` attribute, `<wa-code-demo>` uses [`<wa-viewport-demo>`](../viewport-demo/) internally, and passes the value of `viewport` to it.
|
||||
This allows you to also also provide a width value to emulate and it will be scaled accordingly:
|
||||
|
||||
```html {.example}
|
||||
<wa-code-demo viewport="300">
|
||||
<pre><code class="language-html">
|
||||
<button>Click me!</button>
|
||||
</code></pre>
|
||||
</wa-code-demo>
|
||||
```
|
||||
|
||||
Or both a width and a height value:
|
||||
|
||||
```html {.example}
|
||||
<wa-code-demo viewport="1600 x 1000">
|
||||
<pre><code class="language-html">
|
||||
<button>Click me!</button>
|
||||
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed maximus et tortor vel ullamcorper. Fusce tristique et justo quis auctor. In tristique dignissim dignissim. Fusce lacus urna, efficitur vel fringilla sed, hendrerit at ipsum. Donec suscipit ante ac ligula imperdiet varius. Aliquam ullamcorper augue sit amet lectus euismod finibus. Proin semper, diam at rhoncus posuere, diam dui semper turpis, ut faucibus mi ipsum nec ante. Morbi varius nibh ut facilisis varius. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Fusce in blandit velit. Aliquam massa eros, commodo eu vestibulum a, faucibus non risus.
|
||||
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed maximus et tortor vel ullamcorper. Fusce tristique et justo quis auctor. In tristique dignissim dignissim. Fusce lacus urna, efficitur vel fringilla sed, hendrerit at ipsum. Donec suscipit ante ac ligula imperdiet varius. Aliquam ullamcorper augue sit amet lectus euismod finibus. Proin semper, diam at rhoncus posuere, diam dui semper turpis, ut faucibus mi ipsum nec ante. Morbi varius nibh ut facilisis varius. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Fusce in blandit velit. Aliquam massa eros, commodo eu vestibulum a, faucibus non risus.
|
||||
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed maximus et tortor vel ullamcorper. Fusce tristique et justo quis auctor. In tristique dignissim dignissim. Fusce lacus urna, efficitur vel fringilla sed, hendrerit at ipsum. Donec suscipit ante ac ligula imperdiet varius. Aliquam ullamcorper augue sit amet lectus euismod finibus. Proin semper, diam at rhoncus posuere, diam dui semper turpis, ut faucibus mi ipsum nec ante. Morbi varius nibh ut facilisis varius. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Fusce in blandit velit. Aliquam massa eros, commodo eu vestibulum a, faucibus non risus.
|
||||
</code></pre>
|
||||
</wa-code-demo>
|
||||
```
|
||||
|
||||
If you only provide a width value, the viewport will be rendered to an initial 16:9 aspect ratio,
|
||||
which can be changed via resizing.
|
||||
You can customize this via the `--viewport-initial-aspect-ratio` property.
|
||||
|
||||
### Isolated demos with resources
|
||||
|
||||
Including resources in isolated demos works the same way.
|
||||
Any relative URLs are still resolved relative to the host document.
|
||||
In addition to the `wa-code-demo-include` class, which specifies resources to be included in *every* demo,
|
||||
you can also use the `wa-code-demo-include-isolated` class which specifies resources to be included in every *isolated* demo,
|
||||
i.e. the previews of demos using the `viewport` attribute, but also opening demos in a new tab or editing them on CodePen.
|
||||
|
||||
```html {.example}
|
||||
<template class="wa-code-demo-include-isolated">
|
||||
<script type="module" src="{% cdnUrl 'webawesome.loader.js' %}"></script>
|
||||
<style>
|
||||
body {
|
||||
padding: var(--wa-space-l);
|
||||
}
|
||||
wa-callout { font-size: var(--wa-font-size-2xl) }
|
||||
</style>
|
||||
<script>console.log('Hello from iframe!')</script>
|
||||
</template>
|
||||
<wa-code-demo viewport include="link[rel=stylesheet]">
|
||||
<pre><code class="language-html">
|
||||
<wa-callout>Helloooo!</wa-callout>
|
||||
</code></pre>
|
||||
</wa-code-demo>
|
||||
```
|
||||
|
||||
## Styling
|
||||
|
||||
Just setting `border-radius` or `border` should work as expected:
|
||||
|
||||
```html{.example}
|
||||
<wa-code-demo style="border: 2px dotted var(--wa-color-blue-50); border-radius: var(--wa-border-radius-m)">
|
||||
<pre><code class="language-html">
|
||||
<button>Click me!</button>
|
||||
<wa-button>Click me!</wa-button>
|
||||
</code></pre>
|
||||
</wa-code-demo>
|
||||
```
|
||||
|
||||
The divider width is controlled separately via `--divider-width`:
|
||||
|
||||
```html{.example}
|
||||
<wa-code-demo open style="border-width: var(--wa-border-width-l); --divider-width: var(--wa-border-width-m);">
|
||||
<pre><code class="language-html">
|
||||
<button>Click me!</button>
|
||||
<wa-button>Click me!</wa-button>
|
||||
</code></pre>
|
||||
</wa-code-demo>
|
||||
```
|
||||
|
||||
## Roadmap
|
||||
|
||||
This component is a work in progress.
|
||||
Some of the things that are not yet implemented are listed below.
|
||||
It goes without saying that this list is a rough plan and subject to change.
|
||||
|
||||
### High priority
|
||||
|
||||
- Make the component dynamic so that when the code changes, the demo is updated
|
||||
|
||||
### Low priority
|
||||
|
||||
- Horizontal layout
|
||||
- Tabbed layout
|
||||
- Provide a way to display CSS and JS separately
|
||||
- Provide a way to customize the playground used (currently it is hardcoded to CodePen)
|
||||
- Provide a way to customize the buttons shown
|
||||
@@ -1,888 +0,0 @@
|
||||
---
|
||||
title: Page
|
||||
description: Pages offer an easy way to scaffold entire page layouts using minimal markup.
|
||||
tags: [pro, organization, layout]
|
||||
isPro: true
|
||||
order: 0
|
||||
# icon: page
|
||||
---
|
||||
|
||||
The page component is designed to power full webpages. It is flexible enough to handle most modern designs and includes a simple mechanism for handling desktop and mobile navigation.
|
||||
|
||||
## Layout Anatomy
|
||||
|
||||
This image depicts a page's anatomy, including the default positions of each section. The labels represent the [named slots](#slots) you can use to populate them.
|
||||
|
||||
Most slots are optional. Slots that have no content will not be shown, allowing you to opt-in to just the sections you actually need.
|
||||
|
||||
{% include "page-demo.njk" %}
|
||||
|
||||
<!--  -->
|
||||
|
||||
## Using `wa-page`
|
||||
|
||||
:::info
|
||||
If you're not familiar with how slots work in HTML, you might want to [learn more about slots](/docs/usage/#slots) before using this component.
|
||||
:::
|
||||
|
||||
A number of sections are available as part of the page component, most of which are optional. Content is populated by [slotting elements](/docs/usage/#slots) into various locations.
|
||||
|
||||
This component _does not_ implement any [content sectioning](https://developer.mozilla.org/en-US/docs/Web/HTML/Element#content_sectioning) or "semantic elements" internally (such as `<main>`, `<header>`, `<footer>`, etc.). Instead, we recommended that you slot in content sectioning elements wherever you feel they're appropriate.
|
||||
|
||||
When using `<wa-page>`, make sure to zero out all paddings and margins on `<html>` and `<body>`, otherwise you may see unexpected gaps. We highly recommend adding the following styles when using `<wa-page>`:
|
||||
|
||||
```css
|
||||
html,
|
||||
body {
|
||||
min-height: 100%;
|
||||
height: 100%;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
```
|
||||
|
||||
::info
|
||||
If you use [native styles](/docs/native/), this is already taken care of.
|
||||
:::
|
||||
|
||||
## Examples
|
||||
|
||||
:::warning
|
||||
Open demos in a new tab to examine their behavior in different window sizes.
|
||||
The previews below use simulated zooming which, depending on your browser, may not be accurate.
|
||||
:::
|
||||
|
||||
### Documentation
|
||||
|
||||
A sample documentation page using [all available slots](#slots).
|
||||
The navigation menu collapses into a drawer at a custom `mobile-breakpoint` of 920px.
|
||||
It can be opened using a button with `[data-toggle-nav]` that appears in the `subheader` slot. The `aside` slot is also hidden below 920px.
|
||||
|
||||
```html {.example viewport="1600"}
|
||||
<wa-page mobile-breakpoint="920">
|
||||
<div slot="banner" class="wa-body-s">
|
||||
<a href="#" class="wa-cluster wa-align-items-baseline wa-gap-xs" style="flex-wrap: nowrap;">
|
||||
<wa-icon name="gift"></wa-icon>
|
||||
<span>Give a Hoot for the Holidays: Donate now and double your impact.</span>
|
||||
</a>
|
||||
</div>
|
||||
<header slot="header" class="wa-split">
|
||||
<div class="wa-cluster">
|
||||
<wa-icon name="feather-pointed" style="color: var(--wa-color-brand-fill-loud); font-size: 1.5em;"></wa-icon>
|
||||
<span id="brand-name" class="wa-heading-s wa-desktop-only">Audubon Worldwide</span>
|
||||
<a href="#">Our Work</a>
|
||||
<a href="#">About Us</a>
|
||||
<a href="#">Discover</a>
|
||||
<a href="#">Get Involved</a>
|
||||
</div>
|
||||
<div class="wa-cluster wa-gap-xs">
|
||||
<wa-button size="small" variant="brand" appearance="outlined">Find Your Local Audubon</wa-button>
|
||||
<wa-button size="small" variant="brand">Donate</wa-button>
|
||||
</div>
|
||||
</header>
|
||||
<nav slot="subheader">
|
||||
<div class="wa-cluster" style="flex-wrap: nowrap;">
|
||||
<wa-icon-button data-toggle-nav name="bars" label="Menu"></wa-icon-button>
|
||||
<wa-breadcrumb style="font-size: var(--wa-font-size-s);">
|
||||
<wa-breadcrumb-item>Field Guides</wa-breadcrumb-item>
|
||||
<wa-breadcrumb-item>Owls</wa-breadcrumb-item>
|
||||
<wa-breadcrumb-item>Great Horned Owl</wa-breadcrumb-item>
|
||||
</wa-breadcrumb>
|
||||
</div>
|
||||
<wa-input id="search" class="wa-desktop-only" placeholder="Search" size="small" style="max-inline-size: 12rem;">
|
||||
<wa-icon slot="prefix" name="magnifying-glass"></wa-icon>
|
||||
</wa-input>
|
||||
</nav>
|
||||
<nav slot="navigation-header">
|
||||
<div class="wa-flank">
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1544648720-132573cb590d?q=20" label=""></wa-avatar>
|
||||
<div class="wa-stack wa-gap-3xs">
|
||||
<span class="wa-heading-s">Great Horned Owl</span>
|
||||
<span class="wa-caption-s" lang="la"><em>Bubo virginianus</em></span>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<nav slot="navigation">
|
||||
<a href="#identification">Identification</a>
|
||||
<a href="#range">Range and Habitat</a>
|
||||
<a href="#behavior">Behavior</a>
|
||||
<a href="#conservation">Conservation</a>
|
||||
</nav>
|
||||
<nav slot="navigation-footer">
|
||||
<a href="#" class="wa-flank">
|
||||
<wa-icon name="camera"></wa-icon>
|
||||
<span>Photo Gallery</span>
|
||||
</a>
|
||||
<a href="#" class="wa-flank">
|
||||
<wa-icon name="map-location-dot"></wa-icon>
|
||||
<span>Interactive Range Map</span>
|
||||
</a>
|
||||
</nav>
|
||||
<header slot="main-header">
|
||||
<div class="wa-flank:end wa-border-radius-l wa-dark" style="background-color: var(--wa-color-surface-lowered); --content-percentage: 35%; padding: var(--wa-space-m);">
|
||||
<div class="wa-stack" style="margin: var(--wa-space-2xl);">
|
||||
<h1>Great Horned Owl</h1>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-cluster wa-gap-xs">
|
||||
<wa-tag size="small">Owls</wa-tag>
|
||||
<wa-tag size="small">Birds of Prey</wa-tag>
|
||||
<wa-tag size="small">Pleistocene Birds</wa-tag>
|
||||
</div>
|
||||
<div class="wa-flank">
|
||||
<wa-icon name="ruler"></wa-icon>
|
||||
<span class="wa-caption-m">L 21.5" | WS 48.5"</span>
|
||||
</div>
|
||||
<div class="wa-flank">
|
||||
<wa-icon name="earth-americas"></wa-icon>
|
||||
<span class="wa-caption-m">North America (Widespread), Central America (Limited), South America (Limited)</span>
|
||||
</div>
|
||||
<div class="wa-flank">
|
||||
<wa-icon name="shield-heart"></wa-icon>
|
||||
<span class="wa-caption-m">Least Concern</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-frame" style="border-radius: var(--wa-border-radius-l); max-inline-size: 40ch;">
|
||||
<img src="https://images.unsplash.com/photo-1544648720-132573cb590d?q=20" />
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
<main class="wa-body-l">
|
||||
<h2 id="identification">Identification</h2>
|
||||
<p>Lorem ipsum odor amet, consectetuer adipiscing elit. Eget habitant scelerisque lectus ultrices nascetur aliquet sapien primis. Cursus sapien fusce semper nulla elit sociosqu lectus per sem. Sem ad porttitor dictum nisl pharetra tortor convallis. Sit molestie hendrerit porta dictum tortor posuere euismod magna. Mauris suspendisse pharetra finibus; eleifend etiam ridiculus.</p>
|
||||
<h2 id="range">Range and Habitat</h2>
|
||||
<p>Diam sed ipsum pretium porttitor class cubilia elementum. Blandit felis ligula habitant ultricies vulputate rutrum lacus commodo pulvinar. Nostra semper placerat lectus in dis eu. Sagittis ipsum placerat rhoncus lacus id eget. Erat pharetra aptent enim, augue accumsan ultricies inceptos habitasse. Senectus id maximus parturient tellus; fermentum posuere vulputate luctus. Ac tempus dapibus vehicula ligula ullamcorper sit duis.</p>
|
||||
<h2 id="behavior">Behavior</h2>
|
||||
<p>Erat vitae luctus arcu taciti malesuada pretium arcu justo primis. Cubilia vitae maecenas congue velit id netus arcu. Dictum vel pellentesque taciti fermentum risus consectetur amet. Faucibus commodo habitasse sem maximus praesent purus, dignissim tristique porta. Platea magna justo ipsum ut metus ac facilisi. Imperdiet laoreet pharetra maximus lacus tortor suscipit. Nam quisque iaculis orci porttitor pellentesque rhoncus. Molestie sagittis tincidunt quisque nisi non urna conubia.</p>
|
||||
<h2 id="conservation">Conservation</h2>
|
||||
<p>Nullam magna quam quisque eu varius integer. Inceptos donec facilisi risus himenaeos semper mollis habitasse. Vehicula lacus vivamus euismod pharetra mollis dictum. Ante ex tortor elementum eleifend habitasse orci aliquam. Fames erat senectus fames etiam dapibus cursus.</p>
|
||||
</main>
|
||||
<footer slot="main-footer">
|
||||
<section>
|
||||
<h2 class="wa-heading-m">Sources</h2>
|
||||
<ul class="wa-body-s">
|
||||
<li><cite><a href="https://www.audubon.org/field-guide/bird/great-horned-owl" target="_blank" rel="noopener">Great Horned Owl</a></cite>, National Audubon Society. Retrieved 5 December 2024.</li>
|
||||
<li><cite><a href="https://www.allaboutbirds.org/guide/Great_Horned_Owl/" target="_blank" rel="noopener">Great Horned Owl</a></cite>, All About Birds by CornellLab. Retrieved 5 December 2024.</li>
|
||||
<li>Armistead, G. L. (2015). <cite>Field guide to birds of Pennsylvania</cite>. Scott & Nix, Inc.</li>
|
||||
</ul>
|
||||
</section>
|
||||
</footer>
|
||||
<aside slot="aside" class="wa-desktop-only">
|
||||
<h2 class="wa-heading-m">Discover More Birds</h2>
|
||||
<wa-card with-image>
|
||||
<div slot="image" class="wa-frame">
|
||||
<img src="https://images.unsplash.com/photo-1635254859323-65b78408dcca?q=20" alt="" />
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-3xs">
|
||||
<span class="wa-heading-s">Long-eared Owl</span>
|
||||
<span class="wa-caption-s" lang="la"><em>Asio otus</em></span>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card with-image>
|
||||
<div slot="image" class="wa-frame">
|
||||
<img src="https://images.unsplash.com/photo-1661350356618-f5915c7b6a3c?q=20" alt="" />
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-3xs">
|
||||
<span class="wa-heading-s">Northen Hawk Owl</span>
|
||||
<span class="wa-caption-s" lang="la"><em>Surnia ulula</em></span>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card with-image>
|
||||
<div slot="image" class="wa-frame">
|
||||
<img src="https://images.unsplash.com/photo-1660307777355-f08bced145d3?q=20" alt="" />
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-3xs">
|
||||
<span class="wa-heading-s">Golden Eagle</span>
|
||||
<span class="wa-caption-s" lang="la"><em>Aquila chrysaetos</em></span>
|
||||
</div>
|
||||
</wa-card>
|
||||
</aside>
|
||||
<footer slot="footer" class="wa-grid wa-gap-xl">
|
||||
<div class="wa-cluster" style="flex-wrap: nowrap;">
|
||||
<wa-icon name="feather-pointed" style="font-size: 1.5em;"></wa-icon>
|
||||
<span class="wa-heading-s">Audubon Worldwide</span>
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<h3 class="wa-heading-xs">Our Work</h3>
|
||||
<a href="#">Habitat Restoration</a>
|
||||
<a href="#">Migration Science</a>
|
||||
<a href="#">Advocacy</a>
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<h3 class="wa-heading-xs">About Us</h3>
|
||||
<a href="#">Our History</a>
|
||||
<a href="#">Leadership</a>
|
||||
<a href="#">Fiscal Reports</a>
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<h3 class="wa-heading-xs">Discover</h3>
|
||||
<a href="#">Field Guides</a>
|
||||
<a href="#">Photo Search</a>
|
||||
<a href="#">Gear and Resources</a>
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<h3 class="wa-heading-xs">Get Involved</h3>
|
||||
<a href="#">Adopt a Bird</a>
|
||||
<a href="#">Your Local Audubon</a>
|
||||
<a href="#">Youth Audubon Camps</a>
|
||||
</div>
|
||||
</footer>
|
||||
</wa-page>
|
||||
|
||||
<style>
|
||||
wa-page {
|
||||
--menu-width: 15rem;
|
||||
--aside-width: 15rem;
|
||||
}
|
||||
wa-page[view='desktop'] {
|
||||
[slot*='navigation'] {
|
||||
border-inline-end: var(--wa-border-width-s) var(--wa-border-style) var(--wa-color-surface-border);
|
||||
}
|
||||
}
|
||||
wa-page[view='mobile'] {
|
||||
--menu-width: auto;
|
||||
--aside-width: auto;
|
||||
}
|
||||
|
||||
[slot='banner'] {
|
||||
--wa-color-text-link: var(--wa-color-neutral-on-loud);
|
||||
background-color: var(--wa-color-neutral-fill-loud);
|
||||
}
|
||||
[slot='header'] {
|
||||
--wa-link-decoration-default: none;
|
||||
border-block-end: var(--wa-border-width-s) var(--wa-border-style) var(--wa-color-surface-border);
|
||||
}
|
||||
[slot*='header'] a {
|
||||
font-weight: var(--wa-font-weight-action);
|
||||
}
|
||||
[slot='subheader'] {
|
||||
background-color: var(--wa-color-surface-lowered);
|
||||
border-block-end: var(--wa-border-width-s) var(--wa-border-style) var(--wa-color-surface-border);
|
||||
}
|
||||
[slot='navigation-header'] {
|
||||
border-block-end: var(--wa-border-width-s) var(--wa-border-style) var(--wa-color-surface-border);
|
||||
}
|
||||
|
||||
[slot*='navigation'] a {
|
||||
--wa-color-text-link: var(--wa-color-text-normal);
|
||||
}
|
||||
[slot='navigation-footer'] {
|
||||
border-block-start: var(--wa-border-width-s) var(--wa-border-style) var(--wa-color-surface-border);
|
||||
|
||||
.wa-flank {
|
||||
--flank-size: 1.25em;
|
||||
}
|
||||
}
|
||||
[slot='main-header'],
|
||||
main,
|
||||
[slot='main-footer'] {
|
||||
max-inline-size: 60rem;
|
||||
margin-inline: auto;
|
||||
}
|
||||
[slot='main-footer'] {
|
||||
border-block-start: var(--wa-border-width-s) var(--wa-border-style) var(--wa-color-surface-border);
|
||||
}
|
||||
[slot='footer'] {
|
||||
--wa-color-text-link: var(--wa-color-text-quiet);
|
||||
background-color: var(--wa-color-surface-lowered);
|
||||
font-size: var(--wa-font-size-s);
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
const sectionAnchors = document.querySelectorAll("[slot*='navigation'] a[href*='#']");
|
||||
sectionAnchors.forEach((sectionAnchor) => sectionAnchor.setAttribute("data-drawer", "close"));
|
||||
</script>
|
||||
```
|
||||
|
||||
### Media
|
||||
|
||||
A sample media app page using `header`, `navigation-header`, `main-header`, and `main-footer` along with the default slot. The navigation menu collapses into a drawer at the default `mobile-breakpoint` and can be opened using a button with `[data-toggle-nav]` that appears in the `header` slot.
|
||||
|
||||
```html {.example viewport="1600"}
|
||||
<wa-page class="wa-dark">
|
||||
<header slot="header">
|
||||
<div class="wa-cluster">
|
||||
<wa-icon-button name="bars" label="Menu" data-toggle-nav></wa-icon-button>
|
||||
<wa-icon name="record-vinyl"></wa-icon>
|
||||
<span class="wa-heading-m">radiogaga</span>
|
||||
</div>
|
||||
<wa-input id="search-header" placeholder="Search" class="wa-desktop-only" style="max-inline-size: 100%;">
|
||||
<wa-icon slot="prefix" name="magnifying-glass" ></wa-icon>
|
||||
</wa-input>
|
||||
<div class="wa-cluster">
|
||||
<wa-button appearance="outlined">Log In</wa-button>
|
||||
<wa-button>Sign Up</wa-button>
|
||||
</div>
|
||||
</header>
|
||||
<div slot="navigation-header" class="wa-split">
|
||||
<wa-input id="search-nav-drawer" placeholder="Search" style="max-inline-size: 100%;" class="wa-mobile-only">
|
||||
<wa-icon slot="prefix" name="magnifying-glass" ></wa-icon>
|
||||
</wa-input>
|
||||
<div class="wa-split">
|
||||
<h2 class="wa-heading-s">For You</h2>
|
||||
<wa-icon-button id="settings" name="gear" label="Settings"></wa-icon-button>
|
||||
</div>
|
||||
</div>
|
||||
<nav slot="navigation">
|
||||
<h3 class="wa-heading-xs">Discover</h3>
|
||||
<ul class="wa-stack wa-gap-0">
|
||||
<li>
|
||||
<a href="#" class="wa-flank">
|
||||
<wa-icon name="house"></wa-icon>
|
||||
<span>Home</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="wa-flank">
|
||||
<wa-icon name="star"></wa-icon>
|
||||
<span>New</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="wa-flank">
|
||||
<wa-icon name="tower-broadcast"></wa-icon>
|
||||
<span>Stations</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
<h3 class="wa-heading-xs">Library</h3>
|
||||
<ul class="wa-stack wa-gap-0">
|
||||
<li>
|
||||
<a href="#" class="wa-flank">
|
||||
<wa-icon name="heart"></wa-icon>
|
||||
<span>Favorites</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="wa-flank">
|
||||
<wa-icon name="bars-staggered"></wa-icon>
|
||||
<span>Playlists</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="wa-flank">
|
||||
<wa-icon name="microphone-lines"></wa-icon>
|
||||
<span>Artists</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="wa-flank">
|
||||
<wa-icon name="layer-group"></wa-icon>
|
||||
<span>Albums</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="wa-flank">
|
||||
<wa-icon name="podcast"></wa-icon>
|
||||
<span>Podcasts</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
<h3 class="wa-heading-xs">Recently Played</h3>
|
||||
<ul id="recent" class="wa-stack wa-gap-0">
|
||||
<li>
|
||||
<a href="#" class="wa-flank">
|
||||
<wa-icon name="radio" style="background: var(--wa-color-red-90); color: var(--wa-color-red-60);"></wa-icon>
|
||||
<span>Lo-Fi Station</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="wa-flank">
|
||||
<wa-icon name="font-awesome" style="background: var(--wa-color-blue-30); color: var(--wa-color-yellow-90);"></wa-icon>
|
||||
<span>Podcast Awesome</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="wa-flank">
|
||||
<wa-icon name="seedling" style="background: var(--wa-color-green-70); color: var(--wa-color-green-90);"></wa-icon>
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<span>Seasons</span>
|
||||
<span class="wa-caption-s">Blister Soul</span>
|
||||
</div>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
<div slot="main-header">
|
||||
<wa-icon-button id="back" name="chevron-left" label="Back"></wa-icon-button>
|
||||
<wa-tooltip for="back" placement="bottom" distance="2">Back</wa-tooltip>
|
||||
<div class="wa-cluster">
|
||||
<wa-icon-button id="favorite" name="heart" variant="regular" label="Favorite"></wa-icon-button>
|
||||
<wa-tooltip for="favorite" placement="bottom" distance="2">Favorite</wa-tooltip>
|
||||
<wa-icon-button id="options" name="ellipsis" label="Options"></wa-icon-button>
|
||||
<wa-tooltip for="options" placement="bottom" distance="2">Options</wa-tooltip>
|
||||
</div>
|
||||
</div>
|
||||
<main>
|
||||
<div class="wa-stack wa-gap-3xl">
|
||||
<div class="wa-flank wa-gap-3xl" style="--content-percentage: 40%;">
|
||||
<div class="wa-frame wa-border-radius-l" style="max-inline-size: 40ch;">
|
||||
<img src="https://images.unsplash.com/photo-1732430579016-8d5e5ebd3c99?q=20" alt="Home for the Holidays album artwork" />
|
||||
</div>
|
||||
<div class="wa-split:column wa-align-items-start">
|
||||
<div class="wa-stack" style="margin-block: auto;">
|
||||
<h1 class="wa-heading-3xl">Home for the Holidays</h1>
|
||||
<a href="#" class="wa-heading-m">The Shire Choir</a>
|
||||
<div class="wa-cluster wa-caption-m wa-gap-2xs">
|
||||
<span>Holiday</span>
|
||||
<span>•</span>
|
||||
<span>2024</span>
|
||||
<span>•</span>
|
||||
<span>12 songs, 41 minutes 9 seconds</span>
|
||||
</div>
|
||||
</div>
|
||||
<div id="play-controls" class="wa-split wa-gap-xl">
|
||||
<div class="wa-cluster wa-gap-xl">
|
||||
<wa-icon-button name="play" label="Play"></wa-icon-button>
|
||||
<wa-icon-button name="shuffle" label="Shuffle"></wa-icon-button>
|
||||
</div>
|
||||
<wa-icon-button name="plus" label="Add to Library"></wa-icon-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<ol class="wa-stack wa-gap-0">
|
||||
<li class="wa-split">
|
||||
<span class="wa-flank">
|
||||
<wa-icon name="1"></wa-icon>
|
||||
<span>Fa-La-La-Fellowship</span>
|
||||
</span>
|
||||
<span class="wa-cluster">
|
||||
<span class="wa-caption-m">3:27</span>
|
||||
<wa-icon-button name="ellipsis" label="Song Options"></wa-icon-button>
|
||||
</span>
|
||||
</li>
|
||||
<li class="wa-split">
|
||||
<span class="wa-flank">
|
||||
<wa-icon name="2"></wa-icon>
|
||||
<span>Sleigh Ride</span>
|
||||
</span>
|
||||
<span class="wa-cluster">
|
||||
<span class="wa-caption-m">2:36</span>
|
||||
<wa-icon-button name="ellipsis" label="Song Options"></wa-icon-button>
|
||||
</span>
|
||||
</li>
|
||||
<li class="wa-split">
|
||||
<span class="wa-flank">
|
||||
<wa-icon name="3"></wa-icon>
|
||||
<span>All I Want For Christmas Is Stew</span>
|
||||
</span>
|
||||
<span class="wa-cluster">
|
||||
<span class="wa-caption-m">2:51</span>
|
||||
<wa-icon-button name="ellipsis" label="Song Options"></wa-icon-button>
|
||||
</span>
|
||||
</li>
|
||||
<li class="wa-split">
|
||||
<span class="wa-flank">
|
||||
<wa-icon name="4"></wa-icon>
|
||||
<span>Rockin' Around the Christmas Ent</span>
|
||||
</span>
|
||||
<span class="wa-cluster">
|
||||
<span class="wa-caption-m">3:05</span>
|
||||
<wa-icon-button name="ellipsis" label="Song Options"></wa-icon-button>
|
||||
</span>
|
||||
</li>
|
||||
<li class="wa-split">
|
||||
<span class="wa-flank">
|
||||
<wa-icon name="5"></wa-icon>
|
||||
<span>Merry, Did You Know?</span>
|
||||
</span>
|
||||
<span class="wa-cluster">
|
||||
<span class="wa-caption-m">1:56</span>
|
||||
<wa-icon-button name="ellipsis" label="Song Options"></wa-icon-button>
|
||||
</span>
|
||||
</li>
|
||||
<li class="wa-split">
|
||||
<span class="wa-flank">
|
||||
<wa-icon name="6"></wa-icon>
|
||||
<span>Run Run Shadowfax</span>
|
||||
</span>
|
||||
<span class="wa-cluster">
|
||||
<span class="wa-caption-m">3:32</span>
|
||||
<wa-icon-button name="ellipsis" label="Song Options"></wa-icon-button>
|
||||
</span>
|
||||
</li>
|
||||
<li class="wa-split">
|
||||
<span class="wa-flank">
|
||||
<wa-icon name="7"></wa-icon>
|
||||
<span>You're a Mean One, Mr. Grima</span>
|
||||
</span>
|
||||
<span class="wa-cluster">
|
||||
<span class="wa-caption-m">2:46</span>
|
||||
<wa-icon-button name="ellipsis" label="Song Options"></wa-icon-button>
|
||||
</span>
|
||||
</li>
|
||||
<li class="wa-split">
|
||||
<span class="wa-flank">
|
||||
<wa-icon name="8"></wa-icon>
|
||||
<span>O Come, All Ye Faithful</span>
|
||||
</span>
|
||||
<span class="wa-cluster">
|
||||
<span class="wa-caption-m">3:27</span>
|
||||
<wa-icon-button name="ellipsis" label="Song Options"></wa-icon-button>
|
||||
</span>
|
||||
</li>
|
||||
<li class="wa-split">
|
||||
<span class="wa-flank">
|
||||
<wa-icon name="9"></wa-icon>
|
||||
<span>Do You Hear What I Hear</span>
|
||||
</span>
|
||||
<span class="wa-cluster">
|
||||
<span class="wa-caption-m">2:13</span>
|
||||
<wa-icon-button name="ellipsis" label="Song Options"></wa-icon-button>
|
||||
</span>
|
||||
</li>
|
||||
<li class="wa-split">
|
||||
<span class="wa-flank">
|
||||
<span class="wa-cluster wa-gap-3xs">
|
||||
<wa-icon name="1"></wa-icon>
|
||||
<wa-icon name="0"></wa-icon>
|
||||
</span>
|
||||
<span>Carol of the Horns</span>
|
||||
</span>
|
||||
<span class="wa-cluster">
|
||||
<span class="wa-caption-m">2:55</span>
|
||||
<wa-icon-button name="ellipsis" label="Song Options"></wa-icon-button>
|
||||
</span>
|
||||
</li>
|
||||
<li class="wa-split">
|
||||
<span class="wa-flank">
|
||||
<span class="wa-cluster wa-gap-3xs">
|
||||
<wa-icon name="1"></wa-icon>
|
||||
<wa-icon name="1"></wa-icon>
|
||||
</span>
|
||||
<span>Silent Night</span>
|
||||
</span>
|
||||
<span class="wa-cluster">
|
||||
<span class="wa-caption-m">3:10</span>
|
||||
<wa-icon-button name="ellipsis" label="Song Options"></wa-icon-button>
|
||||
</span>
|
||||
</li>
|
||||
<li class="wa-split">
|
||||
<span class="wa-flank">
|
||||
<span class="wa-cluster wa-gap-3xs">
|
||||
<wa-icon name="1"></wa-icon>
|
||||
<wa-icon name="2"></wa-icon>
|
||||
</span>
|
||||
<span>Wizard Wonderland</span>
|
||||
</span>
|
||||
<span class="wa-cluster">
|
||||
<span class="wa-caption-m">3:22</span>
|
||||
<wa-icon-button name="ellipsis" label="Song Options"></wa-icon-button>
|
||||
</span>
|
||||
</li>
|
||||
</ol>
|
||||
</div>
|
||||
</main>
|
||||
<div slot="main-footer" class="wa-grid wa-gap-xl wa-align-items-center">
|
||||
<h2 class="wa-heading-2xl">More You Might Like</h2>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<div class="wa-frame wa-border-radius-l">
|
||||
<img src="https://images.unsplash.com/photo-1675219119611-40323b738563?q=20" alt="" />
|
||||
</div>
|
||||
<span class="wa-heading-s">Festival of Lights</span>
|
||||
<span class="wa-caption-s">Station</span>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<div class="wa-frame wa-border-radius-l">
|
||||
<img src="https://images.unsplash.com/photo-1481930916222-5ec4696fc0f2?q=20" alt="" />
|
||||
</div>
|
||||
<span class="wa-heading-s">Holiday Cheer</span>
|
||||
<span class="wa-caption-s">Essential Playlist</span>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<div class="wa-frame wa-border-radius-l">
|
||||
<img src="https://images.unsplash.com/photo-1667514627762-521b1c815a89?q=20" alt="" />
|
||||
</div>
|
||||
<span class="wa-heading-s">Nursery Rhymes from the Shire</span>
|
||||
<span class="wa-caption-s">The Shire Choir</span>
|
||||
</div>
|
||||
</div>
|
||||
</wa-page>
|
||||
|
||||
<style>
|
||||
wa-page {
|
||||
--menu-width: 30ch;
|
||||
--wa-tooltip-arrow-size: 0;
|
||||
background-color: var(--wa-color-surface-lowered);
|
||||
}
|
||||
|
||||
wa-page[view='mobile'] {
|
||||
--menu-width: auto;
|
||||
|
||||
[slot*='main'], main {
|
||||
padding: var(--wa-space-xl);
|
||||
}
|
||||
}
|
||||
|
||||
wa-page,
|
||||
[slot='header'],
|
||||
wa-page[view='desktop'] [slot*='navigation'] {
|
||||
background-color: var(--wa-color-surface-lowered);
|
||||
}
|
||||
wa-page[view='mobile'] [slot*='navigation'] {
|
||||
padding: 0;
|
||||
}
|
||||
wa-page::part(base) {
|
||||
background-color: var(--wa-color-surface-lowered);
|
||||
}
|
||||
[slot='header'] {
|
||||
background: linear-gradient(to bottom, var(--wa-color-surface-raised), var(--wa-color-surface-lowered));
|
||||
}
|
||||
[slot='navigation-header'],
|
||||
[slot='main-header'] {
|
||||
padding-block-end: 0 !important;
|
||||
padding-block-start: var(--wa-space-3xl);
|
||||
}
|
||||
[slot='navigation'] {
|
||||
a {
|
||||
--wa-color-text-link: var(--wa-color-text-normal);
|
||||
--wa-link-decoration-default: none;
|
||||
--wa-link-decoration-hover: none;
|
||||
--flank-size: 2rem;
|
||||
font-weight: var(--wa-font-weight-action);
|
||||
gap: 0.5rem;
|
||||
}
|
||||
ul {
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
|
||||
a {
|
||||
border-radius: var(--wa-border-radius-m);
|
||||
padding: var(--wa-space-xs);
|
||||
|
||||
&:hover {
|
||||
background-color: color-mix(in oklab, var(--wa-color-surface-default), var(--wa-color-brand-fill-quiet));
|
||||
}
|
||||
}
|
||||
}
|
||||
wa-icon {
|
||||
align-items: center;
|
||||
aspect-ratio: 1;
|
||||
color: var(--wa-color-brand-fill-loud);
|
||||
display: flex;
|
||||
height: var(--flank-size);
|
||||
justify-content: center;
|
||||
}
|
||||
#recent wa-icon {
|
||||
border-radius: var(--wa-border-radius-s);
|
||||
}
|
||||
}
|
||||
|
||||
[slot='main-header'] {
|
||||
border-block-start: var(--wa-border-width-s) var(--wa-border-style) var(--wa-color-surface-border);
|
||||
border-inline: var(--wa-border-width-s) var(--wa-border-style) var(--wa-color-surface-border);
|
||||
border-radius: var(--wa-border-radius-l) var(--wa-border-radius-l) 0 0
|
||||
}
|
||||
main,
|
||||
[slot*='main'] {
|
||||
margin-inline: var(--wa-space-m);
|
||||
}
|
||||
main ol li {
|
||||
padding: var(--wa-space-m);
|
||||
|
||||
&:hover {
|
||||
background-color: color-mix(in oklab, var(--wa-color-surface-default), var(--wa-color-brand-fill-quiet));
|
||||
}
|
||||
|
||||
&:not(:first-child) {
|
||||
border-block-start: var(--wa-border-width-s) var(--wa-border-style) var(--wa-color-surface-border);
|
||||
}
|
||||
|
||||
.wa-flank {
|
||||
--flank-size: 2rem;
|
||||
}
|
||||
}
|
||||
main,
|
||||
[slot='main-footer'] {
|
||||
border-inline: var(--wa-border-width-s) var(--wa-border-style) var(--wa-color-surface-border);
|
||||
}
|
||||
main,
|
||||
[slot='main-header'] {
|
||||
background-color: var(--wa-color-surface-raised);
|
||||
}
|
||||
#play-controls wa-icon-button::part(base) {
|
||||
border: var(--wa-border-width-l) var(--wa-border-style) currentColor;
|
||||
border-radius: var(--wa-border-radius-circle);
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
#play-controls wa-icon-button[name="play"]::part(base) {
|
||||
background-color: var(--wa-color-brand-fill-loud);
|
||||
border: none;
|
||||
color: var(--wa-color-brand-on-loud);
|
||||
font-size: 3rem;
|
||||
padding: 0.5em 0.45em 0.5em 0.55em;
|
||||
}
|
||||
[slot='main-footer'].wa-grid > * {
|
||||
max-inline-size: 30ch;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
const sectionAnchors = document.querySelectorAll("[slot*='navigation'] a[href*='#']");
|
||||
sectionAnchors.forEach((sectionAnchor) => sectionAnchor.setAttribute("data-drawer", "close"));
|
||||
</script>
|
||||
```
|
||||
|
||||
|
||||
## Customization
|
||||
|
||||
### Sticky Sections
|
||||
|
||||
The following sections of a page are "sticky" by default, meaning they remain in position as the user scrolls.
|
||||
|
||||
- `banner`
|
||||
- `header`
|
||||
- `sub-header`
|
||||
- `menu` (`navigation` itself is not sticky, but its parent `menu` is)
|
||||
- `aside`
|
||||
|
||||
This is often desirable, but you can change this behavior using the `disable-sticky` attribute. Use a space-delimited list of names to tell the page which sections should not be sticky.
|
||||
|
||||
```html
|
||||
<wa-page disable-sticky="header aside"> ... </wa-page>
|
||||
```
|
||||
|
||||
### Skip To Content
|
||||
|
||||
The layout provides a "skip to content" link that's visually hidden until the user tabs into it. You don't have to do anything to configure this, unless you want to change the text displayed in the link. In that case, you can slot in your own text using the `skip-to-content` slot.
|
||||
|
||||
This example localizes the "skip to content" link for German users.
|
||||
|
||||
```html
|
||||
<wa-page>
|
||||
...
|
||||
<span slot="skip-to-content">Zum Inhalt springen</span>
|
||||
...
|
||||
</wa-page>
|
||||
```
|
||||
|
||||
### Responsiveness
|
||||
|
||||
A page isn't very opinionated when it comes to responsive behaviors, but there are tools in place to help make responsiveness easy.
|
||||
|
||||
#### Default Slot Styles
|
||||
|
||||
Each slot is a [flex container](https://developer.mozilla.org/en-US/docs/Glossary/Flex_Container) and specifies some flex properties so that your content is reasonably responsive by default.
|
||||
|
||||
The following slots specify `justify-content: space-between` and `flex-wrap: wrap` to evenly distribute child elements horizontally and allow them to wrap when space is limited:
|
||||
- `header`
|
||||
- `subheader`
|
||||
- `main-header`
|
||||
- `main-footer`
|
||||
- `footer`
|
||||
|
||||
The following slots specify `flex-direction: column` to arrange child elements vertically:
|
||||
- `navigation-header`
|
||||
- `navigation` (or `menu`)
|
||||
- `navigation-footer`
|
||||
- `aside`
|
||||
|
||||
And the `banner` slot specifies `justify-content: center` to horizontally center its child elements.
|
||||
|
||||
You can override the default display and flex properties for each slot with your own CSS.
|
||||
|
||||
#### Responsive Navigation
|
||||
|
||||
When you use the `navigation` slot, your slotted content automatically collapses into a drawer on smaller screens.
|
||||
The breakpoint at which this occurs is `768px` by default, but you can change it using the `mobile-breakpoint` attribute,
|
||||
which takes either a number or a [CSS length](https://developer.mozilla.org/en-US/docs/Web/CSS/length).
|
||||
|
||||
```html
|
||||
<wa-page mobile-breakpoint="600"> ... </wa-page>
|
||||
```
|
||||
```html {.example viewport}
|
||||
<wa-page mobile-breakpoint="50ch">
|
||||
<div slot=navigation>Nav</div>
|
||||
<header slot=header>
|
||||
<div style="width: 50ch; background: gold">I’m 50ch wide</div>
|
||||
</header>
|
||||
</wa-page>
|
||||
<style>
|
||||
html,
|
||||
body {
|
||||
min-height: 100%;
|
||||
height: 100%;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
</style>
|
||||
```
|
||||
|
||||
By default, a "hamburger" button appears in the `header` slot to toggle the navigation menu on smaller screens.
|
||||
You can customize what this looks like by slotting your own button in the `toggle-navigation` slot,
|
||||
or place the `data-toggle-nav` attribute on any button on your page (This _does not_ have to be a Web Awesome element.).
|
||||
The default button not be shown when using either of these methods — if you want to use multiple navigation toggles on your page, simply add the `data-toggle-nav` attribute to multiple elements.
|
||||
|
||||
```html
|
||||
<wa-page mobile-breakpoint="600">
|
||||
...
|
||||
<wa-button data-toggle-nav>Menu</wa-button>
|
||||
...
|
||||
</wa-page>
|
||||
```
|
||||
|
||||
Alternatively, you can apply `nav-state="open"` and `nav-state="closed"` to the layout component to show and hide the navigation, respectively.
|
||||
|
||||
```html
|
||||
<wa-page nav-state="open"> ... </wa-page>
|
||||
```
|
||||
|
||||
`<wa-page>` is given the attribute `view="mobile"` or `view="desktop"` when the viewport narrower or wider than the `mobile-breakpoint` value, respectively. You can leverage these attributes to change styles depending on the size of the viewport.
|
||||
This is especially useful to hide your `data-toggle-nav` button when the viewport is wider:
|
||||
```css
|
||||
wa-page[view='desktop'] [data-toggle-nav] {
|
||||
display: none;
|
||||
}
|
||||
```
|
||||
|
||||
::info
|
||||
If you use [native styles](/docs/native/), this is already taken care for you, and the `data-toggle-nav` button is already hidden on wider screens.
|
||||
:::
|
||||
|
||||
#### Custom Widths
|
||||
|
||||
You specify widths for some slots on your page with [CSS custom properties](#css-custom-properties) for `--menu-width`, `--main-width`, and `--aside-width`.
|
||||
|
||||
If you specify `--menu-width` to apply a specific width to your `navigation` slot, space will still be reserved on the page even below the `mobile-breakpoint`. To collapse this space on smaller screens, add the following code to your styles:
|
||||
```css
|
||||
wa-page[view='mobile'] {
|
||||
--menu-width: auto;
|
||||
}
|
||||
```
|
||||
|
||||
You can use a similar approach for `--aside-width` to hide the `aside` slot on smaller screens. Be sure to also specify `display: none` for the slot:
|
||||
```css
|
||||
wa-page[view='mobile'] {
|
||||
--aside-width: auto;
|
||||
|
||||
[slot='aside'] {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Spacing
|
||||
|
||||
A page specifies default `padding` within each slot and a `gap` between the slot's direct children. You can drop elements into any slot, and reasonable spacing is already applied for you.
|
||||
|
||||
You can override the default spacing for each slot with your own CSS. In this example, we're setting custom `gap` and `padding` for the `footer` slot:
|
||||
```css
|
||||
[slot="footer"] {
|
||||
gap: var(--wa-space-xl);
|
||||
padding: var(--wa-space-xl);
|
||||
}
|
||||
```
|
||||
|
||||
## Utility classes
|
||||
|
||||
[Native styles](/docs/native/) define a few useful defaults for `<wa-page>`, as well as
|
||||
two utility classes you can use for common responsive design tasks:
|
||||
- `.wa-mobile-only` hides an element on the desktop view
|
||||
- `.wa-desktop-only` hides an element on the mobile view
|
||||
|
||||
|
||||
If you don’t want to use [native styles](/docs/native/), you can include this stylesheet in your project to use these:
|
||||
|
||||
```html
|
||||
<link rel="stylesheet" href="{% cdnUrl 'styles/components/page.css' %}" />
|
||||
```
|
||||
@@ -1,70 +0,0 @@
|
||||
---
|
||||
title: Viewport Demo
|
||||
description: Viewport demos can be used to display an iframe as a resizable, zoomable preview.
|
||||
tags: component
|
||||
isPro: true
|
||||
---
|
||||
|
||||
```html {.example}
|
||||
<wa-viewport-demo viewport="1200">
|
||||
<iframe src="."></iframe>
|
||||
</wa-viewport-demo>
|
||||
```
|
||||
|
||||
:::warning
|
||||
A lot of the functionality of this component will not work on cross-origin iframes.
|
||||
:::
|
||||
|
||||
## Examples
|
||||
|
||||
### Arbitrary HTML content
|
||||
|
||||
You can render arbitrary HTML content in the iframe by using the `srcdoc` attribute:
|
||||
|
||||
```html {.example}
|
||||
<wa-viewport-demo>
|
||||
<iframe srcdoc="
|
||||
<button>Click me!</button>
|
||||
"></iframe>
|
||||
</wa-viewport-demo>
|
||||
```
|
||||
|
||||
### Viewport Emulation
|
||||
|
||||
You can also provide a width value to emulate and it will be scaled accordingly:
|
||||
|
||||
```html {.example}
|
||||
<wa-viewport-demo viewport="300">
|
||||
<iframe srcdoc="
|
||||
<button>Click me!</button>
|
||||
<wa-button>Click me!</wa-button>
|
||||
"></iframe>
|
||||
</wa-viewport-demo>
|
||||
```
|
||||
|
||||
By default, the viewport will be rendered to an initial 16:9 aspect ratio,
|
||||
which can be changed via resizing.
|
||||
You can customize this via the `--viewport-initial-aspect-ratio` property.
|
||||
Or, you could add a height value:
|
||||
|
||||
```html {.example}
|
||||
<wa-viewport-demo viewport="1600 x 1000">
|
||||
<iframe srcdoc="
|
||||
<button>Click me!</button>
|
||||
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed maximus et tortor vel ullamcorper. Fusce tristique et justo quis auctor. In tristique dignissim dignissim. Fusce lacus urna, efficitur vel fringilla sed, hendrerit at ipsum. Donec suscipit ante ac ligula imperdiet varius. Aliquam ullamcorper augue sit amet lectus euismod finibus. Proin semper, diam at rhoncus posuere, diam dui semper turpis, ut faucibus mi ipsum nec ante. Morbi varius nibh ut facilisis varius. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Fusce in blandit velit. Aliquam massa eros, commodo eu vestibulum a, faucibus non risus.
|
||||
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed maximus et tortor vel ullamcorper. Fusce tristique et justo quis auctor. In tristique dignissim dignissim. Fusce lacus urna, efficitur vel fringilla sed, hendrerit at ipsum. Donec suscipit ante ac ligula imperdiet varius. Aliquam ullamcorper augue sit amet lectus euismod finibus. Proin semper, diam at rhoncus posuere, diam dui semper turpis, ut faucibus mi ipsum nec ante. Morbi varius nibh ut facilisis varius. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Fusce in blandit velit. Aliquam massa eros, commodo eu vestibulum a, faucibus non risus.
|
||||
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed maximus et tortor vel ullamcorper. Fusce tristique et justo quis auctor. In tristique dignissim dignissim. Fusce lacus urna, efficitur vel fringilla sed, hendrerit at ipsum. Donec suscipit ante ac ligula imperdiet varius. Aliquam ullamcorper augue sit amet lectus euismod finibus. Proin semper, diam at rhoncus posuere, diam dui semper turpis, ut faucibus mi ipsum nec ante. Morbi varius nibh ut facilisis varius. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Fusce in blandit velit. Aliquam massa eros, commodo eu vestibulum a, faucibus non risus.
|
||||
"></iframe>
|
||||
</wa-viewport-demo>
|
||||
```
|
||||
|
||||
## Roadmap
|
||||
|
||||
This component is a work in progress.
|
||||
Some of the things that are not yet implemented are listed below.
|
||||
It goes without saying that this list is a rough plan and subject to change.
|
||||
|
||||
- Non-linear zoom scale
|
||||
- Extend to general content, not just iframes
|
||||
- Styles for mobile and tablet frames and an attribute to switch between them
|
||||
- Automatic iframe height
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
title: Anodized
|
||||
isPro: true
|
||||
tags: pro
|
||||
---
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
title: Elegant
|
||||
isPro: true
|
||||
tags: pro
|
||||
---
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
title: Mild
|
||||
isPro: true
|
||||
tags: pro
|
||||
---
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
title: Natural
|
||||
isPro: true
|
||||
tags: pro
|
||||
---
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
title: Rudimentary
|
||||
isPro: true
|
||||
tags: pro
|
||||
---
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
title: Vogue
|
||||
isPro: true
|
||||
tags: pro
|
||||
---
|
||||
@@ -1,70 +0,0 @@
|
||||
---
|
||||
title: Action Panel
|
||||
description: 'Help users complete tasks efficiently with quick access to key actions.'
|
||||
icon: action-panel
|
||||
isPro: true
|
||||
---
|
||||
|
||||
## Simple
|
||||
|
||||
```html {.example}
|
||||
<wa-card style="max-width: 60ch; margin: auto">
|
||||
<div class="wa-stack wa-align-items-start">
|
||||
<h3 class="wa-heading-m">New Dashboard</h3>
|
||||
<p>Arrange your data into a single view to monitor trends and track performance.</p>
|
||||
<wa-button variant="brand" size="small">Build Dashboard</wa-button>
|
||||
</div>
|
||||
</wa-card>
|
||||
```
|
||||
|
||||
## With Flanked Button
|
||||
|
||||
```html {.example}
|
||||
<wa-card style="max-width: 60ch; margin: auto">
|
||||
<div class="wa-flank:end">
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<h3 class="wa-heading-m">Query with SQL Runner</h3>
|
||||
<p>Access your database to run ad hoc queries.</p>
|
||||
</div>
|
||||
<wa-button variant="brand" size="small">New Query</wa-button>
|
||||
</div>
|
||||
</wa-card>
|
||||
```
|
||||
|
||||
## With Switch
|
||||
|
||||
```html {.example}
|
||||
<wa-card style="max-width: 70ch; margin: auto">
|
||||
<div class="wa-stack">
|
||||
<div class="wa-flank:end">
|
||||
<h3 id="auto-renew-label" class="wa-heading-m">Auto-renew</h3>
|
||||
<wa-switch size="large" aria-labelledby="auto-renew-label"></wa-switch>
|
||||
</div>
|
||||
<p class="wa-body-s">Automatically renew your subscription using your preferred payment method. We'll send you a reminder 30 days before we draft your account.</p>
|
||||
</div>
|
||||
</wa-card>
|
||||
```
|
||||
|
||||
## Avatar and Quick actions
|
||||
|
||||
```html {.example}
|
||||
<wa-card style="margin: 0 auto; max-width: 45ch;">
|
||||
<div class="wa-flank">
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1532202802379-df93d543bac3?q=80&w=2574&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" label="profile-image"></wa-avatar>
|
||||
<div class="wa-split">
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span class="wa-heading-s">Super Dog</span>
|
||||
<div class="wa-caption-m wa-cluster wa-gap-xs">
|
||||
<span>Online</span>
|
||||
<wa-icon name="circle" style="color: var(--wa-color-green); font-size: 10px;"></wa-icon>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-cluster" style="font-size: var(--wa-font-size-l);">
|
||||
<wa-icon-button name="microphone" label="audio-input"></wa-icon-button>
|
||||
<wa-icon-button name="headphones" label="audio-output"></wa-icon-button>
|
||||
<wa-icon-button name="gear" label="settings"></wa-icon-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
```
|
||||
@@ -1,336 +0,0 @@
|
||||
---
|
||||
title: Activity Log
|
||||
description: 'Track and organize recent user actions or events.'
|
||||
|
||||
---
|
||||
|
||||
## Simple
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-stack" style="max-width: 60ch; margin: auto">
|
||||
<article class="wa-flank:end wa-align-items-baseline" style="--flank-size: 10ch">
|
||||
<div class="wa-grid">
|
||||
<div class="wa-cluster">
|
||||
<wa-icon name="french-fries" fixed-width></wa-icon>
|
||||
<span>Fast food</span>
|
||||
</div>
|
||||
<wa-relative-time sync></wa-relative-time>
|
||||
</div>
|
||||
<wa-tag variant="danger">- $5.00</wa-tag>
|
||||
</article>
|
||||
<wa-divider></wa-divider>
|
||||
<article class="wa-flank:end wa-align-items-baseline" style="--flank-size: 10ch">
|
||||
<div class="wa-grid">
|
||||
<div class="wa-cluster">
|
||||
<wa-icon name="piggy-bank" fixed-width></wa-icon>
|
||||
<span>Refund</span>
|
||||
</div>
|
||||
<wa-relative-time date="2025-03-26T09:00:00-04:00"></wa-relative-time>
|
||||
</div>
|
||||
<wa-tag variant="success">+ $48.99</wa-tag>
|
||||
</article>
|
||||
<wa-divider></wa-divider>
|
||||
<article class="wa-flank:end wa-align-items-baseline" style="--flank-size: 10ch">
|
||||
<div class="wa-grid">
|
||||
<div class="wa-cluster">
|
||||
<wa-icon name="carrot" fixed-width></wa-icon>
|
||||
<span>Groceries</span>
|
||||
</div>
|
||||
<wa-relative-time date="2025-03-24T09:00:00-04:00"></wa-relative-time>
|
||||
</div>
|
||||
<wa-tag variant="danger">- $115.37</wa-tag>
|
||||
</article>
|
||||
<wa-divider></wa-divider>
|
||||
<article class="wa-flank:end wa-align-items-baseline" style="--flank-size: 10ch">
|
||||
<div class="wa-grid">
|
||||
<div class="wa-cluster">
|
||||
<wa-icon name="shirt" fixed-width></wa-icon>
|
||||
<span>Clothing</span>
|
||||
</div>
|
||||
<wa-relative-time date="2025-03-15T09:00:00-04:00"></wa-relative-time>
|
||||
</div>
|
||||
<wa-tag variant="danger">- $220.99</wa-tag>
|
||||
</article>
|
||||
</div>
|
||||
```
|
||||
|
||||
## Timeline with Icons
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-stack wa-gap-3xs" style="max-width: 60ch; margin: auto">
|
||||
<article class="wa-flank" style="flex-wrap: nowrap">
|
||||
<wa-avatar style="--size: 2rem">
|
||||
<wa-icon slot="icon" name="acorn"></wa-icon>
|
||||
</wa-avatar>
|
||||
<div class="wa-flank:end wa-gap-xs">
|
||||
<span>Buried by <strong>squirrel</strong></span>
|
||||
<wa-format-date date="2025-04-01" month="short" day="numeric"></wa-format-date>
|
||||
</div>
|
||||
</article>
|
||||
<wa-divider vertical style="height: 1em; margin-left: 1rem"></wa-divider>
|
||||
<article class="wa-flank" style="flex-wrap: nowrap">
|
||||
<wa-avatar style="--size: 2rem">
|
||||
<wa-icon slot="icon" name="seedling"></wa-icon>
|
||||
</wa-avatar>
|
||||
<div class="wa-flank:end wa-gap-xs">
|
||||
<span>Germinated in <strong>nutrient-rich soil</strong></span>
|
||||
<wa-format-date date="2025-05-29" month="short" day="numeric"></wa-format-date>
|
||||
</div>
|
||||
</article>
|
||||
<wa-divider vertical style="height: 1em; margin-left: 1rem"></wa-divider>
|
||||
<article class="wa-flank" style="flex-wrap: nowrap">
|
||||
<wa-avatar style="--size: 2rem">
|
||||
<wa-icon slot="icon" name="tree-deciduous"></wa-icon>
|
||||
</wa-avatar>
|
||||
<div class="wa-flank:end wa-gap-xs">
|
||||
<span>Matured by <strong>water</strong> and <strong>sunlight</strong></span>
|
||||
<wa-format-date date="2025-09-15" month="short" day="numeric"></wa-format-date>
|
||||
</div>
|
||||
</article>
|
||||
<wa-divider vertical style="height: 1em; margin-left: 1rem"></wa-divider>
|
||||
<article class="wa-flank" style="flex-wrap: nowrap">
|
||||
<wa-avatar style="--size: 2rem">
|
||||
<wa-icon slot="icon" name="crate-apple"></wa-icon>
|
||||
</wa-avatar>
|
||||
<div class="wa-flank:end wa-gap-xs">
|
||||
<span>Fruit harvested by <strong>you</strong></span>
|
||||
<wa-format-date date="2025-10-18" month="short" day="numeric"></wa-format-date>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
```
|
||||
|
||||
## With Expandable Details
|
||||
|
||||
```html {.example}
|
||||
<wa-card style="max-width: 70ch; margin: auto">
|
||||
<h3 class="wa-heading-m">Monthly Activity</h3>
|
||||
<div class="wa-stack">
|
||||
<wa-details>
|
||||
<span class="wa-heading-m" slot="summary">
|
||||
February
|
||||
</span>
|
||||
<div class="wa-stack">
|
||||
<article class="wa-flank">
|
||||
<wa-icon style="font-size: var(--wa-font-size-l)" name="envelope" fixed-width></wa-icon>
|
||||
<div class="wa-split">
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<span class="wa-heading-s">Email blasts</span>
|
||||
<div class="wa-cluster wa-gap-2xs">
|
||||
<a href="#">Nick Burkhart</a><span>sent to</span><a href="#">likely customers</a>
|
||||
</div>
|
||||
</div>
|
||||
<wa-format-date date="2025-02-28" month="short" day="numeric" class="wa-caption-m"></wa-format-date>
|
||||
</div>
|
||||
</article>
|
||||
<wa-divider></wa-divider>
|
||||
<article class="wa-flank">
|
||||
<wa-icon style="font-size: var(--wa-font-size-l)" name="phone" fixed-width></wa-icon>
|
||||
<div class="wa-split">
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<span class="wa-heading-s">Spoke with the Pope</span>
|
||||
<div class="wa-cluster wa-gap-2xs">
|
||||
<a href="#">Artur Fleck</a><span>for 1 hour</span>
|
||||
</div>
|
||||
</div>
|
||||
<wa-format-date date="2025-02-23" month="short" day="numeric" class="wa-caption-m"></wa-format-date>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
</wa-details>
|
||||
<wa-details>
|
||||
<span class="wa-heading-m" slot="summary">
|
||||
March
|
||||
</span>
|
||||
<div class="wa-stack">
|
||||
<article class="wa-flank">
|
||||
<wa-icon style="font-size: var(--wa-font-size-l)" name="video" fixed-width></wa-icon>
|
||||
<div class="wa-split">
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<span class="wa-heading-s">Zoom Call with Northeast office</span>
|
||||
<div class="wa-cluster wa-gap-2xs">
|
||||
<a href="#">Axel Foley</a><span>for 47 minutes</span>
|
||||
</div>
|
||||
</div>
|
||||
<wa-format-date date="2025-03-15" month="short" day="numeric" class="wa-caption-m"></wa-format-date>
|
||||
</div>
|
||||
</article>
|
||||
<wa-divider></wa-divider>
|
||||
<article class="wa-flank">
|
||||
<wa-icon style="font-size: var(--wa-font-size-l)" name="calendar" fixed-width></wa-icon>
|
||||
<div class="wa-split">
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<span class="wa-heading-s">Scheduled birthday party</span>
|
||||
<div class="wa-cluster wa-gap-2xs">
|
||||
<a href="#">John Blaze</a><span>in</span><a href="#">Social Events</a>
|
||||
</div>
|
||||
</div>
|
||||
<wa-format-date date="2025-03-03" month="short" day="numeric" class="wa-caption-m"></wa-format-date>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
</wa-details>
|
||||
<wa-details>
|
||||
<span class="wa-heading-m" slot="summary">
|
||||
April
|
||||
</span>
|
||||
<div class="wa-stack">
|
||||
<article class="wa-flank">
|
||||
<wa-icon style="font-size: var(--wa-font-size-l)" family="brands" name="intercom" fixed-width></wa-icon>
|
||||
<div class="wa-split">
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<span class="wa-heading-s">Got new lead</span>
|
||||
<div class="wa-cluster wa-gap-2xs">
|
||||
<a href="#">Jack Carter</a><span>on Intercom switchboard</span>
|
||||
</div>
|
||||
</div>
|
||||
<wa-format-date date="2025-04-18" month="short" day="numeric" class="wa-caption-m"></wa-format-date>
|
||||
</div>
|
||||
</article>
|
||||
<wa-divider></wa-divider>
|
||||
<article class="wa-flank">
|
||||
<wa-icon style="font-size: var(--wa-font-size-l)" name="list-check" fixed-width></wa-icon>
|
||||
<div class="wa-split">
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<span class="wa-heading-s">Completed Todo</span>
|
||||
<div class="wa-cluster wa-gap-2xs">
|
||||
<a href="#">Huey Freeman</a><span>marked complete on</span><a href="#">Daily Tasks</a>
|
||||
</div>
|
||||
</div>
|
||||
<wa-format-date date="2025-04-02" month="short" day="numeric" class="wa-caption-m"></wa-format-date>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
</wa-details>
|
||||
</div>
|
||||
</wa-card>
|
||||
```
|
||||
## Card Separated
|
||||
```html {.example}
|
||||
<div class="wa-stack" style="max-width: 45ch; margin: 0 auto;">
|
||||
<div class="wa-stack">
|
||||
<wa-card>
|
||||
<div class="wa-flank">
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1559188286-a173792c8340?q=80&w=2906&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" label="profile image"></wa-avatar>
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<div class="wa-split">
|
||||
<span class="wa-heading-s">Isaiah Hamilton</span>
|
||||
<wa-relative-time class="wa-caption-s" date="2025-01-15T09:17:00-04:00"></wa-relative-time>
|
||||
</div>
|
||||
<p>Who's on first?</p>
|
||||
<a href="#" class="wa-cluster wa-gap-2xs">
|
||||
<wa-icon name="reply" family="sharp" variant="regular"></wa-icon>
|
||||
<span>Reply</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
<div class="wa-flank wa-gap-xl">
|
||||
<wa-divider vertical style="height: auto; align-self: stretch"></wa-divider>
|
||||
<ul class="wa-stack">
|
||||
<li class="wa-stack wa-gap-2xs">
|
||||
<wa-card>
|
||||
<div class="wa-flank">
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1645288059073-af3e9eb62a29?q=80&w=2936&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" label="profile image"></wa-avatar>
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<div class="wa-split">
|
||||
<span class="wa-heading-s">Melvin Hurst</span>
|
||||
<wa-relative-time class="wa-caption-s" date="2025-02-15T09:17:00-04:00"></wa-relative-time>
|
||||
</div>
|
||||
<p>What's on second?</p>
|
||||
<a href="#" class="wa-cluster wa-gap-2xs">
|
||||
<wa-icon name="reply" family="sharp" variant="regular"></wa-icon>
|
||||
<span>Reply</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
</li>
|
||||
<li class="wa-stack wa-gap-2xs">
|
||||
<wa-card>
|
||||
<div class="wa-flank wa-align-items-start">
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1674044494331-8db2ecf18d46?q=80&w=3019&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" label="profile image"></wa-avatar>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<div class="wa-split">
|
||||
<span class="wa-heading-s">Vanessa Wright</span>
|
||||
</div>
|
||||
<wa-textarea size="small" aria-label="Add Your Comment"></wa-textarea>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
## Divider Separated
|
||||
```html {.example}
|
||||
<wa-card with-header style="max-width: 54ch; margin: 0 auto;">
|
||||
<div slot="header" class="wa-split">
|
||||
<div>
|
||||
<span>Notifications</span>
|
||||
<wa-badge appearance="filled" variant="success" pill>2</wa-badge>
|
||||
</div>
|
||||
<wa-icon name="close"></wa-icon>
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<article>
|
||||
<div class="wa-flank wa-align-items-start">
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1614807547811-4174d3582092?q=80&w=2932&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" label="profile image"></wa-avatar>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<div class="wa-split">
|
||||
<span><strong>Happy</strong> commented in <a href="#">Reporting Dashboard</a></span>
|
||||
<wa-icon name="circle" style="color: var(--wa-color-green);"></wa-icon>
|
||||
</div>
|
||||
<div class="wa-split">
|
||||
<span class="wa-caption-m">Friday 3:12PM</span>
|
||||
<wa-relative-time class="wa-caption-m" date="2025-02-15T09:17:00-04:00"></wa-relative-time>
|
||||
</div>
|
||||
<wa-callout variant="neutral">
|
||||
Really love this approach. I think this is the best solution for the sync issue.
|
||||
</wa-callout>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</article>
|
||||
<article>
|
||||
<div class="wa-flank wa-align-items-start">
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1613428800237-c86372070fab?q=80&w=3017&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" label="profile image"></wa-avatar>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<div class="wa-split">
|
||||
<span><strong>Charlotte</strong> followed you</span>
|
||||
<wa-icon name="circle" style="color: var(--wa-color-green);"></wa-icon>
|
||||
</div>
|
||||
<div class="wa-split">
|
||||
<span class="wa-caption-m">Friday 3:04PM</span>
|
||||
<wa-relative-time class="wa-caption-m" date="2025-02-15T09:17:00-04:00"></wa-relative-time>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</article>
|
||||
<article>
|
||||
<div class="wa-flank wa-align-items-start">
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1645288059073-af3e9eb62a29?q=80&w=2936&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" label="Profile image"></wa-avatar>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<div class="wa-split">
|
||||
<span><strong>Tavitian</strong> invited you to <a href="#">Homepage Redesign</a></span>
|
||||
</div>
|
||||
<div class="wa-split">
|
||||
<span class="wa-caption-m">Friday 2:22PM</span>
|
||||
<wa-relative-time class="wa-caption-m" date="2025-02-15T09:17:00-04:00"></wa-relative-time>
|
||||
</div>
|
||||
<div class="wa-cluster wa-gap-xs">
|
||||
<wa-button appearance="outlined" size="small">Decline</wa-button>
|
||||
<wa-button variant="brand" size="small">Accept</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</article>
|
||||
</div>
|
||||
</wa-card>
|
||||
```
|
||||
@@ -1,3 +0,0 @@
|
||||
{
|
||||
"tags": ["app"]
|
||||
}
|
||||
@@ -1,165 +0,0 @@
|
||||
---
|
||||
title: Comments
|
||||
description: 'Enable users to engage in discussions, provide feedback, or record their thoughts.'
|
||||
isPro: true
|
||||
---
|
||||
|
||||
## Card with Header & Footer
|
||||
|
||||
```html {.example}
|
||||
<form style="max-width: 60ch; margin: auto">
|
||||
<wa-card>
|
||||
<div slot="header" id="comment-area-label">
|
||||
<span class="wa-heading-s">Leave a Comment</span>
|
||||
</div>
|
||||
<wa-textarea aria-labelledby="comment-area-label"></wa-textarea>
|
||||
<div slot="footer" class="wa-cluster" style="justify-content: flex-end">
|
||||
<wa-button appearance="filled" size="small">
|
||||
<wa-icon slot="prefix" name="paperclip" variant="solid"></wa-icon>
|
||||
Attach a file
|
||||
</wa-button>
|
||||
<wa-button variant="brand" size="small">Comment</wa-button>
|
||||
</div>
|
||||
</wa-card>
|
||||
</form>
|
||||
```
|
||||
|
||||
## Card with Thread
|
||||
|
||||
```html {.example}
|
||||
<wa-card style="max-width: 60ch; margin: auto">
|
||||
<div class="wa-stack">
|
||||
<h3 class="wa-heading-m">Comments</h3>
|
||||
<wa-textarea aria-label="Comment"></wa-textarea>
|
||||
<wa-button variant="brand">Add Comment</wa-button>
|
||||
<wa-divider></wa-divider>
|
||||
<ul class="wa-stack">
|
||||
<li class="wa-stack wa-gap-2xs">
|
||||
<div class="wa-flank">
|
||||
<wa-avatar initials="RF" label="User avatar"></wa-avatar>
|
||||
<div class="wa-cluster">
|
||||
<strong>Robert Fox</strong>
|
||||
<span class="wa-caption-m">commented <wa-relative-time date="2025-03-31T09:17:00-04:00"></wa-relative-time></span>
|
||||
</div>
|
||||
</div>
|
||||
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras convallis mollis nunc, vel tempor sem faucibus nec. Suspendisse potenti. Pellentesque lobortis pulvinar nulla non tempor. Interdum et malesuada fames ac ante ipsum primis in faucibus.</p>
|
||||
</li>
|
||||
<div class="wa-flank wa-gap-xl">
|
||||
<wa-divider vertical style="height: auto; align-self: stretch"></wa-divider>
|
||||
<ul class="wa-stack">
|
||||
<li class="wa-stack wa-gap-2xs">
|
||||
<div class="wa-flank">
|
||||
<wa-avatar initials="VF" label="User avatar"></wa-avatar>
|
||||
<div class="wa-cluster">
|
||||
<strong>Virginia Woolf</strong>
|
||||
<span class="wa-caption-m">commented <wa-relative-time date="2025-03-31T12:32:00-04:00"></wa-relative-time></span>
|
||||
</div>
|
||||
</div>
|
||||
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras convallis mollis nunc, vel tempor sem faucibus nec.</p>
|
||||
</li>
|
||||
<li class="wa-stack wa-gap-2xs">
|
||||
<div class="wa-flank">
|
||||
<wa-avatar initials="CV" label="User avatar"></wa-avatar>
|
||||
<div class="wa-cluster">
|
||||
<strong>Clarissa Vaughan</strong>
|
||||
<span class="wa-caption-m">commented <wa-relative-time></wa-relative-time></span>
|
||||
</div>
|
||||
</div>
|
||||
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras convallis mollis nunc, vel tempor sem faucibus nec.</p>
|
||||
</li>
|
||||
<li class="wa-cluster">
|
||||
<wa-icon name="reply"></wa-icon>
|
||||
<a href="">Leave a reply</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</ul>
|
||||
</div>
|
||||
</wa-card>
|
||||
```
|
||||
|
||||
## With Avatar & Additional Actions
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-align-items-start wa-flank">
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1438761681033-6461ffad8d80?q=80&w=2670&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" label="User avatar"></wa-avatar>
|
||||
<div class="wa-stack wa-gap-s">
|
||||
<wa-textarea placeholder="Add to the conversation..." aria-label="Add comment"></wa-textarea>
|
||||
<div class="wa-split">
|
||||
<div class="wa-cluster wa-gap-s">
|
||||
<wa-icon-button name="paperclip" label="Attach File" id="attach-button"></wa-icon-button>
|
||||
<wa-tooltip for="attach-button">Attach File</wa-tooltip>
|
||||
<wa-icon-button name="face-smile" label="Add Sticker" id="sticker-button"></wa-icon-button>
|
||||
<wa-tooltip for="sticker-button">Add Sticker</wa-tooltip>
|
||||
</div>
|
||||
<wa-button variant="brand">Comment</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
## Rich Card with Multiple Actions
|
||||
|
||||
```html {.example}
|
||||
<wa-card with-header with-footer style="max-width: 60ch; margin: auto">
|
||||
<div slot="header">
|
||||
<h3 class="wa-heading-s">I watched...</h3>
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-flank" style="--flank-size: 3rem">
|
||||
<div class="wa-frame:portrait wa-border-radius-s">
|
||||
<img
|
||||
src="https://images.unsplash.com/photo-1607675742178-f616ae75044b?q=80&w=3435&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="the cover image for the film"
|
||||
/>
|
||||
</div>
|
||||
<span class="wa-heading-l">Heretic</span>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<dl class="wa-split">
|
||||
<dt>Date</dt>
|
||||
<dd>
|
||||
<wa-format-date date="2025-03-13T00:00:00.000-04:00" weekday="long" month="long" day="numeric" year="numeric" class="wa-caption-m"></wa-format-date>
|
||||
</dd>
|
||||
</dl>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-split">
|
||||
<wa-rating label="Rating"></wa-rating>
|
||||
<wa-checkbox>Loved it!</wa-checkbox>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<wa-textarea placeholder="Add review..." aria-label="Add review"></wa-textarea>
|
||||
</div>
|
||||
<div slot="footer" class="wa-grid">
|
||||
<wa-button appearance="outlined">Cancel</wa-button>
|
||||
<wa-button variant="brand">Save</wa-button>
|
||||
</div>
|
||||
</wa-card>
|
||||
```
|
||||
## With Preview Pane
|
||||
```html{.example}
|
||||
<div style="max-width: 60ch; margin: 0 auto;">
|
||||
<wa-card class="wa-border-radius-square" with-footer>
|
||||
<h3 class="wa-heading-m">Add a comment</h3>
|
||||
<wa-tab-group>
|
||||
<wa-tab panel="write">Write</wa-tab>
|
||||
<wa-tab panel="preview">Preview</wa-tab>
|
||||
<wa-tab-panel name="write">
|
||||
<div class="wa-stack">
|
||||
<div class="wa-cluster wa-gap-xs" style="justify-content: flex-end;">
|
||||
<wa-icon-button name="link" label="add link"></wa-icon-button>
|
||||
<wa-icon-button name="at" label="mention collaborator"></wa-icon-button>
|
||||
<wa-icon-button name="hashtag" label="change heading"></wa-icon-button>
|
||||
</div>
|
||||
<wa-textarea aria-label="Add a comment"></wa-textarea>
|
||||
</div>
|
||||
</wa-tab-panel>
|
||||
<wa-tab-panel name="preview">Your content will render here.</wa-tab-panel>
|
||||
</wa-tab-group>
|
||||
<div slot="footer" class="wa-cluster" style="justify-content: flex-end;">
|
||||
<wa-button appearance="outlined" size="small">Post</wa-button>
|
||||
</div>
|
||||
</wa-card>
|
||||
|
||||
</div>
|
||||
```
|
||||
@@ -1,174 +0,0 @@
|
||||
---
|
||||
title: Data Display
|
||||
description: 'Convey insights, metrics, and aggregate data at a glance.'
|
||||
isPro: true
|
||||
---
|
||||
|
||||
|
||||
## Simple
|
||||
```html {.example}
|
||||
<wa-card>
|
||||
<div class="wa-grid wa-gap-3xl" style="--min-column-size: 24ch;">
|
||||
<div class="wa-stack">
|
||||
<div class="wa-split">
|
||||
<div class="wa-cluster wa-gap-xs">
|
||||
<wa-icon name="sack-dollar"></wa-icon>
|
||||
<span>Incomes</span>
|
||||
</div>
|
||||
<div class="wa-cluster wa-gap-xs" style="color: var(--wa-color-green);">
|
||||
<wa-icon name="arrow-trend-up"></wa-icon>
|
||||
<wa-format-number class="wa-heading-s" type="percent" value=".475"></wa-format-number>
|
||||
</div>
|
||||
</div>
|
||||
<wa-format-number class="wa-heading-xl" type="currency" currency="USD" value="175000000" lang="en-US"></wa-format-number>
|
||||
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-split">
|
||||
<div class="wa-cluster wa-gap-xs">
|
||||
<wa-icon name="credit-card"></wa-icon>
|
||||
<span>Expenses</span>
|
||||
</div>
|
||||
<div class="wa-cluster wa-gap-xs" style="color: var(--wa-color-red);">
|
||||
<wa-icon name="arrow-trend-down"></wa-icon>
|
||||
<wa-format-number class="wa-heading-s" type="percent" value=".27"></wa-format-number>
|
||||
</div>
|
||||
</div>
|
||||
<wa-format-number class="wa-heading-xl" class="wa-heading-xl" type="currency" currency="USD" value="289472" lang="en-US"></wa-format-number>
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-split">
|
||||
<div class="wa-cluster wa-gap-xs">
|
||||
<wa-icon name="seedling"></wa-icon>
|
||||
<span>Investments</span>
|
||||
</div>
|
||||
<div class="wa-cluster wa-gap-xs" style="color: var(--wa-color-green);">
|
||||
<wa-icon name="arrow-trend-up"></wa-icon>
|
||||
<wa-format-number class="wa-heading-s" type="percent" value=".14"></wa-format-number>
|
||||
</div>
|
||||
</div>
|
||||
<wa-format-number class="wa-heading-xl" class="wa-heading-xl" type="currency" currency="USD" value="569213" lang="en-US"></wa-format-number>
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-split">
|
||||
<div class="wa-cluster wa-gap-xs">
|
||||
<wa-icon name="landmark"></wa-icon>
|
||||
<span>Mortgages & Loans</span>
|
||||
</div>
|
||||
</div>
|
||||
<wa-format-number class="wa-heading-xl" class="wa-heading-xl" type="currency" currency="USD" value="23904" lang="en-US"></wa-format-number>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
```
|
||||
|
||||
## Cards with Avatars
|
||||
```html {.example}
|
||||
<div class="wa-grid" style="--min-column-size: 30ch">
|
||||
<wa-card>
|
||||
<div class="wa-flank wa-align-items-start">
|
||||
<wa-avatar shape="rounded">
|
||||
<wa-icon slot="icon" name="user-group"></wa-icon>
|
||||
</wa-avatar>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<h3 class="wa-caption-m">Total Subscribers</h3>
|
||||
<div class="wa-cluster wa-gap-xs">
|
||||
<span class="wa-heading-l">81,779</span>
|
||||
<wa-badge variant="success" appearance="filled outlined" pill>
|
||||
<wa-icon fixed-width name="arrow-up" label="Up"></wa-icon>
|
||||
212
|
||||
</wa-badge>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card>
|
||||
<div class="wa-flank wa-align-items-start">
|
||||
<wa-avatar shape="rounded">
|
||||
<wa-icon slot="icon" name="envelope-open"></wa-icon>
|
||||
</wa-avatar>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<h3 class="wa-caption-m">Open Rate</h3>
|
||||
<div class="wa-cluster wa-gap-xs">
|
||||
<span class="wa-heading-l">61.58%</span>
|
||||
<wa-badge variant="success" appearance="filled outlined" pill>
|
||||
<wa-icon fixed-width name="arrow-up" label="Up"></wa-icon>
|
||||
4.5%
|
||||
</wa-badge>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card>
|
||||
<div class="wa-flank wa-align-items-start">
|
||||
<wa-avatar shape="rounded">
|
||||
<wa-icon slot="icon" name="arrow-pointer"></wa-icon>
|
||||
</wa-avatar>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<h3 class="wa-caption-m">Click Rate</h3>
|
||||
<div class="wa-cluster wa-gap-xs">
|
||||
<span class="wa-heading-l">25.74%</span>
|
||||
<wa-badge variant="danger" appearance="filled outlined" pill>
|
||||
<wa-icon fixed-width name="arrow-down" label="Down"></wa-icon>
|
||||
2.1%
|
||||
</wa-badge>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
</div>
|
||||
```
|
||||
|
||||
## Condensed Card
|
||||
|
||||
```html {.example}
|
||||
<wa-card style="max-width: 50ch; margin: auto">
|
||||
<div slot="header" class="wa-split">
|
||||
<h3 class="wa-heading-m"><span style="color: var(--wa-color-text-quiet)">query</span> getUser</h3>
|
||||
<wa-icon-button id="go-to-query-button" name="chevron-right" label="Go to Query"></wa-icon-button>
|
||||
<wa-tooltip for="go-to-query-button">Go to Query</wa-tooltip>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xl">
|
||||
<div class="wa-split wa-align-items-stretch">
|
||||
<article class="wa-stack wa-align-items-start wa-gap-xs">
|
||||
<h4 class="wa-caption-l">Cache Hit Rate</h4>
|
||||
<div class="wa-cluster wa-heading-2xl">
|
||||
<wa-progress-ring value="12.3" style="--size: 1em; --track-width: 0.125em"></wa-progress-ring>
|
||||
<span>12.3%</span>
|
||||
</div>
|
||||
<wa-badge appearance="filled outlined" variant="danger"><wa-icon name="arrow-down"></wa-icon> down from 19.6%</wa-badge>
|
||||
</article>
|
||||
<article class="wa-stack wa-gap-xs wa-align-items-end">
|
||||
<h4 class="wa-caption-l">Max CHR</h4>
|
||||
<span class="wa-heading-2xl">72.6%</span>
|
||||
<wa-badge appearance="filled outlined" variant="success"><wa-icon name="sparkles"></wa-icon> CHR Impact +5.4%</wa-badge>
|
||||
</article>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<article class="wa-stack wa-gap-xl">
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<h4 class="wa-caption-l">Cacheable Bandwidth</h4>
|
||||
<div class="wa-split">
|
||||
<span class="wa-heading-2xl">90.5 GB</span>
|
||||
<span class="wa-caption-xl">69.9%</span>
|
||||
</div>
|
||||
<wa-progress-bar value="30.1" label="Cached and non-cacheable bandwidth"></wa-progress-bar>
|
||||
</div>
|
||||
<dl class="wa-stack wa-caption-m">
|
||||
<div class="wa-cluster">
|
||||
<dt>Cached</dt>
|
||||
<dd>12.8 GB (9.8%)</dd>
|
||||
</div>
|
||||
<div class="wa-cluster">
|
||||
<dt>Non-Cacheable</dt>
|
||||
<dd>26.3 GB (20.3%)</dd>
|
||||
</div>
|
||||
<div class="wa-cluster">
|
||||
<dt>Total</dt>
|
||||
<dd>129.6 GB</dd>
|
||||
</div>
|
||||
</dl>
|
||||
</article>
|
||||
</div>
|
||||
</wa-card>
|
||||
```
|
||||
@@ -1,253 +0,0 @@
|
||||
---
|
||||
title: Description List
|
||||
description: 'Help users digest detailed information in a structured, easy-to-scan format.'
|
||||
isPro: true
|
||||
---
|
||||
|
||||
## Left Aligned
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-stack">
|
||||
<h3 class="wa-heading-m">Applicant Info</h3>
|
||||
<p class="wa-caption-m">Details about the applicant and attachments.</p>
|
||||
<wa-divider></wa-divider>
|
||||
<dl class="wa-stack wa-gap-2xl">
|
||||
<div class="wa-flank" style="--flank-size: 20ch;">
|
||||
<dt>Full name</dt>
|
||||
<dd>Bucky Barnes</dd>
|
||||
</div>
|
||||
<div class="wa-flank" style="--flank-size: 20ch;">
|
||||
<dt>Application for</dt>
|
||||
<dd>Machine Learning Engineer</dd>
|
||||
</div>
|
||||
<div class="wa-flank" style="--flank-size: 20ch;">
|
||||
<dt>Email address</dt>
|
||||
<dd>winter_soldier@example.com</dd>
|
||||
</div>
|
||||
<div class="wa-flank" style="--flank-size: 20ch;">
|
||||
<dt>Salary expectation</dt>
|
||||
<dd>$240,000</dd>
|
||||
</div>
|
||||
<div class="wa-flank wa-align-items-start" style="--flank-size: 20ch;">
|
||||
<dt>About</dt>
|
||||
<dd>After being lost in action and brainwashed into becoming Hydra's ruthless assassin, my journey is one of redemption, healing, and reclaiming my true self. Though burdened with the weight of the past, I remain a fierce warrior, loyal to those I love, and I'm always striving to atone for those dark days as the Winter Soldier.
|
||||
</dd>
|
||||
</div>
|
||||
<div class="wa-flank wa-align-items-start" style="--flank-size: 20ch;">
|
||||
<dt>Attachments</dt>
|
||||
<dd>
|
||||
<wa-card>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-flank">
|
||||
<wa-icon name="paperclip"></wa-icon>
|
||||
<div class="wa-split">
|
||||
<span class="wa-caption-m wa-cluster">
|
||||
<span>bb_resume.pdf</span>
|
||||
<span>2.4mb</span>
|
||||
</span>
|
||||
<wa-button appearance="plain" variant="brand" size="small">Download</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-flank">
|
||||
<wa-icon name="paperclip"></wa-icon>
|
||||
<div class="wa-split">
|
||||
<span class="wa-caption-m wa-cluster">
|
||||
<span>bb_cover_letter.pdf</span>
|
||||
<span>2.4mb</span>
|
||||
</span>
|
||||
<wa-button appearance="plain" variant="brand" size="small">Download</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
</dd>
|
||||
</div>
|
||||
</dl>
|
||||
</div>
|
||||
```
|
||||
|
||||
## Two Column
|
||||
|
||||
```html{.example}
|
||||
<div class="wa-stack">
|
||||
<h2 class="wa-heading-m">Applicant Info</h2>
|
||||
<p class="wa-caption-m">Details about the applicant and attachments.</p>
|
||||
<wa-divider></wa-divider>
|
||||
<dl class="wa-grid wa-gap-2xl" style="--min-column-size: 40ch;">
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<dt>Full name</dt>
|
||||
<dd>Bucky Barnes</dd>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<dt>Application for</dt>
|
||||
<dd>Machine Learning Engineer</dd>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<dt>Email address</dt>
|
||||
<dd>winter_soldier@example.com</dd>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<dt>Salary expectation</dt>
|
||||
<dd>$240,000</dd>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs wa-span-grid">
|
||||
<dt>About</dt>
|
||||
<dd>After being lost in action and brainwashed into becoming Hydra's ruthless assassin, my journey is one of redemption, healing, and reclaiming my true self. Though burdened with the weight of the past, I remain a fierce warrior, loyal to those I love, and I'm always striving to atone for those dark days as the Winter Soldier.
|
||||
</dd>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs wa-span-grid">
|
||||
<dt>Attachments</dt>
|
||||
<dd>
|
||||
<wa-card>
|
||||
<div>
|
||||
<div class="wa-flank">
|
||||
<wa-icon name="paperclip"></wa-icon>
|
||||
<div class="wa-split">
|
||||
<span class="wa-caption-m wa-cluster">
|
||||
<span>bb_resume.pdf</span>
|
||||
<span>2.4mb</span>
|
||||
</span>
|
||||
<wa-button appearance="plain" variant="brand" size="small">Download</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-flank">
|
||||
<wa-icon name="paperclip"></wa-icon>
|
||||
<div class="wa-split">
|
||||
<span class="wa-caption-m wa-cluster">
|
||||
<span>bb_cover_letter.pdf</span>
|
||||
<span>2.4mb</span>
|
||||
</span>
|
||||
<wa-button appearance="plain" variant="brand" size="small">Download</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
</dd>
|
||||
</div>
|
||||
</dl>
|
||||
</div>
|
||||
```
|
||||
|
||||
## Left Aligned with Actions
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-stack">
|
||||
<h3 class="wa-heading-m">Applicant Info</h3>
|
||||
<p class="wa-caption-m">Details about the applicant and attachments.</p>
|
||||
<wa-divider></wa-divider>
|
||||
<dl class="wa-stack wa-gap-2xl">
|
||||
<div class="wa-flank" style="--flank-size: 20ch;">
|
||||
<dt>Full name</dt>
|
||||
<div class="wa-flank:end">
|
||||
<dd>Bucky Barnes</dd>
|
||||
<wa-button appearance="plain" variant="brand" size="small">Edit</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-flank" style="--flank-size: 20ch;">
|
||||
<dt>Application for</dt>
|
||||
<div class="wa-flank:end">
|
||||
<dd>Machine Learning Engineer</dd>
|
||||
<wa-button appearance="plain" variant="brand" size="small">Edit</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-flank" style="--flank-size: 20ch;">
|
||||
<dt>Email address</dt>
|
||||
<div class="wa-flank:end">
|
||||
<dd>winter_soldier@example.com</dd>
|
||||
<wa-button appearance="plain" variant="brand" size="small">Edit</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-flank" style="--flank-size: 20ch;">
|
||||
<dt>Salary expectation</dt>
|
||||
<div class="wa-flank:end">
|
||||
<dd>$240,000</dd>
|
||||
<wa-button appearance="plain" variant="brand" size="small">Edit</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-flank wa-align-items-start" style="--flank-size: 20ch;">
|
||||
<dt>About</dt>
|
||||
<div class="wa-flank:end">
|
||||
<dd>After being lost in action and brainwashed into becoming Hydra's ruthless assassin, my journey is one of redemption, healing, and reclaiming my true self. Though burdened with the weight of the past, I remain a fierce warrior, loyal to those I love, and I'm always striving to atone for those dark days as the Winter Soldier.</dd>
|
||||
<wa-button appearance="plain" variant="brand" size="small">Edit</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-flank" style="--flank-size: 20ch;">
|
||||
<dt>Attachments</dt>
|
||||
<dd>
|
||||
<wa-card>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-flank">
|
||||
<wa-icon name="paperclip"></wa-icon>
|
||||
<div class="wa-split">
|
||||
<span class="wa-caption-m wa-cluster">
|
||||
<span>bb_resume.pdf</span>
|
||||
<span>2.4mb</span>
|
||||
</span>
|
||||
<div class="wa-cluster wa-gap-2xs">
|
||||
<wa-button appearance="plain" variant="brand" size="small">Download</wa-button>
|
||||
<wa-divider vertical style="height: 1em"></wa-divider>
|
||||
<wa-button appearance="plain" variant="danger" size="small">Delete</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-flank">
|
||||
<wa-icon name="paperclip"></wa-icon>
|
||||
<div class="wa-split">
|
||||
<span class="wa-caption-m wa-cluster">
|
||||
<span>bb_cover_letter.pdf</span>
|
||||
<span>2.4mb</span>
|
||||
</span>
|
||||
<div class="wa-cluster wa-gap-2xs">
|
||||
<wa-button appearance="plain" variant="brand" size="small">Download</wa-button>
|
||||
<wa-divider vertical style="height: 1em"></wa-divider>
|
||||
<wa-button appearance="plain" variant="danger" size="small">Delete</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
</dd>
|
||||
</div>
|
||||
</dl>
|
||||
</div>
|
||||
```
|
||||
|
||||
## Condensed
|
||||
|
||||
```html{.example}
|
||||
<wa-card appearance="filled" style="max-width: 45ch; margin: auto">
|
||||
<div class="wa-stack">
|
||||
<div class="wa-split wa-align-items-start">
|
||||
<dl class="wa-stack wa-gap-2xs">
|
||||
<dt class="wa-heading-s">Amount</dt>
|
||||
<dd class="wa-heading-l">$5,610.00</dd>
|
||||
</dl>
|
||||
<wa-badge appearance="filled outlined" variant="success">Paid</wa-badge>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<dl class="wa-stack">
|
||||
<div class="wa-flank wa-align-items-stretch">
|
||||
<dt><wa-icon name="user" label="Name" fixed-width></wa-icon></dt>
|
||||
<dd>Sam Wilson</dd>
|
||||
</div>
|
||||
<div class="wa-flank wa-align-items-stretch">
|
||||
<dt><wa-icon name="calendar-days" label="Date" fixed-width></wa-icon></dt>
|
||||
<dd><wa-format-date date="2025-03-15"></wa-format-date></dd>
|
||||
</div>
|
||||
<div class="wa-flank wa-align-items-stretch">
|
||||
<dt><wa-icon family="brands" name="cc-visa" label="Credit Card" fixed-width></wa-icon></dt>
|
||||
<dd>Paid with Visa 1234</dd>
|
||||
</div>
|
||||
</dl>
|
||||
</div>
|
||||
<div slot="footer">
|
||||
<a href="" class="wa-cluster wa-gap-2xs">
|
||||
<span>Download Receipt</span>
|
||||
<wa-icon name="arrow-right"></wa-icon>
|
||||
</a>
|
||||
</div>
|
||||
</wa-card>
|
||||
```
|
||||
@@ -1,207 +0,0 @@
|
||||
---
|
||||
title: Empty State
|
||||
description: 'Guide users with helpful prompts and visuals when no content is available.'
|
||||
isPro: true
|
||||
---
|
||||
|
||||
## Simple
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-stack wa-align-items-center">
|
||||
<wa-icon name="backpack" class="wa-caption-l" style="font-size: var(--wa-font-size-3xl)"></wa-icon>
|
||||
<span class="wa-heading-m">No Kits</span>
|
||||
<p class="wa-caption-l">Manage all of your project's icons in a kit.</p>
|
||||
<wa-button>
|
||||
<wa-icon slot="prefix" name="plus"></wa-icon>
|
||||
Add Kit
|
||||
</wa-button>
|
||||
</div>
|
||||
```
|
||||
|
||||
## With Interactive Placeholder
|
||||
|
||||
```html {.example}
|
||||
<a href="" class="wa-stack wa-align-items-center wa-placeholder wa-link-plain" style="max-width: 60ch; margin: auto">
|
||||
<wa-icon name="ufo-beam" class="wa-caption-l" family="sharp" style="font-size: var(--wa-font-size-3xl)"></wa-icon>
|
||||
<p class="wa-heading-m">No Custom Icons</p>
|
||||
<p style="text-align: center">Add your own icon or logo to get started.</p>
|
||||
</a>
|
||||
```
|
||||
|
||||
## With Templates
|
||||
|
||||
```html {.example}
|
||||
<wa-card with-header with-footer style="max-width: 70ch; margin: auto">
|
||||
<div slot="header" class="wa-stack wa-gap-xs">
|
||||
<h2 class="wa-heading-m">Projects</h2>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xl">
|
||||
<p class="wa-caption-m">You haven’t created a project yet. Get started by selecting a template or start with a blank canvas.</p>
|
||||
<div class="wa-grid wa-gap-xl" style="--min-column-size: 30ch;">
|
||||
<a href="" class="wa-flank wa-align-items-start wa-link-plain">
|
||||
<wa-avatar shape="rounded" style="--background-color: var(--wa-color-yellow-90);color: var(--wa-color-yellow-40);">
|
||||
<wa-icon slot="icon" name="note-sticky"></wa-icon>
|
||||
</wa-avatar>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span class="wa-align-items-center wa-cluster wa-gap-xs wa-heading-s">
|
||||
Create a Quick Note <wa-icon name="arrow-right"></wa-icon>
|
||||
</span>
|
||||
<p class="wa-caption-m">
|
||||
Jot down any idea. Will it make sense later? Who knows.
|
||||
</p>
|
||||
</div>
|
||||
</a>
|
||||
<a href="" class="wa-flank wa-align-items-start wa-link-plain">
|
||||
<wa-avatar shape="rounded" style="--background-color: var(--wa-color-red-90);color: var(--wa-color-red-40);">
|
||||
<wa-icon slot="icon" name="list-check"></wa-icon>
|
||||
</wa-avatar>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span class="wa-align-items-center wa-cluster wa-gap-xs wa-heading-s">
|
||||
Create a Checklist <wa-icon name="arrow-right"></wa-icon>
|
||||
</span>
|
||||
<p class="wa-caption-m">
|
||||
The ultimate tool for looking busy.
|
||||
</p>
|
||||
</div>
|
||||
</a>
|
||||
<a href=""class="wa-flank wa-align-items-start wa-link-plain">
|
||||
<wa-avatar shape="rounded" style="--background-color: var(--wa-color-purple-90);color: var(--wa-color-purple-40);">
|
||||
<wa-icon slot="icon" name="table-cells"></wa-icon>
|
||||
</wa-avatar>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span class="wa-align-items-center wa-cluster wa-gap-xs wa-heading-s">
|
||||
Create a Spreadsheet <wa-icon name="arrow-right"></wa-icon>
|
||||
</span>
|
||||
<p class="wa-caption-m">
|
||||
Endless rows and columns of tiny, soul-crushing numbers.
|
||||
</p>
|
||||
</div>
|
||||
</a>
|
||||
<a href="" class="wa-flank wa-align-items-start wa-link-plain">
|
||||
<wa-avatar shape="rounded" style="--background-color: var(--wa-color-orange-90);color: var(--wa-color-orange-40);">
|
||||
<wa-icon slot="icon" name="presentation-screen"></wa-icon>
|
||||
</wa-avatar>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span class="wa-align-items-center wa-cluster wa-gap-xs wa-heading-s">
|
||||
Create a Slideshow <wa-icon name="arrow-right"></wa-icon>
|
||||
</span>
|
||||
<p class="wa-caption-m">
|
||||
Dramatic transitions make everything seem more official.
|
||||
</p>
|
||||
</div>
|
||||
</a>
|
||||
<a href="" class="wa-flank wa-align-items-start wa-link-plain">
|
||||
<wa-avatar shape="rounded" style="--background-color: var(--wa-color-green-90);color: var(--wa-color-green-40);">
|
||||
<wa-icon slot="icon" name="pen-field"></wa-icon>
|
||||
</wa-avatar>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span class="wa-align-items-center wa-cluster wa-gap-xs wa-heading-s">
|
||||
Create a Form <wa-icon name="arrow-right"></wa-icon>
|
||||
</span>
|
||||
<p class="wa-caption-m">
|
||||
Collect the deepest personal details and darkest secrets.
|
||||
</p>
|
||||
</div>
|
||||
</a>
|
||||
<a href="" class="wa-flank wa-align-items-start wa-link-plain">
|
||||
<wa-avatar shape="rounded" style="--background-color: var(--wa-color-blue-90);color: var(--wa-color-blue-40);">
|
||||
<wa-icon slot="icon" name="image"></wa-icon>
|
||||
</wa-avatar>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span class="wa-align-items-center wa-cluster wa-gap-xs wa-heading-s">
|
||||
Create a Photo Album <wa-icon name="arrow-right"></wa-icon>
|
||||
</span>
|
||||
<p class="wa-caption-m">
|
||||
Curate your best memories or most basic food pictures.
|
||||
</p>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div slot="footer">
|
||||
<a href="" class="wa-cluster wa-gap-xs">
|
||||
<span>Or start with a blank canvas</span>
|
||||
<wa-icon name="arrow-right"></wa-icon>
|
||||
</a>
|
||||
</div>
|
||||
</wa-card>
|
||||
```
|
||||
## Add people
|
||||
```html {.example}
|
||||
<wa-card style="max-width: 60ch; margin: 0 auto;">
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<h3 class="wa-heading-m">Add team members</h3>
|
||||
<p>This project is awful lonely. Invite some team members to liven up the joint.</p>
|
||||
<div class="wa-flank:end wa-gap-xs">
|
||||
<wa-input></wa-input><wa-button>Invite</wa-button>
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<em class="wa-caption-l">Team members previously added to projects</em>
|
||||
<wa-divider></wa-divider>
|
||||
<section>
|
||||
<div class="wa-flank">
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1614807547811-4174d3582092?q=80&w=2932&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" label="profile image"></wa-avatar>
|
||||
<div class="wa-split">
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<span class="wa-heading-s">Earl Upton</span>
|
||||
<span class="wa-caption-m">DevOps</span>
|
||||
</div>
|
||||
<wa-button appearance="plain">
|
||||
<wa-icon name="user-plus" slot="prefix"></wa-icon>
|
||||
Invite
|
||||
</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</section>
|
||||
<section>
|
||||
<div class="wa-flank">
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1613428800237-c86372070fab?q=80&w=3017&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" lable="profile image"></wa-avatar>
|
||||
<div class="wa-split">
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<span class="wa-heading-s">Steamboat Willie</span>
|
||||
<span class="wa-caption-m">Captain</span>
|
||||
</div>
|
||||
<wa-button appearance="plain">
|
||||
<wa-icon name="user-plus" slot="prefix"></wa-icon>
|
||||
Invite
|
||||
</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</section>
|
||||
<section>
|
||||
<div class="wa-flank">
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1678582967399-bf558533f5eb?q=80&w=3029&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" label="profile image"></wa-avatar>
|
||||
<div class="wa-split">
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<span class="wa-heading-s">Melissa Eckers</span>
|
||||
<span class="wa-caption-m">Cloud Engineer</span>
|
||||
</div>
|
||||
<wa-button appearance="plain">
|
||||
<wa-icon name="user-plus" slot="prefix"></wa-icon>
|
||||
Invite
|
||||
</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</section><section>
|
||||
<div class="wa-flank">
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1559188286-a173792c8340?q=80&w=2906&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" label="profile image"></wa-avatar>
|
||||
<div class="wa-split">
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<span class="wa-heading-s">Devin Shears</span>
|
||||
<span class="wa-caption-m">UX Writer</span>
|
||||
</div>
|
||||
<wa-button appearance="plain">
|
||||
<wa-icon name="user-plus" slot="prefix"></wa-icon>
|
||||
Invite
|
||||
</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
```
|
||||
@@ -1,119 +0,0 @@
|
||||
---
|
||||
title: FAQ
|
||||
description: 'Empower users to learn more with a structured list of questions and answers.'
|
||||
isPro: true
|
||||
---
|
||||
|
||||
## With Flanked Heading & Description
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-flank wa-align-items-start wa-gap-2xl" style="--flank-size: 35ch">
|
||||
<div>
|
||||
<h2>Frequently Asked Questions</h2>
|
||||
<p>Can’t find an answer? Reach out to your local <a href="">Operator</a>, or contact <a href="">the Oracle</a>, and enjoy a cookie. 🍪</p>
|
||||
</div>
|
||||
<dl class="wa-stack wa-gap-2xl">
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<dt>Is Zion actually real, or just another Matrix?</dt>
|
||||
<dd>Ah, the question that keeps redpills up at night. Sure, we escaped the first Matrix, but who’s to say Zion isn’t just another layer of the simulation?</dd>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<dt>Why do the Agents always wear suits?</dt>
|
||||
<dd>Because nothing says "unstoppable digital enforcer" like a generic business professional aesthetic. Also, intimidation. You ever try fighting someone in sunglasses and a tie? It’s terrifying.</dd>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<dt>Can I go back into the Matrix once I’m out?</dt>
|
||||
<dd>Technically, yes—via hacking in. Emotionally? That depends on how well you handle the knowledge that nothing around you is real.</dd>
|
||||
</div>
|
||||
</dl>
|
||||
</div>
|
||||
```
|
||||
|
||||
## With Expandable Answers
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-stack">
|
||||
<h2>Frequently Asked Questions</h2>
|
||||
<wa-details appearance="plain">
|
||||
<h3 slot="summary" class="wa-heading-m" style="margin: 0">Is Zion actually real, or just another Matrix?</h3>
|
||||
Ah, the question that keeps redpills up at night. Sure, we escaped the first Matrix, but who’s to say Zion isn’t just another layer of the simulation?
|
||||
</wa-details>
|
||||
<wa-divider></wa-divider>
|
||||
<wa-details appearance="plain">
|
||||
<h3 slot="summary" class="wa-heading-m" style="margin: 0">Why do the Agents always wear suits?</h3>
|
||||
Because nothing says "unstoppable digital enforcer" like a generic business professional aesthetic. Also, intimidation. You ever try fighting someone in sunglasses and a tie? It’s terrifying.
|
||||
</wa-details>
|
||||
<wa-divider></wa-divider>
|
||||
<wa-details appearance="plain">
|
||||
<h3 slot="summary" class="wa-heading-m" style="margin: 0">Can I go back into the Matrix once I’m out?</h3>
|
||||
Technically, yes—via hacking in. Emotionally? That depends on how well you handle the knowledge that nothing around you is real.
|
||||
</wa-details>
|
||||
</div>
|
||||
```
|
||||
|
||||
## Two Column
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-stack wa-gap-2xl">
|
||||
<h2>Frequently Asked Questions</h2>
|
||||
<dl class="wa-stack wa-gap-2xl">
|
||||
<div class="wa-grid wa-gap-xs">
|
||||
<dt class="wa-heading-m">Is Zion actually real, or just another Matrix?</dt>
|
||||
<dd>Ah, the question that keeps redpills up at night. Sure, we escaped the first Matrix, but who’s to say Zion isn’t just another layer of the simulation?</dd>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-grid wa-gap-xs">
|
||||
<dt class="wa-heading-m">Why do the Agents always wear suits?</dt>
|
||||
<dd>Because nothing says "unstoppable digital enforcer" like a generic business professional aesthetic. Also, intimidation. You ever try fighting someone in sunglasses and a tie? It’s terrifying.</dd>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-grid wa-gap-xs">
|
||||
<dt class="wa-heading-m">Can I go back into the Matrix once I’m out?</dt>
|
||||
<dd>Technically, yes—via hacking in. Emotionally? That depends on how well you handle the knowledge that nothing around you is real.</dd>
|
||||
</div>
|
||||
</dl>
|
||||
</div>
|
||||
```
|
||||
|
||||
## Multiple Columns
|
||||
```html{.example}
|
||||
<div>
|
||||
|
||||
<h2>Frequently Asked Questions</h2>
|
||||
|
||||
|
||||
<dl class="wa-grid wa-gap-m" style="--min-column-size: 30ch;">
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<dt class="wa-heading-m">How often do you update your courses?</dt>
|
||||
<dd>A course is updated once there is a fundamental shift in the language or library’s underlying API. You can check our <a href="#">workshop</a> list to see if a new version of a given course is on the schedule. You may also write to us as <a href="#">support@frontendmasters.com</a> with suggestions for updates.</dd>
|
||||
</div>
|
||||
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<dt class="wa-heading-m">Do you offer certificates of completion?</dt>
|
||||
<dd>You can download certificates of completion from the <a href="#">Completed Courses</a> list in your Learning Library. Click the diploma icon next to the course to download the certificate in light or dark mode. A link to your Public Profile is included on each certificate if you’ve created one. Public Profiles showcase your learning journey and are a fantastic way to share progress with friends, co-workers, or employers. Public Profiles are available to members with an active Frontend Masters subscription who have watched ten or more hours of content. Visit the <a href="#">Public Profile</a> section in My Account to get started.</dd>
|
||||
</div>
|
||||
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<dt class="wa-heading-m">Do you offer a free trial?</dt>
|
||||
<dd>
|
||||
<p>We offer a free trial to first-time subscribers. You can find more about the trial here.</p>
|
||||
<p>We also have the following opportunities to learn for free:</p>
|
||||
<ul>
|
||||
<li>The online bootcamp is a free, two-week curriculum to get you started with web development.</li>
|
||||
<li>You can create a free account to gain access to five full courses for free.</li>
|
||||
</ul>
|
||||
</dd>
|
||||
</div>
|
||||
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<dt class="wa-heading-m">Do you have discounts for students?</dt>
|
||||
<dd>We are part of the <a href="#">GitHub Student Developer Pack</a>, allowing students six months of free access to the entire platform.</dd>
|
||||
</div>
|
||||
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<dt class="wa-heading-m">How do I cancel my plan?</dt>
|
||||
<dd>You can cancel your Frontend Masters subscription by visiting the <a href="#">Subscription tab</a> in your My Account area.</dd>
|
||||
</div>
|
||||
</dl>
|
||||
</div>
|
||||
```
|
||||
@@ -1,525 +0,0 @@
|
||||
---
|
||||
title: Grid List
|
||||
description: 'Improve browsing and selection by organizing data in a structured grid layout.'
|
||||
isPro: true
|
||||
---
|
||||
|
||||
## Cards with Footer Actions
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-grid" style="--min-column-size: 30ch;">
|
||||
<wa-card with-footer>
|
||||
<div class="wa-flank:end">
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<div class="wa-cluster wa-gap-xs">
|
||||
<h3 class="wa-heading-s">Barklia Woofington</h3 class="wa-heading-s">
|
||||
<wa-badge pill>Admin</wa-badge>
|
||||
</div>
|
||||
<span class="wa-caption-m">Canine Executive Officer</span>
|
||||
</div>
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1593270379182-fe1b1f6d67e5?q=80&w=2175&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" label="Avatar of black and white Border Collie"></wa-avatar>
|
||||
</div>
|
||||
<div slot="footer" class="wa-grid wa-gap-xs" style="--min-column-size: 10ch;">
|
||||
<wa-button appearance="outlined">
|
||||
<wa-icon slot="prefix" name="at"></wa-icon>
|
||||
Email
|
||||
</wa-button>
|
||||
<wa-button appearance="outlined">
|
||||
<wa-icon slot="prefix" name="phone"></wa-icon>
|
||||
Phone
|
||||
</wa-button>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card with-footer>
|
||||
<div class="wa-flank:end">
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<div class="wa-cluster wa-gap-xs">
|
||||
<h3 class="wa-heading-s">Maggie Pawsworth</h3 class="wa-heading-s">
|
||||
<wa-badge pill>Admin</wa-badge>
|
||||
</div>
|
||||
<span class="wa-caption-m">Canine Fetch Officer</span>
|
||||
</div>
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1514479425649-0981aca9fe41?q=80&w=3474&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" label="Avatar of black collie mix"></wa-avatar>
|
||||
</div>
|
||||
<div slot="footer" class="wa-grid wa-gap-xs" style="--min-column-size: 10ch;">
|
||||
<wa-button appearance="outlined">
|
||||
<wa-icon slot="prefix" name="at"></wa-icon>
|
||||
Email
|
||||
</wa-button>
|
||||
<wa-button appearance="outlined">
|
||||
<wa-icon slot="prefix" name="phone"></wa-icon>
|
||||
Phone
|
||||
</wa-button>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card with-footer>
|
||||
<div class="wa-flank:end">
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<h3 class="wa-heading-s">Rex Tailwag</h3 class="wa-heading-s">
|
||||
<span class="wa-caption-m">Head of Security</span>
|
||||
</div>
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1610968755695-d7fcb5fd4b92?q=80&w=2848&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" label="Avatar of black and tan German Shepherd"></wa-avatar>
|
||||
</div>
|
||||
<div slot="footer" class="wa-grid wa-gap-xs" style="--min-column-size: 10ch;">
|
||||
<wa-button appearance="outlined">
|
||||
<wa-icon slot="prefix" name="at"></wa-icon>
|
||||
Email
|
||||
</wa-button>
|
||||
<wa-button appearance="outlined">
|
||||
<wa-icon slot="prefix" name="phone"></wa-icon>
|
||||
Phone
|
||||
</wa-button>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card with-footer>
|
||||
<div class="wa-flank:end">
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<h3 class="wa-heading-s">Luna Sniffington</h3 class="wa-heading-s">
|
||||
<span class="wa-caption-m">Hound Relations</span>
|
||||
</div>
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1526440847959-4e38e7f00b04?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" label="Avatar of black and tan Yorkshire Terrier"></wa-avatar>
|
||||
</div>
|
||||
<div slot="footer" class="wa-grid wa-gap-xs" style="--min-column-size: 10ch;">
|
||||
<wa-button appearance="outlined">
|
||||
<wa-icon slot="prefix" name="at"></wa-icon>
|
||||
Email
|
||||
</wa-button>
|
||||
<wa-button appearance="outlined">
|
||||
<wa-icon slot="prefix" name="phone"></wa-icon>
|
||||
Phone
|
||||
</wa-button>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card with-footer>
|
||||
<div class="wa-flank:end">
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<h3 class="wa-heading-s">Charlie Drooler</h3 class="wa-heading-s">
|
||||
<span class="wa-caption-m">Head of Sales</span>
|
||||
</div>
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1554692844-6627ca340264?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" label="Avatar of tan and white corgi"></wa-avatar>
|
||||
</div>
|
||||
<div slot="footer" class="wa-grid wa-gap-xs" style="--min-column-size: 10ch;">
|
||||
<wa-button appearance="outlined">
|
||||
<wa-icon slot="prefix" name="at"></wa-icon>
|
||||
Email
|
||||
</wa-button>
|
||||
<wa-button appearance="outlined">
|
||||
<wa-icon slot="prefix" name="phone"></wa-icon>
|
||||
Phone
|
||||
</wa-button>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card with-footer>
|
||||
<div class="wa-flank:end">
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<h3 class="wa-heading-s">Daisy Zoomley</h3 class="wa-heading-s">
|
||||
<span class="wa-caption-m">IT Support</span>
|
||||
</div>
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1544378062-0b74cc8b4713?q=80&w=3648&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" label="Avatar of gray Weimaraner"></wa-avatar>
|
||||
</div>
|
||||
<div slot="footer" class="wa-grid wa-gap-xs" style="--min-column-size: 10ch;">
|
||||
<wa-button appearance="outlined">
|
||||
<wa-icon slot="prefix" name="at"></wa-icon>
|
||||
Email
|
||||
</wa-button>
|
||||
<wa-button appearance="outlined">
|
||||
<wa-icon slot="prefix" name="phone"></wa-icon>
|
||||
Phone
|
||||
</wa-button>
|
||||
</div>
|
||||
</wa-card>
|
||||
</div>
|
||||
```
|
||||
|
||||
## Cards with Footer Actions & Large Image
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-grid" style="--min-column-size: 29ch;">
|
||||
<wa-card with-footer>
|
||||
<div class="wa-stack wa-align-items-center wa-gap-xs">
|
||||
<div class="wa-frame wa-border-radius-circle">
|
||||
<img src="https://images.unsplash.com/photo-1522075469751-3a6694fb2f61?q=80&w=2680&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" />
|
||||
</div>
|
||||
<h2 class="wa-heading-m">Scott Summers</h2>
|
||||
<p class="wa-caption-l">DevOps</p>
|
||||
</div>
|
||||
<div slot="footer" class="wa-grid wa-gap-xs" style="--min-column-size: 10ch;">
|
||||
<wa-button appearance="outlined">
|
||||
<wa-icon slot="prefix" name="at"></wa-icon>
|
||||
Email
|
||||
</wa-button>
|
||||
<wa-button appearance="outlined">
|
||||
<wa-icon slot="prefix" name="phone"></wa-icon>
|
||||
Phone
|
||||
</wa-button>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card with-footer>
|
||||
<div class="wa-stack wa-align-items-center wa-gap-xs">
|
||||
<div class="wa-frame wa-border-radius-circle">
|
||||
<img src="https://images.unsplash.com/photo-1559188286-a173792c8340?q=80&w=2906&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" />
|
||||
</div>
|
||||
<h2 class="wa-heading-m">Kaitlin Moore</h2>
|
||||
<p class="wa-caption-l">Systems Engineer</p>
|
||||
</div>
|
||||
<div slot="footer" class="wa-grid wa-gap-xs" style="--min-column-size: 10ch;">
|
||||
<wa-button appearance="outlined">
|
||||
<wa-icon slot="prefix" name="at"></wa-icon>
|
||||
Email
|
||||
</wa-button>
|
||||
<wa-button appearance="outlined">
|
||||
<wa-icon slot="prefix" name="phone"></wa-icon>
|
||||
Phone
|
||||
</wa-button>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card with-footer>
|
||||
<div class="wa-stack wa-align-items-center wa-gap-xs">
|
||||
<div class="wa-frame wa-border-radius-circle">
|
||||
<img src="https://images.unsplash.com/photo-1613428800237-c86372070fab?q=80&w=3017&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" />
|
||||
</div>
|
||||
<h2 class="wa-heading-m">Nessa Riley</h2>
|
||||
<p class="wa-caption-l">Cloud Engineer</p>
|
||||
</div>
|
||||
<div slot="footer" class="wa-grid wa-gap-xs" style="--min-column-size: 10ch;">
|
||||
<wa-button appearance="outlined">
|
||||
<wa-icon slot="prefix" name="at"></wa-icon>
|
||||
Email
|
||||
</wa-button>
|
||||
<wa-button appearance="outlined">
|
||||
<wa-icon slot="prefix" name="phone"></wa-icon>
|
||||
Phone
|
||||
</wa-button>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card with-footer>
|
||||
<div class="wa-stack wa-align-items-center wa-gap-xs">
|
||||
<div class="wa-frame wa-border-radius-circle">
|
||||
<img src="https://images.unsplash.com/photo-1645288059073-af3e9eb62a29?q=80&w=2936&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" />
|
||||
</div>
|
||||
<h2 class="wa-heading-m">Veronica Staley</h2>
|
||||
<p class="wa-caption-l">Machine Learning Engineer</p>
|
||||
</div>
|
||||
<div slot="footer" class="wa-grid wa-gap-xs" style="--min-column-size: 10ch;">
|
||||
<wa-button appearance="outlined">
|
||||
<wa-icon slot="prefix" name="at"></wa-icon>
|
||||
Email
|
||||
</wa-button>
|
||||
<wa-button appearance="outlined">
|
||||
<wa-icon slot="prefix" name="phone"></wa-icon>
|
||||
Phone
|
||||
</wa-button>
|
||||
</div>
|
||||
</wa-card>
|
||||
</div>
|
||||
```
|
||||
## with Images
|
||||
```html {.example}
|
||||
<div class="wa-grid">
|
||||
<article class="wa-stack">
|
||||
<div class="wa-frame wa-border-radius-l">
|
||||
<img src="https://images.unsplash.com/photo-1522075469751-3a6694fb2f61?q=80&w=2680&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" />
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-3xs">
|
||||
<span>Jeff Hanks</span>
|
||||
<span>Product Designer</span>
|
||||
</div>
|
||||
<div class="wa-cluster wa-gap-3xs">
|
||||
<wa-icon-button name="bluesky" family="brands" label="link to Blusky profile"></wa-icon-button>
|
||||
<wa-icon-button name="dribbble" family="brands" label="link to Dribbble profile"></wa-icon-button>
|
||||
</div>
|
||||
</article>
|
||||
<article class="wa-stack">
|
||||
<div class="wa-frame wa-border-radius-l">
|
||||
<img src="https://images.unsplash.com/photo-1674044494331-8db2ecf18d46?q=80&w=3019&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" />
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-3xs">
|
||||
<span>Allen Bryant</span>
|
||||
<span>Staff Engineer</span>
|
||||
</div>
|
||||
<div class="wa-cluster wa-gap-3xs">
|
||||
<wa-icon-button name="bluesky" family="brands" label="link to Blusky profile"></wa-icon-button>
|
||||
<wa-icon-button name="dribbble" family="brands" label="link to Dribbble profile"></wa-icon-button>
|
||||
</div>
|
||||
</article>
|
||||
<article class="wa-stack">
|
||||
<div class="wa-frame wa-border-radius-l">
|
||||
<img src="https://images.unsplash.com/photo-1645288059073-af3e9eb62a29?q=80&w=2936&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" />
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-3xs">
|
||||
<span>Mariah Greene</span>
|
||||
<span>DevOps</span>
|
||||
</div>
|
||||
<div class="wa-cluster wa-gap-3xs">
|
||||
<wa-icon-button name="bluesky" family="brands" label="link to Blusky profile"></wa-icon-button>
|
||||
<wa-icon-button name="dribbble" family="brands" label="link to Dribbble profile"></wa-icon-button>
|
||||
</div>
|
||||
</article>
|
||||
<article class="wa-stack">
|
||||
<div class="wa-frame wa-border-radius-l">
|
||||
<img src="https://images.unsplash.com/photo-1613428800237-c86372070fab?q=80&w=3017&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" />
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-3xs">
|
||||
<span>Beverly Winslow</span>
|
||||
<span>Design Systems Lead</span>
|
||||
</div>
|
||||
<div class="wa-cluster wa-gap-3xs">
|
||||
<wa-icon-button name="bluesky" family="brands" label="link to Blusky profile"></wa-icon-button>
|
||||
<wa-icon-button name="dribbble" family="brands" label="link to Dribbble profile"></wa-icon-button>
|
||||
</div>
|
||||
</article>
|
||||
<article class="wa-stack">
|
||||
<div class="wa-frame wa-border-radius-l">
|
||||
<img src="https://images.unsplash.com/photo-1614807547811-4174d3582092?q=80&w=2932&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" />
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-3xs">
|
||||
<span>Eric Masterson</span>
|
||||
<span>Copy Writer</span>
|
||||
</div>
|
||||
<div class="wa-cluster wa-gap-3xs">
|
||||
<wa-icon-button name="bluesky" family="brands" label="link to Blusky profile"></wa-icon-button>
|
||||
<wa-icon-button name="dribbble" family="brands" label="link to Dribbble profile"></wa-icon-button>
|
||||
</div>
|
||||
</article>
|
||||
<article class="wa-stack">
|
||||
<div class="wa-frame wa-border-radius-l">
|
||||
<img src="https://images.unsplash.com/photo-1559188286-a173792c8340?q=80&w=2906&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" />
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-3xs">
|
||||
<span>Stephen Coffee</span>
|
||||
<span>Visual Designer</span>
|
||||
</div>
|
||||
<div class="wa-cluster wa-gap-3xs">
|
||||
<wa-icon-button name="bluesky" family="brands" label="link to Blusky profile"></wa-icon-button>
|
||||
<wa-icon-button name="dribbble" family="brands" label="link to Dribbble profile"></wa-icon-button>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
```
|
||||
## Linked Cards with Options Menu
|
||||
|
||||
```html{.example}
|
||||
<div class="wa-grid" style="--min-column-size: 25ch">
|
||||
<wa-card>
|
||||
<div class="wa-flank:end">
|
||||
<a href="" class="wa-flank wa-link-plain">
|
||||
<wa-avatar shape="rounded" style="--background-color: var(--wa-color-yellow-80); --text-color: var(--wa-color-yellow-40)">
|
||||
<wa-icon slot="icon" name="pancakes"></wa-icon>
|
||||
</wa-avatar>
|
||||
<div class="wa-gap-2xs wa-stack">
|
||||
<span class="wa-heading-s">Breakfast</span>
|
||||
<span class="wa-caption-m">28 Items</span>
|
||||
</div>
|
||||
</a>
|
||||
<wa-dropdown>
|
||||
<wa-icon-button id="more-actions-1" slot="trigger" name="ellipsis-vertical" label="More actions"></wa-icon-button>
|
||||
<wa-menu>
|
||||
<wa-menu-item>Copy link</wa-menu-item>
|
||||
<wa-menu-item>Rename</wa-menu-item>
|
||||
<wa-menu-item>Move to trash</wa-menu-item>
|
||||
</wa-menu>
|
||||
</wa-dropdown>
|
||||
<wa-tooltip for="more-actions-1">More actions</wa-tooltip>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card>
|
||||
<div class="wa-flank:end">
|
||||
<a href="" class="wa-flank wa-link-plain">
|
||||
<wa-avatar shape="rounded" style="--background-color: var(--wa-color-orange-80); --text-color: var(--wa-color-orange-40)">
|
||||
<wa-icon slot="icon" name="burger-cheese"></wa-icon>
|
||||
</wa-avatar>
|
||||
<div class="wa-gap-2xs wa-stack">
|
||||
<span class="wa-heading-s">Lunch + Dinner</span>
|
||||
<span class="wa-caption-m">40 Items</span>
|
||||
</div>
|
||||
</a>
|
||||
<wa-dropdown>
|
||||
<wa-icon-button id="more-actions-2" slot="trigger" name="ellipsis-vertical" label="More actions"></wa-icon-button>
|
||||
<wa-menu>
|
||||
<wa-menu-item>Copy link</wa-menu-item>
|
||||
<wa-menu-item>Rename</wa-menu-item>
|
||||
<wa-menu-item>Move to trash</wa-menu-item>
|
||||
</wa-menu>
|
||||
</wa-dropdown>
|
||||
<wa-tooltip for="more-actions-2">More actions</wa-tooltip>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card>
|
||||
<div class="wa-flank:end">
|
||||
<a href="" class="wa-flank wa-link-plain">
|
||||
<wa-avatar shape="rounded" style="--background-color: var(--wa-color-indigo-80); --text-color: var(--wa-color-indigo-40)">
|
||||
<wa-icon slot="icon" name="martini-glass-citrus"></wa-icon>
|
||||
</wa-avatar>
|
||||
<div class="wa-gap-2xs wa-stack">
|
||||
<span class="wa-heading-s">Beverages</span>
|
||||
<span class="wa-caption-m">19 Items</span>
|
||||
</div>
|
||||
</a>
|
||||
<wa-dropdown>
|
||||
<wa-icon-button id="more-actions-3" slot="trigger" name="ellipsis-vertical" label="More actions"></wa-icon-button>
|
||||
<wa-menu>
|
||||
<wa-menu-item>Copy link</wa-menu-item>
|
||||
<wa-menu-item>Rename</wa-menu-item>
|
||||
<wa-menu-item>Move to trash</wa-menu-item>
|
||||
</wa-menu>
|
||||
</wa-dropdown>
|
||||
<wa-tooltip for="more-actions-3">More actions</wa-tooltip>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card>
|
||||
<div class="wa-flank:end">
|
||||
<a href="" class="wa-flank wa-link-plain">
|
||||
<wa-avatar shape="rounded" style="--background-color: var(--wa-color-pink-80); --text-color: var(--wa-color-pink-40)">
|
||||
<wa-icon slot="icon" name="cake-slice"></wa-icon>
|
||||
</wa-avatar>
|
||||
<div class="wa-gap-2xs wa-stack">
|
||||
<span class="wa-heading-s">Dessert</span>
|
||||
<span class="wa-caption-m">11 Items</span>
|
||||
</div>
|
||||
</a>
|
||||
<wa-dropdown>
|
||||
<wa-icon-button id="more-actions-4" slot="trigger" name="ellipsis-vertical" label="More actions"></wa-icon-button>
|
||||
<wa-menu>
|
||||
<wa-menu-item>Copy link</wa-menu-item>
|
||||
<wa-menu-item>Rename</wa-menu-item>
|
||||
<wa-menu-item>Move to trash</wa-menu-item>
|
||||
</wa-menu>
|
||||
</wa-dropdown>
|
||||
<wa-tooltip for="more-actions-4">More actions</wa-tooltip>
|
||||
</div>
|
||||
</wa-card>
|
||||
</div>
|
||||
```
|
||||
## Kanban
|
||||
```html {.example}
|
||||
<div>
|
||||
<h2>Project #487</h2>
|
||||
<div class="wa-grid wa-gap-2xl">
|
||||
<div class="wa-stack">
|
||||
<div class="wa-cluster wa-gap-s"><span>Draft</span> <wa-badge appearance="filled outlined" variant="neutral">1</wa-badge></div>
|
||||
|
||||
|
||||
|
||||
<wa-card>
|
||||
<div class="wa-flank:end">
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<div class="wa-cluster wa-gap-2xs">
|
||||
<span class="wa-heading-s">Unit Testing</span>
|
||||
<wa-dropdown>
|
||||
<wa-icon-button id="task-action-4" slot="trigger" name="ellipsis" label="More actions"></wa-icon-button>
|
||||
<wa-menu>
|
||||
<wa-menu-item>Copy link</wa-menu-item>
|
||||
<wa-menu-item>Rename</wa-menu-item>
|
||||
<wa-menu-item>Move to trash</wa-menu-item>
|
||||
</wa-menu>
|
||||
</wa-dropdown>
|
||||
<wa-tooltip for="task-action-4">More actions</wa-tooltip>
|
||||
</div>
|
||||
<div class="wa-cluster wa-gap-2xs">
|
||||
<wa-badge appearance="outlined" pill>DevOps</wa-badge> <wa-badge variant="neutral" appearance="outlined" pill>Priority: Low</wa-badge>
|
||||
</div>
|
||||
</div>
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1559188286-a173792c8340?q=80&w=2906&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
label="profile image"></wa-avatar>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-button appearance="plain">
|
||||
<wa-icon name="plus"></wa-icon>
|
||||
Add Task
|
||||
</wa-button>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="wa-stack">
|
||||
<div class="wa-cluster wa-gap-s"><span>In Progress</span> <wa-badge appearance="filled outlined" variant="neutral">2</wa-badge></div>
|
||||
|
||||
<wa-card>
|
||||
<div class="wa-flank:end">
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<div class="wa-cluster wa-gap-2xs">
|
||||
<span class="wa-heading-s">UX Audit</span>
|
||||
<wa-dropdown>
|
||||
<wa-icon-button id="task-action-2" slot="trigger" name="ellipsis" label="More actions"></wa-icon-button>
|
||||
<wa-menu>
|
||||
<wa-menu-item>Copy link</wa-menu-item>
|
||||
<wa-menu-item>Rename</wa-menu-item>
|
||||
<wa-menu-item>Move to trash</wa-menu-item>
|
||||
</wa-menu>
|
||||
</wa-dropdown>
|
||||
<wa-tooltip for="task-action-2">More actions</wa-tooltip>
|
||||
</div>
|
||||
<div class="wa-cluster wa-gap-2xs">
|
||||
<wa-badge appearance="outlined" pill>Design</wa-badge> <wa-badge variant="warning" appearance="outlined" pill>Priority: Medium</wa-badge>
|
||||
</div>
|
||||
</div>
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1613428800237-c86372070fab?q=80&w=3017&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
label="profile image"></wa-avatar>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card>
|
||||
<div class="wa-flank:end">
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<div class="wa-cluster wa-gap-2xs">
|
||||
<span class="wa-heading-s">Visual Testing</span>
|
||||
<wa-dropdown>
|
||||
<wa-icon-button id="task-action-3" slot="trigger" name="ellipsis" label="More actions"></wa-icon-button>
|
||||
<wa-menu>
|
||||
<wa-menu-item>Copy link</wa-menu-item>
|
||||
<wa-menu-item>Rename</wa-menu-item>
|
||||
<wa-menu-item>Move to trash</wa-menu-item>
|
||||
</wa-menu>
|
||||
</wa-dropdown>
|
||||
<wa-tooltip for="task-action-3">More actions</wa-tooltip>
|
||||
</div>
|
||||
<div class="wa-cluster wa-gap-2xs">
|
||||
<wa-badge appearance="outlined" pill>Design</wa-badge> <wa-badge variant="danger" appearance="outlined" pill>Priority: High</wa-badge>
|
||||
</div>
|
||||
</div>
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1614807547811-4174d3582092?q=80&w=2932&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" label="profile image"></wa-avatar>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-button appearance="plain">
|
||||
<wa-icon name="plus"></wa-icon>
|
||||
Add Task
|
||||
</wa-button>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="wa-stack">
|
||||
<div class="wa-cluster wa-gap-s"><span>Ready for Review</span> <wa-badge appearance="filled outlined" variant="neutral">1</wa-badge></div>
|
||||
<wa-card>
|
||||
<div class="wa-flank:end">
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<div class="wa-cluster wa-gap-2xs">
|
||||
<span class="wa-heading-s">Deploy Bug Fixes</span>
|
||||
<wa-dropdown>
|
||||
<wa-icon-button id="task-action-1" slot="trigger" name="ellipsis" label="More actions"></wa-icon-button>
|
||||
<wa-menu>
|
||||
<wa-menu-item>Copy link</wa-menu-item>
|
||||
<wa-menu-item>Rename</wa-menu-item>
|
||||
<wa-menu-item>Move to trash</wa-menu-item>
|
||||
</wa-menu>
|
||||
</wa-dropdown>
|
||||
<wa-tooltip for="task-action-1">More actions</wa-tooltip>
|
||||
</div>
|
||||
<div class="wa-cluster wa-gap-2xs">
|
||||
<wa-badge appearance="outlined" pill>Development</wa-badge> <wa-badge variant="warning" appearance="outlined" pill>Priority: Medium</wa-badge>
|
||||
</div>
|
||||
</div>
|
||||
<wa-avatar initials="KK" label="Avatar with initials: KK"></wa-avatar>
|
||||
</div>
|
||||
</wa-card>
|
||||
|
||||
|
||||
<wa-button appearance="plain">
|
||||
<wa-icon name="plus"></wa-icon>
|
||||
Add Task
|
||||
</wa-button>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
@@ -1,9 +0,0 @@
|
||||
---
|
||||
title: App
|
||||
description: Pre-built action panels, data displays, and more ready to drop into your web app.
|
||||
parent: patterns
|
||||
layout: overview
|
||||
override:tags: []
|
||||
listChildren: true
|
||||
isPro: false
|
||||
---
|
||||
@@ -1,266 +0,0 @@
|
||||
---
|
||||
title: Leaderboard
|
||||
description: 'Engage and motivate users by highlighting top performers, scores, and achievements.'
|
||||
isPro: true
|
||||
---
|
||||
|
||||
## Simple
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-stack">
|
||||
<h3>Daily Crossword</h3>
|
||||
<div class="wa-grid">
|
||||
<wa-callout variant="warning" appearance="filled">
|
||||
<wa-icon slot="icon" name="timer"></wa-icon>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<span class="wa-heading-l">11h 54m 52s</span>
|
||||
<span class="wa-caption-m">until play ends</span>
|
||||
</div>
|
||||
</wa-callout>
|
||||
<wa-callout variant="neutral" appearance="filled">
|
||||
<wa-icon slot="icon" name="user-group"></wa-icon>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<span class="wa-heading-l">304</span>
|
||||
<span class="wa-caption-m">players on this leaderboard</span>
|
||||
</div>
|
||||
</wa-callout>
|
||||
</div>
|
||||
<wa-card>
|
||||
<div class="wa-stack">
|
||||
<ol class="wa-stack">
|
||||
<li class="wa-flank">
|
||||
<div class="wa-cluster">
|
||||
<wa-icon name="1" fixed-width></wa-icon>
|
||||
<wa-avatar>
|
||||
<wa-icon slot="icon" name="hat-wizard"></wa-icon>
|
||||
</wa-avatar>
|
||||
</div>
|
||||
<div class="wa-split wa-gap-xs">
|
||||
<span>wordwiz</span>
|
||||
<small class="wa-caption-l">00:01:41</small>
|
||||
</div>
|
||||
</li>
|
||||
<wa-divider></wa-divider>
|
||||
<li class="wa-flank">
|
||||
<div class="wa-cluster">
|
||||
<wa-icon name="2" fixed-width></wa-icon>
|
||||
<wa-avatar initials="A"></wa-avatar>
|
||||
</div>
|
||||
<div class="wa-split wa-gap-xs">
|
||||
<span>acrossNdown</span>
|
||||
<small class="wa-caption-l">00:01:58</small>
|
||||
</div>
|
||||
</li>
|
||||
<wa-divider></wa-divider>
|
||||
<li class="wa-flank">
|
||||
<div class="wa-cluster">
|
||||
<wa-icon name="3" fixed-width></wa-icon>
|
||||
<wa-avatar initials="X"></wa-avatar>
|
||||
</div>
|
||||
<div class="wa-split wa-gap-xs">
|
||||
<span>XwordChamp</span>
|
||||
<small class="wa-caption-l">00:02:14</small>
|
||||
</div>
|
||||
</li>
|
||||
<wa-divider></wa-divider>
|
||||
<li class="wa-flank">
|
||||
<div class="wa-cluster">
|
||||
<wa-icon name="4" fixed-width></wa-icon>
|
||||
<wa-avatar>
|
||||
<wa-icon slot="icon" name="chess-knight"></wa-icon>
|
||||
</wa-avatar>
|
||||
</div>
|
||||
<div class="wa-split wa-gap-xs">
|
||||
<span>puzzlepoet</span>
|
||||
<small class="wa-caption-l">00:02:16</small>
|
||||
</div>
|
||||
</li>
|
||||
<wa-divider></wa-divider>
|
||||
<li class="wa-flank">
|
||||
<div class="wa-cluster">
|
||||
<wa-icon name="5" fixed-width></wa-icon>
|
||||
<wa-avatar initials="R"></wa-avatar>
|
||||
</div>
|
||||
<div class="wa-split wa-gap-xs">
|
||||
<span>RiddleMeThis</span>
|
||||
<small class="wa-caption-l">00:02:34</small>
|
||||
</div>
|
||||
</li>
|
||||
</ol>
|
||||
</div>
|
||||
<div slot="footer">
|
||||
<a href="" class="wa-cluster wa-gap-xs wa-caption-m">
|
||||
<span>View all standings</span>
|
||||
<wa-icon name="arrow-right"></wa-icon>
|
||||
</a>
|
||||
</div>
|
||||
</wa-card>
|
||||
</div>
|
||||
```
|
||||
|
||||
## Two Column
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-stack">
|
||||
<h3>Collective Activity for Yesterday</h3>
|
||||
<div class="wa-grid">
|
||||
<wa-callout variant="neutral" appearance="filled">
|
||||
<wa-icon slot="icon" name="book"></wa-icon>
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<h4 class="wa-heading-xs">Items Studied</h4>
|
||||
<div class="wa-heading-2xl">482,813</div>
|
||||
</div>
|
||||
</wa-callout>
|
||||
<wa-callout variant="brand" appearance="filled">
|
||||
<wa-icon slot="icon" name="diploma"></wa-icon>
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<h4 class="wa-heading-xs">Items Mastered</h4>
|
||||
<div class="wa-heading-2xl">67,106</div>
|
||||
</div>
|
||||
</wa-callout>
|
||||
<wa-callout variant="success" appearance="filled">
|
||||
<wa-icon slot="icon" name="wand-sparkles"></wa-icon>
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<h4 class="wa-heading-xs">Items Created</h4>
|
||||
<div class="wa-heading-2xl">2,080</div>
|
||||
</div>
|
||||
</wa-callout>
|
||||
</div>
|
||||
<div class="wa-grid">
|
||||
<wa-card>
|
||||
<div slot="header" class="wa-flank wa-gap-xl">
|
||||
<wa-icon name="graduation-cap" class="wa-heading-xl"></wa-icon>
|
||||
<span class="wa-gap-2xs wa-stack">
|
||||
<h4>Study Leaders</h4>
|
||||
<span class="wa-caption-m">Items mastered in the last 7 days</span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<ol class="wa-stack">
|
||||
<li class="wa-flank">
|
||||
<div class="wa-cluster">
|
||||
<wa-icon name="1" fixed-width></wa-icon>
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1620428268482-cf1851a36764?q=80&w=3418&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" shape="rounded"></wa-avatar>
|
||||
</div>
|
||||
<div class="wa-split wa-gap-xs">
|
||||
<span>mitsuwo</span>
|
||||
<small class="wa-caption-l">2,753</small>
|
||||
</div>
|
||||
</li>
|
||||
<wa-divider></wa-divider>
|
||||
<li class="wa-flank">
|
||||
<div class="wa-cluster">
|
||||
<wa-icon name="2" fixed-width></wa-icon>
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1639628735078-ed2f038a193e?q=80&w=3348&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" shape="rounded"></wa-avatar>
|
||||
</div>
|
||||
<div class="wa-split wa-gap-xs">
|
||||
<span>knowledgeninja</span>
|
||||
<small class="wa-caption-l">2,298</small>
|
||||
</div>
|
||||
</li>
|
||||
<wa-divider></wa-divider>
|
||||
<li class="wa-flank">
|
||||
<div class="wa-cluster">
|
||||
<wa-icon name="3" fixed-width></wa-icon>
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1638803040283-7a5ffd48dad5?q=80&w=2592&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" shape="rounded"></wa-avatar>
|
||||
</div>
|
||||
<div class="wa-split wa-gap-xs">
|
||||
<span>NxtLvl</span>
|
||||
<small class="wa-caption-l">2,008</small>
|
||||
</div>
|
||||
</li>
|
||||
<wa-divider></wa-divider>
|
||||
<li class="wa-flank">
|
||||
<div class="wa-cluster">
|
||||
<wa-icon name="4" fixed-width></wa-icon>
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1630549316063-7ae02749d2cc?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" shape="rounded"></wa-avatar>
|
||||
</div>
|
||||
<div class="wa-split wa-gap-xs">
|
||||
<span>brainiac</span>
|
||||
<small class="wa-caption-l">1,954</small>
|
||||
</div>
|
||||
</li>
|
||||
<wa-divider></wa-divider>
|
||||
<li class="wa-flank">
|
||||
<div class="wa-cluster">
|
||||
<wa-icon name="5" fixed-width></wa-icon>
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1582845512747-e42001c95638?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" shape="rounded"></wa-avatar>
|
||||
</div>
|
||||
<div class="wa-split wa-gap-xs">
|
||||
<span>eduexplorer</span>
|
||||
<small class="wa-caption-l">1,897</small>
|
||||
</div>
|
||||
</li>
|
||||
</ol>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card>
|
||||
<div slot="header" class="wa-flank wa-gap-xl">
|
||||
<wa-icon name="hat-wizard" class="wa-heading-xl"></wa-icon>
|
||||
<span class="wa-gap-2xs wa-stack">
|
||||
<h4>Creation Leaders</h4>
|
||||
<span class="wa-caption-m">Items created in the last 7 days</span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<ol class="wa-stack">
|
||||
<li class="wa-flank">
|
||||
<div class="wa-cluster">
|
||||
<wa-icon name="1" fixed-width></wa-icon>
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1630549316063-7ae02749d2cc?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" shape="rounded"></wa-avatar>
|
||||
</div>
|
||||
<div class="wa-split wa-gap-xs">
|
||||
<span>brainiac</span>
|
||||
<small class="wa-caption-l">134</small>
|
||||
</div>
|
||||
</li>
|
||||
<wa-divider></wa-divider>
|
||||
<li class="wa-flank">
|
||||
<div class="wa-cluster">
|
||||
<wa-icon name="2" fixed-width></wa-icon>
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1546776230-bb86256870ce?q=80&w=3368&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" shape="rounded"></wa-avatar>
|
||||
</div>
|
||||
<div class="wa-split wa-gap-xs">
|
||||
<span>LessonLegend</span>
|
||||
<small class="wa-caption-l">115</small>
|
||||
</div>
|
||||
</li>
|
||||
<wa-divider></wa-divider>
|
||||
<li class="wa-flank">
|
||||
<div class="wa-cluster">
|
||||
<wa-icon name="3" fixed-width></wa-icon>
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1620428268482-cf1851a36764?q=80&w=3418&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" shape="rounded"></wa-avatar>
|
||||
</div>
|
||||
<div class="wa-split wa-gap-xs">
|
||||
<span>mitsuwo</span>
|
||||
<small class="wa-caption-l">98</small>
|
||||
</div>
|
||||
</li>
|
||||
<wa-divider></wa-divider>
|
||||
<li class="wa-flank">
|
||||
<div class="wa-cluster">
|
||||
<wa-icon name="4" fixed-width></wa-icon>
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1586374579358-9d19d632b6df?q=80&w=3387&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" shape="rounded"></wa-avatar>
|
||||
</div>
|
||||
<div class="wa-split wa-gap-xs">
|
||||
<span>wiswiz</span>
|
||||
<small class="wa-caption-l">79</small>
|
||||
</div>
|
||||
</li>
|
||||
<wa-divider></wa-divider>
|
||||
<li class="wa-flank">
|
||||
<div class="wa-cluster">
|
||||
<wa-icon name="5" fixed-width></wa-icon>
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1639628735078-ed2f038a193e?q=80&w=3348&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" shape="rounded"></wa-avatar>
|
||||
</div>
|
||||
<div class="wa-split wa-gap-xs">
|
||||
<span>knowledgeninja</span>
|
||||
<small class="wa-caption-l">77</small>
|
||||
</div>
|
||||
</li>
|
||||
</ol>
|
||||
</div>
|
||||
</wa-card>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
@@ -1,52 +0,0 @@
|
||||
---
|
||||
title: Pagination
|
||||
description: 'Improve navigation and performance by breaking long lists or content into manageable pages.'
|
||||
isPro: true
|
||||
---
|
||||
|
||||
## Simple
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-stack">
|
||||
<div class="wa-placeholder"></div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-split">
|
||||
<span class="wa-caption-l">Showing 1 to 10 of 50 Results</span>
|
||||
<div class="wa-cluster wa-gap-xs">
|
||||
<wa-button appearance="outlined">
|
||||
<wa-icon slot="prefix" name="chevron-left"></wa-icon>
|
||||
Prev
|
||||
</wa-button>
|
||||
<wa-button appearance="outlined">
|
||||
<wa-icon slot="suffix" name="chevron-right"></wa-icon>
|
||||
Next
|
||||
</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
## With Button Group
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-stack">
|
||||
<div class="wa-placeholder"></div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-split">
|
||||
<span class="wa-caption-l">Showing 1 to 10 of 50 Results</span>
|
||||
<wa-button-group orientation="horizontal">
|
||||
<wa-button appearance="outlined">
|
||||
<wa-icon name="chevron-left"></wa-icon>
|
||||
</wa-button>
|
||||
<wa-button appearance="accent" variant="brand">1</wa-button>
|
||||
<wa-button appearance="outlined">2</wa-button>
|
||||
<wa-button appearance="outlined">3</wa-button>
|
||||
<wa-button appearance="outlined" disabled>...</wa-button>
|
||||
<wa-button appearance="outlined">10</wa-button>
|
||||
<wa-button appearance="outlined">
|
||||
<wa-icon name="chevron-right"></wa-icon>
|
||||
</wa-button>
|
||||
</wa-button-group>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
@@ -1,229 +0,0 @@
|
||||
---
|
||||
title: Permissions
|
||||
description: 'Permission patterns provide or restrict access to users.'
|
||||
isPro: true
|
||||
---
|
||||
|
||||
## With Form Inputs
|
||||
```html{.example}
|
||||
<wa-card with-header style="max-width: 72ch; margin: 0 auto;">
|
||||
<div slot="header" class="wa-split">
|
||||
<h2 class="wa-heading-m">Invite Team Members</h2>
|
||||
<wa-icon name="close"></wa-icon>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-2xl">
|
||||
<div class="wa-align-items-end wa-flank:end wa-gap-2xs">
|
||||
<wa-input label="Email" placeholder="contact@example.com"></wa-input>
|
||||
<wa-button variant="success">Send Invite</wa-button>
|
||||
</div>
|
||||
|
||||
<div class="wa-stack">
|
||||
<span class="wa-heading-s">Project Members</span>
|
||||
<div class="wa-stack wa-gap-xl">
|
||||
<div class="wa-flank">
|
||||
<wa-avatar label="User avatar" image="https://images.unsplash.com/photo-1580489944761-15a19d654956?q=80&w=1961&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"></wa-avatar>
|
||||
<div class="wa-split">
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<span class="wa-heading-xs">Jessica Jones</span>
|
||||
<span class="wa-caption-m" style="word-break: break-word">jessica.jones@example.com</span>
|
||||
</div>
|
||||
<wa-select value="owner">
|
||||
<wa-option value="owner">Owner</wa-option>
|
||||
<wa-option value="admin">Admin</wa-option>
|
||||
<wa-option value="can-edit">Can Edit</wa-option>
|
||||
<wa-option value="view-only">View Only</wa-option>
|
||||
</wa-select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-flank">
|
||||
<wa-avatar label="User avatar" image="https://images.unsplash.com/photo-1566492031773-4f4e44671857?q=80&w=2487&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"></wa-avatar>
|
||||
<div class="wa-split">
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<span class="wa-heading-xs">Foggy Nelson</span>
|
||||
<span class="wa-caption-m" style="word-break: break-word">foggy.nelson@example.com</span>
|
||||
</div>
|
||||
<wa-select value="admin">
|
||||
<wa-option value="owner">Owner</wa-option>
|
||||
<wa-option value="admin">Admin</wa-option>
|
||||
<wa-option value="can-edit">Can Edit</wa-option>
|
||||
<wa-option value="view-only">View Only</wa-option>
|
||||
</wa-select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-flank">
|
||||
<wa-avatar label="User avatar" image="https://images.unsplash.com/photo-1494790108377-be9c29b29330?q=80&w=2487&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"></wa-avatar>
|
||||
<div class="wa-split">
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<span class="wa-heading-xs">Karen Page</span>
|
||||
<span class="wa-caption-m" style="word-break: break-word">karen.page@example.com</span>
|
||||
</div>
|
||||
<wa-select value="can-edit">
|
||||
<wa-option value="owner">Owner</wa-option>
|
||||
<wa-option value="admin">Admin</wa-option>
|
||||
<wa-option value="can-edit">Can Edit</wa-option>
|
||||
<wa-option value="view-only">View Only</wa-option>
|
||||
</wa-select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-flank">
|
||||
<wa-avatar label="User avatar" image="https://images.unsplash.com/photo-1599566150163-29194dcaad36?q=80&w=2487&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"></wa-avatar>
|
||||
<div class="wa-split">
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<span class="wa-heading-xs">Matt Murdock</span>
|
||||
<span class="wa-caption-m" style="word-break: break-word">matt.murdock@example.com</span>
|
||||
</div>
|
||||
<wa-select value="view-only">
|
||||
<wa-option value="owner">Owner</wa-option>
|
||||
<wa-option value="admin">Admin</wa-option>
|
||||
<wa-option value="can-edit">Can Edit</wa-option>
|
||||
<wa-option value="view-only">View Only</wa-option>
|
||||
</wa-select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="wa-align-items-end wa-flank:end wa-gap-2xs">
|
||||
<wa-input label="Share Link" value="https://sharelink3435re.com" disabled></wa-input>
|
||||
<wa-button variant="brand" appearance="filled outlined">
|
||||
<wa-icon slot="prefix" name="link" variant="solid"></wa-icon>
|
||||
Copy Link
|
||||
</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
```
|
||||
|
||||
## Link Settings
|
||||
```html {.example}
|
||||
<wa-card style="max-width: 45ch; margin: 0 auto;">
|
||||
<div class="wa-stack">
|
||||
<h2 class="wa-heading-m">Manage Link</h2>
|
||||
<wa-input label="Expiration Date" type="date"></wa-input>
|
||||
<wa-radio-group
|
||||
label="Share Limit"
|
||||
orientation="horizontal"
|
||||
name="share-limit"
|
||||
value="0"
|
||||
>
|
||||
<wa-radio-button value="0">None</wa-radio-button>
|
||||
<wa-radio-button value="5">5</wa-radio-button>
|
||||
<wa-radio-button value="10">10</wa-radio-button>
|
||||
<wa-radio-button value="50">50</wa-radio-button>
|
||||
<wa-radio-button value="100">100</wa-radio-button>
|
||||
</wa-radio-group>
|
||||
<wa-divider></wa-divider>
|
||||
<wa-switch hint="Members are removed after logging out." checked>Temporary Access</wa-switch>
|
||||
<div class="wa-cluster wa-gap-xs" style="justify-content: flex-end">
|
||||
<wa-button size="small" appearance="outlined" pill>Cancel</wa-button>
|
||||
<wa-button size="small" variant="brand" pill>Generate</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</wa-card>
|
||||
```
|
||||
|
||||
## Role Settings
|
||||
```html {.example}
|
||||
<div style="max-width: 78ch; margin: 0 auto;">
|
||||
<h2>Settings</h2>
|
||||
<p>Update settings for this server.</p>
|
||||
<wa-tab-group>
|
||||
<wa-tab panel="general">
|
||||
<div class="wa-cluster">
|
||||
<wa-icon name="user"></wa-icon>
|
||||
<span>User Permissions</span>
|
||||
</div>
|
||||
</wa-tab>
|
||||
<wa-tab-panel name="general">
|
||||
<wa-card>
|
||||
<div class="wa-flank">
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1741289308283-feba56f857cc?w=500&auto=format&fit=crop&q=60&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxzZWFyY2h8MTl8fGJlYXJkfGVufDB8MnwwfHx8Mg%3D%3D" alt="image avatar"></wa-avatar>
|
||||
<div class="wa-split">
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<span class="wa-heading-s">Kris Kringle</span>
|
||||
<span class="wa-caption-m">Admin</span>
|
||||
</div>
|
||||
<wa-button appearance="plain">
|
||||
<wa-icon slot="prefix" name="edit"></wa-icon>
|
||||
Edit Profile
|
||||
</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Role</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="wa-flank">
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1579824894326-77ec5aaf8703?w=500&auto=format&fit=crop&q=60&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxzZWFyY2h8NDJ8fHJlaW5kZWVyfGVufDB8MnwwfHx8Mg%3D%3D"></wa-avatar>
|
||||
<span class="wa-caption-m">Dasher</span>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<wa-select value="moderator">
|
||||
<wa-option value="moderator">Moderator</wa-option>
|
||||
<wa-option value="contributor">Contributor</wa-option>
|
||||
<wa-option value="reader">Reader</wa-option>
|
||||
</wa-select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="wa-flank">
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1691065686144-916ff29d1b4f?q=80&w=2666&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"></wa-avatar>
|
||||
<span class="wa-caption-m">Dancer</span>
|
||||
</div>
|
||||
</td>
|
||||
|
||||
<td>
|
||||
<wa-select value="moderator">
|
||||
<wa-option value="moderator">Moderator</wa-option>
|
||||
<wa-option value="contributor">Contributor</wa-option>
|
||||
<wa-option value="reader">Reader</wa-option>
|
||||
</wa-select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="wa-flank">
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1616742618872-9e8a890d90b2?q=80&w=2712&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"></wa-avatar>
|
||||
<span class="wa-caption-m">Prancer</span>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<wa-select value="contributor">
|
||||
<wa-option value="moderator">Moderator</wa-option>
|
||||
<wa-option value="contributor">Contributor</wa-option>
|
||||
<wa-option value="reader">Reader</wa-option>
|
||||
</wa-select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="wa-flank">
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1728290403857-1b7909db2baa?q=80&w=2680&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"></wa-avatar>
|
||||
<span class="wa-caption-m">Vixen</span>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<wa-select value="reader">
|
||||
<wa-option value="moderator">Moderator</wa-option>
|
||||
<wa-option value="contributor">Contributor</wa-option>
|
||||
<wa-option value="reader">Reader</wa-option>
|
||||
</wa-select>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</wa-tab-panel>
|
||||
|
||||
</wa-tab-group>
|
||||
</div>
|
||||
```
|
||||
@@ -1,168 +0,0 @@
|
||||
---
|
||||
title: Pricing
|
||||
description: 'Help users make informed purchasing decisions with clear, structured pricing.'
|
||||
isPro: true
|
||||
---
|
||||
|
||||
## Three Tiers
|
||||
|
||||
```html{.example}
|
||||
<div class="wa-grid">
|
||||
<wa-card>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-cluster wa-heading-l">
|
||||
<wa-icon name="apple-core"></wa-icon>
|
||||
<h3>Lite</h3>
|
||||
</div>
|
||||
<span class="wa-flank wa-align-items-baseline wa-gap-2xs">
|
||||
<span class="wa-heading-2xl">$60</span>
|
||||
<span class="wa-caption-l">per year</span>
|
||||
</span>
|
||||
<p class="wa-caption-l">An online-only plan for web-based projects.</p>
|
||||
<wa-button variant="brand" appearance="outlined">Get Lite</wa-button>
|
||||
</div>
|
||||
<div slot="footer" class="wa-stack">
|
||||
<h4 class="wa-heading-s">What You Get</h4>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-flank">
|
||||
<wa-icon name="user" fixed-width></wa-icon>
|
||||
<span class="wa-caption-m">1 user</span>
|
||||
</div>
|
||||
<div class="wa-flank">
|
||||
<wa-icon name="suitcase" fixed-width></wa-icon>
|
||||
<span class="wa-caption-m">2 custom kits</span>
|
||||
</div>
|
||||
<div class="wa-flank">
|
||||
<wa-icon name="chart-simple" fixed-width></wa-icon>
|
||||
<span class="wa-caption-m">Up to 100k pageviews</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-split">
|
||||
<div class="wa-cluster wa-heading-l">
|
||||
<wa-icon name="apple-whole"></wa-icon>
|
||||
<h3>Pro</h3>
|
||||
</div>
|
||||
<wa-badge>Most Popular</wa-badge>
|
||||
</div>
|
||||
<span class="wa-flank wa-align-items-baseline wa-gap-2xs">
|
||||
<span class="wa-heading-2xl">$120</span>
|
||||
<span class="wa-caption-l">per year</span>
|
||||
</span>
|
||||
<p class="wa-caption-l">A great all-around plan for online or desktop use.</p>
|
||||
<wa-button variant="brand">Get Pro</wa-button>
|
||||
</div>
|
||||
<div slot="footer" class="wa-stack">
|
||||
<h4 class="wa-heading-s">What You Get</h4>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-flank">
|
||||
<wa-icon name="user" fixed-width></wa-icon>
|
||||
<span class="wa-caption-m">5 users</span>
|
||||
</div>
|
||||
<div class="wa-flank">
|
||||
<wa-icon name="suitcase" fixed-width></wa-icon>
|
||||
<span class="wa-caption-m">20 custom kits</span>
|
||||
</div>
|
||||
<div class="wa-flank">
|
||||
<wa-icon name="chart-simple" fixed-width></wa-icon>
|
||||
<span class="wa-caption-m">Up to 1M pageviews</span>
|
||||
</div>
|
||||
<div class="wa-flank">
|
||||
<wa-icon name="arrow-down-to-line" fixed-width></wa-icon>
|
||||
<span class="wa-caption-m">Kit downloads</span>
|
||||
</div>
|
||||
<div class="wa-flank">
|
||||
<wa-icon name="cloud-plus" fixed-width></wa-icon>
|
||||
<span class="wa-caption-m">Cloud hosting</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-cluster wa-heading-l">
|
||||
<wa-icon name="crate-apple"></wa-icon>
|
||||
<h3>Max</h3>
|
||||
</div>
|
||||
<span class="wa-flank wa-align-items-baseline wa-gap-2xs">
|
||||
<span class="wa-heading-2xl">$600</span>
|
||||
<span class="wa-caption-l">per year</span>
|
||||
</span>
|
||||
<p class="wa-caption-l">Our biggest plan with more of everything.</p>
|
||||
<wa-button variant="brand" appearance="outlined">Get Max</wa-button>
|
||||
</div>
|
||||
<div slot="footer" class="wa-stack">
|
||||
<h4 class="wa-heading-s">What You Get</h4>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-flank">
|
||||
<wa-icon name="user" fixed-width></wa-icon>
|
||||
<span class="wa-caption-m">50 users</span>
|
||||
</div>
|
||||
<div class="wa-flank">
|
||||
<wa-icon name="suitcase" fixed-width></wa-icon>
|
||||
<span class="wa-caption-m">Unlimited custom kits</span>
|
||||
</div>
|
||||
<div class="wa-flank">
|
||||
<wa-icon name="chart-simple" fixed-width></wa-icon>
|
||||
<span class="wa-caption-m">Up to 10M pageviews</span>
|
||||
</div>
|
||||
<div class="wa-flank">
|
||||
<wa-icon name="arrow-down-to-line" fixed-width></wa-icon>
|
||||
<span class="wa-caption-m">Kit downloads</span>
|
||||
</div>
|
||||
<div class="wa-flank">
|
||||
<wa-icon name="cloud-plus" fixed-width></wa-icon>
|
||||
<span class="wa-caption-m">Cloud hosting</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
</div>
|
||||
```
|
||||
|
||||
## Single Tier
|
||||
|
||||
```html {.example}
|
||||
<wa-card>
|
||||
<div class="wa-grid">
|
||||
<div class="wa-stack">
|
||||
<h3 class="wa-heading-l">Lifetime Membership</h3>
|
||||
<p>Learn at your own pace with expert-led content, exclusive resources, and a community of like-minded learners.</p>
|
||||
<wa-divider></wa-divider>
|
||||
<h4 class="wa-heading-s">Membership Includes:</h4>
|
||||
<div class="wa-grid">
|
||||
<div class="wa-flank wa-gap-xs">
|
||||
<wa-icon name="check"></wa-icon>
|
||||
<span class="wa-caption-m">Private forum access</span>
|
||||
</div>
|
||||
<div class="wa-flank wa-gap-xs">
|
||||
<wa-icon name="check"></wa-icon>
|
||||
<span class="wa-caption-m">Priority admission to events</span>
|
||||
</div>
|
||||
<div class="wa-flank wa-gap-xs">
|
||||
<wa-icon name="check"></wa-icon>
|
||||
<span class="wa-caption-m">Yearly skill assessment</span>
|
||||
</div>
|
||||
<div class="wa-flank wa-gap-xs">
|
||||
<wa-icon name="check"></wa-icon>
|
||||
<span class="wa-caption-m">Members-only swag</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<wa-callout variant="neutral" appearance="filled">
|
||||
<div class="wa-stack wa-align-items-center" style="justify-content: center">
|
||||
<h4 class="wa-heading-s">Pay Once, Own it Forever</h4>
|
||||
<div class="wa-cluster wa-align-items-baseline wa-gap-2xs">
|
||||
<span class="wa-heading-3xl">$459</span>
|
||||
<span>USD</span>
|
||||
</div>
|
||||
<wa-button variant="brand" style="width: 100%">Get Access</wa-button>
|
||||
<small class="wa-caption-m">30-day money back guarantee</small>
|
||||
</div>
|
||||
</wa-callout>
|
||||
</div>
|
||||
</wa-card>
|
||||
```
|
||||
@@ -1,371 +0,0 @@
|
||||
---
|
||||
title: Blog
|
||||
description: TODO
|
||||
unlisted: true
|
||||
isPro: true
|
||||
---
|
||||
|
||||
TODO Page Description
|
||||
|
||||
## Examples
|
||||
|
||||
### Hero
|
||||
```html{.example}
|
||||
<wa-carousel pagination>
|
||||
<wa-carousel-item>
|
||||
<a href="#" class="hero-link">
|
||||
<div style="background: #fe53a0;">
|
||||
|
||||
</div>
|
||||
<div style="background: gray;">
|
||||
<img
|
||||
alt="A waterfall in the middle of a forest (by Thomas Kelly on Unsplash)"
|
||||
src="/assets/examples/carousel/blog-carousel-5.jpg"
|
||||
/>
|
||||
</div>
|
||||
<h2><span>Do you see any Teletubbies in here?</span></h2>
|
||||
</a>
|
||||
</wa-carousel-item>
|
||||
<wa-carousel-item>
|
||||
<a href="#" class="hero-link">
|
||||
<div style="background: #5a90f3;">
|
||||
|
||||
</div>
|
||||
<div style="background: gray;">
|
||||
<img
|
||||
alt="A waterfall in the middle of a forest (by Thomas Kelly on Unsplash)"
|
||||
src="/assets/examples/carousel/blog-carousel-1.jpg"
|
||||
/>
|
||||
</div>
|
||||
<h2><span>The path of the righteous man is beset on all sides</span></h2>
|
||||
</a>
|
||||
</wa-carousel-item>
|
||||
<wa-carousel-item>
|
||||
<a href="#" class="hero-link">
|
||||
<div style="background: #8c431e;">
|
||||
|
||||
</div>
|
||||
<div style="background: gray;">
|
||||
<img
|
||||
alt="A waterfall in the middle of a forest (by Thomas Kelly on Unsplash)"
|
||||
src="/assets/examples/carousel/blog-carousel-2.jpg"
|
||||
/>
|
||||
</div>
|
||||
<h2><span>Article Title</span></h2>
|
||||
</a>
|
||||
</wa-carousel-item>
|
||||
<wa-carousel-item>
|
||||
<a href="#" class="hero-link">
|
||||
<div style="background: #37b3e6;">
|
||||
|
||||
</div>
|
||||
<div style="background: gray;">
|
||||
<img
|
||||
alt="A waterfall in the middle of a forest (by Thomas Kelly on Unsplash)"
|
||||
src="/assets/examples/carousel/blog-carousel-3.jpg"
|
||||
/>
|
||||
</div>
|
||||
<h2><span>Article Title</span></h2>
|
||||
</a>
|
||||
</wa-carousel-item>
|
||||
<wa-carousel-item>
|
||||
<a href="#" class="hero-link">
|
||||
<div style="background: #f993d6;">
|
||||
|
||||
</div>
|
||||
<div style="background: gray;">
|
||||
<img
|
||||
alt="A waterfall in the middle of a forest (by Thomas Kelly on Unsplash)"
|
||||
src="/assets/examples/carousel/blog-carousel-4.jpg"
|
||||
/>
|
||||
</div>
|
||||
<h2><span>Article Title</span></h2>
|
||||
</a>
|
||||
</wa-carousel-item>
|
||||
|
||||
</wa-carousel>
|
||||
<style>
|
||||
.hero-link {
|
||||
display: flex;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: relative;
|
||||
|
||||
h2 {
|
||||
position: absolute;
|
||||
color: white;
|
||||
top: 25%;
|
||||
left: 15%;
|
||||
width: 200px;
|
||||
padding: .5rem;
|
||||
line-height: 1.15;
|
||||
|
||||
span {
|
||||
background-color: black;
|
||||
}
|
||||
}
|
||||
|
||||
div:first-of-type {
|
||||
width: 30%;
|
||||
}
|
||||
div:last-of-type {
|
||||
width: 70%;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
```
|
||||
|
||||
### Newsletter signup
|
||||
```html{.example}
|
||||
<wa-card class="news-letter-signup">
|
||||
<h2>Subscribe to our Newsletter</h2>
|
||||
<p>To get the latest and most quality design resources</p>
|
||||
<div class="subscribe-input"> <wa-input></wa-input><wa-button>Subscribe</wa-button></div>
|
||||
</wa-card>
|
||||
<style>
|
||||
.news-letter-signup {
|
||||
display: block;
|
||||
width: fit-content;
|
||||
margin: 0 auto;
|
||||
}
|
||||
.subscribe-input {
|
||||
display: flex;
|
||||
width: 100%;
|
||||
|
||||
wa-input {
|
||||
width: inherit;
|
||||
}
|
||||
|
||||
wa-button {
|
||||
margin-left: 0.5rem;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
```
|
||||
|
||||
### Posts List
|
||||
```html{.example}
|
||||
<wa-card with-header>
|
||||
<div slot="header">
|
||||
Recent Articles
|
||||
</div>
|
||||
<div class="body">
|
||||
<div class="post-list">
|
||||
<div class="post-list-item" style="display: flex; align-items: center;">
|
||||
<img src="/assets/images/patterns/flower-crop-1.jpg" />
|
||||
<div class="post-list-item-info" style="display: flex;flex-direction: column;">
|
||||
<span style="font-size: small;"> <wa-icon fixed-width name="mug-hot"></wa-icon> Lifestyle</span>
|
||||
<span style="font-size: larger;font-weight: 600;">Your bones don't break</span>
|
||||
<span style="font-size: small;font-style: italic; font-weight: 600; color: var(--wa-color-text-quiet)">Jules</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="post-list-item" style="display: flex; align-items: center; flex-direction: row-reverse;justify-content: flex-end">
|
||||
<img class="last" src="/assets/images/patterns/flower-crop-2.jpg" />
|
||||
<div class="post-list-item-info" style="display: flex;flex-direction: column; margin-right: 1rem;">
|
||||
<span style="font-size: small;"><wa-icon fixed-width name="user-nurse"> </wa-icon>Health</span>
|
||||
<span style="font-size: larger;font-weight: 600;">That's clear. Your cells react to bacteria</span>
|
||||
<span style="font-size: small;font-style: italic; font-weight: 600; color: var(--wa-color-text-quiet)">Mr. Glass</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="post-list-item" style="display: flex; align-items: center; flex-direction: row-reverse;justify-content: flex-end">
|
||||
<img style="display:none;" src="#"/>
|
||||
<div class="post-list-item-info" style="display: flex;flex-direction: column;">
|
||||
<span style="font-size: small;"><wa-icon fixed-width name="football"></wa-icon> Sports</span>
|
||||
<span style="font-size: larger;font-weight: 600;">Do you see any Teletubbies in here?</span>
|
||||
<span style="font-size: small;font-style: italic; font-weight: 600; color: var(--wa-color-text-quiet)">Nick Fury</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="post-list-item" style="display: flex; align-items: center;">
|
||||
<img src="/assets/images/patterns/flower-crop-3.jpg" />
|
||||
<div class="post-list-item-info" style="display: flex;flex-direction: column;">
|
||||
<span style="font-size: small;">Lifestyle</span>
|
||||
<span style="font-size: larger;font-weight: 600;">Your bones don't break</span>
|
||||
<span style="font-size: small;font-style: italic; font-weight: 600; color: var(--wa-color-text-quiet)">Jules</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="post-list-item" style="display: flex; align-items: center;">
|
||||
<img src="/assets/images/patterns/flower-crop-1.jpg" />
|
||||
<div class="post-list-item-info" style="display: flex;flex-direction: column;">
|
||||
<span style="font-size: small;">Lifestyle</span>
|
||||
<span style="font-size: larger;font-weight: 600;">Your bones don't break</span>
|
||||
<span style="font-size: small;font-style: italic; font-weight: 600; color: var(--wa-color-text-quiet)">Jules</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
<style>
|
||||
.post-list {
|
||||
.post-list-item {
|
||||
border-bottom: 1px solid var(--wa-color-surface-border);
|
||||
margin-bottom: 1rem;
|
||||
padding-bottom: 1rem;
|
||||
|
||||
img {
|
||||
margin-right: 1rem;
|
||||
object-fit: cover;
|
||||
min-width: 50px;
|
||||
min-height: 50px;
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
border-radius: var(--wa-border-radius-circle);
|
||||
}
|
||||
img.last {
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
.post-list-item-info span:first-of-type {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.post-list-item-info span wa-icon {
|
||||
margin-right: 0.25rem;
|
||||
}
|
||||
}
|
||||
.post-list-item:last-of-type {
|
||||
border-bottom: none;
|
||||
margin-bottom: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
```
|
||||
|
||||
### Related Posts
|
||||
```html{.example}
|
||||
<wa-card with-image with-footer class="card-overview">
|
||||
<img
|
||||
slot="image"
|
||||
src="https://plus.unsplash.com/premium_photo-1661382011487-cd3d6b1d9dff?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1OTAyOTl8MHwxfGFsbHx8fHx8fHx8fDE3MTg2NDc0ODd8&ixlib=rb-4.0.3&q=80&w=1080"
|
||||
alt="A kitten sits patiently between a terracotta pot and decorative grasses."
|
||||
/>
|
||||
|
||||
<strong>Color Advancements</strong><br />
|
||||
Lot of new and exciting features in web colors<br />
|
||||
<small>2d ago</small>
|
||||
|
||||
<div slot="footer">
|
||||
<wa-button variant="brand" pill>Read More</wa-button>
|
||||
|
||||
</div>
|
||||
</wa-card>
|
||||
|
||||
|
||||
|
||||
<style>
|
||||
.card-overview {
|
||||
max-width: 300px;
|
||||
}
|
||||
|
||||
.card-overview small {
|
||||
color: var(--wa-color-text-quiet);
|
||||
}
|
||||
|
||||
.card-overview [slot='footer'] {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
</style>
|
||||
|
||||
```
|
||||
### Article footer
|
||||
```html{.example}
|
||||
<div class="article-footer">
|
||||
<div class="article-tags">
|
||||
<a href="#"><wa-tag size="medium" pill>UX</wa-tag></a>
|
||||
<a href="#"><wa-tag size="medium" pill>Product Design</wa-tag></a>
|
||||
<a href="#"><wa-tag size="medium" pill>Design</wa-tag></a>
|
||||
<a href="#"><wa-tag size="medium" pill>Prototyping</wa-tag></a>
|
||||
</div>
|
||||
<div class="article-actions">
|
||||
<wa-icon-button name="hands-clapping"></wa-icon-button>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
## Social Share
|
||||
|
||||
### Vertical
|
||||
```html{.example}
|
||||
<wa-card class="social-share-vertical" style="--border-radius: 4rem;">
|
||||
<wa-icon-button name="facebook" family="brands" variant="solid" label="Edit" href="https://example.com/"></wa-icon-button>
|
||||
<wa-icon-button name="x-twitter" family="brands" variant="solid" label="Edit" href="https://example.com/"></wa-icon-button>
|
||||
<wa-icon-button name="threads" family="brands" variant="solid" label="Edit" href="https://example.com/"></wa-icon-button>
|
||||
<wa-icon-button name="mastodon" family="brands" variant="solid" label="Edit" href="https://example.com/"></wa-icon-button>
|
||||
<wa-icon-button name="paper-plane" family="solid" variant="solid" label="Edit" href="https://example.com/"></wa-icon-button>
|
||||
</wa-card>
|
||||
<style>
|
||||
.social-share-vertical {
|
||||
display: block;
|
||||
margin: 0 auto;
|
||||
width: fit-content;
|
||||
|
||||
wa-icon-button {
|
||||
font-size: 2.5rem;
|
||||
display: block;
|
||||
margin-bottom: .5rem;
|
||||
}
|
||||
wa-icon-button:last-of-type {
|
||||
margin-bottom: initial;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
```
|
||||
|
||||
### Horizontal
|
||||
```html{.example}
|
||||
<wa-card with-header with-footer class="social-share-horizontal">
|
||||
<div slot="header">
|
||||
Share this Article
|
||||
</div>
|
||||
<wa-icon-button name="facebook" family="brands" variant="solid" label="Edit" style="--background: #1877f225; --color: #1877f2"></wa-icon-button>
|
||||
<wa-icon-button name="x-twitter" family="brands" variant="solid" label="Edit" style="--background: #00000025; --color: #000000"></wa-icon-button>
|
||||
<wa-icon-button name="threads" family="brands" variant="solid" label="Edit" style="--background: #c32aa325; --color: #c32aa3"></wa-icon-button>
|
||||
<wa-icon-button name="mastodon" family="brands" variant="solid" label="Edit" style="--background: #6364ff25; --color: #6364ff"></wa-icon-button>
|
||||
|
||||
<wa-icon-button name="instagram" family="brands" variant="solid" label="Edit" style="--background: #c32aa325; --color: #c32aa3"></wa-icon-button>
|
||||
|
||||
<wa-icon-button name="pinterest" family="brands" variant="solid" label="Edit" style="--background: #bd081c25; --color: #bd081c"></wa-icon-button>
|
||||
<wa-icon-button name="linkedin" family="brands" variant="solid" label="Edit" style="--background: #0a66c225; --color: #0a66c2"></wa-icon-button>
|
||||
<div slot="footer">
|
||||
<div class="share-input">
|
||||
<wa-input value="https://fontawesome.com"></wa-input>
|
||||
<wa-button variant="brand"> <wa-icon slot="prefix" name="link" variant="solid"></wa-icon>Copy</wa-button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</wa-card>
|
||||
<style>
|
||||
.social-share-horizontal {
|
||||
margin: 0 auto;
|
||||
display: block;
|
||||
width: fit-content;
|
||||
|
||||
wa-icon-button {
|
||||
--background: transparent;
|
||||
--color: initial;
|
||||
font-size: 1.5rem;
|
||||
border-radius: .25rem;
|
||||
background: var(--background);
|
||||
}
|
||||
wa-icon-button::part(base) {
|
||||
|
||||
color: var(--color);
|
||||
}
|
||||
|
||||
.share-input {
|
||||
display: flex;
|
||||
|
||||
wa-input {
|
||||
--border-radius: var(--wa-form-control-border-radius) 0 0 var(--wa-form-control-border-radius);
|
||||
}
|
||||
wa-button {
|
||||
--border-radius: 0 var(--wa-form-control-border-radius) var(--wa-form-control-border-radius) 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
```
|
||||
@@ -1,10 +0,0 @@
|
||||
---
|
||||
title: Business
|
||||
description: TODO
|
||||
unlisted: true
|
||||
isPro: true
|
||||
---
|
||||
|
||||
TODO Page Description
|
||||
|
||||
## Examples
|
||||
@@ -1,84 +0,0 @@
|
||||
---
|
||||
title: Category Filter
|
||||
description: 'Helps the user find the right products with filters to refine search results by specific attributes.'
|
||||
icon: checkbox
|
||||
isPro: true
|
||||
---
|
||||
|
||||
## Sidebar with Checkboxes & Expandable Filters
|
||||
|
||||
```html{.example}
|
||||
<h1>New Arrivals</h1>
|
||||
<div class="wa-flank wa-align-items-start" style="--flank-size: 200px;">
|
||||
<form class="wa-stack">
|
||||
<wa-checkbox checked>All Products</wa-checkbox>
|
||||
<wa-checkbox>Sale</wa-checkbox>
|
||||
<wa-checkbox>Travel</wa-checkbox>
|
||||
<wa-checkbox>Organization</wa-checkbox>
|
||||
<wa-checkbox>Accessories</wa-checkbox>
|
||||
<wa-details summary="Color" open>
|
||||
<div class="wa-stack">
|
||||
<wa-checkbox>White</wa-checkbox>
|
||||
<wa-checkbox>Beige</wa-checkbox>
|
||||
<wa-checkbox>Blue</wa-checkbox>
|
||||
<wa-checkbox>Brown</wa-checkbox>
|
||||
<wa-checkbox>Green</wa-checkbox>
|
||||
</div>
|
||||
</wa-details>
|
||||
<wa-details summary="Category">
|
||||
<div class="wa-stack">
|
||||
<wa-checkbox>Outdoor</wa-checkbox>
|
||||
<wa-checkbox>Indoor</wa-checkbox>
|
||||
<wa-checkbox>All Weather</wa-checkbox>
|
||||
</div>
|
||||
</wa-details>
|
||||
<wa-details summary="Size">
|
||||
<div class="wa-stack">
|
||||
<wa-checkbox>Small</wa-checkbox>
|
||||
<wa-checkbox>Medium</wa-checkbox>
|
||||
<wa-checkbox>Large</wa-checkbox>
|
||||
<wa-checkbox>XL</wa-checkbox>
|
||||
<wa-checkbox>XXL</wa-checkbox>
|
||||
</div>
|
||||
</wa-details>
|
||||
</form>
|
||||
<div class="wa-placeholder"></div>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
## Sidebar with Dropdowns
|
||||
|
||||
```html{.example}
|
||||
<h1>New Arrivals</h1>
|
||||
<div class="wa-flank wa-align-items-start">
|
||||
<div class="wa-stack">
|
||||
<wa-select label="Product Type" placeholder="Products" value="all-products">
|
||||
<wa-option value="all-products">All Products</wa-option>
|
||||
<wa-option value="sale">Sale</wa-option>
|
||||
<wa-option value="travel">Travel</wa-option>
|
||||
<wa-option value="organization">Organization</wa-option>
|
||||
<wa-option value="accessories">Accessories</wa-option>
|
||||
</wa-select>
|
||||
<wa-divider></wa-divider>
|
||||
<wa-select label="Color" placeholder="Color" value="black" multiple>
|
||||
<wa-option value="black">Black</wa-option>
|
||||
<wa-option value="white">White</wa-option>
|
||||
<wa-option value="gray">Gray</wa-option>
|
||||
</wa-select>
|
||||
<wa-select label="Category" placeholder="Category" value="outdoor" multiple>
|
||||
<wa-option value="outdoor">Outdoor</wa-option>
|
||||
<wa-option value="indoor">Indoor</wa-option>
|
||||
<wa-option value="all-weather">All Weather</wa-option>
|
||||
</wa-select>
|
||||
<wa-select label="Size" placeholder="Size" value="xl xxl" multiple>
|
||||
<wa-option value="s">Small</wa-option>
|
||||
<wa-option value="m">Medium</wa-option>
|
||||
<wa-option value="l">Large</wa-option>
|
||||
<wa-option value="xl">XL</wa-option>
|
||||
<wa-option value="xxl">XXL</wa-option>
|
||||
</wa-select>
|
||||
</div>
|
||||
<div class="wa-placeholder"></div>
|
||||
</div>
|
||||
```
|
||||
@@ -1,163 +0,0 @@
|
||||
---
|
||||
title: Category Preview
|
||||
description: 'Help shoppers discover your product offerings with showcases of product categories.'
|
||||
icon: preview
|
||||
isPro: true
|
||||
---
|
||||
|
||||
## Split with Image Grid
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-flank wa-align-items-start" style="--flank-size: 20rem;">
|
||||
<div class="wa-stack wa-gap-2xl">
|
||||
<h2 class="wa-heading-xl">Casual Collection</h2>
|
||||
<p class="wa-body-s">Look good — without looking like you're trying too hard. Our casual collection includes laid back styles that work in <em>almost</em> any situation.</p>
|
||||
<wa-button>View the Collection</wa-button>
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-frame:landscape wa-border-radius-s">
|
||||
<img
|
||||
src="https://images.unsplash.com/photo-1544441893-675973e31985?q=80&w=2340&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="An analog watch, cotton pants, crew neck tee, and pair of tennis shoes (Photograph by Mnz)"
|
||||
/>
|
||||
</div>
|
||||
<div class="wa-grid">
|
||||
<div class="wa-frame:landscape wa-border-radius-s">
|
||||
<img
|
||||
src="https://images.unsplash.com/photo-1548768041-2fceab4c0b85?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="Stack of three folded solid color tees (Photograph by Mnz)"
|
||||
/>
|
||||
</div>
|
||||
<div class="wa-frame:landscape wa-border-radius-s">
|
||||
<img
|
||||
src="https://images.unsplash.com/photo-1544441892-794166f1e3be?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="Pair of bright white tennis shoes(Photograph by Mnz)"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
## Columns with Tall Images
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-stack">
|
||||
<h2 class="wa-heading-xl">Shop by Category</h2>
|
||||
<div class="wa-grid">
|
||||
<a href="" class="wa-stack wa-link-plain">
|
||||
<div class="wa-frame:portrait wa-border-radius-s">
|
||||
<img
|
||||
src="https://uploads.webawesome.com/organization.jpg"
|
||||
alt="Inside of a closet filled with clothes on wooden hangers and integrated shelving with shoes"
|
||||
/>
|
||||
</div>
|
||||
<span class="wa-caption-xl">Organization</span>
|
||||
</a>
|
||||
<a href="" class="wa-stack wa-link-plain">
|
||||
<div class="wa-frame:portrait wa-border-radius-s">
|
||||
<img
|
||||
src="https://uploads.webawesome.com/bags.jpg"
|
||||
alt="Young person hugging a small floral patterned book bag between their arms"
|
||||
/>
|
||||
</div>
|
||||
<span class="wa-caption-xl">Bags</span>
|
||||
</a>
|
||||
<a href="" class="wa-stack wa-link-plain">
|
||||
<div class="wa-frame:portrait wa-border-radius-s">
|
||||
<img
|
||||
src="https://uploads.webawesome.com/outdoor-2.jpg"
|
||||
alt="Person in a mountain clearing wearing a waterproof hooded windbreaker in black and orange"
|
||||
/>
|
||||
</div>
|
||||
<span class="wa-caption-xl">Outdoor</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
## Columns with Cards
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-stack">
|
||||
<div class="wa-split">
|
||||
<h2 class="wa-heading-xl">Shop by Category</h2>
|
||||
<a href="" class="wa-cluster">
|
||||
<span>Browse All Categories</span>
|
||||
<wa-icon name="arrow-right"></wa-icon>
|
||||
</a>
|
||||
</div>
|
||||
<div class="wa-grid">
|
||||
<a href="" class="wa-link-plain">
|
||||
<wa-card style="height: 100%">
|
||||
<img
|
||||
slot="image"
|
||||
src="https://img.fortawesome.com/cfa83f3c/outdoor-3x.jpg"
|
||||
alt="Two hikers wearing long canvas pants, weatherproof jackets, and backpacks"
|
||||
/>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<span class="wa-heading-m">Outdoor</span>
|
||||
<p class="wa-caption-m">Durable canvas gear for all conditions.</p>
|
||||
</div>
|
||||
</wa-card>
|
||||
</a>
|
||||
<a href="" class="wa-link-plain">
|
||||
<wa-card style="height: 100%">
|
||||
<img
|
||||
slot="image"
|
||||
src="https://img.fortawesome.com/cfa83f3c/home.jpg"
|
||||
alt="Woman sitting on a couch in a bright home, wearing a thick knit sweater"
|
||||
/>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<span class="wa-heading-m">Home</span>
|
||||
<p class="wa-caption-m">Cozy up on the couch and relax in soft cotton.</p>
|
||||
</div>
|
||||
</wa-card>
|
||||
</a>
|
||||
<a href="" class="wa-link-plain">
|
||||
<wa-card style="height: 100%">
|
||||
<img
|
||||
slot="image"
|
||||
src="https://img.fortawesome.com/cfa83f3c/fitness.jpg"
|
||||
alt="Athlete training in fitted active wear tee and shorts"
|
||||
/>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<span class="wa-heading-m">Active</span>
|
||||
<p class="wa-caption-m">Get fit in style with breathable poly blends.</p>
|
||||
</div>
|
||||
</wa-card>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
## Square Image Grid
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-stack wa-gap-2xl">
|
||||
<div class="wa-stack wa-gap-xs wa-align-items-center">
|
||||
<h2 class="wa-heading-xl">New Arrivals</h2>
|
||||
<p class="wa-caption-l">Explore brand new furniture to accentuate your home aesthetic — just for you.</p>
|
||||
</div>
|
||||
<div class="wa-grid">
|
||||
<div class="wa-stack">
|
||||
<div class="wa-frame wa-border-radius-m">
|
||||
<img
|
||||
src="https://uploads.webawesome.com/indoor-furniture.jpg"
|
||||
alt="Sunny room with a mid-century modern couch, accent chair, and elegant lamp"
|
||||
/>
|
||||
</div>
|
||||
<wa-button appearance="outlined">View Indoor Furniture</wa-button>
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-frame wa-border-radius-m">
|
||||
<img
|
||||
src="https://uploads.webawesome.com/outdoor-furniture.jpg"
|
||||
alt="Covered patio with rustic wooden cabinets, writing desk, and stool"
|
||||
/>
|
||||
</div>
|
||||
<wa-button appearance="outlined">View Outdoor Furniture</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
@@ -1,245 +0,0 @@
|
||||
---
|
||||
title: Checkout Form
|
||||
description: 'Let shoppers checkout with ease with streamlined forms to capture shipping and payment info.'
|
||||
isPro: true
|
||||
---
|
||||
|
||||
|
||||
## Full Form with Order Summary Card
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-grid wa-gap-3xl">
|
||||
<div class="wa-stack">
|
||||
<h4>Contact</h4>
|
||||
<wa-input type="email" label="Email Address"></wa-input>
|
||||
<wa-divider></wa-divider>
|
||||
<h4>Shipping</h4>
|
||||
<wa-select label="Country" value="us">
|
||||
<wa-option value="ca">Canada</wa-option>
|
||||
<wa-option value="mx">Mexico</wa-option>
|
||||
<wa-option value="us">United States</wa-option>
|
||||
</wa-select>
|
||||
<div class="wa-grid">
|
||||
<wa-input label="First Name"></wa-input>
|
||||
<wa-input label="Last Name"></wa-input>
|
||||
</div>
|
||||
<wa-input label="Company"></wa-input>
|
||||
<wa-input label="Address"></wa-input>
|
||||
<div class="wa-grid" style="--min-column-size: 10ch;">
|
||||
<wa-input label="City"></wa-input>
|
||||
<wa-input label="State"></wa-input>
|
||||
<wa-input label="Postal Code"></wa-input>
|
||||
</div>
|
||||
<wa-input label="Phone"></wa-input>
|
||||
<wa-divider></wa-divider>
|
||||
<wa-radio-group label="Shipping Method" name="shipping-method" value="standard" orientation="horizontal">
|
||||
<wa-radio value="standard" hint="7-10 business days">Standard</wa-radio>
|
||||
<wa-radio value="express" hint="2-5 business days">Express</wa-radio>
|
||||
</wa-radio-group>
|
||||
<wa-divider></wa-divider>
|
||||
<h4>Payment</h4>
|
||||
<wa-radio-group label="Payment Method" name="payment-method" value="credit" orientation="horizontal">
|
||||
<wa-radio value="credit">Credit Card</wa-radio>
|
||||
<wa-radio value="paypal">Paypal</wa-radio>
|
||||
</wa-radio-group>
|
||||
<wa-input label="Card Number"></wa-input>
|
||||
<wa-input label="Name on Card"></wa-input>
|
||||
<div class="wa-grid">
|
||||
<wa-input label="Expiration Date" placeholder="MM/YY"></wa-input>
|
||||
<wa-input label="CVC"></wa-input>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<h4>Order Summary</h4>
|
||||
<wa-card>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-flank wa-align-items-start" style="--flank-size: 7rem">
|
||||
<div class="wa-frame wa-border-radius-s">
|
||||
<img src="https://images.unsplash.com/photo-1595950653106-6c9ebd614d3a?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1OTAyOTl8MHwxfGFsbHx8fHx8fHx8fDE3MTg2NDM1MzB8&ixlib=rb-4.0.3&q=80&w=1080" alt="">
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<div class="wa-split">
|
||||
<span class="wa-heading-s">Dolce Runners</span>
|
||||
<wa-icon-button name="trash" label="Remove from cart"></wa-icon-button>
|
||||
</div>
|
||||
<span class="wa-caption-m">Cream/Seafoam</span>
|
||||
<span class="wa-caption-m">12.5</span>
|
||||
<div class="wa-split">
|
||||
<span>$135.00</span>
|
||||
<wa-select value="1" size="small" style="max-width: 8ch">
|
||||
<wa-option value="1">1</wa-option>
|
||||
<wa-option value="2">2</wa-option>
|
||||
<wa-option value="3">3</wa-option>
|
||||
</wa-select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-flank wa-align-items-start" style="--flank-size: 7rem">
|
||||
<div class="wa-frame wa-border-radius-s">
|
||||
<img src="https://images.unsplash.com/photo-1514989940723-e8e51635b782?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1OTAyOTl8MHwxfGFsbHx8fHx8fHx8fDE3MTg2NDM1Njh8&ixlib=rb-4.0.3&q=80&w=1080" alt="">
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<div class="wa-split">
|
||||
<span class="wa-heading-s">Dunk High</span>
|
||||
<wa-icon-button name="trash" label="Remove from cart"></wa-icon-button>
|
||||
</div>
|
||||
<span class="wa-caption-m">Sand/Amber/Black</span>
|
||||
<span class="wa-caption-m">12.5</span>
|
||||
<div class="wa-split">
|
||||
<span>$180.00</span>
|
||||
<wa-select value="1" size="small" style="max-width: 8ch">
|
||||
<wa-option value="1">1</wa-option>
|
||||
<wa-option value="2">2</wa-option>
|
||||
<wa-option value="3">3</wa-option>
|
||||
</wa-select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-flank wa-align-items-start" style="--flank-size: 7rem">
|
||||
<div class="wa-frame wa-border-radius-s">
|
||||
<img src="https://images.unsplash.com/photo-1606107557195-0e29a4b5b4aa?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1OTAyOTl8MHwxfGFsbHx8fHx8fHx8fDE3MTg2NDM2MTF8&ixlib=rb-4.0.3&q=80&w=1080" alt="">
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<div class="wa-split">
|
||||
<span class="wa-heading-s">NB Runner</span>
|
||||
<wa-icon-button name="trash" label="Remove from cart"></wa-icon-button>
|
||||
</div>
|
||||
<span class="wa-caption-m">Forrest Green</span>
|
||||
<span class="wa-caption-m">12.5</span>
|
||||
<div class="wa-split">
|
||||
<span>$48.99</span>
|
||||
<wa-select value="1" size="small" style="max-width: 8ch">
|
||||
<wa-option value="1">1</wa-option>
|
||||
<wa-option value="2">2</wa-option>
|
||||
<wa-option value="3">3</wa-option>
|
||||
</wa-select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-split wa-caption-m">
|
||||
<span>Subtotal</span>
|
||||
<span>$363.99</span>
|
||||
</div>
|
||||
<div class="wa-split wa-caption-m">
|
||||
<span>Shipping</span>
|
||||
<span>FREE</span>
|
||||
</div>
|
||||
<div class="wa-split wa-heading-m">
|
||||
<span>Total</span>
|
||||
<span>$363.99</span>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<wa-button variant="brand">Confirm Order</wa-button>
|
||||
</div>
|
||||
</wa-card>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
## Short Form with Order Summary
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-grid wa-gap-3xl">
|
||||
<div class="wa-stack wa-gap-xl">
|
||||
<h2>Payment</h2>
|
||||
<wa-input type="email" label="Email" placeholder="ex. tanderson@metacortex.com">
|
||||
<wa-icon slot="prefix" name="envelope"></wa-icon>
|
||||
</wa-input>
|
||||
<wa-input label="Card Number" placeholder="1234 1234 1234 1234">
|
||||
<wa-icon slot="prefix" name="credit-card"></wa-icon>
|
||||
</wa-input>
|
||||
<div class="wa-grid" style="--min-column-size: 12ch">
|
||||
<wa-input label="Expiration" placeholder="MM/YY">
|
||||
<wa-icon slot="prefix" name="calendar"></wa-icon>
|
||||
</wa-input>
|
||||
<wa-input label="CVC" placeholder="CVC">
|
||||
<wa-icon slot="prefix" name="lock"></wa-icon>
|
||||
</wa-input>
|
||||
</div>
|
||||
<wa-input label="Cardholder Name" placeholder="Thomas Anderson">
|
||||
<wa-icon slot="prefix" name="user"></wa-icon>
|
||||
</wa-input>
|
||||
<div class="wa-grid" style="--min-column-size: 12ch">
|
||||
<wa-select label="Country" value="us">
|
||||
<wa-icon slot="prefix" name="globe"></wa-icon>
|
||||
<wa-option value="ca">Canada</wa-option>
|
||||
<wa-option value="us">United States</wa-option>
|
||||
<wa-option value="mx">Mexico</wa-option>
|
||||
</wa-select>
|
||||
<wa-input label="ZIP" placeholder="12345">
|
||||
<wa-icon slot="prefix" name="location-dot"></wa-icon>
|
||||
</wa-input>
|
||||
</div>
|
||||
<wa-switch checked>Sign me up for more offers from this store</wa-switch>
|
||||
<wa-button variant="brand">Pay Now</wa-button>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xl">
|
||||
<h2>Order Summary</h2>
|
||||
<div class="wa-split">
|
||||
<div class="wa-cluster">
|
||||
<div class="wa-frame wa-border-radius-m" style="max-width: 4rem">
|
||||
<img src="https://images.unsplash.com/photo-1618677366787-9727aacca7ea?q=80&w=3255&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" alt="Glasses with black wire frames and dark tinted, circular lenses (Photograph by Colin Lloyd)">
|
||||
</div>
|
||||
<strong>Morpheus</strong>
|
||||
</div>
|
||||
<div class="wa-cluster">
|
||||
<wa-input type="number" value="1" style="max-width: 5rem"></wa-input>
|
||||
<span>$120.00</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-split">
|
||||
<div class="wa-cluster">
|
||||
<div class="wa-frame wa-border-radius-m" style="max-width: 4rem">
|
||||
<img src="https://images.unsplash.com/photo-1511499767150-a48a237f0083?q=80&w=3558&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" alt="Glasses with rose gold wire frames and green tinted, circular lenses (Photograph by Charles Deluvio)">
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-3xs">
|
||||
<strong>Seraph</strong>
|
||||
<em class="wa-caption-m">Tinted</em>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-cluster">
|
||||
<wa-input type="number" value="1" style="max-width: 5rem"></wa-input>
|
||||
<span>$180.00</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-split">
|
||||
<div class="wa-cluster">
|
||||
<div class="wa-frame wa-border-radius-m" style="max-width: 4rem">
|
||||
<img src="https://images.unsplash.com/photo-1547104442-a40f335740cb?q=80&w=3348&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" alt="Glasses with tortoise shell half frames and large, rounded lenses (Photograph by Sincerely Media)">
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-3xs">
|
||||
<strong>Keymaker</strong>
|
||||
<em class="wa-caption-m">Glossy</em>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-cluster">
|
||||
<wa-input type="number" value="1" style="max-width: 5rem"></wa-input>
|
||||
<span>$50.00</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-flank:end">
|
||||
<wa-input placeholder="Discount code or gift card"></wa-input>
|
||||
<wa-button appearance="filled">Apply</wa-button>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-s">
|
||||
<div class="wa-split">
|
||||
<span>Subtotal</span>
|
||||
<strong>$530.00</strong>
|
||||
</div>
|
||||
<div class="wa-split">
|
||||
<span>Shipping</span>
|
||||
<span>$8.00</span>
|
||||
</div>
|
||||
<div class="wa-split">
|
||||
<strong>Total</strong>
|
||||
<strong>$538.00</strong>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
@@ -1,3 +0,0 @@
|
||||
{
|
||||
"tags": ["ecommerce"]
|
||||
}
|
||||
@@ -1,124 +0,0 @@
|
||||
---
|
||||
title: Incentives
|
||||
description: 'Encourage shoppers to buy your products with value propositions, discounts, and promotions.'
|
||||
isPro: true
|
||||
---
|
||||
|
||||
## 3 Column
|
||||
|
||||
```html{.example}
|
||||
<div class="wa-gap-3xl wa-stack" style="max-width: 960px; margin: 0 auto;">
|
||||
<div class="wa-align-items-center wa-grid">
|
||||
<div>
|
||||
<span class="wa-heading-xl">Unlock your Superpower</span>
|
||||
<p class="wa-caption-l">Web development is like a superpower—you can turn your ideas into actual products online, and learning it from home means you don’t need a fancy degree or expensive tuition to start building your future.</p>
|
||||
</div>
|
||||
<div class="wa-frame wa-border-radius-l">
|
||||
<img src="https://images.unsplash.com/photo-1551981878-4c70c3e64135?q=80&w=2960&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" />
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="wa-grid">
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<wa-icon name="briefcase" variant="light" style="font-size: 32px;"></wa-icon>
|
||||
<span class="wa-heading-s">Career Opportunities</span>
|
||||
<p class="wa-caption-m">Mastering web development can lead to high-paying jobs, freelancing gigs, or even launching your own business or app.</p>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<wa-icon name="laptop-code" variant="light" style="font-size: 32px;"></wa-icon>
|
||||
<span class="wa-heading-s">Flexibility of Online Learning</span>
|
||||
<p class="wa-caption-m">Perfect for people balancing school, work, or other responsibilities—no need to attend in-person classes</p>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<wa-icon name="palette" variant="light" style="font-size: 32px;"></wa-icon>
|
||||
<span class="wa-heading-s">Creative & Practical Skillset</span>
|
||||
<p class="wa-caption-m">You can build real, functional things like personal portfolios, blogs, or web apps—and immediately see your progress.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
## 2 Column with Cards
|
||||
|
||||
```html{.example}
|
||||
<div class="wa-grid" style="--min-column-size: 24ch;">
|
||||
<wa-card>
|
||||
<div class="wa-flank">
|
||||
<div>
|
||||
<wa-icon name="hands" style="font-size: 2.5rem;"></wa-icon>
|
||||
</div>
|
||||
<div class="wa-gap-s wa-stack">
|
||||
<span class="wa-heading-m">Hands-on training</span>
|
||||
<p class="wa-caption-l">Upskill effectively with AI-powered coding exercises, practice tests, and quizzes.</p>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card>
|
||||
<div class="wa-flank">
|
||||
<div>
|
||||
<wa-icon name="medal" style="font-size: 2.5rem;"></wa-icon>
|
||||
</div>
|
||||
<div class="wa-gap-s wa-stack">
|
||||
<span class="wa-heading-m">Certification prep</span>
|
||||
<p class="wa-caption-l">Prep for industry-recognized certifications by solving real-world challenges and earn badges along the way</p>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card>
|
||||
<div class="wa-flank">
|
||||
<div>
|
||||
<wa-icon name="chart-line" style="font-size: 2.5rem;"></wa-icon>
|
||||
</div>
|
||||
<div class="wa-gap-s wa-stack">
|
||||
<div class="wa-split wa-gap-2xs">
|
||||
<span class="wa-heading-m">Insights and analytics</span>
|
||||
<wa-badge appearance="filled outlined" variant="warning">Pro Plan</wa-badge>
|
||||
</div>
|
||||
<p class="wa-caption-l">Fast-track goals with advanced insights plus a dedicated customer success team to help drive effective learning.</p>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card>
|
||||
<div class="wa-flank">
|
||||
<div>
|
||||
<wa-icon name="puzzle-piece" style="font-size: 2.5rem;"></wa-icon>
|
||||
</div>
|
||||
<div class="wa-gap-s wa-stack">
|
||||
<div class="wa-split wa-gap-2xs">
|
||||
<span class="wa-heading-m">Customizable content</span>
|
||||
<wa-badge appearance="filled outlined" variant="warning">Pro Plan</wa-badge>
|
||||
</div>
|
||||
<p class="wa-caption-l">Create tailored learning paths for team and organization goals and even host your own content and resources.</p>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
</div>
|
||||
```
|
||||
|
||||
## 4 Column
|
||||
|
||||
```html{.example}
|
||||
<div>
|
||||
<div class="wa-grid" style="--min-column-size: 16ch;">
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<wa-icon family="duotone" name="magnifying-glass" style="font-size: var(--wa-font-size-2xl);"></wa-icon>
|
||||
<span class="wa-heading-s">In-Demand Skills</span>
|
||||
<p class="wa-caption-m">Learn skills that lead to well-paying jobs, freelance work, or remote opportunities.</p>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<wa-icon family="duotone" name="chalkboard-user" style="font-size: var(--wa-font-size-2xl);"></wa-icon>
|
||||
<span class="wa-heading-s">Learn Anytime, Anywhere</span>
|
||||
<p class="wa-caption-m">Flexible learning fits into any schedule—perfect for students, parents, or full-time workers.</p>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<wa-icon family="duotone" name="people-arrows" style="font-size: var(--wa-font-size-2xl);"></wa-icon>
|
||||
<span class="wa-heading-s">Build and Launch Your Own Projects</span>
|
||||
<p class="wa-caption-m">You’re not just learning theory—you’re creating real, functional websites and apps.</p>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<wa-icon family="duotone" name="code" style="font-size: var(--wa-font-size-2xl);"></wa-icon>
|
||||
<span class="wa-heading-s">Low-Cost Entry</span>
|
||||
<p class="wa-caption-m">You don’t need a tech degree or expensive tools to get started</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
@@ -1,8 +0,0 @@
|
||||
---
|
||||
title: Ecommerce
|
||||
description: Pre-built product overviews, shopping carts, and more to help you build high-converting storefronts.
|
||||
parent: patterns
|
||||
layout: overview
|
||||
override:tags: []
|
||||
isPro: false
|
||||
---
|
||||
@@ -1,251 +0,0 @@
|
||||
---
|
||||
title: Order History
|
||||
description: 'Empower your customers to view past purchases and track upcoming orders with comprehensive order histories.'
|
||||
isPro: true
|
||||
---
|
||||
|
||||
## List
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-stack wa-gap-2xl">
|
||||
<h2>Order History</h2>
|
||||
<p class="wa-caption-m">Check the status of recent orders, manage returns, and download invoices.</p>
|
||||
<dl class="wa-split">
|
||||
<span class="wa-stack wa-gap-0">
|
||||
<dt>Order number</dt>
|
||||
<dd>WU88191111</dd>
|
||||
</span>
|
||||
<span class="wa-stack wa-gap-0">
|
||||
<dt>Date placed</dt>
|
||||
<dd>January 22, 2021</dd>
|
||||
</span>
|
||||
<span class="wa-stack wa-gap-0">
|
||||
<dt>Total amount</dt>
|
||||
<dd>$590.00</dd>
|
||||
</span>
|
||||
<span class="wa-cluster">
|
||||
<wa-button variant="neutral" appearance="outlined">View Order</wa-button>
|
||||
<wa-button variant="neutral" appearance="outlined">View Invoice</wa-button>
|
||||
</span>
|
||||
</dl>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-flank" style="--flank-size: 12rem">
|
||||
<div class="wa-frame wa-border-radius-s" style="aspect-ratio: 3 / 2">
|
||||
<img
|
||||
src="https://img.fortawesome.com/cfa83f3c/light-fixtures.jpg"
|
||||
alt=""
|
||||
/>
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-split">
|
||||
<span><strong>Dome Light Fixtures</strong></span>
|
||||
<span><strong>$215.00</strong></span>
|
||||
</div>
|
||||
<p class="wa-caption-m">Illuminate your space with elegance and style with stunning Dome Light Fixtures. The shape of these lights complements both modern and traditional interiors.</p>
|
||||
<div class="wa-split">
|
||||
<wa-badge appearance="filled" variant="success">Delivered</wa-badge>
|
||||
<div class="wa-cluster">
|
||||
<wa-button size="small" appearance="plain" variant="neutral">View Product</wa-button>
|
||||
<wa-button size="small" appearance="accent" variant="brand">Buy Again</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-flank" style="--flank-size: 12rem">
|
||||
<div class="wa-frame wa-border-radius-s" style="aspect-ratio: 3 / 2">
|
||||
<img
|
||||
src="https://img.fortawesome.com/cfa83f3c/modern-chair.jpg"
|
||||
alt=""
|
||||
/>
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-split">
|
||||
<span><strong>Reading Chair</strong></span>
|
||||
<span><strong>$115.00</strong></span>
|
||||
</div>
|
||||
<p class="wa-caption-m">Add a pop of color and a touch of elegance to any room with our Reading Chair featuring vibrant yellow fabric upholstery.</p>
|
||||
<div class="wa-split">
|
||||
<wa-badge appearance="filled" variant="brand">Out for delivery</wa-badge>
|
||||
<div class="wa-cluster">
|
||||
<wa-button size="small" appearance="plain" variant="neutral">View Product</wa-button>
|
||||
<wa-button size="small" appearance="accent" variant="brand">Buy Again</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-flank" style="--flank-size: 12rem">
|
||||
<div class="wa-frame wa-border-radius-s" style="aspect-ratio: 3 / 2">
|
||||
<img
|
||||
src="https://img.fortawesome.com/cfa83f3c/sofa.jpg"
|
||||
alt=""
|
||||
/>
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-split">
|
||||
<span><strong>Custom Sofa</strong></span>
|
||||
<span><strong>$260.00</strong></span>
|
||||
</div>
|
||||
<p class="wa-caption-m">Experience luxury and comfort like never before with our Custom Sofa, designed to elevate any living space. This sofa features exquisite velvet upholstery for an air of sophistication.</p>
|
||||
<div class="wa-split">
|
||||
<wa-badge appearance="filled" variant="neutral">Preparing to ship</wa-badge>
|
||||
<div class="wa-cluster">
|
||||
<wa-button size="small" appearance="plain" variant="neutral">View Product</wa-button>
|
||||
<wa-button size="small" appearance="accent" variant="brand">Buy Again</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
## Invoice Table
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-stack wa-gap-2xl">
|
||||
<wa-callout appearance="filled" variant="neutral">
|
||||
<div class="wa-flank:end wa-align-items-center">
|
||||
<dl class="wa-grid">
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<dt>Date Placed</dt>
|
||||
<dd>
|
||||
<wa-format-date date="2021-01-22" month="long" day="numeric" year="numeric"></wa-format-date>
|
||||
</dd>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<dt>Order Number</dt>
|
||||
<dd>WU88191111</dd>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<dt>Total Amount</dt>
|
||||
<dd>$590.00</dd>
|
||||
</div>
|
||||
</dl>
|
||||
<wa-button>View Invoice</wa-button>
|
||||
</div>
|
||||
</wa-callout>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Product</th>
|
||||
<th>Price</th>
|
||||
<th>Status</th>
|
||||
<th>Info</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="wa-cluster wa-align-items-start">
|
||||
<div class="wa-frame:landscape wa-border-radius-s" style="max-width: 8rem">
|
||||
<img
|
||||
src="https://img.fortawesome.com/cfa83f3c/light-fixtures.jpg"
|
||||
alt=""
|
||||
/>
|
||||
</div>
|
||||
<span>Dome Light Fixtures</span>
|
||||
</div>
|
||||
</td>
|
||||
<td>$215.00</td>
|
||||
<td>Delivered Jan 25, 2021</td>
|
||||
<td><a href="">View</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="wa-cluster wa-align-items-start">
|
||||
<div class="wa-frame:landscape wa-border-radius-s" style="max-width: 8rem">
|
||||
<img
|
||||
src="https://img.fortawesome.com/cfa83f3c/modern-chair.jpg"
|
||||
alt=""
|
||||
/>
|
||||
</div>
|
||||
<span>Reading Chair</span>
|
||||
</div>
|
||||
</td>
|
||||
<td>$115.00</td>
|
||||
<td>Delivered Jan 25, 2021</td>
|
||||
<td><a href="">View</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="wa-cluster wa-align-items-start">
|
||||
<div class="wa-frame:landscape wa-border-radius-s" style="max-width: 8rem">
|
||||
<img
|
||||
src="https://img.fortawesome.com/cfa83f3c/sofa.jpg"
|
||||
alt=""
|
||||
/>
|
||||
</div>
|
||||
<span>Custom Sofa</span>
|
||||
</div>
|
||||
</td>
|
||||
<td>$260.00</td>
|
||||
<td>Delivered Jan 25, 2021</td>
|
||||
<td><a href="">View</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
```
|
||||
## Card separated
|
||||
```html{.example}
|
||||
<div class="wa-stack" style="max-width: 60ch; margin: 0 auto;">
|
||||
<wa-card>
|
||||
<div class="wa-flank:end">
|
||||
<div class="wa-stack">
|
||||
<div class="wa-cluster wa-gap-xs">
|
||||
<wa-avatar shape="rounded" label="Avatar with an image icon">
|
||||
<wa-icon slot="icon"family="brands" name="amazon"></wa-icon>
|
||||
</wa-avatar>
|
||||
<span class="wa-heading-s">Amazon</span>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<span>Expected Tomorrow</span>
|
||||
<wa-progress-bar value="75" label="delivery progress" style="height: 0.5rem;"></wa-progress-bar>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-frame wa-border-radius-m" style="max-width: 6rem;">
|
||||
<img src="https://images.unsplash.com/photo-1589810635657-232948472d98?q=80&w=2680&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" />
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card>
|
||||
<div class="wa-flank:end">
|
||||
<div class="wa-stack">
|
||||
<div class="wa-cluster wa-gap-xs">
|
||||
<wa-avatar shape="rounded" label="Avatar with an image icon">
|
||||
<wa-icon slot="icon" family="sharp" variant="light" name="shirt"></wa-icon>
|
||||
</wa-avatar>
|
||||
<span class="wa-heading-s">T-shirt Depot</span>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<span>Out for Delivery</span>
|
||||
<wa-progress-bar value="95" label="delivery progress" style="height: 0.5rem;"></wa-progress-bar>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-frame wa-border-radius-m" style="max-width: 6rem;">
|
||||
<img src="https://images.unsplash.com/photo-1576566588028-4147f3842f27?q=80&w=2400&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" />
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card>
|
||||
<div class="wa-flank:end">
|
||||
<div class="wa-stack">
|
||||
<div class="wa-cluster wa-gap-xs">
|
||||
<wa-avatar shape="rounded" label="Avatar with an image icon">
|
||||
<wa-icon slot="icon" variant="duotone" name="gamepad-modern"></wa-icon>
|
||||
</wa-avatar>
|
||||
<span class="wa-heading-s">Game Theory</span>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<span>Shipping Soon</span>
|
||||
<wa-progress-bar value="15" label="delivery progress" style="height: 0.5rem;"></wa-progress-bar>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-frame wa-border-radius-m" style="max-width: 6rem;">
|
||||
<img src="https://images.unsplash.com/photo-1627421383054-488d9c9828f5?q=80&w=2960&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" />
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
</div>
|
||||
```
|
||||
@@ -1,295 +0,0 @@
|
||||
---
|
||||
title: Order Summary
|
||||
description: 'Give shoppers confidence in their purchases with summaries of everything included in their order.'
|
||||
isPro: true
|
||||
---
|
||||
|
||||
## Simple
|
||||
```html {.example}
|
||||
<div class="wa-stack wa-gap-xl">
|
||||
<wa-callout variant="success">
|
||||
<em>Payment Successful</em>
|
||||
<wa-icon slot="icon" name="circle-check"></wa-icon>
|
||||
</wa-callout>
|
||||
<wa-card>
|
||||
<div class="wa-stack wa-gap-xl">
|
||||
<h2>Thank you for ordering from us!</h2>
|
||||
<p class="wa-caption-l">We're processing your order now. A confirmation email will be sent to you momentarily!</p>
|
||||
<dl class="wa-cluster">
|
||||
<dt>Order #</dt>
|
||||
<dd>49548790-24545</dd>
|
||||
</dl>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-flank:end wa-align-items-start wa-gap-xl" style="--flank-size: 14em">
|
||||
<div class="wa-stack wa-gap-xl">
|
||||
<ul class="wa-stack wa-gap-xl">
|
||||
<li class="wa-flank wa-align-items-start">
|
||||
<div class="wa-frame wa-border-radius-s">
|
||||
<img
|
||||
src="https://uploads.webawesome.com/vase-1.jpg"
|
||||
alt=""
|
||||
/>
|
||||
</div>
|
||||
<div class="wa-split">
|
||||
<span class="wa-heading-s">Spotted Flower Pot</span>
|
||||
<span>$75.00</span>
|
||||
</div>
|
||||
</li>
|
||||
<wa-divider></wa-divider>
|
||||
<li class="wa-flank wa-align-items-start">
|
||||
<div class="wa-frame wa-border-radius-s">
|
||||
<img
|
||||
src="https://uploads.webawesome.com/decorative-vase.jpg"
|
||||
alt=""
|
||||
/>
|
||||
</div>
|
||||
<div class="wa-split">
|
||||
<span class="wa-heading-s">Decorative Vase</span>
|
||||
<span>$51.00</span>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
<wa-divider></wa-divider>
|
||||
<dl class="wa-stack wap-gap-2xs wa-caption-l">
|
||||
<div class="wa-split">
|
||||
<dt>Subtotal</dt>
|
||||
<dd>$126.00</dd>
|
||||
</div>
|
||||
<div class="wa-split">
|
||||
<dt>Shipping</dt>
|
||||
<dd>$8.00</dd>
|
||||
</div>
|
||||
<div class="wa-split">
|
||||
<dt>Taxes</dt>
|
||||
<dd>$6.40</dd>
|
||||
</div>
|
||||
<div class="wa-split">
|
||||
<dt>Total</dt>
|
||||
<dd>$140.40</dd>
|
||||
</div>
|
||||
</dl>
|
||||
</div>
|
||||
<wa-callout variant="neutral" appearance="filled">
|
||||
<dl class="wa-stack" style="margin: 0">
|
||||
<dt>Shipping Address</dt>
|
||||
<dd>
|
||||
<address class="wa-stack wa-gap-2xs">
|
||||
<span>Donna Noble</span>
|
||||
<span>56 Front Street</span>
|
||||
<span>Las Cruces, NM 56929</span>
|
||||
</address>
|
||||
</dd>
|
||||
<dt>Payment Information</dt>
|
||||
<dd class="wa-flank wa-gap-s">
|
||||
<wa-icon label="Visa" class="wa-body-xl" family="brands" name="cc-visa" style="color: #224DBA;"></wa-icon>
|
||||
<span>Ending with 9065</span>
|
||||
</dd>
|
||||
</dl>
|
||||
</wa-callout>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-button size="large" variant="brand" appearance="plain">
|
||||
<wa-icon slot="suffix" name="arrow-right" variant="solid"></wa-icon>
|
||||
Continue Shopping
|
||||
</wa-button>
|
||||
</div>
|
||||
```
|
||||
|
||||
## With Details
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-stack">
|
||||
<h2>Order Details</h2>
|
||||
<div class="wa-split">
|
||||
<div class="wa-cluster">
|
||||
<span>Order placed <wa-format-date date="2025-02-26T09:00:00-04:00" month="long" day="numeric" year="numeric"></wa-format-date></span>
|
||||
<wa-divider vertical style="height: 2em"></wa-divider>
|
||||
<span>Order # 45646456-4656-4542</span>
|
||||
</div>
|
||||
<wa-button size="small" appearance="outlined" pill>View Invoice</wa-button>
|
||||
</div>
|
||||
<wa-card>
|
||||
<div class="wa-split wa-align-items-start">
|
||||
<div class="wa-stack">
|
||||
<h3 class="wa-heading-s">Shipping Address</h3>
|
||||
<address class="wa-stack wa-gap-xs wa-caption-m">
|
||||
<span>Johnny Blaze</span>
|
||||
<span>200 Park Avenue</span>
|
||||
<span>Manhattan, NY 45789-3412</span>
|
||||
<span>United States</span>
|
||||
</address>
|
||||
<wa-button size="small" appearance="outlined" pill>Change</wa-button>
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<h3 class="wa-heading-s">Payment Method</h3>
|
||||
<div class="wa-flank wa-gap-s">
|
||||
<wa-icon class="wa-body-xl" family="brands" name="cc-visa" style="color: #224DBA;"></wa-icon>
|
||||
<span class="wa-caption-m">Visa ending in 9542</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<h3 class="wa-heading-s">Order Summary</h3>
|
||||
<dl class="wa-stack wa-gap-xs wa-caption-m">
|
||||
<div class="wa-split">
|
||||
<dt>Item(s) Subtotal</dt>
|
||||
<dd>$39.00</dd>
|
||||
</div>
|
||||
<div class="wa-split">
|
||||
<dt>Shipping & Handling</dt>
|
||||
<dd>$0.00</dd>
|
||||
</div>
|
||||
<div class="wa-split">
|
||||
<dt>Pre-tax Total</dt>
|
||||
<dd>$39.00</dd>
|
||||
</div>
|
||||
<div class="wa-split">
|
||||
<dt>Tax</dt>
|
||||
<dd>$39.00</dd>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-split wa-body-m">
|
||||
<dt>Grand Total</dt>
|
||||
<dd>$39.00</dd>
|
||||
</div>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card>
|
||||
<div class="wa-flank:end wa-align-items-start" style="--flank-size: 12rem">
|
||||
<div class="wa-stack">
|
||||
<h3 class="wa-heading-s">Arriving Saturday</h3>
|
||||
<div class="wa-flank wa-align-items-start">
|
||||
<div class="wa-frame wa-border-radius-s">
|
||||
<img
|
||||
src="https://uploads.webawesome.com/sparkling-water.jpg"
|
||||
alt=""
|
||||
/>
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<a href="" class="wa-caption-m">Mineragua Sparkling Water 12 Count</a>
|
||||
<span class="wa-caption-s">Sold by: <a href="">Mineragua</a></span>
|
||||
<div class="wa-cluster">
|
||||
<span class="wa-heading-s">$39.00</span>
|
||||
<wa-button appearance="outlined" size="small" pill>
|
||||
<wa-icon slot="prefix" name="rotate" variant="solid"></wa-icon>
|
||||
Buy Again
|
||||
</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<wa-button size="small" variant="brand" pill>Track Package</wa-button>
|
||||
<wa-button size="small" appearance="outlined" variant="neutral" pill>Cancel Item(s)</wa-button>
|
||||
<wa-button size="small" appearance="outlined" variant="neutral" pill>Ask Question</wa-button>
|
||||
<wa-button size="small" appearance="outlined" variant="neutral" pill>Write Review</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
</div>
|
||||
```
|
||||
|
||||
## With Status & Description
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-stack wa-gap-xl">
|
||||
<div class="wa-split">
|
||||
<div class="wa-cluster">
|
||||
<h2>Order #7093</h2>
|
||||
<a href="">View Invoice</a>
|
||||
</div>
|
||||
<p class="wa-caption-m">Order placed <wa-format-date date="2025-06-12T09:00:00-04:00" month="long" day="numeric" year="numeric"></wa-format-date></p>
|
||||
</div>
|
||||
<wa-card>
|
||||
<div class="wa-flank wa-align-items-start">
|
||||
<div class="wa-frame wa-border-radius-s">
|
||||
<img
|
||||
src="https://uploads.webawesome.com/vase-1.jpg"
|
||||
alt=""
|
||||
/>
|
||||
</div>
|
||||
<div class="wa-stack wa-align-items-start wa-gap-s">
|
||||
<div class="wa-split wa-gap-s">
|
||||
<h3 class="wa-heading-m">Spotted Flower Pot</h3>
|
||||
<span>$75.00</span>
|
||||
</div>
|
||||
<p class="wa-caption-m">Wood fired, salt glaze</p>
|
||||
<wa-tag variant="success" appearance="filled" size="small">Delivered</wa-tag>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card>
|
||||
<div class="wa-flank wa-align-items-start">
|
||||
<div class="wa-frame wa-border-radius-s">
|
||||
<img
|
||||
src="https://uploads.webawesome.com/decorative-vase.jpg"
|
||||
alt=""
|
||||
/>
|
||||
</div>
|
||||
<div class="wa-stack wa-align-items-start wa-gap-s">
|
||||
<div class="wa-split wa-gap-s">
|
||||
<h3 class="wa-heading-m">Decorative Vase</h3>
|
||||
<span>$51.00</span>
|
||||
</div>
|
||||
<p class="wa-caption-m">High quality Japanese Kutani-yaki ceramic-ware</p>
|
||||
<wa-tag variant="neutral" appearance="filled" size="small">Shipping Soon</wa-tag>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card>
|
||||
<div class="wa-flank wa-align-items-start">
|
||||
<div class="wa-frame wa-border-radius-s">
|
||||
<img
|
||||
src="https://uploads.webawesome.com/cuong-duyen-ceramic.jpg"
|
||||
alt=""
|
||||
/>
|
||||
</div>
|
||||
<div class="wa-stack wa-align-items-start wa-gap-s">
|
||||
<div class="wa-split wa-gap-s">
|
||||
<h3 class="wa-heading-m">Cuong Duyen Ceramic</h3>
|
||||
<span>$48.00</span>
|
||||
</div>
|
||||
<p class="wa-caption-m">Koishiwara-yaki style with crystalline glaze</p>
|
||||
<wa-tag variant="brand" appearance="filled" size="small">Out for Delivery</wa-tag>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-divider></wa-divider>
|
||||
<wa-callout variant="neutral" appearance="filled">
|
||||
<div class="wa-grid">
|
||||
<div class="wa-stack">
|
||||
<h3 class="wa-heading-s">Shipping Address</h3>
|
||||
<address class="wa-stack wa-gap-xs wa-caption-m">
|
||||
<span>Donna Noble</span>
|
||||
<span>56 Front Street</span>
|
||||
<span>Las Cruces, NM 56929</span>
|
||||
</address>
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<h3 class="wa-heading-s">Order Summary</h3>
|
||||
<dl class="wa-stack wa-gap-xs wa-caption-m">
|
||||
<div class="wa-split">
|
||||
<dt>Item(s) Subtotal</dt>
|
||||
<dd>$174.00</dd>
|
||||
</div>
|
||||
<div class="wa-split">
|
||||
<dt>Shipping & Handling</dt>
|
||||
<dd>$0.00</dd>
|
||||
</div>
|
||||
<div class="wa-split">
|
||||
<dt>Tax</dt>
|
||||
<dd>$17.40</dd>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-split wa-body-m">
|
||||
<dt>Total</dt>
|
||||
<dd>$191.40</dd>
|
||||
</div>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
</wa-callout>
|
||||
</div>
|
||||
```
|
||||
@@ -1,183 +0,0 @@
|
||||
---
|
||||
title: Product Lists
|
||||
description: 'Let shoppers browse and compare products with detailed lists of the products in your store.'
|
||||
isPro: true
|
||||
---
|
||||
|
||||
## Simple Grid with Ratings
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-grid wa-gap-2xl">
|
||||
<a class="wa-stack wa-align-items-center wa-gap-xs wa-link-plain" href="">
|
||||
<div class="wa-frame wa-border-radius-m">
|
||||
<img
|
||||
src="https://images.unsplash.com/photo-1633933329864-5d4c4423ad54?q=80&w=3387&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="Bunch of fresh basil leaves with purple veins (Photograph by Svitlana)"
|
||||
/>
|
||||
</div>
|
||||
<strong>Basil</strong>
|
||||
<wa-rating label="Rating" size="small" readonly value="5"></wa-rating>
|
||||
<span class="wa-caption-m">41 Reviews</span>
|
||||
<strong>$8.59</strong>
|
||||
</a>
|
||||
<a class="wa-stack wa-align-items-center wa-gap-xs wa-link-plain" href="">
|
||||
<div class="wa-frame wa-border-radius-m">
|
||||
<img
|
||||
src="https://images.unsplash.com/photo-1662892194342-f95c33cc16e3?q=80&w=3000&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="Bunch of cut chamomile blooms (Photograph by Rootnot Creations)"
|
||||
/>
|
||||
</div>
|
||||
<strong>Chamomile</strong>
|
||||
<wa-rating label="Rating" size="small" readonly value="3"></wa-rating>
|
||||
<span class="wa-caption-m">17 Reviews</span>
|
||||
<strong>$10.29</strong>
|
||||
</a>
|
||||
<a class="wa-stack wa-align-items-center wa-gap-xs wa-link-plain" href="">
|
||||
<div class="wa-frame wa-border-radius-m">
|
||||
<img
|
||||
src="https://images.unsplash.com/photo-1636396279461-f875646332d9?q=80&w=3360&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="Canvas bundle of cut lavender blooms (Photograph by volant)"
|
||||
/>
|
||||
</div>
|
||||
<strong>Lavender</strong>
|
||||
<wa-rating label="Rating" size="small" readonly value="4"></wa-rating>
|
||||
<span class="wa-caption-m">29 Reviews</span>
|
||||
<strong>$9.99</strong>
|
||||
</a>
|
||||
<a class="wa-stack wa-align-items-center wa-gap-xs wa-link-plain" href="">
|
||||
<div class="wa-frame wa-border-radius-m">
|
||||
<img
|
||||
src="https://images.unsplash.com/photo-1501085934018-450c8e615dbc?q=80&w=3387&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="Blooming marjoram plant (Photograph by Monika Grabkowska)"
|
||||
/>
|
||||
</div>
|
||||
<strong>Marjoram</strong>
|
||||
<wa-rating label="Rating" size="small" readonly value="4"></wa-rating>
|
||||
<span class="wa-caption-m">11 Reviews</span>
|
||||
<strong>$8.59</strong>
|
||||
</a>
|
||||
<a class="wa-stack wa-align-items-center wa-gap-xs wa-link-plain" href="">
|
||||
<div class="wa-frame wa-border-radius-m">
|
||||
<img
|
||||
src="https://images.unsplash.com/photo-1688633767797-455f59c98272?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="Group of mature oregano plants (Photograph Nikolett Emmert)"
|
||||
/>
|
||||
</div>
|
||||
<strong>Oregano</strong>
|
||||
<wa-rating label="Rating" size="small" readonly value="5"></wa-rating>
|
||||
<span class="wa-caption-m">38 Reviews</span>
|
||||
<strong>$8.59</strong>
|
||||
</a>
|
||||
<a class="wa-stack wa-align-items-center wa-gap-xs wa-link-plain" href="">
|
||||
<div class="wa-frame wa-border-radius-m">
|
||||
<img
|
||||
src="https://images.unsplash.com/photo-1603109731710-dba41b1096a7?q=80&w=2259&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="Cluster of peppermint plants (Photograph by Josefin)"
|
||||
/>
|
||||
</div>
|
||||
<strong>Peppermint</strong>
|
||||
<wa-rating label="Rating" size="small" readonly value="5"></wa-rating>
|
||||
<span class="wa-caption-m">26 Reviews</span>
|
||||
<strong>$9.99</strong>
|
||||
</a>
|
||||
<a class="wa-stack wa-align-items-center wa-gap-xs wa-link-plain" href="">
|
||||
<div class="wa-frame wa-border-radius-m">
|
||||
<img
|
||||
src="https://images.unsplash.com/photo-1726994803809-0e065bd4b25b?q=80&w=3387&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="Mature rosemary stems (Photograph by 360floralflaves)"
|
||||
/>
|
||||
</div>
|
||||
<strong>Rosemary</strong>
|
||||
<wa-rating label="Rating" size="small" readonly value="4"></wa-rating>
|
||||
<span class="wa-caption-m">34 Reviews</span>
|
||||
<strong>$8.59</strong>
|
||||
</a>
|
||||
<a class="wa-stack wa-align-items-center wa-gap-xs wa-link-plain" href="">
|
||||
<div class="wa-frame wa-border-radius-m">
|
||||
<img
|
||||
src="https://images.unsplash.com/photo-1659834742696-44573974981b?q=80&w=3542&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="Group of sage plants (Photograph by Susie Burleson)"
|
||||
/>
|
||||
</div>
|
||||
<strong>Sage</strong>
|
||||
<wa-rating label="Rating" size="small" readonly value="5"></wa-rating>
|
||||
<span class="wa-caption-m">24 Reviews</span>
|
||||
<strong>$9.29</strong>
|
||||
</a>
|
||||
</div>
|
||||
```
|
||||
|
||||
## Even Card Grid with Details
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-grid" style="--min-column-size: 50ch">
|
||||
<div class="wa-grid">
|
||||
<a href="" class="wa-link-plain">
|
||||
<wa-card>
|
||||
<img slot="image"
|
||||
src="https://images.unsplash.com/photo-1622445272461-c6580cab8755?q=80&w=3387&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="Man in a relaxed fit, white, crew neck t-shirt (Photography by Mediamodifier)"
|
||||
/>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-flank:end wa-align-items-start wa-heading-m">
|
||||
<span>Plain Classic Tee</span>
|
||||
<span>$24</span>
|
||||
</div>
|
||||
<p class="wa-caption-m">Keep it casual or dress it up. Soft, 100% cotton with a crew neckline, perfect for any occasion.</p>
|
||||
<em class="wa-caption-m">8 colors</em>
|
||||
</div>
|
||||
</wa-card>
|
||||
</a>
|
||||
<a href="" class="wa-link-plain">
|
||||
<wa-card>
|
||||
<img slot="image"
|
||||
src="https://images.unsplash.com/photo-1554568218-0f1715e72254?q=80&w=3387&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="Woman in a light heather t-shirt printed with sharp black ink (Photograph by Christian Bolt)"
|
||||
/>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-flank:end wa-align-items-start wa-heading-m">
|
||||
<span>One-color Graphic Tee</span>
|
||||
<span>$32</span>
|
||||
</div>
|
||||
<p class="wa-caption-m">Your own spin on our classic tee. Hand screen printed for the ultimate accuracy and quality.</p>
|
||||
<em class="wa-caption-m">6 colors</em>
|
||||
</div>
|
||||
</wa-card>
|
||||
</a>
|
||||
</div>
|
||||
<div class="wa-grid">
|
||||
<a href="" class="wa-link-plain">
|
||||
<wa-card>
|
||||
<img slot="image"
|
||||
src="https://images.unsplash.com/photo-1567098260939-5d9cee055592?q=80&w=2832&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="Man in a black t-shirt printed with many-colored gradients (Photograph by Marcel)"
|
||||
/>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-flank:end wa-align-items-start wa-heading-m">
|
||||
<span>Multi-color Graphic Tee</span>
|
||||
<span>$36</span>
|
||||
</div>
|
||||
<p class="wa-caption-m">Make a statement. Screen printed with vibrant, quality inks to last wash after wash.</p>
|
||||
<em class="wa-caption-m">4 colors</em>
|
||||
</div>
|
||||
</wa-card>
|
||||
</a>
|
||||
<a href="" class="wa-link-plain">
|
||||
<wa-card>
|
||||
<img slot="image"
|
||||
src="https://images.unsplash.com/photo-1709185727063-c3caae752a64?q=80&w=3387&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="Woman in a black t-shirt with a bright white logo printed on the pocket (Photograph by SASI)"
|
||||
/>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-flank:end wa-align-items-start wa-heading-m">
|
||||
<span>Pocket Graphic Tee</span>
|
||||
<span>$29</span>
|
||||
</div>
|
||||
<p class="wa-caption-m">Go classic with a bit of your own flair. Screen printed, eye-catching detail on the pocket.</p>
|
||||
<em class="wa-caption-m">6 colors</em>
|
||||
</div>
|
||||
</wa-card>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
@@ -1,430 +0,0 @@
|
||||
---
|
||||
title: Product Overview
|
||||
description: 'Showcase your products with overviews including images, ratings, features, options, and more.'
|
||||
isPro: true
|
||||
---
|
||||
|
||||
## Split with Image
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-grid wa-gap-2xl">
|
||||
<div class="wa-stack wa-gap-2xl">
|
||||
<h2>San Ignacio Pache</h2>
|
||||
<p>A smooth, balanced Arabica varietal, grown and roasted on the Guerrero family's farm. Rich caramel and malt flavors blend with bright citrus for a complex brew suitable for drip, pour over, espresso, or however you take your coffee.</p>
|
||||
<div class="wa-stack">
|
||||
<wa-select label="Bag Size" value="12oz">
|
||||
<wa-option value="12oz">12 oz – $19.95</wa-option>
|
||||
<wa-option value="3lb">3 lb – $72.00</wa-option>
|
||||
<wa-option value="5lb">5 lb – $99.75</wa-option>
|
||||
</wa-select>
|
||||
<wa-select label="Bean Type" value="whole">
|
||||
<wa-option value="whole">Whole</wa-option>
|
||||
<wa-option value="drip">Drip Grind</wa-option>
|
||||
<wa-option value="espresso">Espresso Grind</wa-option>
|
||||
</wa-select>
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-flank">
|
||||
<wa-input type="number" aria-label="Quantity" value="1" min="1" style="max-width: 8ch"></wa-input>
|
||||
<wa-button variant="brand">
|
||||
<wa-icon slot="prefix" name="basket-shopping"></wa-icon>
|
||||
Add to Basket
|
||||
</wa-button>
|
||||
</div>
|
||||
<div class="wa-flank wa-caption-m">
|
||||
<wa-icon name="truck"></wa-icon>
|
||||
<span>Free shipping on orders over $60</span>
|
||||
</div>
|
||||
</div>
|
||||
<dl class="wa-grid">
|
||||
<div class="wa-flank">
|
||||
<wa-avatar>
|
||||
<wa-icon slot="icon" name="coffee-bean"></wa-icon>
|
||||
</wa-avatar>
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<dt>Roast</dt>
|
||||
<dd>Medium</dd>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-flank">
|
||||
<wa-avatar>
|
||||
<wa-icon slot="icon" name="earth-americas"></wa-icon>
|
||||
</wa-avatar>
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<dt>Origin</dt>
|
||||
<dd>San Ignacio, Peru</dd>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-flank">
|
||||
<wa-avatar>
|
||||
<wa-icon slot="icon" name="sun-haze"></wa-icon>
|
||||
</wa-avatar>
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<dt>Process</dt>
|
||||
<dd>Washed</dd>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-flank">
|
||||
<wa-avatar>
|
||||
<wa-icon slot="icon" name="mug-hot"></wa-icon>
|
||||
</wa-avatar>
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<dt>Tasting Notes</dt>
|
||||
<dd>Caramel, malt, orange</dd>
|
||||
</div>
|
||||
</div>
|
||||
</dl>
|
||||
</div>
|
||||
<div class="wa-frame wa-border-radius-m">
|
||||
<img
|
||||
src="https://images.unsplash.com/photo-1600396538702-d234dbb79139?q=80&w=3833&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="Whole roasted coffee beans (Photograph by Jocelyn Morales)"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
## With Image Grid
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-stack wa-gap-2xl">
|
||||
<wa-breadcrumb>
|
||||
<wa-breadcrumb-item>Clothing</wa-breadcrumb-item>
|
||||
<wa-breadcrumb-item>Women's</wa-breadcrumb-item>
|
||||
<wa-breadcrumb-item>Shirts & Tops</wa-breadcrumb-item>
|
||||
</wa-breadcrumb>
|
||||
<div class="wa-grid wa-gap-xs" style="--min-column-size: 10ch">
|
||||
<div class="wa-frame" style="height: 100%; width: 100%">
|
||||
<img class="wa-border-radius-s"
|
||||
src="https://images.unsplash.com/photo-1614792568992-ded1c487c1dd?q=80&w=2487&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="(Photograph by Patrick Perkins)"
|
||||
/>
|
||||
</div>
|
||||
<div class="wa-grid wa-gap-xs">
|
||||
<div class="wa-frame" style="aspect-ratio: 3 / 2">
|
||||
<img class="wa-border-radius-s"
|
||||
src="https://images.unsplash.com/photo-1614725078749-29c421fd0e51?q=80&w=2487&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="(Photograph by Patrick Perkins)"
|
||||
/>
|
||||
</div>
|
||||
<div class="wa-frame" style="aspect-ratio: 3 / 2">
|
||||
<img class="wa-border-radius-s"
|
||||
src="https://images.unsplash.com/photo-1614725808713-e6bbe418fc5d?q=80&w=2487&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="(Photograph by Patrick Perkins)"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-frame" style="height: 100%; width: 100%">
|
||||
<img class="wa-border-radius-s"
|
||||
src="https://images.unsplash.com/photo-1614725078379-9d1330a08c95?q=80&w=2487&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="(Photograph by Patrick Perkins)"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-grid wa-gap-xl" style="--min-column-size: 30ch">
|
||||
<h2 class="wa-heading-l">Cropped Fitted Tank Top</h2>
|
||||
<span class="wa-body-xl">$59</span>
|
||||
</div>
|
||||
<div class="wa-grid wa-gap-xl" style="--min-column-size: 30ch">
|
||||
<div class="wa-stack wa-gap-xl">
|
||||
<div class="wa-cluster">
|
||||
<wa-rating label="Rating" readonly value="3.5"></wa-rating>
|
||||
<a href="">117 Reviews</a>
|
||||
</div>
|
||||
<p>Made with a breathable, stretchy fabric blend for unparalleled comfort and flattering style. Pairs perfectly with your favorite high-waisted jeans for lazy summer weekends or lively nights out.</p>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<h3 class="wa-heading-xs">Good to Know</h3>
|
||||
<p class="wa-body-xs">95% cotton, 5% elastane. Our tops are pre-shrunk to ensure a consistent fit with no surprises. Machine wash cold. Tumble dry low.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<wa-radio-group label="Color" name="color" value="black" orientation="horizontal">
|
||||
<wa-radio-button id="radio-black" value="black">
|
||||
<wa-icon name="square" label="Black" style="color: black;"></wa-icon>
|
||||
<wa-tooltip for="radio-black">Black</wa-tooltip>
|
||||
</wa-radio-button>
|
||||
<wa-radio-button id="radio-gray" value="gray">
|
||||
<wa-icon name="square" label="Gray" style="color: gray;"></wa-icon>
|
||||
<wa-tooltip for="radio-gray">Gray</wa-tooltip>
|
||||
</wa-radio-button>
|
||||
<wa-radio-button id="radio-indigo" value="indigo">
|
||||
<wa-icon name="square" label="Indigo" style="color: indigo;"></wa-icon>
|
||||
<wa-tooltip for="radio-indigo">Indigo</wa-tooltip>
|
||||
</wa-radio-button>
|
||||
<wa-radio-button id="radio-olive" value="olive">
|
||||
<wa-icon name="square" label="Olive" style="color: olive;"></wa-icon>
|
||||
<wa-tooltip for="radio-olive">Olive</wa-tooltip>
|
||||
</wa-radio-button>
|
||||
</wa-radio-group>
|
||||
<wa-radio-group label="Size" name="size" value="s" orientation="horizontal">
|
||||
<wa-radio-button value="xs">XS</wa-radio-button>
|
||||
<wa-radio-button value="s">S</wa-radio-button>
|
||||
<wa-radio-button value="m">M</wa-radio-button>
|
||||
<wa-radio-button value="l">L</wa-radio-button>
|
||||
<wa-radio-button value="xl">XL</wa-radio-button>
|
||||
</wa-radio-group>
|
||||
<wa-button variant="brand">
|
||||
<wa-icon slot="prefix" name="cart-plus" variant="solid"></wa-icon>
|
||||
Add to Cart
|
||||
</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
## With Tiered Images
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-stack wa-gap-2xl">
|
||||
<wa-breadcrumb>
|
||||
<wa-breadcrumb-item>Clothing</wa-breadcrumb-item>
|
||||
<wa-breadcrumb-item>Men's</wa-breadcrumb-item>
|
||||
<wa-breadcrumb-item>Shirts & Tops</wa-breadcrumb-item>
|
||||
</wa-breadcrumb>
|
||||
<div class="wa-grid wa-gap-2xl" style="--min-column-size: 35ch">
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<img class="wa-border-radius-s"
|
||||
src="https://images.unsplash.com/photo-1630643583573-c68623718072?q=80&w=3387&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="(Photograph by Gervyn Louis)"
|
||||
/>
|
||||
<div class="wa-grid wa-gap-xs" style="--min-column-size: 0ch">
|
||||
<img class="wa-border-radius-s"
|
||||
src="https://images.unsplash.com/photo-1571666274590-f8cc87006500?q=80&w=3387&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="(Photograph by Gervyn Louis)"
|
||||
/>
|
||||
<img class="wa-border-radius-s"
|
||||
src="https://images.unsplash.com/photo-1630643591760-a6ed60ef499f?q=80&w=3387&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="(Photograph by Gervyn Louis)"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-split">
|
||||
<h2 class="wa-heading-l">Graphic Cutoff Tee</h2>
|
||||
<span class="wa-body-xl">$65</span>
|
||||
</div>
|
||||
<div class="wa-split">
|
||||
<div class="wa-cluster">
|
||||
<wa-rating label="Rating" readonly value="4.2"></wa-rating>
|
||||
<span>4.2</span>
|
||||
</div>
|
||||
<a href="#">144 Reviews</a>
|
||||
</div>
|
||||
<wa-radio-group label="Color" name="color" value="black" orientation="horizontal">
|
||||
<wa-radio-button value="black">
|
||||
<wa-icon slot="prefix" name="shirt" style="color: black;"></wa-icon>
|
||||
Vintage Black
|
||||
</wa-radio-button>
|
||||
<wa-radio-button value="gray">
|
||||
<wa-icon slot="prefix" name="shirt" style="color: gray;"></wa-icon>
|
||||
Faded Gray
|
||||
</wa-radio-button>
|
||||
</wa-radio-group>
|
||||
<wa-radio-group label="Size" name="size" value="s" orientation="horizontal">
|
||||
<wa-radio-button value="xs">XS</wa-radio-button>
|
||||
<wa-radio-button value="s">S</wa-radio-button>
|
||||
<wa-radio-button value="m">M</wa-radio-button>
|
||||
<wa-radio-button value="l">L</wa-radio-button>
|
||||
<wa-radio-button value="xl">XL</wa-radio-button>
|
||||
</wa-radio-group>
|
||||
<wa-button variant="brand">
|
||||
<wa-icon slot="prefix" name="bag-shopping" variant="solid"></wa-icon>
|
||||
Add to Bag
|
||||
</wa-button>
|
||||
<wa-divider></wa-divider>
|
||||
<h3 class="wa-heading-s">Description</h3>
|
||||
<p>Stay cool, <em>slay</em> cool. Train hard and recover in style with this ultra-breathable cutoff tee. Made from 100% organic, quick-drying cotton to keep the air flowing whether you're lifting, sprinting, or crushing HIIT sessions.</p>
|
||||
<wa-divider></wa-divider>
|
||||
<h3 class="wa-heading-s">Highlights</h3>
|
||||
<div class="wa-grid">
|
||||
<wa-card class="wa-span-grid">
|
||||
<div class="wa-stack">
|
||||
<wa-icon name="hand-holding-heart"></wa-icon>
|
||||
<h4 class="wa-heading-s">People and Planet First</h4>
|
||||
<p class="wa-caption-m">Ethical production, fair wages, and sustainable materials empower every part of our supply chain.</p>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card>
|
||||
<div class="wa-stack">
|
||||
<wa-icon name="earth-americas"></wa-icon>
|
||||
<h4 class="wa-heading-s">International Shipping</h4>
|
||||
<p class="wa-caption-m">Wherever you are, your order will meet you there.</p>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card>
|
||||
<div class="wa-stack">
|
||||
<wa-icon name="arrow-right-arrow-left"></wa-icon>
|
||||
<h4 class="wa-heading-s">90-day Returns</h4>
|
||||
<p class="wa-caption-m">Not happy? Return your item and get a full refund.</p>
|
||||
</div>
|
||||
</wa-card>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
## With Carousel and Collapsible Details
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-stack wa-gap-2xl">
|
||||
<wa-carousel pagination navigation loop style="--aspect-ratio: 3 / 2;">
|
||||
<wa-carousel-item>
|
||||
<img
|
||||
src="https://images.unsplash.com/photo-1601379327928-bedfaf9da2d0?q=80&w=3456&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="Four folded and stacked knit sweaters in three colors (Photograph by Tijana Drndarski)"
|
||||
/>
|
||||
</wa-carousel-item>
|
||||
<wa-carousel-item>
|
||||
<img
|
||||
src="https://images.unsplash.com/photo-1519804270019-39e929a7afb5?q=80&w=3774&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="Knit sweater in sand color full view, showing waffle knit pattern, relaxed fit, and crew neckline (Photograph by Jonathan Zerger)"
|
||||
/>
|
||||
</wa-carousel-item>
|
||||
<wa-carousel-item>
|
||||
<img
|
||||
src="https://images.unsplash.com/photo-1519805614447-6f49142e6697?q=80&w=3633&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="Knit sweater in sand color shoulder detail, showing relaxed fit on broader shoulders (Photograph by Jonathan Zerger)"
|
||||
/>
|
||||
</wa-carousel-item>
|
||||
<wa-carousel-item>
|
||||
<img
|
||||
src="https://images.unsplash.com/photo-1522230130022-498e355165c5?q=80&w=3774&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="Knit sweater in sand color sleeve detail, showing loose fit around the arms (Photograph by Jonathan Zerger)"
|
||||
/>
|
||||
</wa-carousel-item>
|
||||
</wa-carousel>
|
||||
<div class="wa-grid wa-gap-2xl" style="--min-column-size: 30ch;">
|
||||
<div class="wa-stack">
|
||||
<div class="wa-split">
|
||||
<h3>Pullover Sweater</h3>
|
||||
<span class="wa-body-xl">$140</span>
|
||||
</div>
|
||||
<wa-rating label="Rating" precision="0.5" value="4.5" readonly></wa-rating>
|
||||
<p>Wrap yourself in warmth and effortless style with this wool knit Pullover Sweater. Designed for unparalleled comfort. The relaxed fit and classic crew neckline make it a versatile staple for layering or wearing solo.</p>
|
||||
<wa-radio-group label="Color" name="color" value="sand" orientation="horizontal">
|
||||
<wa-radio-button value="sand">
|
||||
<wa-icon slot="prefix" name="circle" style="color: burlywood;"></wa-icon>
|
||||
Sand
|
||||
</wa-radio-button>
|
||||
<wa-radio-button value="shale">
|
||||
<wa-icon slot="prefix" name="circle" style="color: silver;"></wa-icon>
|
||||
Shale
|
||||
</wa-radio-button>
|
||||
<wa-radio-button value="slate">
|
||||
<wa-icon slot="prefix" name="circle" style="color: dimgray;"></wa-icon>
|
||||
Slate
|
||||
</wa-radio-button>
|
||||
</wa-radio-group>
|
||||
<wa-radio-group label="Size" name="size" value="s" orientation="horizontal">
|
||||
<wa-radio-button value="xs">XS</wa-radio-button>
|
||||
<wa-radio-button value="s">S</wa-radio-button>
|
||||
<wa-radio-button value="m">M</wa-radio-button>
|
||||
<wa-radio-button value="l">L</wa-radio-button>
|
||||
<wa-radio-button value="xl">XL</wa-radio-button>
|
||||
</wa-radio-group>
|
||||
<wa-button variant="brand">Add to Cart</wa-button>
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<wa-details summary="Size and Fit" open>
|
||||
<ul class="wa-body-s">
|
||||
<li>True to size with a relaxed fit</li>
|
||||
<li>Fits all shoulder shapes, broad to narrow</li>
|
||||
<li>No pinching in the arms or irritating seams</li>
|
||||
<li>Ribbed cuffs and hem</li>
|
||||
</ul>
|
||||
</wa-details>
|
||||
<wa-details summary="Materials and Care">
|
||||
<ul class="wa-body-s">
|
||||
<li>Durable Merino and Yak wool blend</li>
|
||||
<li>Machine wash cold on delicate cycle</li>
|
||||
<li>Lay flat to dry</li>
|
||||
<li>Made with <wa-icon name="heart" label="love"></wa-icon> in Bentonville, USA</li>
|
||||
</ul>
|
||||
</wa-details>
|
||||
<wa-details summary="Shipping">
|
||||
<ul class="wa-body-s">
|
||||
<li>Flat $9 shipping free for orders under $200.</li>
|
||||
<li>Free shipping on orders over $200, anywhere in the world.</li>
|
||||
</ul>
|
||||
</wa-details>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
|
||||
## With Tabs
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-flank:end wa-align-items-start wa-gap-2xl" style="--flank-size: 30ch">
|
||||
<div class="wa-stack">
|
||||
<img class="wa-border-radius-l"
|
||||
src="https://img.fortawesome.com/cfa83f3c/icon-grid-wallpaper.png"
|
||||
alt="Sample of 48 line-style icons"
|
||||
/>
|
||||
<wa-tab-group>
|
||||
<wa-tab panel="license">License</wa-tab>
|
||||
<wa-tab panel="faq">FAQ</wa-tab>
|
||||
<wa-tab-panel name="license">
|
||||
<p class="wa-body-s">Your purchase includes a perpetual Font Awesome Pro License to use Classic Light icons on unlimited projects. <a href="">Read the full license terms.</a></p>
|
||||
</wa-tab-panel>
|
||||
<wa-tab-panel name="faq">
|
||||
<dl class="wa-stack wa-body-s">
|
||||
<dt>Do I need to renew my subscription to receive fixes?</dt>
|
||||
<dd>We split up Font Awesome releases into regular updates and bug-fix updates. With a Font Awesome Pro plan that has a perpetual license, you'll always be entitled to bug-fix updates for your last version, even after your subscription has expired.</dd>
|
||||
<dt>Can I use Font Awesome Pro in themes, plug-ins, or open source projects?</dt>
|
||||
<dd>For themes and open source projects, right now it's best to just use Font Awesome Free. We are working a better solution, so feel free to get in touch if you have thoughts.</dd>
|
||||
<dt>Do you offer enterprise licenses for Font Awesome Pro?</dt>
|
||||
<dd>We don't currently offer Enterprise-level licenses, but we may do so in the future. Get in touch if interested.</dd>
|
||||
</dl>
|
||||
</wa-tab-panel>
|
||||
</wa-tab-group>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-l">
|
||||
<wa-badge appearance="filled">Sale</wa-badge>
|
||||
<h2>Icon Pack: Classic Light</h2>
|
||||
<p class="wa-body-l">Easy, readable icons with a lighter touch.</p>
|
||||
<div class="wa-cluster wa-gap-xs wa-body-l">
|
||||
<s>$60</s>
|
||||
<strong>$49</strong>
|
||||
</div>
|
||||
<wa-button variant="brand" size="large">
|
||||
<wa-icon slot="prefix" name="arrow-down-to-line" variant="solid"></wa-icon>
|
||||
Get Icons
|
||||
</wa-button>
|
||||
<wa-divider></wa-divider>
|
||||
<h3 class="wa-heading-m">What's in the Pack</h3>
|
||||
<ul class="wa-stack wa-gap-xs">
|
||||
<li class="wa-flank">
|
||||
<wa-icon name="badge-check"></wa-icon>
|
||||
<span>3,323 icons</span>
|
||||
</li>
|
||||
<li class="wa-flank">
|
||||
<wa-icon name="badge-check"></wa-icon>
|
||||
<span>Pre-bundled Font Awesome kit</span>
|
||||
</li>
|
||||
<li class="wa-flank">
|
||||
<wa-icon name="badge-check"></wa-icon>
|
||||
<span>Ligature-based desktop font files</span>
|
||||
</li>
|
||||
<li class="wa-flank">
|
||||
<wa-icon name="badge-check"></wa-icon>
|
||||
<span>Individual SVGs + SVG sprites</span>
|
||||
</li>
|
||||
<li class="wa-flank">
|
||||
<wa-icon name="badge-check"></wa-icon>
|
||||
<span>Web fonts + SVG framework</span>
|
||||
</li>
|
||||
<li class="wa-flank">
|
||||
<wa-icon name="badge-check"></wa-icon>
|
||||
<span>SCSS/LESS CSS preprocessor files</span>
|
||||
</li>
|
||||
<li class="wa-flank">
|
||||
<wa-icon name="badge-check"></wa-icon>
|
||||
<span>Perpetual Pro license</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
@@ -1,161 +0,0 @@
|
||||
---
|
||||
title: Product Preview
|
||||
description: 'Give shoppers a quick look at your products as they browse with modal previews.'
|
||||
icon: preview
|
||||
isPro: true
|
||||
---
|
||||
|
||||
## With Product Options
|
||||
|
||||
```html {.example}
|
||||
<wa-card with-header>
|
||||
<div class="wa-split" slot="header">
|
||||
<h3 class="wa-heading-l">Stan Smith® Camo Tongue Tee</h3>
|
||||
<wa-icon-button name="close" label="Close Preview"></wa-icon-button>
|
||||
</div>
|
||||
<div class="wa-grid wa-gap-xl">
|
||||
<div class="wa-frame wa-border-radius-l" style="aspect-ratio: auto">
|
||||
<img
|
||||
src="https://images.unsplash.com/photo-1660997351262-6c31d8a35b6c?q=80&w=2000&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="Stan Smith graphic crew-neck tee in honeydew color"
|
||||
/>
|
||||
</div>
|
||||
<div class="wa-split:column wa-align-items-stretch wa-gap-xl">
|
||||
<div class="wa-stack wa-gap-xl">
|
||||
<div class="wa-cluster">
|
||||
<span class="wa-heading-2xl">$32</span>
|
||||
<wa-divider vertical style="height: 2em"></wa-divider>
|
||||
<wa-rating label="Rating" value="3.75" readonly></wa-rating>
|
||||
<a href="" class="wa-caption-m">36 Reviews</a>
|
||||
</div>
|
||||
<p>An ode to the “Sneaker that go with everything” …even this tee.</p>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-stack wa-gap-s">
|
||||
<h4 class="wa-heading-s">Categories</h4>
|
||||
<div class="wa-cluster wa-gap-2xs">
|
||||
<a href=""><wa-tag appearance="outlined" size="small" pill>Men's</wa-tag></a>
|
||||
<a href=""><wa-tag appearance="outlined" size="small" pill>Sneakers</wa-tag></a>
|
||||
<a href=""><wa-tag appearance="outlined" size="small" pill>Tees</wa-tag></a>
|
||||
<a href=""><wa-tag appearance="outlined" size="small" pill>Lifestyle</wa-tag></a>
|
||||
<a href=""><wa-tag appearance="outlined" size="small" pill>Fashion</wa-tag></a>
|
||||
<a href=""><wa-tag appearance="outlined" size="small" pill>Casual</wa-tag></a>
|
||||
<a href=""><wa-tag appearance="outlined" size="small" pill>Stan Smith</wa-tag></a>
|
||||
<a href=""><wa-tag appearance="outlined" size="small" pill>Tennis</wa-tag></a>
|
||||
<a href=""><wa-tag appearance="outlined" size="small" pill>Sports</wa-tag></a>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-stack wa-gap-s">
|
||||
<wa-select label="Color" value="honeydew">
|
||||
<wa-option value="hotpink">
|
||||
<wa-icon slot="prefix" name="circle" style="color: hotpink;"></wa-icon>
|
||||
Hot Pink
|
||||
</wa-option>
|
||||
<wa-option value="honeydew">
|
||||
<wa-icon slot="prefix" name="circle" style="color: honeydew;"></wa-icon>
|
||||
Honeydew
|
||||
</wa-option>
|
||||
<wa-option value="coral">
|
||||
<wa-icon slot="prefix" name="circle" style="color: lightcoral;"></wa-icon>
|
||||
Coral
|
||||
</wa-option>
|
||||
<wa-option value="wheat">
|
||||
<wa-icon slot="prefix" name="circle" style="color: wheat;"></wa-icon>
|
||||
Wheat
|
||||
</wa-option>
|
||||
<wa-option value="lilac">
|
||||
<wa-icon slot="prefix" name="circle" style="color: #C8A2C8;"></wa-icon>
|
||||
Lilac
|
||||
</wa-option>
|
||||
<wa-option value="burnt-orange">
|
||||
<wa-icon slot="prefix" name="circle" style="color: #FF5733"></wa-icon>
|
||||
Burnt Orange
|
||||
</wa-option>
|
||||
</wa-select>
|
||||
<wa-select label="Size" value="large">
|
||||
<wa-option value="small">Small</wa-option>
|
||||
<wa-option value="medium">Medium</wa-option>
|
||||
<wa-option value="large">Large</wa-option>
|
||||
<wa-option value="xl">XL</wa-option>
|
||||
<wa-option value="xxl">XXL</wa-option>
|
||||
</wa-select>
|
||||
</div>
|
||||
</div>
|
||||
<wa-button variant="brand">
|
||||
Add to Cart
|
||||
<wa-icon slot="suffix" name="cart-shopping" variant="solid"></wa-icon>
|
||||
</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
```
|
||||
|
||||
## With Description & Details
|
||||
|
||||
```html{.example}
|
||||
<wa-card>
|
||||
<div class="wa-split" slot="header">
|
||||
<h3 class="wa-heading-l">Champion® Crossbody Bag</h3>
|
||||
<wa-icon-button name="close" label="Close Preview"></wa-icon-button>
|
||||
</div>
|
||||
<div class="wa-grid wa-gap-xl">
|
||||
<div class="wa-frame wa-border-radius-l" style="aspect-ratio: auto">
|
||||
<img
|
||||
src="https://images.unsplash.com/photo-1643467358005-899641cab7b5?q=80&w=2487&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="Black weatherproof crossbody bag with two large zipper pockets"
|
||||
/>
|
||||
</div>
|
||||
<div class="wa-split:column wa-align-items-stretch wa-gap-xl">
|
||||
<div class="wa-stack wa-gap-xl">
|
||||
<div class="wa-split wa-align-items-start">
|
||||
<span class="wa-heading-2xl">$40</span>
|
||||
<wa-icon-button id="favorite" label="Favorite" name="heart" variant="regular"></wa-icon-button>
|
||||
<wa-tooltip for="favorite">Add to Favorites</wa-tooltip>
|
||||
</div>
|
||||
<div class="wa-split">
|
||||
<div class="wa-cluster wa-gap-xs">
|
||||
<span>3.9</span>
|
||||
<wa-rating value="3.9" readonly></wa-rating>
|
||||
</div>
|
||||
<a href="">See 512 Reviews</a>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<wa-callout size="small">
|
||||
<wa-icon slot="icon" name="circle-info" variant="regular"></wa-icon>
|
||||
You purchased this item on <wa-format-date date="2023-02-20T09:00:00-04:00" month="long" day="numeric" year="numeric"></wa-format-date>
|
||||
</wa-callout>
|
||||
<div class="wa-gap-xs wa-stack">
|
||||
<h4 class="wa-heading-m">About</h4>
|
||||
<p class="wa-body-s">The Champion® Crossbody Bag is crafted for the trendsetter. Its sleek silhouette, paired with a tonal branded adjustable sling strap, ensures you look effortlessly cool no matter where you go.</p>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-gap-xs wa-stack">
|
||||
<h4 class="wa-heading-m">Details</h4>
|
||||
<dl class="wa-grid" style="--min-column-size: 15ch">
|
||||
<div class="wa-gap-2xs wa-stack">
|
||||
<dt class="wa-body-s">Care Instructions</dt>
|
||||
<dd class="wa-caption-m">Hand Wash Only</dd>
|
||||
</div>
|
||||
<div class="wa-gap-2xs wa-stack">
|
||||
<dt class="wa-body-s">Origin</dt>
|
||||
<dd class="wa-caption-m">Imported</dd>
|
||||
</div>
|
||||
<div class="wa-gap-2xs wa-stack">
|
||||
<dt class="wa-body-s">Country of Origin</dt>
|
||||
<dd class="wa-caption-m">China</dd>
|
||||
</div>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-flank:end wa-align-items-end">
|
||||
<wa-button variant="brand" size="medium">
|
||||
<wa-icon slot="suffix" name="cart-shopping" variant="solid"></wa-icon>Add to Cart
|
||||
</wa-button>
|
||||
<wa-button appearance="outlined" size="medium">
|
||||
<wa-icon slot="suffix" name="arrow-right" variant="solid"></wa-icon>View Full Details
|
||||
</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
```
|
||||
@@ -1,212 +0,0 @@
|
||||
---
|
||||
title: Product Reviews
|
||||
description: 'Help shoppers make informed decisions with ratings, reviews, and testimonials from your customers.'
|
||||
isPro: true
|
||||
---
|
||||
## Multi column
|
||||
|
||||
```html{.example}
|
||||
<div style="max-width: 960px; margin: 0 auto;">
|
||||
<span class="wa-heading-m">Recent Reviews</span>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-flank wa-gap-s" style="--flank-size: 20%">
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span class="wa-heading-s">Viktor Vaughn</span>
|
||||
<wa-relative-time date="2020-07-15T09:17:00-04:00" class="wa-caption-m"></wa-relative-time>
|
||||
</div>
|
||||
<div class="wa-flank">
|
||||
<wa-rating label="Rating" readonly value="5"></wa-rating>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span class="wa-heading-s">Solid treadmill for home workouts!</span>
|
||||
<p>Best treadmill I've ever owned! It has a sleek design, and the features are top-notch. I use it daily for my cardio workouts, and the motor is powerful enough to keep up with my running. It’s easy to adjust the speed and incline, and the display is clear and simple to read. Worth every penny!</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-flank wa-gap-s" style="--flank-size: 20%">
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span class="wa-heading-s">Ben Grimm</span>
|
||||
<wa-relative-time date="2020-07-15T09:17:00-04:00" class="wa-caption-m"></wa-relative-time>
|
||||
</div>
|
||||
<div class="wa-flank">
|
||||
<wa-rating label="Rating" readonly value="4"></wa-rating>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span class="wa-heading-s">Good value, a few minor flaws</span>
|
||||
<p>Decent treadmill for the price, but I feel like the belt could be a little wider for comfort. The cushioning is good, but sometimes I experience a slight wobble when running at high speeds. For casual walking, it's fine, but I’m not sure it’s built for intense runners.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-flank wa-gap-s" style="--flank-size: 20%">
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span class="wa-heading-s">Johnny Storm</span>
|
||||
<wa-relative-time date="2020-07-15T09:17:00-04:00" class="wa-caption-m"></wa-relative-time>
|
||||
</div>
|
||||
<div class="wa-flank">
|
||||
<wa-rating label="Rating" readonly value="4"></wa-rating>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span class="wa-heading-s">Decent, but could use upgrades</span>
|
||||
<p>This treadmill has been a great addition to my home gym. It's sturdy, easy to use, and I like that it tracks my steps and heart rate. The only downside is that it's a bit bulky, so I had to rearrange my space to make room for it. Overall, I'm happy with the performance and would recommend it.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-flank wa-gap-s" style="--flank-size: 20%">
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span class="wa-heading-s">Sue Storm</span>
|
||||
<wa-relative-time date="2020-07-15T09:17:00-04:00" class="wa-caption-m"></wa-relative-time>
|
||||
</div>
|
||||
<div class="wa-flank">
|
||||
<wa-rating label="Rating" readonly value="4"></wa-rating>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span class="wa-heading-s">Perfect for small spaces</span>
|
||||
<p>I absolutely love my new treadmill! It’s perfect for my daily workouts. The setup was quick, and it’s so quiet that I can use it while watching TV without any interruptions. The different incline levels really help mix up my routine, and the built-in programs keep things interesting. Highly recommend for anyone looking to stay fit at home!</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
## With Ratings Distribution
|
||||
|
||||
```html {.example}
|
||||
<div style="max-width: 960px; margin: 0 auto;">
|
||||
<div class="wa-align-items-start wa-flank wa-gap-2xl">
|
||||
<div class="wa-gap-s wa-stack">
|
||||
<span class="wa-heading-m">Customer Reviews</span>
|
||||
<div class="wa-stack wa-gap-xs"><wa-rating label="Rating" precision="0.5" value="4.6" size="small"></wa-rating> <span class="wa-caption-m">Based on 1624 reviews</span></div>
|
||||
<div class="wa-stack">
|
||||
<span class="wa-cluster wa-gap-2xs">
|
||||
<span>5</span>
|
||||
<wa-icon name="star" style="font-size: 12px;"></wa-icon>
|
||||
<wa-progress-bar value="63" label="Upload progress" style="height: 6px; width: 50%"></wa-progress-bar>
|
||||
<wa-format-number type="percent" value=".63"></wa-format-number>
|
||||
</span>
|
||||
<span class="wa-cluster wa-gap-2xs">
|
||||
<span>4</span>
|
||||
<wa-icon name="star" style="font-size: 12px;"></wa-icon>
|
||||
<wa-progress-bar value="17" label="Upload progress" style="height: 6px; width: 50%"></wa-progress-bar>
|
||||
<wa-format-number type="percent" value=".17"></wa-format-number>
|
||||
</span>
|
||||
<span class="wa-cluster wa-gap-2xs">
|
||||
<span>3</span>
|
||||
<wa-icon name="star" style="font-size: 12px;"></wa-icon>
|
||||
<wa-progress-bar value="15" label="Upload progress" style="height: 6px; width: 50%"></wa-progress-bar>
|
||||
<wa-format-number type="percent" value=".15"></wa-format-number>
|
||||
</span>
|
||||
<span class="wa-cluster wa-gap-2xs">
|
||||
<span>2</span>
|
||||
<wa-icon name="star" style="font-size: 12px;"></wa-icon>
|
||||
<wa-progress-bar value="3" label="Upload progress" style="height: 6px; width: 50%"></wa-progress-bar>
|
||||
<wa-format-number type="percent" value=".03"></wa-format-number>
|
||||
</span>
|
||||
<span class="wa-cluster wa-gap-2xs">
|
||||
<span>1</span>
|
||||
<wa-icon name="star" style="font-size: 12px;"></wa-icon>
|
||||
<wa-progress-bar value="2" label="Upload progress" style="height: 6px; width: 50%"></wa-progress-bar>
|
||||
<wa-format-number type="percent" value=".02"></wa-format-number>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div>
|
||||
<div class="wa-flank">
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1494790108377-be9c29b29330?q=80&w=2574&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"></wa-avatar>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span class="wa-heading-s">Michelle Jasper</span>
|
||||
<wa-rating label="Rating" precision="0.5" value="2.5"></wa-rating>
|
||||
</div>
|
||||
</div>
|
||||
<p>I bought this grow light for my herbs and succulents, and wow—what a difference. After just a week, my basil perked up, and new leaves started popping up. Super easy to set up and doesn’t get too hot. Highly recommend for anyone growing indoors!</p>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div>
|
||||
<div class="wa-flank">
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1599566150163-29194dcaad36?q=80&w=2574&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"></wa-avatar>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span class="wa-heading-s">Doug Michaels</span>
|
||||
<wa-rating label="Rating" precision="0.5" value="2.5"></wa-rating>
|
||||
</div>
|
||||
</div>
|
||||
<p>This light really helps my plants grow during the winter months. The brightness is strong, and I love the adjustable height. The only downside is the timer—it resets if you unplug it. Otherwise, great value for the price!</p>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div>
|
||||
<div class="wa-flank">
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1580489944761-15a19d654956?q=80&w=2561&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"></wa-avatar>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span class="wa-heading-s">Stephanie Hurst</span>
|
||||
<wa-rating label="Rating" precision="0.5" value="2.5"></wa-rating>
|
||||
</div>
|
||||
</div>
|
||||
<p>I don’t get much natural light in my apartment, so this grow light has been a game-changer. I’m using it for my small tomato plants and some lettuce, and they’re growing faster than expected. Plus, the light isn’t too harsh on the eyes</p>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div>
|
||||
<div class="wa-flank">
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1566492031773-4f4e44671857?q=80&w=2574&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"></wa-avatar>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span class="wa-heading-s">Miles Rogers</span>
|
||||
<wa-rating label="Rating" precision="0.5" value="2.5"></wa-rating>
|
||||
</div>
|
||||
</div>
|
||||
<p>I’ve tried a few grow lights, and this one is my favorite. It stays cool, uses less power, and my peace lilies and spider plants are growing beautifully. I just wish it came in more color options for the stand, but performance-wise, it’s excellent.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
## Two Column
|
||||
|
||||
```html{.example}
|
||||
<div class="wa-stack" style="max-width: 960px; margin: 0 auto;">
|
||||
<div class="wa-flank wa-align-items-center">
|
||||
<div class="wa-stack wa-align-items-center wa-gap-xs">
|
||||
<wa-avatar label="User avatar" image="https://images.unsplash.com/photo-1607746882042-944635dfe10e?q=80&w=2670&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"></wa-avatar>
|
||||
<p>Ripley</p>
|
||||
<div>
|
||||
<wa-icon-button name="thumbs-up" label="I don't like this review"></wa-icon-button>
|
||||
<wa-icon-button name="thumbs-down" label="I like this review"></wa-icon-button>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<wa-rating label="Rating" precision="0.5" value="5" readonly></wa-rating>
|
||||
<p>I recently purchased the Modern Sofa Couch, and I couldn't be happier with my decision! The process from ordering to delivery was smooth and hassle-free</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-flank wa-align-items-center">
|
||||
<div class="wa-stack wa-align-items-center wa-gap-xs">
|
||||
<wa-avatar label="User avatar" image="https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?q=80&w=2574&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"></wa-avatar>
|
||||
<p>Kane</p>
|
||||
<div>
|
||||
<wa-icon-button name="thumbs-up" label="I don't like this review"></wa-icon-button>
|
||||
<wa-icon-button name="thumbs-down" label="I like this review"></wa-icon-button>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<wa-rating label="Rating" precision="0.5" value="3.4" readonly></wa-rating>
|
||||
<p>The cushions are soft yet supportive, and the sectional layout gives plenty of space to stretch out. It’s perfect for movie nights or just lounging with a good book.</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-flank wa-align-items-center">
|
||||
<div class="wa-stack wa-align-items-center wa-gap-xs">
|
||||
<wa-avatar label="User avatar" image="https://images.unsplash.com/photo-1728577740843-5f29c7586afe?q=80&w=2680&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"></wa-avatar>
|
||||
<p>Parker</p>
|
||||
<div>
|
||||
<wa-icon-button name="thumbs-up" label="I don't like this review"></wa-icon-button>
|
||||
<wa-icon-button name="thumbs-down" label="I like this review"></wa-icon-button>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<wa-rating label="Rating" precision="0.5" value="3.8" readonly></wa-rating>
|
||||
<p>The leather is high quality, but it’s a little firmer than I thought. That said, after sitting on it for a while, it does soften up and feels more comfortable. It’s perfect if you’re looking for a more structured seating experience.</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</div>
|
||||
```
|
||||
@@ -1,278 +0,0 @@
|
||||
---
|
||||
title: Shopping Cart
|
||||
description: 'Give shoppers an overview of selected items with shopping carts that let them edit items and proceed to checkout.'
|
||||
isPro: true
|
||||
---
|
||||
|
||||
## Two Columns with Summary Card
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-stack wa-gap-2xl">
|
||||
<h2>Shopping Cart</h2>
|
||||
<div class="wa-grid wa-align-items-start wa-gap-2xl">
|
||||
<div class="wa-stack wa-gap-xl">
|
||||
<article class="wa-flank wa-gap-xl" style="--flank-size: 8rem">
|
||||
<div class="wa-frame wa-border-radius-m">
|
||||
<img
|
||||
src="https://images.unsplash.com/photo-1523381294911-8d3cead13475?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1OTAyOTl8MHwxfGFsbHx8fHx8fHx8fDE3MTg2NDIzNDd8&ixlib=rb-4.0.3&q=80&w=1080"
|
||||
alt=""
|
||||
/>
|
||||
</div>
|
||||
<div class="wa-flank:end wa-align-items-baseline">
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<h3 class="wa-heading-s">Classic Tee</h3>
|
||||
<span class="wa-caption-m">Sage Green</span>
|
||||
<span class="wa-caption-m">Large</span>
|
||||
<span>$20.00</span>
|
||||
</div>
|
||||
<wa-icon-button name="xmark" label="Remove" id="remove-1"></wa-icon-button>
|
||||
<wa-tooltip for="remove-1">Remove</wa-tooltip>
|
||||
</div>
|
||||
</article>
|
||||
<article class="wa-flank wa-gap-xl" style="--flank-size: 8rem">
|
||||
<div class="wa-frame wa-border-radius-m">
|
||||
<img
|
||||
src="https://images.unsplash.com/photo-1564859227552-81fde4a1df0b?q=80&w=2671&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt=""
|
||||
/>
|
||||
</div>
|
||||
<div class="wa-flank:end wa-align-items-baseline">
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<h3 class="wa-heading-s">RVCA Graphic</h3>
|
||||
<span class="wa-caption-m">White</span>
|
||||
<span class="wa-caption-m">Large</span>
|
||||
<span>$25.00</span>
|
||||
</div>
|
||||
<wa-icon-button name="xmark" label="Remove" id="remove-2"></wa-icon-button>
|
||||
<wa-tooltip for="remove-2">Remove</wa-tooltip>
|
||||
</div>
|
||||
</article>
|
||||
<article class="wa-flank wa-gap-xl" style="--flank-size: 8rem">
|
||||
<div class="wa-frame wa-border-radius-m">
|
||||
<img
|
||||
src="https://images.unsplash.com/photo-1503341733017-1901578f9f1e?q=80&w=2670&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt=""
|
||||
/>
|
||||
</div>
|
||||
<div class="wa-flank:end wa-align-items-baseline">
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<h3 class="wa-heading-s">Stay Wild Graphic</h3>
|
||||
<span class="wa-caption-m">Black</span>
|
||||
<span class="wa-caption-m">Large</span>
|
||||
<span>$18.00</span>
|
||||
</div>
|
||||
<wa-icon-button name="xmark" label="Remove" id="remove-3"></wa-icon-button>
|
||||
<wa-tooltip for="remove-3">Remove</wa-tooltip>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
<wa-card>
|
||||
<div slot="header">
|
||||
<h3 class="wa-heading-m">Order Summary</h3>
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-split">
|
||||
<span class="wa-caption-l">Subtotal</span>
|
||||
<strong>$63.00</strong>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-split">
|
||||
<span class="wa-caption-l">Shipping</span>
|
||||
<strong>$5.00</strong>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-split">
|
||||
<span class="wa-caption-l">Tax</span>
|
||||
<strong>$5.50</strong>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-split wa-body-l">
|
||||
<span>Total</span>
|
||||
<strong>$73.50</strong>
|
||||
</div>
|
||||
<wa-button variant="brand">Checkout</wa-button>
|
||||
</div>
|
||||
</wa-card>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
## Single Column
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-stack wa-gap-2xl" style="max-width: 60ch; margin: auto">
|
||||
<h2>Your Cart</h2>
|
||||
<wa-divider></wa-divider>
|
||||
<article class="wa-flank" style="--flank-size: 12rem">
|
||||
<div class="wa-frame wa-border-radius-m" style="aspect-ratio: 3 / 2">
|
||||
<img
|
||||
src="https://images.unsplash.com/photo-1594787317357-dcda50fd1d78?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1OTAyOTl8MHwxfGFsbHx8fHx8fHx8fDE3MTg2NDI4MDd8&ixlib=rb-4.0.3&q=80&w=1080"
|
||||
alt=""
|
||||
/>
|
||||
</div>
|
||||
<div class="wa-split:column wa-align-items-stretch wa-gap-xs">
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<span class="wa-split wa-gap-xs">
|
||||
<h3 class="wa-heading-m">Convertible</h3>
|
||||
<span>$32.00</span>
|
||||
</span>
|
||||
<wa-tag size="small" variant="neutral" appearance="filled" pill style="width: fit-content">Cherry Red</wa-tag>
|
||||
</div>
|
||||
<div class="wa-split">
|
||||
<wa-badge appearance="filled" variant="success">In Stock</wa-badge>
|
||||
<wa-button appearance="plain" size="small" variant="danger">
|
||||
<wa-icon slot="suffix" name="trash"></wa-icon>
|
||||
Remove
|
||||
</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
<wa-divider></wa-divider>
|
||||
<article class="wa-flank" style="--flank-size: 12rem">
|
||||
<div class="wa-frame wa-border-radius-m" style="aspect-ratio: 3 / 2">
|
||||
<img
|
||||
src="https://images.unsplash.com/photo-1597670250484-0e9aff7f8804?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1OTAyOTl8MHwxfGFsbHx8fHx8fHx8fDE3MTg2NDI4NTB8&ixlib=rb-4.0.3&q=80&w=1080"
|
||||
alt=""
|
||||
/>
|
||||
</div>
|
||||
<div class="wa-split:column wa-align-items-stretch wa-gap-xs">
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<span class="wa-split wa-gap-xs">
|
||||
<h3 class="wa-heading-m">Racers (3 Pack)</h3>
|
||||
<span>$80.00</span>
|
||||
</span>
|
||||
<wa-tag size="small" variant="neutral" appearance="filled" pill style="width: fit-content">Assorted Colors</wa-tag>
|
||||
</div>
|
||||
<div class="wa-split">
|
||||
<wa-badge appearance="filled" variant="success">In Stock</wa-badge>
|
||||
<wa-button appearance="plain" size="small" variant="danger">
|
||||
<wa-icon slot="suffix" name="trash"></wa-icon>
|
||||
Remove
|
||||
</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
<wa-divider></wa-divider>
|
||||
<article class="wa-flank" style="--flank-size: 12rem">
|
||||
<div class="wa-frame wa-border-radius-m" style="aspect-ratio: 3 / 2">
|
||||
<img
|
||||
src="https://images.unsplash.com/photo-1594787826350-19386fdb2363?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1OTAyOTl8MHwxfGFsbHx8fHx8fHx8fDE3MTg2NDI4ODV8&ixlib=rb-4.0.3&q=80&w=1080"
|
||||
alt=""
|
||||
/>
|
||||
</div>
|
||||
<div class="wa-split:column wa-align-items-stretch wa-gap-xs">
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<span class="wa-split wa-gap-xs">
|
||||
<h3 class="wa-heading-m">Volkswagen T2</h3>
|
||||
<span>$60.00</span>
|
||||
</span>
|
||||
<wa-tag size="small" variant="neutral" appearance="filled" pill style="width: fit-content">Red/White</wa-tag>
|
||||
</div>
|
||||
<div class="wa-split">
|
||||
<wa-badge appearance="filled" variant="warning">Low Stock</wa-badge>
|
||||
<wa-button appearance="plain" size="small" variant="danger">
|
||||
<wa-icon slot="suffix" name="trash"></wa-icon>
|
||||
Remove
|
||||
</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-split">
|
||||
<h3 class="wa-heading-m">Subtotal</h3>
|
||||
<span class="wa-body-l">$172.00</span>
|
||||
</div>
|
||||
<span class="wa-caption-m">Shipping and taxes calculated at checkout</span>
|
||||
<wa-button size="large" variant="brand">Checkout</wa-button>
|
||||
<div class="cluster">
|
||||
<span class="wa-caption-m">Not quite ready?</span>
|
||||
<wa-button appearance="plain" size="small" variant="brand">
|
||||
Continue Shopping
|
||||
<wa-icon name="arrow-right"></wa-icon>
|
||||
</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
## Drawer
|
||||
|
||||
```html {.example viewport}
|
||||
<wa-drawer label="Shopping Cart" with-header with-footer open>
|
||||
<div class="wa-stack">
|
||||
<article class="wa-flank" style="--flank-size: 6rem">
|
||||
<div class="wa-frame wa-border-radius-m">
|
||||
<img
|
||||
src="https://images.unsplash.com/photo-1704677982224-89cd6d039fa6?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1OTAyOTl8MHwxfGFsbHx8fHx8fHx8fDE3MTg2NDEwOTJ8&ixlib=rb-4.0.3&q=80&w=1080"
|
||||
alt=""
|
||||
/>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<div class="wa-split wa-gap-2xs">
|
||||
<strong>AJ1 Low</strong>
|
||||
<strong>$170.00</strong>
|
||||
</div>
|
||||
<span class="wa-caption-m">Multi-color</span>
|
||||
<div class="wa-split wa-gap-2xs">
|
||||
<span class="wa-body-s">Qty: 1</span>
|
||||
<wa-button appearance="plain" size="small">Remove</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
<wa-divider></wa-divider>
|
||||
<article class="wa-flank" style="--flank-size: 6rem">
|
||||
<div class="wa-frame wa-border-radius-m">
|
||||
<img
|
||||
src="https://images.unsplash.com/photo-1672908615254-71a0b373eaba?q=80&w=3560&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="(Photograph by Hamed darzi)"
|
||||
/>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<div class="wa-split wa-gap-2xs">
|
||||
<strong>The Trails</strong>
|
||||
<strong>$35.00</strong>
|
||||
</div>
|
||||
<span class="wa-caption-m">Twilight Blue</span>
|
||||
<div class="wa-split wa-gap-2xs">
|
||||
<span class="wa-body-s">Qty: 1</span>
|
||||
<wa-button appearance="plain" size="small">Remove</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
<wa-divider></wa-divider>
|
||||
<article class="wa-flank" style="--flank-size: 6rem">
|
||||
<div class="wa-frame wa-border-radius-m">
|
||||
<img
|
||||
src="https://images.unsplash.com/photo-1693443687750-611ad77f3aba?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
|
||||
alt="(Photograph by tian dayong)"
|
||||
/>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<div class="wa-split wa-gap-2xs">
|
||||
<strong>Outcast 2-pack</strong>
|
||||
<strong>$27.00</strong>
|
||||
</div>
|
||||
<span class="wa-caption-m">Black / White</span>
|
||||
<div class="wa-split wa-gap-2xs">
|
||||
<span class="wa-body-s">Qty: 1</span>
|
||||
<wa-button appearance="plain" size="small">Remove</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
<div slot="footer" class="wa-stack" style="width: 100%">
|
||||
<div class="wa-split">
|
||||
<strong>Subtotal</strong>
|
||||
<strong>$232.00</strong>
|
||||
</div>
|
||||
<span class="wa-caption-m">Shipping and taxes calculated at checkout.</span>
|
||||
<wa-button variant="brand">Checkout</wa-button>
|
||||
<wa-button appearance="plain" size="small" variant="brand">
|
||||
Continue Shopping
|
||||
<wa-icon name="arrow-right"></wa-icon>
|
||||
</wa-button>
|
||||
</div>
|
||||
</wa-drawer>
|
||||
```
|
||||
@@ -1,85 +0,0 @@
|
||||
---
|
||||
title: Store Navigation
|
||||
description: 'Help shoppers explore categories and find products with all of the links they need to navigate your store.'
|
||||
unlisted: true
|
||||
isPro: true
|
||||
---
|
||||
|
||||
## Popup Menu
|
||||
|
||||
```html{.example}
|
||||
<wa-dropdown>
|
||||
<wa-button slot="trigger" caret>Shop</wa-button>
|
||||
<wa-menu class="mm-grid">
|
||||
<div>
|
||||
<wa-menu-label>Shop by Department</wa-menu-label>
|
||||
<wa-menu-item value="apple">Mens</wa-menu-item>
|
||||
<wa-menu-item value="banana">Womens</wa-menu-item>
|
||||
<wa-menu-item value="orange">Kids</wa-menu-item>
|
||||
<wa-menu-item value="orange">
|
||||
Infants
|
||||
<wa-menu slot="submenu">
|
||||
<wa-menu-item value="uppercase">Newborns</wa-menu-item>
|
||||
<wa-menu-item value="lowercase">6 Months</wa-menu-item>
|
||||
<wa-menu-item value="capitalize">12 Months</wa-menu-item>
|
||||
</wa-menu>
|
||||
</wa-menu-item>
|
||||
<wa-menu-item value="orange">Big & Tall</wa-menu-item>
|
||||
</div>
|
||||
<div>
|
||||
<wa-menu-label>Shop by Category</wa-menu-label>
|
||||
<wa-menu-item value="apple">Shirts</wa-menu-item>
|
||||
<wa-menu-item value="banana">Pants</wa-menu-item>
|
||||
<wa-menu-item value="orange">Shoes</wa-menu-item>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<wa-menu-label>Just Arrived</wa-menu-label>
|
||||
|
||||
|
||||
<wa-menu-item>
|
||||
<a href="#">
|
||||
<img style="width: 100%; max-width: 200px;" src="https://images.unsplash.com/photo-1523381294911-8d3cead13475?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1OTAyOTl8MHwxfGFsbHx8fHx8fHx8fDE3MTg2NDIzNDd8&ixlib=rb-4.0.3&q=80&w=1080" />
|
||||
</a>
|
||||
|
||||
</wa-menu-item>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<wa-menu-item style="grid-column: 1/-1;">
|
||||
<div style="display: flex; justify-content: space-between; align-items: center;">
|
||||
<p style="margin:0;">footer with something cool in it</p>
|
||||
<wa-button variant="brand" size="small">Signup now</wa-button>
|
||||
</div>
|
||||
|
||||
</wa-menu-item>
|
||||
|
||||
</wa-menu>
|
||||
|
||||
|
||||
</wa-dropdown>
|
||||
<style>
|
||||
.mm-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, auto);
|
||||
gap: 1rem;
|
||||
|
||||
|
||||
|
||||
.card-overview small {
|
||||
color: var(--wa-color-text-quiet);
|
||||
}
|
||||
|
||||
.card-overview [slot='footer'] {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
</style>
|
||||
```
|
||||
@@ -1,10 +0,0 @@
|
||||
---
|
||||
title: Business
|
||||
description: TODO
|
||||
unlisted: true
|
||||
isPro: true
|
||||
---
|
||||
|
||||
TODO Page Description
|
||||
|
||||
## Examples
|
||||
@@ -1,10 +0,0 @@
|
||||
---
|
||||
title: Entertainment
|
||||
description: TODO
|
||||
unlisted: true
|
||||
isPro: true
|
||||
---
|
||||
|
||||
TODO Page Description
|
||||
|
||||
## Examples
|
||||
@@ -1,28 +0,0 @@
|
||||
---
|
||||
title: Patterns
|
||||
description: Patterns are reusable UI solutions to common design problems, ready to copy and paste into any project.
|
||||
layout: overview
|
||||
override:tags: []
|
||||
isPro: false
|
||||
---
|
||||
|
||||
<div class="max-line-length">
|
||||
{% markdown %}
|
||||
|
||||
## What's a Pattern?
|
||||
|
||||
A pattern is a code snippet composed of components, style utilities, and native HTML that you can copy and paste into any project that uses Web Awesome.
|
||||
It's a chunk of a user interface, rather than a single component, that allows you to implement UI solutions without designing something from scratch.
|
||||
|
||||
Patterns are designed according to proven usability practices so they're responsive, accessible, and cohesive out-of-the-box. Importantly, patterns don't handle business logic or functionality like form submissions, data processing, encryption, etc. It's up to you to implement the logic you need for your project.
|
||||
|
||||
Patterns are written as standard HTML, so you can use them just as you would any ol' HTML and customize them to fit your specific needs.
|
||||
|
||||
## Using Patterns
|
||||
|
||||
To use a pattern in your project, refer to each pattern's docs for a copyable code snippet. Paste the snippet wherever you'd like the pattern to appear in your project.
|
||||
|
||||
Because patterns use a combination of Web Awesome features, they work best when you have [native styles](/docs/native), [style utilities](/docs/utilities), and a [theme](/docs/themes) installed in addition to Web Awesome [components](/docs/components). Refer to the [Installation page](/docs/) to set up all of these features in your project.
|
||||
|
||||
{% endmarkdown %}
|
||||
</div>
|
||||
@@ -1,10 +0,0 @@
|
||||
---
|
||||
title: Membership
|
||||
description: TODO
|
||||
unlisted: true
|
||||
isPro: true
|
||||
---
|
||||
|
||||
TODO Page Description
|
||||
|
||||
## Examples
|
||||
@@ -1,161 +0,0 @@
|
||||
---
|
||||
title: News
|
||||
description: TODO
|
||||
unlisted: true
|
||||
isPro: true
|
||||
---
|
||||
|
||||
TODO Page Description
|
||||
|
||||
## Examples
|
||||
### Paywall
|
||||
|
||||
```html{.example}
|
||||
<div>
|
||||
<wa-dialog label="You've run out of free articles... loser" with-header class="dialog-header">
|
||||
<wa-button href="#">Register</wa-button>
|
||||
Already a subscriber? <a href="#">Login</a>
|
||||
</wa-dialog>
|
||||
|
||||
<wa-button>Open Paywall</wa-button>
|
||||
|
||||
<script>
|
||||
const dialog = document.querySelector('.dialog-header');
|
||||
const openButton = dialog.nextElementSibling;
|
||||
|
||||
openButton.addEventListener('click', () => dialog.open = true);
|
||||
</script>
|
||||
|
||||
</div>
|
||||
```
|
||||
## Related articles
|
||||
```html{.example}
|
||||
<div>
|
||||
<wa-card>
|
||||
<div class="card-body">
|
||||
<div style="border-bottom: 1px solid var(--wa-color-surface-border);margin-bottom: 1rem; padding-bottom: 1rem;">
|
||||
<img src="https://img.fortawesome.com/cfa83f3c/article-flower.jpg" alt="">
|
||||
<h2 style="margin-bottom: var(--wa-space-s);">Title</h2>
|
||||
<p style="margin-bottom: var(--wa-space-3xs);">Fusce lectus lorem, tincidunt non semper sit amet, laoreet vitae nunc. Morbi egestas, libero vitae elementum pretium, nibh ipsum faucibus lacus, id pretium urna ligula eu mauris. Aliquam erat volutpat. Mauris pharetra lacus rhoncus ligula bibendum, at consectetur erat auctor.</p>
|
||||
|
||||
<span style="font-size: small;font-weight: 600;font-style: italic;">sub-title</span>
|
||||
</div>
|
||||
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 1rem;">
|
||||
<div>
|
||||
<img src="https://img.fortawesome.com/cfa83f3c/article-flower.jpg" alt="">
|
||||
|
||||
<p style="margin-bottom: var(--wa-space-3xs);">Etiam et tincidunt est, sollicitudin fermentum ligula. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut suscipit libero at velit fringilla, ac pretium lorem rutrum. Cras luctus blandit semper.</p>
|
||||
|
||||
<span style="font-size: small;font-weight: 600;font-style: italic;">sub-title</span>
|
||||
</div>
|
||||
<div>
|
||||
<img src="https://img.fortawesome.com/cfa83f3c/article-flower.jpg" alt="">
|
||||
|
||||
<p style="margin-bottom: var(--wa-space-3xs);">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris in fringilla ante. In mattis sapien ac aliquet mattis.</p>
|
||||
|
||||
<span style="font-size: small;font-weight: 600;font-style: italic;">sub-title</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
</div>
|
||||
```
|
||||
|
||||
## Footer
|
||||
```html{.example}
|
||||
<div class="news-footer">
|
||||
<div class="container">
|
||||
<!-- <div class="logo"> <wa-icon name="user-secret"></wa-icon> <h1 style="--wa-space-xl: 0;">Daily Snoop</h1></div> -->
|
||||
<div class="nav">
|
||||
<section>
|
||||
<h4 style="--wa-space-xl: 0;">News</h4>
|
||||
<ul>
|
||||
<li><a href="#">U.S.</a></li>
|
||||
<li><a href="#">World</a></li>
|
||||
<li><a href="#">Politics</a></li>
|
||||
<li><a href="#">Education</a></li>
|
||||
<li><a href="#">Sports</a></li>
|
||||
<li><a href="#">Business</a></li>
|
||||
<li><a href="#">Tech</a></li>
|
||||
<li><a href="#">Science</a></li>
|
||||
</ul>
|
||||
</section>
|
||||
<section>
|
||||
<h4 style="--wa-space-xl: 0;">Arts</h4>
|
||||
<ul>
|
||||
<li><a href="#">Book Review</a></li>
|
||||
<li><a href="#">Dance</a></li>
|
||||
<li><a href="#">Movies</a></li>
|
||||
<li><a href="#">Pop Culture</a></li>
|
||||
</ul>
|
||||
</section>
|
||||
<section>
|
||||
<h4 style="--wa-space-xl: 0;">Subscriptions</h4>
|
||||
<ul class="list">
|
||||
<li><a href="#"><wa-icon fixed-width name="game-board-simple"></wa-icon> Crossword</a></li>
|
||||
<li><a href="#"><wa-icon fixed-width name="paper-plane"></wa-icon> Newsletters</a></li>
|
||||
<li><a href="#"><wa-icon fixed-width name="microphone-lines"></wa-icon> Podcast</a></li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
<div class="social">
|
||||
<a href="">
|
||||
<wa-icon family="brands" name="bluesky"></wa-icon>
|
||||
</a>
|
||||
<a href="">
|
||||
<wa-icon family="brands" name="instagram"></wa-icon>
|
||||
</a>
|
||||
<a href="">
|
||||
<wa-icon family="brands" name="facebook"></wa-icon>
|
||||
</a>
|
||||
<a href="">
|
||||
<wa-icon family="brands" name="mastodon"></wa-icon>
|
||||
</a>
|
||||
</div>
|
||||
<div>
|
||||
<img src="https://img.fortawesome.com/cfa83f3c/app_store.svg" alt="">
|
||||
<img src="https://img.fortawesome.com/cfa83f3c/google_play.svg" alt="">
|
||||
</div>
|
||||
<div class="legal">© 2024 All rights reserved.</div>
|
||||
</div>
|
||||
</div>
|
||||
<style>
|
||||
.news-footer {
|
||||
|
||||
.container {
|
||||
max-width: 960px;
|
||||
margin: auto;
|
||||
}
|
||||
.logo {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
.nav {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr 1fr;
|
||||
}
|
||||
|
||||
.nav ul {
|
||||
list-style-type: none;
|
||||
margin-left: 0;
|
||||
}
|
||||
.social a {
|
||||
text-decoration: none;
|
||||
display: inline-block;
|
||||
}
|
||||
.social a:not(:last-child) {
|
||||
margin-right: 1rem;
|
||||
}
|
||||
section ul li a {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
text-decoration: none;
|
||||
--wa-color-text-link: var(--wa-color-gray-20);
|
||||
|
||||
wa-icon {
|
||||
margin-right: .5rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
```
|
||||
@@ -1,10 +0,0 @@
|
||||
---
|
||||
title: Non-profit
|
||||
description: TODO
|
||||
unlisted: true
|
||||
isPro: true
|
||||
---
|
||||
|
||||
TODO Page Description
|
||||
|
||||
## Examples
|
||||
@@ -1,7 +0,0 @@
|
||||
.anchor-heading:has(+ wa-code-demo, + template + wa-code-demo) {
|
||||
font-size: var(--wa-font-size-l);
|
||||
}
|
||||
|
||||
wa-code-demo:has(+ .anchor-heading) {
|
||||
margin-block-end: var(--wa-space-3xl);
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"layout": "patterns.njk",
|
||||
"tags": ["patterns"],
|
||||
"wide": true,
|
||||
"isPro": true
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
---
|
||||
title: Portfolio
|
||||
description: TODO
|
||||
unlisted: true
|
||||
isPro: true
|
||||
---
|
||||
|
||||
TODO Page Description
|
||||
|
||||
## Examples
|
||||
@@ -1,10 +0,0 @@
|
||||
---
|
||||
title: Product Landing
|
||||
description: TODO
|
||||
unlisted: true
|
||||
isPro: true
|
||||
---
|
||||
|
||||
TODO Page Description
|
||||
|
||||
## Examples
|
||||
@@ -1,10 +0,0 @@
|
||||
---
|
||||
title: Active
|
||||
description: Energetic and tactile, always in motion.
|
||||
isPro: true
|
||||
tags: pro
|
||||
palette: rudimentary
|
||||
brand: green
|
||||
fonts:
|
||||
body: Inter
|
||||
---
|
||||
@@ -1,12 +0,0 @@
|
||||
---
|
||||
title: Brutalist
|
||||
description: Sharp, square, and unapologetically bold.
|
||||
isPro: true
|
||||
tags: pro
|
||||
palette: default
|
||||
brand: blue
|
||||
fonts:
|
||||
body: Space Grotesk
|
||||
heading: IBM Plex Sans Condensed
|
||||
code: Space Mono
|
||||
---
|
||||
@@ -1,10 +0,0 @@
|
||||
---
|
||||
title: Glossy
|
||||
description: Bustling with plenty of luster and shine.
|
||||
isPro: true
|
||||
tags: pro
|
||||
palette: elegant
|
||||
brand: indigo
|
||||
fonts:
|
||||
body: Figtree
|
||||
---
|
||||
@@ -1,90 +0,0 @@
|
||||
---
|
||||
title: Matter
|
||||
description: Digital design inspired by the real world.
|
||||
isPro: true
|
||||
tags: pro
|
||||
palette: mild
|
||||
brand: indigo
|
||||
fonts:
|
||||
body: 'Wix Madefor Text'
|
||||
code: Roboto Mono
|
||||
longform: Roboto Serif
|
||||
---
|
||||
|
||||
Set the page theme to "{{ title }}" from the top right to preview the following examples.
|
||||
|
||||
## Floating Labels
|
||||
|
||||
This theme implements "floating labels" for `wa-input`, `wa-textarea`, `wa-select`,
|
||||
which makes labels look like placeholders when the input is empty, does not have an actual placeholder, and is not focused.
|
||||
|
||||
```html {.example}
|
||||
<wa-input label="What is your name?"></wa-input>
|
||||
<br>
|
||||
<wa-input label="What is your name?" appearance="filled"></wa-input>
|
||||
```
|
||||
|
||||
## Ripple Effect
|
||||
|
||||
This theme implements a ripple effect for buttons, including native buttons.
|
||||
Click on the following buttons to observe it:
|
||||
|
||||
```html {.example}
|
||||
<wa-button variant="brand">Button</wa-button>
|
||||
<button class="wa-brand">Button</button>
|
||||
```
|
||||
|
||||
|
||||
|
||||
### Customization
|
||||
|
||||
You can use several properties to customize the ripple effect.
|
||||
|
||||
These properties can be set on any ancestor, including the root element:
|
||||
|
||||
| Property | Type | Default | Description |
|
||||
| --- | --- | --- | --- |
|
||||
| `--wa-ripple-start-radius` | `<length>` | `0.1em` | The starting radius of the ripple effect. |
|
||||
| `--wa-ripple-start-opacity` | `<number>` | `0.1` | The starting opacity of the ripple effect. |
|
||||
| `--wa-ripple-duration` | `<time>` | `calc(2 * var(--wa-transition-slow))` | The duration of the ripple effect transition. |
|
||||
|
||||
Any of these can be used to disable the ripple effect:
|
||||
|
||||
```css
|
||||
--wa-ripple-start-radius: 0em;
|
||||
```
|
||||
```css
|
||||
--wa-ripple-start-opacity: 0;
|
||||
```
|
||||
```css
|
||||
--wa-ripple-duration: 0s;
|
||||
```
|
||||
|
||||
These properties would only work on the button itself:
|
||||
|
||||
| Property | Type | Default | Description |
|
||||
| --- | --- | --- | --- |
|
||||
| `--wa-ripple-center-x` | `<percentage>` | `50%` | The x-coordinate of the ripple center point as a percentage of the button width. |
|
||||
| `--wa-ripple-center-y` | `<percentage>` | `50%` | The y-coordinate of the ripple center point as a percentage of the button height. |
|
||||
|
||||
### Ripple Center Point
|
||||
|
||||
By default the ripple effect starts from the center of the button.
|
||||
If you want it to start from the position the button was clicked, you can use this JS snippet:
|
||||
|
||||
```js
|
||||
document.addEventListener("mousedown", evt => {
|
||||
let target = evt.target;
|
||||
|
||||
if (!target.matches?.('wa-button, button, .wa-button')) {
|
||||
return;
|
||||
}
|
||||
|
||||
let rect = target.getBoundingClientRect();
|
||||
let x = (evt.clientX - rect.left) / rect.width;
|
||||
let y = (evt.clientY - rect.top) / rect.height;
|
||||
|
||||
target.style.setProperty("--mouse-local-x", x);
|
||||
target.style.setProperty("--mouse-local-y", y);
|
||||
});
|
||||
```
|
||||
@@ -1,11 +0,0 @@
|
||||
---
|
||||
title: Mellow
|
||||
description: Soft and soothing, like a lazy Sunday morning.
|
||||
isPro: true
|
||||
tags: pro
|
||||
palette: natural
|
||||
fonts:
|
||||
body: Mulish
|
||||
heading: Lora
|
||||
longform: Lora
|
||||
---
|
||||
@@ -1,12 +0,0 @@
|
||||
---
|
||||
title: Playful
|
||||
description: Cheerful and engaging, like a playground on screen.
|
||||
isPro: true
|
||||
tags: pro
|
||||
palette: rudimentary
|
||||
brand: purple
|
||||
fonts:
|
||||
body: Nunito
|
||||
heading: Fredoka
|
||||
code: Azeret Mono
|
||||
---
|
||||
@@ -1,12 +0,0 @@
|
||||
---
|
||||
title: Premium
|
||||
description: The ultimate in sophistication and style.
|
||||
isPro: true
|
||||
tags: pro
|
||||
palette: anodized
|
||||
brand: cyan
|
||||
fonts:
|
||||
body: DM Sans
|
||||
heading: Playfair Display
|
||||
longform: Playfair
|
||||
---
|
||||
@@ -1,10 +0,0 @@
|
||||
---
|
||||
title: Tailspin
|
||||
description: Like a bird in flight, guiding you from there to here.
|
||||
isPro: true
|
||||
tags: pro
|
||||
palette: vogue
|
||||
brand: indigo
|
||||
fonts:
|
||||
body: Inter
|
||||
---
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"//": "This file will get 'deep merged' with the webawesome package.json to preserve things like exportmaps and scripts.",
|
||||
"name": "@shoelace-style/webawesome-pro",
|
||||
"description": "The pro version of Web Awesome. Same Web Awesome you know and love, with extra features.",
|
||||
"license": "TODO",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/shoelace-style/webawesome-pro.git"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/shoelace-style/webawesome-pro/issues"
|
||||
}
|
||||
}
|
||||
@@ -1,84 +0,0 @@
|
||||
{
|
||||
"//": "This file is auto generated. Do not edit it manually. If something seems wrong here, check packages/webawesome/package.json or packages/webawesome-pro/package-merges.json",
|
||||
"type": "module",
|
||||
"name": "@shoelace-style/webawesome-pro",
|
||||
"description": "The pro version of Web Awesome. Same Web Awesome you know and love, with extra features.",
|
||||
"version": "3.0.0-alpha.12",
|
||||
"homepage": "https://webawesome.com/",
|
||||
"author": "Web Awesome",
|
||||
"license": "TODO",
|
||||
"customElements": "dist/custom-elements.json",
|
||||
"web-types": "./dist/web-types.json",
|
||||
"types": "dist/webawesome.d.ts",
|
||||
"jsdelivr": "./dist/webawesome.loader.js",
|
||||
"exports": {
|
||||
".": {
|
||||
"types": "./dist/webawesome.d.ts",
|
||||
"import": "./dist/webawesome.js"
|
||||
},
|
||||
"./dist/custom-elements.json": "./dist/custom-elements.json",
|
||||
"./dist/webawesome.js": "./dist/webawesome.js",
|
||||
"./dist/webawesome.loader.js": "./dist/webawesome.loader.js",
|
||||
"./dist/themes": "./dist/themes",
|
||||
"./dist/themes/*": "./dist/themes/*",
|
||||
"./dist/components": "./dist/components",
|
||||
"./dist/components/*": "./dist/components/*",
|
||||
"./dist/react": "./dist/react/index.js",
|
||||
"./dist/react/*": "./dist/react/*",
|
||||
"./dist/translations": "./dist/translations",
|
||||
"./dist/translations/*": "./dist/translations/*"
|
||||
},
|
||||
"files": [
|
||||
"dist",
|
||||
"cdn"
|
||||
],
|
||||
"keywords": [
|
||||
"web components",
|
||||
"custom elements",
|
||||
"components"
|
||||
],
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/shoelace-style/webawesome-pro.git"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/shoelace-style/webawesome-pro/issues"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "node scripts/build.js --develop",
|
||||
"start:alpha": "echo 'This command has been deprecated. Use: \"npm start\"\n'",
|
||||
"build": "node scripts/build.js",
|
||||
"build:serve": "npm run build && npx http-server _site -p 4000",
|
||||
"publish-alpha-cdn": "./publish-alpha-cdn.sh",
|
||||
"create": "plop --plopfile scripts/plop/plopfile.js",
|
||||
"test": "CSR_ONLY=\"true\" web-test-runner --group default",
|
||||
"test:component": "CSR_ONLY=\"true\" web-test-runner -- --watch --group",
|
||||
"test:contrast": "cd src/styles/color && node contrast.test.js",
|
||||
"test:watch": "web-test-runner --watch --group default",
|
||||
"prettier": "prettier --check --log-level=warn --ignore-path=\"../../.prettierignore\".",
|
||||
"prettier:fix": "prettier --write --log-level=warn --ignore-path=\"../../.prettierignore\" .",
|
||||
"spellcheck": "cspell \"**/*.{js,ts,json,html,css,md}\" --no-progress --config=\"../../cspell.json\"",
|
||||
"verify": "npm run prettier && npm run build && npm run test",
|
||||
"prepublishOnly": "npm run verify",
|
||||
"check-updates": "npx npm-check-updates --interactive --format group"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.17.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@ctrl/tinycolor": "^4.1.0",
|
||||
"@floating-ui/dom": "^1.6.13",
|
||||
"@shoelace-style/animations": "^1.2.0",
|
||||
"@shoelace-style/localize": "^3.2.1",
|
||||
"composed-offset-position": "^0.0.6",
|
||||
"lit": "^3.2.1",
|
||||
"qr-creator": "^1.0.0",
|
||||
"style-observer": "^0.0.7"
|
||||
},
|
||||
"devDependencies": {},
|
||||
"lint-staged": {
|
||||
"*.{ts,js}": [
|
||||
"prettier --write"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
// @ts-check
|
||||
import {
|
||||
bundleEverything,
|
||||
build
|
||||
} from "./utils/build.js"
|
||||
|
||||
import * as fs from "node:fs/promises"
|
||||
import * as path from "node:path"
|
||||
|
||||
import * as url from 'url';
|
||||
|
||||
;(async () => {
|
||||
const __dirname = url.fileURLToPath(new URL('.', import.meta.url));
|
||||
|
||||
await bundleEverything()
|
||||
await import("./sync.js")
|
||||
const packageRoot = path.resolve(path.join(__dirname, ".."))
|
||||
await fs.cp(path.join(packageRoot, "package.json"), path.join(process.env.ROOT_DIR, "package.json"))
|
||||
await fs.cp(path.join(packageRoot, "tsconfig.prod.json"), path.join(process.env.ROOT_DIR, "tsconfig.prod.json"))
|
||||
await build()
|
||||
|
||||
// Copy dist, dist-cdn, and _site to the root of the package.
|
||||
const bundleRoot = process.env.ROOT_DIR || "."
|
||||
|
||||
await Promise.allSettled(
|
||||
["dist", "dist-cdn", "_site"].map((str) => {
|
||||
const src = path.join(bundleRoot, str)
|
||||
const dest = path.join(packageRoot, str)
|
||||
console.log("Copying " + src + " to " + dest)
|
||||
return fs.cp(src, dest, { recursive: true })
|
||||
})
|
||||
)
|
||||
})()
|
||||
@@ -1,39 +0,0 @@
|
||||
import * as path from "node:path";
|
||||
import * as os from "node:os";
|
||||
import * as fs from "node:fs/promises";
|
||||
import Eleventy from "@11ty/eleventy"
|
||||
import { getRootDir } from "../src/utilities/file";
|
||||
|
||||
async function buildDocs () {
|
||||
// This looks weird, but by writing to a temp directory first, and then deleting + copying, we reduce the amount of "downtime"
|
||||
const tmpPath = path.join(os.tmpdir(), "site")
|
||||
const outputPath = path.join(getRootDir(), "_site")
|
||||
|
||||
// We could *probably* do incremental builds, but may need to diff before / after.
|
||||
// eleventy.setIncrementalBuild(true)
|
||||
|
||||
const eleventy = new Eleventy(getRootDir(), tmpPath, {
|
||||
quietMode: true,
|
||||
configPath: path.join(getRootDir(), ".eleventy.js")
|
||||
});
|
||||
|
||||
// Write to a temp directory
|
||||
console.log("Writing 11ty docs...")
|
||||
|
||||
await eleventy.write()
|
||||
|
||||
// Delete the current site
|
||||
console.log("Deleting 11ty build...")
|
||||
await fs.rm(outputPath, { force: true, recursive: true })
|
||||
|
||||
// Copy to the current site
|
||||
console.log("Copying new 11ty build...")
|
||||
|
||||
await fs.cp(tmpPath, outputPath, { force: true, recursive: true })
|
||||
await fs.rm(tmpPath, { force: true, recursive: true })
|
||||
|
||||
console.log("11ty build complete!")
|
||||
}
|
||||
|
||||
await buildDocs()
|
||||
|
||||
@@ -1,51 +0,0 @@
|
||||
import * as fs from "node:fs"
|
||||
import * as path from "node:path"
|
||||
import * as url from 'url';
|
||||
|
||||
const __dirname = url.fileURLToPath(new URL('.', import.meta.url));
|
||||
const obj = {
|
||||
"//": "This file is auto generated. Do not edit it manually. If something seems wrong here, check packages/webawesome/package.json or packages/webawesome-pro/package-merges.json",
|
||||
"type": "module"
|
||||
}
|
||||
|
||||
const webawesomePackageJson = fs.readFileSync(path.resolve(__dirname, "..", "..", "webawesome", "package.json"))
|
||||
const webawesomeJson = JSON.parse(webawesomePackageJson)
|
||||
|
||||
const overridesPackageJson = fs.readFileSync(path.resolve(__dirname, "..", "package-merges.json"))
|
||||
const overridesJson = JSON.parse(overridesPackageJson)
|
||||
// Dont use the merged top level comment.
|
||||
delete overridesJson["//"]
|
||||
|
||||
function deepMerge (target, merge) {
|
||||
const obj = structuredClone(target)
|
||||
mergeObject(obj, merge)
|
||||
return obj
|
||||
}
|
||||
|
||||
function mergeObject (target, merge) {
|
||||
Object.keys(merge).forEach((key) => {
|
||||
if (target[key] === undefined) {
|
||||
target[key] = merge[key]
|
||||
return
|
||||
}
|
||||
|
||||
if (Array.isArray(target[key]) && Array.isArray(merge[key])) {
|
||||
target[key] = [...new Set(target.concat(merge[key]))]
|
||||
return
|
||||
}
|
||||
|
||||
if (target[key] instanceof Object && merge[key] instanceof Object) {
|
||||
mergeObject(target[key], merge[key])
|
||||
return
|
||||
} else {
|
||||
target[key] = merge[key]
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
fs.writeFileSync(path.resolve(__dirname, "..", "package.json"), JSON.stringify({
|
||||
...obj,
|
||||
...deepMerge(webawesomeJson, overridesJson)
|
||||
}, null, 2))
|
||||
|
||||
|
||||
@@ -1,60 +0,0 @@
|
||||
// @ts-check
|
||||
import {runScript} from "../../../webawesome/scripts/utils.js"
|
||||
import * as url from 'url';
|
||||
import * as path from 'node:path';
|
||||
import * as fs from "node:fs/promises"
|
||||
import copy from "recursive-copy"
|
||||
|
||||
const __dirname = url.fileURLToPath(new URL('.', import.meta.url));
|
||||
const ROOT_DIR = path.resolve(__dirname, "..", "..")
|
||||
|
||||
const BUNDLED_DIR = path.resolve(path.join(ROOT_DIR, "_bundle_"))
|
||||
const PAGES_DIR = path.resolve(path.join(BUNDLED_DIR, "pages"))
|
||||
|
||||
const FREE_DIR = path.resolve(path.join(ROOT_DIR, "..", "webawesome"))
|
||||
const FREE_SRC_DIR = path.join(FREE_DIR, "src")
|
||||
const FREE_DOCS_DIR = path.join(FREE_DIR, "docs")
|
||||
|
||||
const PRO_DOCS_DIR = path.resolve(path.join(ROOT_DIR, "docs"))
|
||||
const PRO_SRC_DIR = path.resolve(path.join(ROOT_DIR, "src"))
|
||||
|
||||
const DIST_DIR = path.resolve(path.join(ROOT_DIR, "dist"))
|
||||
const DIST_CDN_DIR = path.resolve(path.join(ROOT_DIR, "dist-cdn"))
|
||||
|
||||
// Set env vars for the build.js process.
|
||||
process.env.ROOT_DIR = BUNDLED_DIR
|
||||
process.env.DIST_DIR = path.join(ROOT_DIR, "dist")
|
||||
process.env.CDN_DIR = path.join(ROOT_DIR, "dist-cdn")
|
||||
process.env.DOCS_DIR = path.join(BUNDLED_DIR, "pages")
|
||||
// process.env.SKIP_ELEVENTY = "true" // We're going to run our own.
|
||||
|
||||
/**
|
||||
* Copies all files into 1 giant "_bundle_" directory to then run ESBuild + 11ty on top of.
|
||||
*/
|
||||
export async function bundleEverything () {
|
||||
await fs.rm(BUNDLED_DIR, { recursive: true, force: true })
|
||||
await fs.mkdir(BUNDLED_DIR)
|
||||
|
||||
// Bundle src files to run esbuild on them.
|
||||
await fs.cp(FREE_SRC_DIR, path.join(BUNDLED_DIR, "src"), { recursive: true })
|
||||
await fs.cp(PRO_SRC_DIR, path.join(BUNDLED_DIR, "src"), { recursive: true })
|
||||
|
||||
// Bundle docs directories to run 11ty on them.
|
||||
// Copy "docs" to "pages" so that 11ty has full context.
|
||||
await fs.cp(FREE_DOCS_DIR, PAGES_DIR, { recursive: true })
|
||||
await fs.cp(PRO_DOCS_DIR, PAGES_DIR, { recursive: true, filter: () => true })
|
||||
}
|
||||
|
||||
export async function buildDocs () {
|
||||
// For some reason 11ty has to be run separately. If its run "in process", it caches incorrectly and breaks.
|
||||
await runScript(path.join(ROOT_DIR, "scripts", "docs.js"), [])
|
||||
}
|
||||
|
||||
export async function copyCdnBuild () {
|
||||
// These need to be copied separately into "_site" because 11ty doesn't copy them over.
|
||||
await copy(DIST_CDN_DIR, path.join(ROOT_DIR, "_site", "dist"))
|
||||
}
|
||||
|
||||
export async function build () {
|
||||
await import("../../../webawesome/scripts/build.js")
|
||||
}
|
||||
@@ -1,250 +0,0 @@
|
||||
:host {
|
||||
display: block;
|
||||
background-color: var(--wa-color-surface-default);
|
||||
box-sizing: border-box;
|
||||
height: 100%;
|
||||
--menu-width: auto;
|
||||
--main-width: 1fr;
|
||||
--aside-width: auto;
|
||||
--banner-height: 0px;
|
||||
--header-height: 0px;
|
||||
--subheader-height: 0px;
|
||||
--scroll-margin-top: calc(var(--header-height, 0px) + var(--subheader-height, 0px) + 0.5em);
|
||||
}
|
||||
|
||||
slot[name]:not([name='skip-to-content'], [name='navigation-toggle'])::slotted(*) {
|
||||
display: flex;
|
||||
background-color: var(--wa-color-surface-default);
|
||||
}
|
||||
|
||||
::slotted([slot='banner']) {
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: var(--wa-space-m);
|
||||
padding: var(--wa-space-xs) var(--wa-space-m);
|
||||
}
|
||||
|
||||
::slotted([slot='header']) {
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
flex-wrap: wrap;
|
||||
gap: var(--wa-space-m);
|
||||
padding: var(--wa-space-m);
|
||||
flex: auto;
|
||||
}
|
||||
|
||||
::slotted([slot='subheader']) {
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
flex-wrap: wrap;
|
||||
gap: var(--wa-space-m);
|
||||
padding: var(--wa-space-xs) var(--wa-space-m);
|
||||
}
|
||||
|
||||
::slotted([slot*='navigation']),
|
||||
::slotted([slot='menu']),
|
||||
::slotted([slot='aside']) {
|
||||
flex-direction: column;
|
||||
gap: var(--wa-space-m);
|
||||
padding: var(--wa-space-m);
|
||||
}
|
||||
|
||||
::slotted([slot='main-header']) {
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
flex-wrap: wrap;
|
||||
gap: var(--wa-space-m);
|
||||
padding: var(--wa-space-m) var(--wa-space-3xl);
|
||||
}
|
||||
|
||||
slot:not([name]) {
|
||||
/* See #331 */
|
||||
&::slotted(main),
|
||||
&::slotted(section) {
|
||||
padding: var(--wa-space-3xl);
|
||||
}
|
||||
}
|
||||
|
||||
::slotted([slot='main-footer']),
|
||||
::slotted([slot='footer']) {
|
||||
align-items: start;
|
||||
justify-content: space-between;
|
||||
flex-wrap: wrap;
|
||||
gap: var(--wa-space-m);
|
||||
padding: var(--wa-space-3xl);
|
||||
}
|
||||
|
||||
:host([disable-sticky~='banner']) :is([part~='header'], [part~='subheader']) {
|
||||
--banner-height: 0px !important;
|
||||
}
|
||||
:host([disable-sticky~='header']) [part~='subheader'] {
|
||||
--header-height: 0px !important;
|
||||
}
|
||||
|
||||
/* Nothing else depends on subheader-height. */
|
||||
:host([disable-sticky~='subheader']) {
|
||||
}
|
||||
:host([disable-sticky~='aside']) [part~='aside'],
|
||||
:host([disable-sticky~='menu']) [part~='menu'] {
|
||||
height: unset;
|
||||
max-height: unset;
|
||||
}
|
||||
|
||||
:host([disable-sticky~='banner']) [part~='banner'],
|
||||
:host([disable-sticky~='header']) [part~='header'],
|
||||
:host([disable-sticky~='subheader']) [part~='subheader'],
|
||||
:host([disable-sticky~='aside']) [part~='aside'],
|
||||
:host([disable-sticky~='menu']) [part~='menu'] {
|
||||
position: static;
|
||||
overflow: unset;
|
||||
z-index: unset;
|
||||
}
|
||||
|
||||
:host([disable-sticky~='aside']) [part~='aside'],
|
||||
:host([disable-sticky~='menu']) [part~='menu'] {
|
||||
height: auto;
|
||||
max-height: auto;
|
||||
}
|
||||
|
||||
[part~='base'] {
|
||||
min-height: 100%;
|
||||
display: grid;
|
||||
grid-template-rows: repeat(3, minmax(0, auto)) minmax(0, 1fr) minmax(0, auto);
|
||||
grid-template-columns: 100%;
|
||||
width: 100%;
|
||||
grid-template-areas:
|
||||
'banner'
|
||||
'header'
|
||||
'subheader'
|
||||
'body'
|
||||
'footer';
|
||||
}
|
||||
|
||||
/* Grid areas */
|
||||
[part~='banner'] {
|
||||
grid-area: banner;
|
||||
}
|
||||
[part~='header'] {
|
||||
grid-area: header;
|
||||
}
|
||||
[part~='subheader'] {
|
||||
grid-area: subheader;
|
||||
}
|
||||
[part~='menu'] {
|
||||
grid-area: menu;
|
||||
}
|
||||
[part~='body'] {
|
||||
grid-area: body;
|
||||
}
|
||||
[part~='main'] {
|
||||
grid-area: main;
|
||||
}
|
||||
[part~='aside'] {
|
||||
grid-area: aside;
|
||||
}
|
||||
[part~='footer'] {
|
||||
grid-area: footer;
|
||||
}
|
||||
|
||||
/* Z-indexes */
|
||||
[part~='banner'],
|
||||
[part~='header'],
|
||||
[part~='subheader'] {
|
||||
position: sticky;
|
||||
z-index: 5;
|
||||
}
|
||||
[part~='banner'] {
|
||||
top: 0px;
|
||||
}
|
||||
[part~='header'] {
|
||||
top: var(--banner-height);
|
||||
|
||||
/** Make the header flex so that you don't unexpectedly have the default toggle button appearing above a slotted div because block elements are fun. */
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
[part~='subheader'] {
|
||||
top: calc(var(--header-height) + var(--banner-height));
|
||||
}
|
||||
[part~='body'] {
|
||||
display: grid;
|
||||
height: 100%;
|
||||
align-items: flex-start;
|
||||
grid-template-columns: minmax(0, var(--menu-width)) minmax(0, var(--main-width)) minmax(0, var(--aside-width));
|
||||
grid-template-rows: minmax(0, 1fr);
|
||||
grid-template-areas: 'menu main aside';
|
||||
}
|
||||
[part~='main'] {
|
||||
display: grid;
|
||||
min-height: 100%;
|
||||
grid-template-columns: minmax(0, 1fr);
|
||||
grid-template-rows: minmax(0, auto) minmax(0, 1fr) minmax(0, auto);
|
||||
grid-template-areas:
|
||||
'main-header'
|
||||
'main-content'
|
||||
'main-footer';
|
||||
}
|
||||
[part~='main-header'] {
|
||||
grid-area: main-header;
|
||||
}
|
||||
[part~='main-content'] {
|
||||
grid-area: main-content;
|
||||
}
|
||||
[part~='main-footer'] {
|
||||
grid-area: main-footer;
|
||||
}
|
||||
|
||||
.skip-to-content {
|
||||
position: absolute;
|
||||
top: var(--wa-space-m);
|
||||
left: var(--wa-space-m);
|
||||
z-index: 6;
|
||||
border-radius: var(--wa-corners-1x);
|
||||
background-color: var(--wa-color-surface-default);
|
||||
color: var(--wa-color-text-link);
|
||||
text-decoration: none;
|
||||
padding: var(--wa-space-s) var(--wa-space-m);
|
||||
box-shadow: var(--wa-shadow-l);
|
||||
outline: var(--wa-focus-ring);
|
||||
outline-offset: var(--wa-focus-ring-offset);
|
||||
}
|
||||
|
||||
[part~='menu'],
|
||||
[part~='aside'] {
|
||||
position: sticky;
|
||||
top: calc(var(--banner-height) + var(--header-height) + var(--subheader-height));
|
||||
z-index: 4;
|
||||
height: calc(100dvh - var(--header-height) - var(--banner-height) - var(--subheader-height));
|
||||
max-height: calc(100dvh - var(--header-height) - var(--banner-height) - var(--subheader-height));
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
[part~='navigation'] {
|
||||
height: 100%;
|
||||
display: grid;
|
||||
grid-template-columns: minmax(0, 1fr);
|
||||
grid-template-rows: minmax(0, auto) minmax(0, 1fr) minmax(0, auto);
|
||||
}
|
||||
|
||||
[part~='drawer']::part(dialog) {
|
||||
background-color: var(--wa-color-surface-default);
|
||||
}
|
||||
|
||||
/* Set these on the slot because we don't always control the navigation-toggle since that may be slotted. */
|
||||
slot[name~='navigation-toggle'],
|
||||
:host([disable-navigation-toggle]) slot[name~='navigation-toggle'] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Sometimes the media query in the viewport is stubborn in iframes. This is an extra check to make it behave properly. */
|
||||
:host(:not([disable-navigation-toggle])[view='mobile']) slot[name~='navigation-toggle'] {
|
||||
display: contents;
|
||||
}
|
||||
|
||||
[part~='navigation-toggle'] {
|
||||
/* Use only a margin-inline-start because the slotted header is expected to have default padding
|
||||
so it looks really awkward if this sets a margin-inline-end and the slotted header has a padding-inline-start. */
|
||||
margin-inline-start: var(--wa-space-m);
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
export default (breakpoint: string = '768px') => `
|
||||
@media screen and (width < ${breakpoint}) {
|
||||
[part~='navigation'] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
:host(:not([disable-navigation-toggle])) slot[name~='navigation-toggle'] {
|
||||
display: contents;
|
||||
}
|
||||
}
|
||||
`;
|
||||
@@ -1,15 +0,0 @@
|
||||
import { expect } from '@open-wc/testing';
|
||||
import { html } from 'lit';
|
||||
import { fixtures } from '../../internal/test/fixture.js';
|
||||
|
||||
describe('<wa-page>', () => {
|
||||
for (const fixture of fixtures) {
|
||||
describe(`with "${fixture.type}" rendering`, () => {
|
||||
it('should render a component', async () => {
|
||||
const el = await fixture(html` <wa-page></wa-page> `);
|
||||
|
||||
expect(el).to.exist;
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -1,378 +0,0 @@
|
||||
import { html, isServer } from 'lit';
|
||||
import { customElement, property, query } from 'lit/decorators.js';
|
||||
import { live } from 'lit/directives/live.js';
|
||||
import { unsafeHTML } from 'lit/directives/unsafe-html.js';
|
||||
import { toLength, toPx } from '../../internal/css-values.js';
|
||||
import WebAwesomeElement from '../../internal/webawesome-element.js';
|
||||
|
||||
import visuallyHidden from '../../styles/utilities/visually-hidden.css';
|
||||
import styles from './page.css';
|
||||
import mobileStyles from './page.mobile.styles.js';
|
||||
|
||||
import '../button/button.js';
|
||||
import '../drawer/drawer.js';
|
||||
import '../icon/icon.js';
|
||||
|
||||
import type { PropertyValues } from 'lit';
|
||||
import type WaDrawer from '../drawer/drawer.js';
|
||||
|
||||
if (typeof ResizeObserver === 'undefined') {
|
||||
globalThis.ResizeObserver = class {
|
||||
// eslint-disable-next-line
|
||||
constructor(..._args: ConstructorParameters<typeof ResizeObserver>) {}
|
||||
// eslint-disable-next-line
|
||||
observe(..._args: Parameters<ResizeObserver['observe']>) {}
|
||||
// eslint-disable-next-line
|
||||
unobserve(..._args: Parameters<ResizeObserver['unobserve']>) {}
|
||||
// eslint-disable-next-line
|
||||
disconnect(..._args: Parameters<ResizeObserver['disconnect']>) {}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @summary Pages offer an easy way to scaffold entire page layouts using minimal markup.
|
||||
* @documentation https://backers.webawesome.com/docs/components/page
|
||||
* @status experimental
|
||||
* @since 3.0
|
||||
*
|
||||
* @slot - The page's main content.
|
||||
* @slot banner - The banner that gets display above the header. The banner will not be shown if no content is provided.
|
||||
* @slot header - The header to display at the top of the page. If a banner is present, the header will appear below the banner. The header will not be shown if there is no content.
|
||||
* @slot subheader - A subheader to display below the `header`. This is a good place to put things like breadcrumbs.
|
||||
* @slot menu - The left side of the page. If you slot an element in here, you will override the default `navigation` slot and will be handling navigation on your own. This also will not disable the fallback behavior of the navigation button. This section "sticks" to the top as the page scrolls.
|
||||
* @slot navigation-header - The header for a navigation area. On mobile this will be the header for `<wa-drawer>`.
|
||||
* @slot navigation - The main content to display in the navigation area. This is displayed on the left side of the page, if `menu` is not used. This section "sticks" to the top as the page scrolls.
|
||||
* @slot navigation-footer - The footer for a navigation area. On mobile this will be the footer for `<wa-drawer>`.
|
||||
* @slot navigation-toggle - Use this slot to slot in your own button + icon for toggling the navigation drawer. By default it is a `<wa-button>` + a 3 bars `<wa-icon>`
|
||||
* @slot navigation-toggle-icon - Use this to slot in your own icon for toggling the navigation drawer. By default it is 3 bars `<wa-icon>`.
|
||||
* @slot main-header - Header to display inline above the main content.
|
||||
* @slot main-footer - Footer to display inline below the main content.
|
||||
* @slot aside - Content to be shown on the right side of the page. Typically contains a table of contents, ads, etc. This section "sticks" to the top as the page scrolls.
|
||||
* @slot skip-to-content - The "skip to content" slot. You can override this If you would like to override the `Skip to content` button and add additional "Skip to X", they can be inserted here.
|
||||
* @slot footer - The content to display in the footer. This is always displayed underneath the viewport so will always make the page "scrollable".
|
||||
*
|
||||
* @csspart base - The component's base wrapper.
|
||||
* @csspart banner - The banner to show above header.
|
||||
* @csspart header - The header, usually for top level navigation / branding.
|
||||
* @csspart subheader - Shown below the header, usually intended for things like breadcrumbs and other page level navigation.
|
||||
* @csspart body - The wrapper around menu, main, and aside.
|
||||
* @csspart menu - The left hand side of the page. Generally intended for navigation.
|
||||
* @csspart navigation - The `<nav>` that wraps the navigation slots on desktop viewports.
|
||||
* @csspart navigation-header - The header for a navigation area. On mobile this will be the header for `<wa-drawer>`.
|
||||
* @csspart navigation-footer - The footer for a navigation area. On mobile this will be the footer for `<wa-drawer>`.
|
||||
* @csspart navigation-toggle - The default `<wa-button>` that will toggle the `<wa-drawer>` for mobile viewports.
|
||||
* @csspart navigation-toggle-icon - The default `<wa-icon>` displayed inside of the navigation-toggle button.
|
||||
* @csspart main-header - The header above main content.
|
||||
* @csspart main-content - The main content.
|
||||
* @csspart main-footer - The footer below main content.
|
||||
* @csspart aside - The right hand side of the page. Used for things like table of contents, ads, etc.
|
||||
* @csspart skip-links - Wrapper around skip-link
|
||||
* @csspart skip-link - The "skip to main content" link
|
||||
* @csspart footer - The footer of the page. This is always below the initial viewport size.
|
||||
* @csspart dialog-wrapper - A wrapper around elements such as dialogs or other modal-like elements.
|
||||
*
|
||||
* @cssproperty [--menu-width=auto] - The width of the page's "menu" section.
|
||||
* @cssproperty [--main-width=1fr] - The width of the page's "main" section.
|
||||
* @cssproperty [--aside-width=auto] - The wide of the page's "aside" section.
|
||||
* @cssproperty [--banner-height=0px] - The height of the banner. This gets calculated when the page initializes. If the height is known, you can set it here to prevent shifting when the page loads.
|
||||
* @cssproperty [--header-height=0px] - The height of the header. This gets calculated when the page initializes. If the height is known, you can set it here to prevent shifting when the page loads.
|
||||
* @cssproperty [--subheader-height=0px] - The height of the subheader. This gets calculated when the page initializes. If the height is known, you can set it here to prevent shifting when the page loads.
|
||||
*/
|
||||
@customElement('wa-page')
|
||||
export default class WaPage extends WebAwesomeElement {
|
||||
static shadowStyle = [visuallyHidden, styles];
|
||||
|
||||
private headerResizeObserver = this.slotResizeObserver('header');
|
||||
private subheaderResizeObserver = this.slotResizeObserver('subheader');
|
||||
private bannerResizeObserver = this.slotResizeObserver('banner');
|
||||
private footerResizeObserver = this.slotResizeObserver('footer');
|
||||
|
||||
private slotResizeObserver(slot: string) {
|
||||
return new ResizeObserver(entries => {
|
||||
for (const entry of entries) {
|
||||
if (entry.contentBoxSize) {
|
||||
const contentBoxSize = entry.borderBoxSize[0];
|
||||
this.style.setProperty(`--${slot}-height`, `${contentBoxSize.blockSize}px`);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private handleNavigationToggle = (e: Event) => {
|
||||
// Don't toggle the nav when we're in desktop mode
|
||||
if (this.view === 'desktop') {
|
||||
// Just in case, try to hide the navigation.
|
||||
this.hideNavigation();
|
||||
return;
|
||||
}
|
||||
|
||||
const path = e.composedPath();
|
||||
|
||||
const navigationToggleSlot = this.navigationToggleSlot;
|
||||
|
||||
if (
|
||||
path.find((el: Element) => {
|
||||
return (
|
||||
el.hasAttribute?.('data-toggle-nav') ||
|
||||
el.assignedSlot === navigationToggleSlot ||
|
||||
el === navigationToggleSlot
|
||||
);
|
||||
})
|
||||
) {
|
||||
e.preventDefault();
|
||||
this.toggleNavigation();
|
||||
}
|
||||
};
|
||||
|
||||
@query("[part~='header']") header: HTMLElement;
|
||||
@query("[part~='subheader']") subheader: HTMLElement;
|
||||
@query("[part~='footer']") footer: HTMLElement;
|
||||
@query("[part~='banner']") banner: HTMLElement;
|
||||
@query("[part~='drawer']") navigationDrawer: WaDrawer;
|
||||
@query("slot[name~='navigation-toggle']") navigationToggleSlot: HTMLSlotElement;
|
||||
|
||||
/**
|
||||
* The view is a reflection of the "mobileBreakpoint", when the page is larger than the `mobile-breakpoint` (768px by
|
||||
* default), it is considered to be a "desktop" view. The view is merely a way to distinguish when to show/hide the
|
||||
* navigation. You can use additional media queries to make other adjustments to content as necessary.
|
||||
* The default is "desktop" because the "mobile navigation drawer" isn't accessible via SSR due to drawer requiring JS.
|
||||
*/
|
||||
@property({ attribute: 'view', reflect: true }) view: 'mobile' | 'desktop' = 'desktop';
|
||||
|
||||
/**
|
||||
* Whether or not the navigation drawer is open. Note, the navigation drawer is only "open" on mobile views.
|
||||
*/
|
||||
@property({ attribute: 'nav-open', reflect: true, type: Boolean }) navOpen = false;
|
||||
|
||||
/**
|
||||
* At what page width to hide the "navigation" slot and collapse into a hamburger button.
|
||||
* Accepts both numbers (interpreted as px) and CSS lengths (e.g. `50em`), which are resolved based on the root element.
|
||||
*/
|
||||
@property({ attribute: 'mobile-breakpoint', type: String })
|
||||
mobileBreakpoint = '768px';
|
||||
|
||||
/**
|
||||
* Where to place the navigation when in the mobile viewport.
|
||||
*/
|
||||
@property({ attribute: 'navigation-placement', reflect: true }) navigationPlacement: 'start' | 'end' = 'start';
|
||||
|
||||
/**
|
||||
* Determines whether or not to hide the default hamburger button.
|
||||
* This will automatically flip to "true" if you add an element with `data-toggle-nav` anywhere in the element light DOM.
|
||||
* Generally this will be set for you and you don't need to do anything, unless you're using SSR, in which case you should set this manually for initial page loads.
|
||||
*/
|
||||
@property({ attribute: 'disable-navigation-toggle', reflect: true, type: Boolean }) disableNavigationToggle: boolean =
|
||||
false;
|
||||
|
||||
pageResizeObserver = new ResizeObserver(entries => {
|
||||
for (const entry of entries) {
|
||||
if (entry.contentBoxSize) {
|
||||
const contentBoxSize = entry.borderBoxSize[0];
|
||||
const pageWidth = contentBoxSize.inlineSize;
|
||||
|
||||
const oldView = this.view;
|
||||
|
||||
if (pageWidth >= toPx(this.mobileBreakpoint)) {
|
||||
this.view = 'desktop';
|
||||
} else {
|
||||
this.view = 'mobile';
|
||||
}
|
||||
|
||||
this.requestUpdate('view', oldView);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
protected update(changedProperties: PropertyValues<this>): void {
|
||||
if (changedProperties.has('view')) {
|
||||
this.hideNavigation();
|
||||
}
|
||||
super.update(changedProperties);
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
if (!isServer) {
|
||||
this.addEventListener('click', this.handleNavigationToggle);
|
||||
}
|
||||
}
|
||||
|
||||
connectedCallback() {
|
||||
super.connectedCallback();
|
||||
|
||||
this.pageResizeObserver.observe(this);
|
||||
|
||||
const navQuery = ":not([slot='toggle-navigation']) [data-toggle-nav]";
|
||||
|
||||
// check once on initial connect
|
||||
// eslint-disable-next-line
|
||||
this.disableNavigationToggle = Boolean(this.querySelector(navQuery));
|
||||
|
||||
setTimeout(() => {
|
||||
this.headerResizeObserver.observe(this.header);
|
||||
this.subheaderResizeObserver.observe(this.subheader);
|
||||
this.bannerResizeObserver.observe(this.banner);
|
||||
this.footerResizeObserver.observe(this.footer);
|
||||
|
||||
// Check again when the element updates
|
||||
// eslint-disable-next-line
|
||||
this.disableNavigationToggle = Boolean(this.querySelector(navQuery));
|
||||
});
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
// If the user provides a #main-content id, it should be present in the default slot and the "skip to
|
||||
// content" link will point to it. If not, we'll prepend an empty element for them so things just work.
|
||||
if (!document.getElementById('main-content')) {
|
||||
const div = document.createElement('div');
|
||||
div.id = 'main-content';
|
||||
div.slot = 'skip-to-content-target';
|
||||
this.prepend(div);
|
||||
}
|
||||
}
|
||||
|
||||
disconnectedCallback() {
|
||||
super.disconnectedCallback();
|
||||
this.pageResizeObserver.unobserve(this);
|
||||
this.headerResizeObserver.unobserve(this.header);
|
||||
this.subheaderResizeObserver.unobserve(this.subheader);
|
||||
this.footerResizeObserver.unobserve(this.footer);
|
||||
this.bannerResizeObserver.unobserve(this.banner);
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows the mobile navigation drawer
|
||||
*/
|
||||
showNavigation() {
|
||||
this.navOpen = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Hides the mobile navigation drawer
|
||||
*/
|
||||
hideNavigation() {
|
||||
this.navOpen = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Toggles the mobile navigation drawer
|
||||
*/
|
||||
toggleNavigation() {
|
||||
this.navOpen = !this.navOpen;
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<a href="#main-content" part="skip-to-content" class="wa-visually-hidden">
|
||||
<slot name="skip-to-content">Skip to content</slot>
|
||||
</a>
|
||||
|
||||
<!-- unsafeHTML needed for SSR until this is solved: https://github.com/lit/lit/issues/4696 -->
|
||||
${unsafeHTML(`
|
||||
<style id="mobile-styles">
|
||||
${mobileStyles(toLength(this.mobileBreakpoint))}
|
||||
</style>
|
||||
`)}
|
||||
|
||||
<div class="base" part="base">
|
||||
<div class="banner" part="banner">
|
||||
<slot name="banner"></slot>
|
||||
</div>
|
||||
<div class="header" part="header">
|
||||
<slot name="navigation-toggle">
|
||||
<wa-button part="navigation-toggle" size="small" appearance="plain" variant="neutral">
|
||||
<slot name="navigation-toggle-icon">
|
||||
<wa-icon name="bars" part="navigation-toggle-icon" label="Toggle navigation drawer"></wa-icon>
|
||||
</slot>
|
||||
</wa-button>
|
||||
</slot>
|
||||
<slot name="header"></slot>
|
||||
</div>
|
||||
<div class="subheader" part="subheader">
|
||||
<slot name="subheader"></slot>
|
||||
</div>
|
||||
<div class="body" part="body">
|
||||
<div class="menu" part="menu">
|
||||
<slot name="menu">
|
||||
<nav name="navigation" class="navigation" part="navigation navigation-desktop">
|
||||
<!-- Add fallback divs so that CSS grid works properly. -->
|
||||
<slot name="desktop-navigation-header">
|
||||
<slot name=${this.view === 'desktop' ? 'navigation-header' : '___'}><div></div></slot>
|
||||
</slot>
|
||||
<slot name="desktop-navigation">
|
||||
<slot name=${this.view === 'desktop' ? 'navigation' : '____'}><div></div></slot>
|
||||
</slot>
|
||||
<slot name="desktop-navigation-footer">
|
||||
<slot name=${this.view === 'desktop' ? 'navigation-footer' : '___'}><div></div></slot>
|
||||
</slot>
|
||||
</nav>
|
||||
</slot>
|
||||
</div>
|
||||
<div class="main" part="main">
|
||||
<div class="main-header" part="main-header">
|
||||
<slot name="main-header"></slot>
|
||||
</div>
|
||||
<div class="main-content" part="main-content">
|
||||
<slot name="skip-to-content-target"></slot>
|
||||
<slot></slot>
|
||||
</div>
|
||||
<div class="main-footer" part="main-footer">
|
||||
<slot name="main-footer"></slot>
|
||||
</div>
|
||||
</div>
|
||||
<div class="aside" part="aside">
|
||||
<slot name="aside"></slot>
|
||||
</div>
|
||||
</div>
|
||||
<div class="footer" part="footer">
|
||||
<slot name="footer"></slot>
|
||||
</div>
|
||||
</div>
|
||||
<wa-drawer
|
||||
part="drawer"
|
||||
placement=${this.navigationPlacement}
|
||||
light-dismiss
|
||||
?open=${live(this.navOpen)}
|
||||
@wa-after-show=${() => (this.navOpen = this.navigationDrawer.open)}
|
||||
@wa-after-hide=${() => (this.navOpen = this.navigationDrawer.open)}
|
||||
exportparts="
|
||||
dialog:drawer__dialog,
|
||||
overlay:drawer__overlay,
|
||||
panel:drawer__panel,
|
||||
header:drawer__header,
|
||||
header-actions:drawer__header-actions,
|
||||
title:drawer__title,
|
||||
close-button:drawer__close-button,
|
||||
close-button__base:drawer__close-button__base,
|
||||
body:drawer__body,
|
||||
footer:drawer__footer
|
||||
"
|
||||
class="navigation-drawer"
|
||||
with-header
|
||||
with-footer
|
||||
>
|
||||
<slot slot="label" part="navigation-header" name="mobile-navigation-header">
|
||||
<slot name=${this.view === 'mobile' ? 'navigation-header' : '___'}></slot>
|
||||
</slot>
|
||||
<slot name="mobile-navigation">
|
||||
<slot name=${this.view === 'mobile' ? 'navigation' : '____'}></slot>
|
||||
</slot>
|
||||
|
||||
<slot name="mobile-navigation-footer">
|
||||
<slot
|
||||
part="navigation-footer"
|
||||
slot="footer"
|
||||
name=${this.view === 'mobile' ? 'navigation-footer' : '___'}
|
||||
></slot>
|
||||
</slot>
|
||||
</wa-drawer>
|
||||
`;
|
||||
}
|
||||
}
|
||||
|
||||
declare global {
|
||||
interface HTMLElementTagNameMap {
|
||||
'wa-page': WaPage;
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
{
|
||||
"extends": "../webawesome/tsconfig.json",
|
||||
"include": [
|
||||
"src",
|
||||
"../webawesome/src"
|
||||
]
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
// This is ../../ instead of ../ because it gets copied into /_bundle_/
|
||||
"extends": "../../webawesome/tsconfig.prod.json",
|
||||
"compilerOptions": {
|
||||
"rootDir": "./src"
|
||||
},
|
||||
"include": [
|
||||
"src"
|
||||
],
|
||||
"exclude": [
|
||||
"src/**/*.test.ts"
|
||||
]
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
import * as path from 'node:path';
|
||||
import * as fs from "node:fs"
|
||||
import { anchorHeadingsPlugin } from './_utils/anchor-headings.js';
|
||||
import { codeExamplesPlugin } from './_utils/code-examples.js';
|
||||
import { copyCodePlugin } from './_utils/copy-code.js';
|
||||
@@ -33,15 +34,15 @@ const globalData = {
|
||||
},
|
||||
};
|
||||
|
||||
export default function (eleventyConfig) {
|
||||
export default async function (eleventyConfig) {
|
||||
/**
|
||||
* If you plan to add or remove any of these extensions, make sure to let either Konnor or Cory know as these passthrough extensions
|
||||
* will also need to be updated in the Web Awesome App.
|
||||
*/
|
||||
const passThroughExtensions = ['js', 'css', 'png', 'svg', 'jpg', 'mp4'];
|
||||
|
||||
const baseDir = process.env.BASE_DIR || 'docs';
|
||||
const passThrough = [...passThroughExtensions.map(ext => path.join(baseDir, '**/*.' + ext))];
|
||||
const docsDir = path.join(process.env.BASE_DIR || ".", 'docs');
|
||||
const passThrough = [...passThroughExtensions.map(ext => path.join(docsDir, '**/*.' + ext))];
|
||||
|
||||
/**
|
||||
* This is the guard we use for now to make sure our final built files dont need a 2nd pass by the server. This keeps us able to still deploy the bare HTML files on Vercel until the app is ready.
|
||||
@@ -171,9 +172,9 @@ export default function (eleventyConfig) {
|
||||
// eleventyConfig.addPlugin(formatCodePlugin());
|
||||
// }
|
||||
|
||||
eleventyConfig.addPassthroughCopy({
|
||||
'docs/assets': 'assets',
|
||||
});
|
||||
|
||||
let assetsDir = path.join(process.env.BASE_DIR || "docs", "assets")
|
||||
fs.cpSync(assetsDir, path.join(eleventyConfig.directories.output, "assets"), { recursive: true })
|
||||
|
||||
for (let glob of passThrough) {
|
||||
eleventyConfig.addPassthroughCopy(glob);
|
||||
@@ -203,14 +204,15 @@ export default function (eleventyConfig) {
|
||||
// componentModules,
|
||||
// });
|
||||
// }
|
||||
|
||||
return {
|
||||
markdownTemplateEngine: 'njk',
|
||||
dir: {
|
||||
input: 'docs',
|
||||
includes: '_includes',
|
||||
layouts: '_layouts',
|
||||
},
|
||||
templateFormats: ['njk', 'md'],
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
export const config = {
|
||||
markdownTemplateEngine: 'njk',
|
||||
dir: {
|
||||
input: 'docs',
|
||||
includes: '_includes',
|
||||
layouts: '_layouts',
|
||||
},
|
||||
templateFormats: ['njk', 'md'],
|
||||
}
|
||||
|
||||
@@ -30,6 +30,20 @@
|
||||
{# Web Awesome #}
|
||||
<script type="module" src="/dist/webawesome.loader.js"></script>
|
||||
|
||||
<link rel="preconnect" href="https://early.webawesome.com">
|
||||
<link type="modulepreload" href="{% cdnUrl 'components/page/page.js' %}">
|
||||
<script type="module">
|
||||
document.addEventListener("wa-discovery-complete", loadLayout)
|
||||
function loadLayout () {
|
||||
if (!customElements.get("wa-layout")) {
|
||||
import("{% cdnUrl 'components/page/page.js' %}")
|
||||
.catch((e) => {
|
||||
// known errors with dual registration. This is only a thing in the free repo.
|
||||
})
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<script type="module" src="/assets/scripts/theme-picker.js"></script>
|
||||
{# Preset Theme #}
|
||||
{% if forceTheme %}
|
||||
|
||||
@@ -33,387 +33,456 @@ let buildContexts = {
|
||||
};
|
||||
|
||||
/**
|
||||
* Runs the full build.
|
||||
* @typedef {Object} BuildOptions
|
||||
* @property {Array<string>} [watchedSrcDirectories]
|
||||
* @property {Array<string>} [watchedDocsDirectories]
|
||||
* @property {(eventName: "change" | "add" | "unlink", filePath: string) => unknown} [onWatchEvent]
|
||||
*/
|
||||
async function buildAll() {
|
||||
const start = Date.now();
|
||||
|
||||
try {
|
||||
await cleanup();
|
||||
await generateManifest();
|
||||
await generateReactWrappers();
|
||||
await generateTypes();
|
||||
await generateStyles();
|
||||
|
||||
// copy everything to unbundled before we generate bundles.
|
||||
await copy(getCdnDir(), getDistDir(), { overwrite: true });
|
||||
|
||||
await generateBundle();
|
||||
await generateDocs();
|
||||
|
||||
const time = (Date.now() - start) / 1000 + 's';
|
||||
spinner.succeed(`The build is complete ${chalk.gray(`(finished in ${time})`)}`);
|
||||
} catch (err) {
|
||||
spinner.fail();
|
||||
console.log(chalk.red(`\n${err}`));
|
||||
}
|
||||
}
|
||||
|
||||
/** Empties the dist directory. */
|
||||
async function cleanup() {
|
||||
spinner.start('Cleaning up dist');
|
||||
|
||||
await deleteAsync(getDistDir());
|
||||
await deleteAsync(getCdnDir());
|
||||
await mkdir(getDistDir(), { recursive: true });
|
||||
await mkdir(getCdnDir(), { recursive: true });
|
||||
|
||||
spinner.succeed();
|
||||
}
|
||||
|
||||
/**
|
||||
* Analyzes components and generates the custom elements manifest file.
|
||||
* @param {BuildOptions} [options={}]
|
||||
*/
|
||||
function generateManifest() {
|
||||
spinner.start('Generating CEM');
|
||||
|
||||
try {
|
||||
execSync('cem analyze --config "custom-elements-manifest.js"');
|
||||
} catch (error) {
|
||||
console.error(`\n\n${error.message}`);
|
||||
|
||||
if (!isDeveloping) {
|
||||
process.exit(1);
|
||||
}
|
||||
export async function build (options = {}) {
|
||||
if (!options.watchedSrcDirectories) {
|
||||
options.watchedSrcDirectories = ['src']
|
||||
}
|
||||
|
||||
spinner.succeed();
|
||||
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates React wrappers for all components.
|
||||
*/
|
||||
function generateReactWrappers() {
|
||||
spinner.start('Generating React wrappers');
|
||||
|
||||
try {
|
||||
// need to run make-react from this directories.
|
||||
execSync(`node ${join(__dirname, "make-react.js")} --outdir "${getCdnDir()}"`, { stdio: 'inherit' });
|
||||
} catch (error) {
|
||||
console.error(`\n\n${error.message}`);
|
||||
|
||||
if (!isDeveloping) {
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
spinner.succeed();
|
||||
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies theme stylesheets to the dist.
|
||||
*/
|
||||
async function generateStyles() {
|
||||
spinner.start('Copying stylesheets');
|
||||
|
||||
await copy(join(getRootDir(), 'src/styles'), join(getCdnDir(), 'styles'), { overwrite: true });
|
||||
|
||||
spinner.succeed();
|
||||
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs TypeScript to generate types.
|
||||
*/
|
||||
async function generateTypes() {
|
||||
spinner.start('Running the TypeScript compiler');
|
||||
|
||||
const cwd = process.cwd()
|
||||
try {
|
||||
if (process.env.ROOT_DIR) {
|
||||
process.chdir(process.env.ROOT_DIR)
|
||||
}
|
||||
execSync(`tsc --project ./tsconfig.prod.json --outdir "${getCdnDir()}"`);
|
||||
process.chdir(cwd)
|
||||
} catch (error) {
|
||||
process.chdir(cwd)
|
||||
if (!isDeveloping) {
|
||||
process.exit(1);
|
||||
}
|
||||
return Promise.reject(error.stdout);
|
||||
if (!options.watchedDocsDirectories) {
|
||||
options.watchedDocsDirectories = [getDocsDir()]
|
||||
}
|
||||
|
||||
spinner.succeed();
|
||||
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs esbuild to generate the final dist.
|
||||
*/
|
||||
async function generateBundle() {
|
||||
spinner.start('Bundling with esbuild');
|
||||
|
||||
const rootDir = process.env.ROOT_DIR || "."
|
||||
// Bundled config
|
||||
const config = {
|
||||
format: 'esm',
|
||||
target: 'es2020',
|
||||
entryPoints: [
|
||||
//
|
||||
// IMPORTANT: Entry points MUST be mapped in package.json => exports
|
||||
//
|
||||
// Utilities
|
||||
join(rootDir, 'src/webawesome.ts'),
|
||||
// Autoloader + utilities
|
||||
join(rootDir, 'src/webawesome.loader.ts'),
|
||||
join(rootDir, 'src/webawesome.ssr-loader.ts'),
|
||||
// Individual components
|
||||
...(await globby(join(rootDir, 'src/components/**/!(*.(style|test)).ts'))),
|
||||
// Translations
|
||||
...(await globby(join(rootDir, 'src/translations/**/*.ts'))),
|
||||
// React wrappers
|
||||
...(await globby(join(rootDir, 'src/react/**/*.ts'))),
|
||||
],
|
||||
outdir: getCdnDir(),
|
||||
chunkNames: 'chunks/[name].[hash]',
|
||||
define: {
|
||||
'process.env.NODE_ENV': '"production"', // required by Floating UI
|
||||
},
|
||||
bundle: true,
|
||||
splitting: true,
|
||||
minify: false,
|
||||
plugins: [replace({ __WEBAWESOME_VERSION__: version })],
|
||||
loader: {
|
||||
'.css': 'text',
|
||||
},
|
||||
};
|
||||
|
||||
const unbundledConfig = {
|
||||
...config,
|
||||
splitting: true,
|
||||
treeShaking: true,
|
||||
// Don't inline libraries like Lit etc.
|
||||
packages: 'external',
|
||||
outdir: getDistDir(),
|
||||
};
|
||||
|
||||
try {
|
||||
if (isDeveloping) {
|
||||
buildContexts.bundledContext = await esbuild.context(config);
|
||||
buildContexts.unbundledContext = await esbuild.context(unbundledConfig);
|
||||
|
||||
await buildContexts.bundledContext.rebuild();
|
||||
await buildContexts.unbundledContext.rebuild();
|
||||
} else {
|
||||
// One-time build for production
|
||||
await esbuild.build(config);
|
||||
await esbuild.build(unbundledConfig);
|
||||
}
|
||||
} catch (error) {
|
||||
spinner.fail();
|
||||
console.log(chalk.red(`\n${error}`));
|
||||
if (!isDeveloping) {
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
spinner.succeed();
|
||||
}
|
||||
|
||||
/**
|
||||
* Incrementally rebuilds the source files. Must be called only after `generateBundle()` has been called.
|
||||
*/
|
||||
async function regenerateBundle() {
|
||||
try {
|
||||
spinner.start('Re-bundling with esbuild');
|
||||
await buildContexts.bundledContext.rebuild();
|
||||
await buildContexts.unbundledContext.rebuild();
|
||||
} catch (error) {
|
||||
spinner.fail();
|
||||
console.log(chalk.red(`\n${error}`));
|
||||
|
||||
if (!isDeveloping) {
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
spinner.succeed();
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates the documentation site.
|
||||
*/
|
||||
async function generateDocs() {
|
||||
/**
|
||||
* Used by the webawesome-app to skip doc generation since it will do its own.
|
||||
*/
|
||||
if (process.env.SKIP_ELEVENTY === 'true') {
|
||||
return;
|
||||
}
|
||||
|
||||
spinner.start('Writing the docs');
|
||||
|
||||
const args = [];
|
||||
if (isDeveloping) args.push('--develop');
|
||||
|
||||
let output;
|
||||
try {
|
||||
// 11ty
|
||||
output = (await runScript(join(__dirname, 'docs.js'), args, { env: process.env }))
|
||||
// Cleanup the output
|
||||
.replace('[11ty]', '')
|
||||
.replace(' seconds', 's')
|
||||
.replace(/\(.*?\)/, '')
|
||||
.toLowerCase()
|
||||
.trim();
|
||||
|
||||
// Copy dist (production only)
|
||||
if (!isDeveloping) {
|
||||
await copy(getCdnDir(), join(getSiteDir(), 'dist'));
|
||||
}
|
||||
|
||||
spinner.succeed(`Writing the docs ${chalk.gray(`(${output}`)})`);
|
||||
} catch (error) {
|
||||
console.error('\n\n' + chalk.red(error) + '\n');
|
||||
|
||||
spinner.fail(chalk.red(`Error while writing the docs.`));
|
||||
if (!isDeveloping) {
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Initial build
|
||||
await buildAll();
|
||||
|
||||
if (!isDeveloping) {
|
||||
console.log(); // just a newline for readability
|
||||
}
|
||||
|
||||
// Launch the dev server
|
||||
if (isDeveloping) {
|
||||
spinner.start('Launching the dev server');
|
||||
|
||||
const bs = browserSync.create();
|
||||
const port = await getPort({ port: portNumbers(4000, 4999) });
|
||||
const url = `http://localhost:${port}/`;
|
||||
const reload = () => {
|
||||
spinner.start('Reloading browser');
|
||||
bs.reload();
|
||||
spinner.succeed();
|
||||
};
|
||||
|
||||
// Launch browser sync
|
||||
bs.init(
|
||||
{
|
||||
startPath: '/',
|
||||
port,
|
||||
logLevel: 'silent',
|
||||
logPrefix: '[webawesome]',
|
||||
logFileChanges: true,
|
||||
notify: false,
|
||||
single: false,
|
||||
ghostMode: false,
|
||||
server: {
|
||||
baseDir: getSiteDir(),
|
||||
routes: {
|
||||
'/dist/': './dist-cdn/',
|
||||
},
|
||||
},
|
||||
callbacks: {
|
||||
ready: (_err, instance) => {
|
||||
// 404 errors
|
||||
instance.addMiddleware('*', async (req, res) => {
|
||||
if (req.url.toLowerCase().endsWith('.svg')) {
|
||||
// Make sure SVGs error out in dev instead of serve the 404 page
|
||||
res.writeHead(404);
|
||||
} else {
|
||||
try {
|
||||
const notFoundTemplate = await readFile(join(getSiteDir(), '404.html'), 'utf-8');
|
||||
res.writeHead(404);
|
||||
res.write(notFoundTemplate || 'Page Not Found');
|
||||
} catch {
|
||||
// We're probably disconnected for some reason, so fail gracefully
|
||||
}
|
||||
}
|
||||
|
||||
res.end();
|
||||
});
|
||||
},
|
||||
},
|
||||
},
|
||||
() => {
|
||||
spinner.succeed();
|
||||
console.log(`\nThe dev server is running at ${chalk.cyan(url)}\n`);
|
||||
},
|
||||
);
|
||||
|
||||
// Rebuild and reload when source files change
|
||||
bs.watch('src/**/!(*.test).*').on('change', async filename => {
|
||||
spinner.info(`File modified ${chalk.gray(`(${relative(getRootDir(), filename)})`)}`);
|
||||
* Runs the full build.
|
||||
*/
|
||||
async function buildAll() {
|
||||
const start = Date.now();
|
||||
|
||||
try {
|
||||
const isTestFile = filename.includes('.test.ts');
|
||||
const isCssStylesheet = filename.includes('.css');
|
||||
const isComponent =
|
||||
filename.includes('components/') && filename.includes('.ts') && !isCssStylesheet && !isTestFile;
|
||||
await cleanup();
|
||||
await generateManifest();
|
||||
await generateReactWrappers();
|
||||
await generateTypes();
|
||||
await generateStyles();
|
||||
|
||||
// Re-bundle when relevant files change
|
||||
if (isTestFile) {
|
||||
return;
|
||||
}
|
||||
// copy everything to unbundled before we generate bundles.
|
||||
await copy(getCdnDir(), getDistDir(), { overwrite: true });
|
||||
|
||||
await regenerateBundle();
|
||||
|
||||
// Copy stylesheets when CSS files change
|
||||
if (isCssStylesheet) {
|
||||
await generateStyles();
|
||||
}
|
||||
|
||||
// Regenerate metadata when components change
|
||||
if (isComponent) {
|
||||
await generateManifest();
|
||||
}
|
||||
|
||||
// This needs to be outside of "isComponent" check because SSR needs to run on CSS files too.
|
||||
await generateBundle();
|
||||
await generateDocs();
|
||||
|
||||
reload();
|
||||
const time = (Date.now() - start) / 1000 + 's';
|
||||
spinner.succeed(`The build is complete ${chalk.gray(`(finished in ${time})`)}`);
|
||||
} catch (err) {
|
||||
console.error(chalk.red(err));
|
||||
spinner.fail();
|
||||
console.log(chalk.red(`\n${err}`));
|
||||
}
|
||||
}
|
||||
|
||||
/** Empties the dist directory. */
|
||||
async function cleanup() {
|
||||
spinner.start('Cleaning up dist');
|
||||
|
||||
await deleteAsync(getDistDir());
|
||||
await deleteAsync(getCdnDir());
|
||||
await mkdir(getDistDir(), { recursive: true });
|
||||
await mkdir(getCdnDir(), { recursive: true });
|
||||
|
||||
spinner.succeed();
|
||||
}
|
||||
|
||||
/**
|
||||
* Analyzes components and generates the custom elements manifest file.
|
||||
*/
|
||||
function generateManifest() {
|
||||
spinner.start('Generating CEM');
|
||||
|
||||
try {
|
||||
execSync('cem analyze --config "custom-elements-manifest.js"');
|
||||
} catch (error) {
|
||||
console.error(`\n\n${error.message}`);
|
||||
|
||||
if (!isDeveloping) {
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Rebuild the docs and reload when the docs change
|
||||
bs.watch(`${getDocsDir()}/**/*.*`).on('change', async filename => {
|
||||
spinner.info(`File modified ${chalk.gray(`(${relative(getRootDir(), filename)})`)}`);
|
||||
await generateDocs();
|
||||
reload();
|
||||
});
|
||||
}
|
||||
spinner.succeed();
|
||||
|
||||
//
|
||||
// Cleanup everything when the process terminates
|
||||
//
|
||||
function terminate() {
|
||||
// dispose of contexts.
|
||||
Object.values(buildContexts).forEach(context => context?.dispose?.());
|
||||
|
||||
if (spinner) {
|
||||
spinner.stop();
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
process.exit();
|
||||
/**
|
||||
* Generates React wrappers for all components.
|
||||
*/
|
||||
function generateReactWrappers() {
|
||||
spinner.start('Generating React wrappers');
|
||||
|
||||
try {
|
||||
// need to run make-react from this directories.
|
||||
execSync(`node ${join(__dirname, "make-react.js")} --outdir "${getCdnDir()}"`, { stdio: 'inherit' });
|
||||
} catch (error) {
|
||||
console.error(`\n\n${error.message}`);
|
||||
|
||||
if (!isDeveloping) {
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
spinner.succeed();
|
||||
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies theme stylesheets to the dist.
|
||||
*/
|
||||
async function generateStyles() {
|
||||
spinner.start('Copying stylesheets');
|
||||
|
||||
await copy(join(getRootDir(), 'src/styles'), join(getCdnDir(), 'styles'), { overwrite: true });
|
||||
|
||||
spinner.succeed();
|
||||
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs TypeScript to generate types.
|
||||
*/
|
||||
async function generateTypes() {
|
||||
spinner.start('Running the TypeScript compiler');
|
||||
|
||||
const cwd = process.cwd()
|
||||
try {
|
||||
if (process.env.ROOT_DIR) {
|
||||
process.chdir(process.env.ROOT_DIR)
|
||||
}
|
||||
execSync(`tsc --project ./tsconfig.prod.json --outdir "${getCdnDir()}"`);
|
||||
process.chdir(cwd)
|
||||
} catch (error) {
|
||||
process.chdir(cwd)
|
||||
if (!isDeveloping) {
|
||||
process.exit(1);
|
||||
}
|
||||
return Promise.reject(error.stdout);
|
||||
}
|
||||
|
||||
spinner.succeed();
|
||||
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs esbuild to generate the final dist.
|
||||
*/
|
||||
async function generateBundle() {
|
||||
spinner.start('Bundling with esbuild');
|
||||
|
||||
const rootDir = process.env.ROOT_DIR || "."
|
||||
// Bundled config
|
||||
const config = {
|
||||
format: 'esm',
|
||||
target: 'es2020',
|
||||
entryPoints: [
|
||||
//
|
||||
// IMPORTANT: Entry points MUST be mapped in package.json => exports
|
||||
//
|
||||
// Utilities
|
||||
join(rootDir, 'src/webawesome.ts'),
|
||||
// Autoloader + utilities
|
||||
join(rootDir, 'src/webawesome.loader.ts'),
|
||||
join(rootDir, 'src/webawesome.ssr-loader.ts'),
|
||||
// Individual components
|
||||
...(await globby(join(rootDir, 'src/components/**/!(*.(style|test)).ts'))),
|
||||
// Translations
|
||||
...(await globby(join(rootDir, 'src/translations/**/*.ts'))),
|
||||
// React wrappers
|
||||
...(await globby(join(rootDir, 'src/react/**/*.ts'))),
|
||||
],
|
||||
outdir: getCdnDir(),
|
||||
chunkNames: 'chunks/[name].[hash]',
|
||||
define: {
|
||||
'process.env.NODE_ENV': '"production"', // required by Floating UI
|
||||
},
|
||||
bundle: true,
|
||||
splitting: true,
|
||||
minify: false,
|
||||
plugins: [replace({ __WEBAWESOME_VERSION__: version })],
|
||||
loader: {
|
||||
'.css': 'text',
|
||||
},
|
||||
};
|
||||
|
||||
const unbundledConfig = {
|
||||
...config,
|
||||
splitting: true,
|
||||
treeShaking: true,
|
||||
// Don't inline libraries like Lit etc.
|
||||
packages: 'external',
|
||||
outdir: getDistDir(),
|
||||
};
|
||||
|
||||
try {
|
||||
if (isDeveloping) {
|
||||
buildContexts.bundledContext = await esbuild.context(config);
|
||||
buildContexts.unbundledContext = await esbuild.context(unbundledConfig);
|
||||
|
||||
await buildContexts.bundledContext.rebuild();
|
||||
await buildContexts.unbundledContext.rebuild();
|
||||
} else {
|
||||
// One-time build for production
|
||||
await esbuild.build(config);
|
||||
await esbuild.build(unbundledConfig);
|
||||
}
|
||||
} catch (error) {
|
||||
spinner.fail();
|
||||
console.log(chalk.red(`\n${error}`));
|
||||
if (!isDeveloping) {
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
spinner.succeed();
|
||||
}
|
||||
|
||||
/**
|
||||
* Incrementally rebuilds the source files. Must be called only after `generateBundle()` has been called.
|
||||
*/
|
||||
async function regenerateBundle() {
|
||||
try {
|
||||
spinner.start('Re-bundling with esbuild');
|
||||
await buildContexts.bundledContext.rebuild();
|
||||
await buildContexts.unbundledContext.rebuild();
|
||||
} catch (error) {
|
||||
spinner.fail();
|
||||
console.log(chalk.red(`\n${error}`));
|
||||
|
||||
if (!isDeveloping) {
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
spinner.succeed();
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates the documentation site.
|
||||
*/
|
||||
async function generateDocs() {
|
||||
/**
|
||||
* Used by the webawesome-app to skip doc generation since it will do its own.
|
||||
*/
|
||||
if (process.env.SKIP_ELEVENTY === 'true') {
|
||||
return;
|
||||
}
|
||||
|
||||
spinner.start('Writing the docs');
|
||||
|
||||
const args = [];
|
||||
if (isDeveloping) args.push('--develop');
|
||||
|
||||
let output;
|
||||
try {
|
||||
// 11ty
|
||||
output = (await runScript(join(__dirname, 'docs.js'), args, { env: process.env }))
|
||||
// Cleanup the output
|
||||
.replace('[11ty]', '')
|
||||
.replace(' seconds', 's')
|
||||
.replace(/\(.*?\)/, '')
|
||||
.toLowerCase()
|
||||
.trim();
|
||||
|
||||
// Copy dist (production only)
|
||||
if (!isDeveloping) {
|
||||
await copy(getCdnDir(), join(getSiteDir(), 'dist'));
|
||||
}
|
||||
|
||||
spinner.succeed(`Writing the docs ${chalk.gray(`(${output}`)})`);
|
||||
} catch (error) {
|
||||
console.error('\n\n' + chalk.red(error) + '\n');
|
||||
|
||||
spinner.fail(chalk.red(`Error while writing the docs.`));
|
||||
if (!isDeveloping) {
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Initial build
|
||||
await buildAll();
|
||||
|
||||
if (!isDeveloping) {
|
||||
console.log(); // just a newline for readability
|
||||
}
|
||||
|
||||
// Launch the dev server
|
||||
if (isDeveloping) {
|
||||
spinner.start('Launching the dev server');
|
||||
|
||||
const bs = browserSync.create();
|
||||
const port = await getPort({ port: portNumbers(4000, 4999) });
|
||||
const url = `http://localhost:${port}/`;
|
||||
const reload = () => {
|
||||
spinner.start('Reloading browser');
|
||||
bs.reload();
|
||||
spinner.succeed();
|
||||
};
|
||||
|
||||
// Launch browser sync
|
||||
bs.init(
|
||||
{
|
||||
startPath: '/',
|
||||
port,
|
||||
logLevel: 'silent',
|
||||
logPrefix: '[webawesome]',
|
||||
logFileChanges: true,
|
||||
notify: false,
|
||||
single: false,
|
||||
ghostMode: false,
|
||||
server: {
|
||||
baseDir: getSiteDir(),
|
||||
routes: {
|
||||
'/dist/': './dist-cdn/',
|
||||
},
|
||||
},
|
||||
callbacks: {
|
||||
ready: (_err, instance) => {
|
||||
// 404 errors
|
||||
instance.addMiddleware('*', async (req, res) => {
|
||||
if (req.url.toLowerCase().endsWith('.svg')) {
|
||||
// Make sure SVGs error out in dev instead of serve the 404 page
|
||||
res.writeHead(404);
|
||||
} else {
|
||||
try {
|
||||
const notFoundTemplate = await readFile(join(getSiteDir(), '404.html'), 'utf-8');
|
||||
res.writeHead(404);
|
||||
res.write(notFoundTemplate || 'Page Not Found');
|
||||
} catch {
|
||||
// We're probably disconnected for some reason, so fail gracefully
|
||||
}
|
||||
}
|
||||
|
||||
res.end();
|
||||
});
|
||||
},
|
||||
},
|
||||
},
|
||||
() => {
|
||||
spinner.succeed();
|
||||
console.log(`\nThe dev server is running at ${chalk.cyan(url)}\n`);
|
||||
},
|
||||
);
|
||||
|
||||
// TODO: Should probably listen for all of these instead of just "change"
|
||||
const watchEvents = [
|
||||
"change",
|
||||
// "unlink",
|
||||
// "add"
|
||||
]
|
||||
// Rebuild and reload when source files change
|
||||
options.watchedSrcDirectories.forEach((dir) => {
|
||||
const watcher = bs.watch(join(dir, "**", "!(*.test).*"))
|
||||
|
||||
watchEvents.forEach((evt) => {
|
||||
watcher.on(evt, handleWatchEvent(evt))
|
||||
})
|
||||
function handleWatchEvent (evt) {
|
||||
return async (filename) => {
|
||||
spinner.info(`File modified ${chalk.gray(`(${relative(getRootDir(), filename)})`)}`);
|
||||
|
||||
try {
|
||||
const isTestFile = filename.includes('.test.ts');
|
||||
const isCssStylesheet = filename.includes('.css');
|
||||
const isComponent =
|
||||
filename.includes('components/') && filename.includes('.ts') && !isCssStylesheet && !isTestFile;
|
||||
|
||||
// Re-bundle when relevant files change
|
||||
if (isTestFile) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (typeof options.onWatchEvent === "function") {
|
||||
await options.onWatchEvent(evt, filename)
|
||||
}
|
||||
await regenerateBundle();
|
||||
|
||||
// Copy stylesheets when CSS files change
|
||||
if (isCssStylesheet) {
|
||||
await generateStyles();
|
||||
}
|
||||
|
||||
// Regenerate metadata when components change
|
||||
if (isComponent) {
|
||||
await generateManifest();
|
||||
}
|
||||
|
||||
// This needs to be outside of "isComponent" check because SSR needs to run on CSS files too.
|
||||
await generateDocs();
|
||||
|
||||
reload();
|
||||
} catch (err) {
|
||||
console.error(chalk.red(err));
|
||||
|
||||
if (!isDeveloping) {
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
// Rebuild the docs and reload when the docs change
|
||||
options.watchedDocsDirectories.forEach((dir) => {
|
||||
const watcher = bs.watch(join(dir, "**", "*.*"))
|
||||
|
||||
watchEvents.forEach((evt) => {
|
||||
watcher.on(evt, handleWatchEvent(evt))
|
||||
})
|
||||
|
||||
function handleWatchEvent (evt) {
|
||||
return async (filename) => {
|
||||
spinner.info(`File modified ${chalk.gray(`(${relative(getRootDir(), filename)})`)}`);
|
||||
if (typeof options.onWatchEvent === "function") {
|
||||
await options.onWatchEvent(evt, filename)
|
||||
}
|
||||
await generateDocs();
|
||||
reload();
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
//
|
||||
// Cleanup everything when the process terminates
|
||||
//
|
||||
function terminate() {
|
||||
// dispose of contexts.
|
||||
Object.values(buildContexts).forEach(context => context?.dispose?.());
|
||||
|
||||
if (spinner) {
|
||||
spinner.stop();
|
||||
}
|
||||
|
||||
process.exit();
|
||||
}
|
||||
|
||||
process.on('SIGINT', terminate);
|
||||
process.on('SIGTERM', terminate);
|
||||
}
|
||||
|
||||
// https://exploringjs.com/nodejs-shell-scripting/ch_nodejs-path.html#detecting-if-module-is-main
|
||||
// Detects if this was called via node scripts/build.js
|
||||
function isRunAsMain () {
|
||||
if (import.meta.url.startsWith('file:')) { // (A)
|
||||
const modulePath = fileURLToPath(import.meta.url);
|
||||
if (process.argv[1] === modulePath) { // (B)
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
process.on('SIGINT', terminate);
|
||||
process.on('SIGTERM', terminate);
|
||||
if (isRunAsMain()) {
|
||||
await build()
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ import { getAllComponents } from './shared.js';
|
||||
const { outdir } = commandLineArgs({ name: 'outdir', type: String });
|
||||
|
||||
const reactDir = path.join(process.env.ROOT_DIR || ".", 'src', 'react');
|
||||
const srcDir = process.env.ROOT_DIR ? path.join(process.env.ROOT_DIR, "src") : "."
|
||||
|
||||
// Clear build directory
|
||||
deleteSync(reactDir);
|
||||
@@ -17,13 +18,15 @@ fs.mkdirSync(reactDir, { recursive: true });
|
||||
// Fetch component metadata
|
||||
const metadata = JSON.parse(fs.readFileSync(path.join(outdir, 'custom-elements.json'), 'utf8'));
|
||||
const components = getAllComponents(metadata);
|
||||
|
||||
const index = [];
|
||||
|
||||
for await (const component of components) {
|
||||
const tagWithoutPrefix = component.tagName.replace(/^wa-/, '');
|
||||
const componentDir = path.join(reactDir, tagWithoutPrefix);
|
||||
const componentFile = path.join(componentDir, 'index.ts');
|
||||
const importPath = component.path.replace(/\.js$/, '.js');
|
||||
const importPath = path.relative(srcDir, component.path)
|
||||
|
||||
// We only want to wrap wa- prefixed events, because the others are native
|
||||
const eventsToWrap = component.events?.filter(event => event.name.startsWith('wa-')) || [];
|
||||
const eventImports = eventsToWrap
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
export { default as WaAnimatedImage } from './animated-image/index.js';
|
||||
export { default as WaBadge } from './badge/index.js';
|
||||
export { default as WaAvatar } from './avatar/index.js';
|
||||
export { default as WaBadge } from './badge/index.js';
|
||||
export { default as WaAnimation } from './animation/index.js';
|
||||
export { default as WaBreadcrumb } from './breadcrumb/index.js';
|
||||
export { default as WaBreadcrumbItem } from './breadcrumb-item/index.js';
|
||||
export { default as WaButtonGroup } from './button-group/index.js';
|
||||
export { default as WaButton } from './button/index.js';
|
||||
export { default as WaButtonGroup } from './button-group/index.js';
|
||||
export { default as WaCallout } from './callout/index.js';
|
||||
export { default as WaCard } from './card/index.js';
|
||||
export { default as WaCarousel } from './carousel/index.js';
|
||||
@@ -37,23 +37,23 @@ export { default as WaProgressBar } from './progress-bar/index.js';
|
||||
export { default as WaProgressRing } from './progress-ring/index.js';
|
||||
export { default as WaQrCode } from './qr-code/index.js';
|
||||
export { default as WaRadio } from './radio/index.js';
|
||||
export { default as WaRadioButton } from './radio-button/index.js';
|
||||
export { default as WaRadioGroup } from './radio-group/index.js';
|
||||
export { default as WaRating } from './rating/index.js';
|
||||
export { default as WaRadioButton } from './radio-button/index.js';
|
||||
export { default as WaRelativeTime } from './relative-time/index.js';
|
||||
export { default as WaRating } from './rating/index.js';
|
||||
export { default as WaResizeObserver } from './resize-observer/index.js';
|
||||
export { default as WaSelect } from './select/index.js';
|
||||
export { default as WaSkeleton } from './skeleton/index.js';
|
||||
export { default as WaSlider } from './slider/index.js';
|
||||
export { default as WaSpinner } from './spinner/index.js';
|
||||
export { default as WaSplitPanel } from './split-panel/index.js';
|
||||
export { default as WaSpinner } from './spinner/index.js';
|
||||
export { default as WaTab } from './tab/index.js';
|
||||
export { default as WaSwitch } from './switch/index.js';
|
||||
export { default as WaTabGroup } from './tab-group/index.js';
|
||||
export { default as WaTabPanel } from './tab-panel/index.js';
|
||||
export { default as WaTag } from './tag/index.js';
|
||||
export { default as WaTextarea } from './textarea/index.js';
|
||||
export { default as WaTooltip } from './tooltip/index.js';
|
||||
export { default as WaTree } from './tree/index.js';
|
||||
export { default as WaTreeItem } from './tree-item/index.js';
|
||||
export { default as WaViewportDemo } from './viewport-demo/index.js';
|
||||
export { default as WaTooltip } from './tooltip/index.js';
|
||||
export { default as WaViewportDemo } from './viewport-demo/index.js';
|
||||
export { default as WaTreeItem } from './tree-item/index.js';
|
||||
@@ -13,7 +13,7 @@ const observer = new MutationObserver(mutations => {
|
||||
/** Starts the autoloader. */
|
||||
export function startLoader() {
|
||||
// Initial discovery
|
||||
discover(document.body);
|
||||
discover(document);
|
||||
|
||||
// Listen for new undefined elements
|
||||
observer.observe(document.documentElement, { subtree: true, childList: true });
|
||||
@@ -27,12 +27,12 @@ export function stopLoader() {
|
||||
/**
|
||||
* Checks a node for undefined elements and attempts to register them.
|
||||
*/
|
||||
export async function discover(root: Element | ShadowRoot) {
|
||||
export async function discover(root: Document | Element | ShadowRoot) {
|
||||
const rootTagName = root instanceof Element ? root.tagName.toLowerCase() : '';
|
||||
const rootIsWebAwesomeComponent = rootTagName?.startsWith('wa-');
|
||||
const tags = [...root.querySelectorAll(':not(:defined)')]
|
||||
.map(el => el.tagName.toLowerCase())
|
||||
.filter(tag => tag.startsWith('wa-'));
|
||||
.filter(tag => tag.startsWith('wa-') && tag !== "wa-page");
|
||||
|
||||
// If the root element is an undefined Web Awesome component, add it to the list
|
||||
if (rootIsWebAwesomeComponent && !customElements.get(rootTagName)) {
|
||||
|
||||
Reference in New Issue
Block a user