mirror of
https://github.com/shoelace-style/webawesome.git
synced 2026-01-13 12:39:14 +00:00
Compare commits
110 Commits
alpha
...
kj/app-pat
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c3de5a8915 | ||
|
|
c18aa23d76 | ||
|
|
54e14a20c0 | ||
|
|
97b8e96a6e | ||
|
|
55a362b741 | ||
|
|
d9cafdafb7 | ||
|
|
81bf6865ec | ||
|
|
873eb47d18 | ||
|
|
a564d3061f | ||
|
|
ef865396f2 | ||
|
|
903085257d | ||
|
|
27237441a1 | ||
|
|
b0291653f8 | ||
|
|
3962c50844 | ||
|
|
314801c368 | ||
|
|
dc30ed8503 | ||
|
|
e12be798b8 | ||
|
|
7f29f1b4ea | ||
|
|
3563d6a2dd | ||
|
|
007d93077f | ||
|
|
80b78aeb16 | ||
|
|
8bc8ea85a5 | ||
|
|
61a6cd9fb9 | ||
|
|
7fb3fd5982 | ||
|
|
dc580b3351 | ||
|
|
74719d4c06 | ||
|
|
47a7cdedd0 | ||
|
|
d906940726 | ||
|
|
a782470c6a | ||
|
|
de175ed4a1 | ||
|
|
3612f8fdfa | ||
|
|
bc76df4b31 | ||
|
|
9ad7f4a6be | ||
|
|
a7457630aa | ||
|
|
e19928123f | ||
|
|
e644862f58 | ||
|
|
76529c628e | ||
|
|
62ded7b15a | ||
|
|
65af9980f1 | ||
|
|
db592194fd | ||
|
|
0f9ea14033 | ||
|
|
057b76a10a | ||
|
|
b466ba9d0f | ||
|
|
9c979931da | ||
|
|
898311590a | ||
|
|
5f4510f355 | ||
|
|
b8eeb3db23 | ||
|
|
8574270340 | ||
|
|
aa042a0a6e | ||
|
|
fe81a41a6b | ||
|
|
f3628ad2d8 | ||
|
|
169337077d | ||
|
|
406d9a9708 | ||
|
|
faaf75c0a2 | ||
|
|
13b67db869 | ||
|
|
b7fdda4b03 | ||
|
|
d60e675702 | ||
|
|
414a318f0b | ||
|
|
ff8ed89645 | ||
|
|
e027ab1291 | ||
|
|
d8f97b15b4 | ||
|
|
a8ed6f2c19 | ||
|
|
c7f5dc69ad | ||
|
|
42381722c5 | ||
|
|
b2f9ec573f | ||
|
|
b85e59b8ca | ||
|
|
8bd69694ce | ||
|
|
7672923479 | ||
|
|
c94006c6aa | ||
|
|
91ce2f2271 | ||
|
|
9c609e44de | ||
|
|
28a8e4250a | ||
|
|
656a38cd3d | ||
|
|
9b90e56b45 | ||
|
|
0c84a2ff37 | ||
|
|
511cca7931 | ||
|
|
2069d223f0 | ||
|
|
37d2455965 | ||
|
|
85b05fc655 | ||
|
|
52328d9805 | ||
|
|
2c89c5f510 | ||
|
|
5ac9e8cff1 | ||
|
|
e238e35b3b | ||
|
|
c6d8d37871 | ||
|
|
4dddb183fd | ||
|
|
d49ed53e9a | ||
|
|
99e2ffc17b | ||
|
|
97c79c29b9 | ||
|
|
7da9f53e27 | ||
|
|
a9cc02193f | ||
|
|
9ad1c8f060 | ||
|
|
e0eaea2024 | ||
|
|
a8b7b6a93f | ||
|
|
581e47043a | ||
|
|
9ffe0cfe3c | ||
|
|
45df4a924f | ||
|
|
43eed9d15e | ||
|
|
a0ff411463 | ||
|
|
04cd027c7e | ||
|
|
a68a157ebc | ||
|
|
b2a24a3b52 | ||
|
|
cbb456ffda | ||
|
|
e0038c3125 | ||
|
|
3e5d3120b1 | ||
|
|
020f4cbaed | ||
|
|
9106bb88cf | ||
|
|
a822ab98c8 | ||
|
|
026777c085 | ||
|
|
6d87b9b24a | ||
|
|
d5affa01e9 |
9
.github/workflows/ssr_tests.js.yml
vendored
9
.github/workflows/ssr_tests.js.yml
vendored
@@ -1,12 +1,11 @@
|
||||
# This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
||||
# # This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node
|
||||
# # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
||||
|
||||
name: SSR Tests
|
||||
|
||||
on:
|
||||
# push:
|
||||
# branches: [next]
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches: [next]
|
||||
|
||||
jobs:
|
||||
ssr_test:
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import * as path from 'node:path';
|
||||
import { anchorHeadingsPlugin } from './_utils/anchor-headings.js';
|
||||
import { codeExamplesPlugin } from './_utils/code-examples.js';
|
||||
import { copyCodePlugin } from './_utils/copy-code.js';
|
||||
@@ -7,10 +6,9 @@ import { highlightCodePlugin } from './_utils/highlight-code.js';
|
||||
import { markdown } from './_utils/markdown.js';
|
||||
import { removeDataAlphaElements } from './_utils/remove-data-alpha-elements.js';
|
||||
// import { formatCodePlugin } from './_utils/format-code.js';
|
||||
// import litPlugin from '@lit-labs/eleventy-plugin-lit';
|
||||
import litPlugin from '@lit-labs/eleventy-plugin-lit';
|
||||
import { readFile } from 'fs/promises';
|
||||
import nunjucks from 'nunjucks';
|
||||
// import componentList from './_data/componentList.js';
|
||||
import componentList from './_data/componentList.js';
|
||||
import * as filters from './_utils/filters.js';
|
||||
import { outlinePlugin } from './_utils/outline.js';
|
||||
import { replaceTextPlugin } from './_utils/replace-text.js';
|
||||
@@ -18,10 +16,7 @@ import { searchPlugin } from './_utils/search.js';
|
||||
|
||||
import process from 'process';
|
||||
|
||||
import * as url from 'url';
|
||||
const __dirname = url.fileURLToPath(new URL('.', import.meta.url));
|
||||
|
||||
const packageData = JSON.parse(await readFile(path.join(__dirname, '..', 'package.json'), 'utf-8'));
|
||||
const packageData = JSON.parse(await readFile('./package.json', 'utf-8'));
|
||||
const isAlpha = process.argv.includes('--alpha');
|
||||
const isDev = process.argv.includes('--develop');
|
||||
|
||||
@@ -29,22 +24,12 @@ const globalData = {
|
||||
package: packageData,
|
||||
isAlpha,
|
||||
layout: 'page.njk',
|
||||
server: {
|
||||
head: '',
|
||||
loginOrAvatar: '',
|
||||
flashes: '',
|
||||
},
|
||||
};
|
||||
|
||||
const passThroughExtensions = ['js', 'css', 'png', 'svg', 'jpg', 'mp4'];
|
||||
const passThrough = [...passThroughExtensions.map(ext => 'docs/**/*.' + ext)];
|
||||
|
||||
export default function (eleventyConfig) {
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
const serverBuild = process.env.WEBAWESOME_SERVER === 'true';
|
||||
|
||||
// NOTE - alpha setting removes certain pages
|
||||
if (isAlpha) {
|
||||
eleventyConfig.ignores.add('**/experimental/**');
|
||||
@@ -70,38 +55,7 @@ export default function (eleventyConfig) {
|
||||
|
||||
// Shortcodes - {% shortCode arg1, arg2 %}
|
||||
eleventyConfig.addShortcode('cdnUrl', location => {
|
||||
return `https://early.webawesome.com/webawesome@${packageData.version}/dist/` + (location || '').replace(/^\//, '');
|
||||
});
|
||||
|
||||
// Turns `{% server "foo" %} into `{{ server.foo | safe }}` when the WEBAWESOME_SERVER variable is set to "true"
|
||||
eleventyConfig.addShortcode('server', function (property) {
|
||||
if (serverBuild) {
|
||||
return `{{ server.${property} | safe }}`;
|
||||
}
|
||||
|
||||
return '';
|
||||
});
|
||||
|
||||
eleventyConfig.addTransform('second-nunjucks-transform', function NunjucksTransform(content) {
|
||||
// For a server build, we expect a server to run the second transform.
|
||||
if (serverBuild) {
|
||||
return content;
|
||||
}
|
||||
|
||||
// Only run the transform on files nunjucks would transform.
|
||||
if (!this.page.inputPath.match(/.(md|html|njk)$/)) {
|
||||
return content;
|
||||
}
|
||||
|
||||
/** This largely mimics what an app would do and just stubs out what we don't care about. */
|
||||
return nunjucks.renderString(content, {
|
||||
// Stub the server EJS shortcodes.
|
||||
server: {
|
||||
head: '',
|
||||
loginOrAvatar: '',
|
||||
flashes: '',
|
||||
},
|
||||
});
|
||||
return `https://early.webawesome.com/webawesome@${packageData.version}/dist/` + location.replace(/^\//, '');
|
||||
});
|
||||
|
||||
// Paired shortcodes - {% shortCode %}content{% endShortCode %}
|
||||
@@ -163,6 +117,29 @@ export default function (eleventyConfig) {
|
||||
]),
|
||||
);
|
||||
|
||||
// SSR plugin
|
||||
if (!isDev) {
|
||||
//
|
||||
// Problematic components in SSR land:
|
||||
// - animation (breaks on navigation + ssr with Turbo)
|
||||
// - mutation-observer (why SSR this?)
|
||||
// - resize-observer (why SSR this?)
|
||||
// - tooltip (why SSR this?)
|
||||
//
|
||||
const omittedModules = [];
|
||||
const componentModules = componentList
|
||||
.filter(component => !omittedModules.includes(component.tagName.split(/wa-/)[1]))
|
||||
.map(component => {
|
||||
const name = component.tagName.split(/wa-/)[1];
|
||||
return `./dist/components/${name}/${name}.js`;
|
||||
});
|
||||
|
||||
eleventyConfig.addPlugin(litPlugin, {
|
||||
mode: 'worker',
|
||||
componentModules,
|
||||
});
|
||||
}
|
||||
|
||||
// Build the search index
|
||||
eleventyConfig.addPlugin(
|
||||
searchPlugin({
|
||||
@@ -189,31 +166,6 @@ export default function (eleventyConfig) {
|
||||
eleventyConfig.addPassthroughCopy(glob);
|
||||
}
|
||||
|
||||
// // SSR plugin
|
||||
// // Make sure this is the last thing, we don't want to run the risk of accidentally transforming shadow roots with the nunjucks 2nd transform.
|
||||
// if (!isDev) {
|
||||
// //
|
||||
// // Problematic components in SSR land:
|
||||
// // - animation (breaks on navigation + ssr with Turbo)
|
||||
// // - mutation-observer (why SSR this?)
|
||||
// // - resize-observer (why SSR this?)
|
||||
// // - tooltip (why SSR this?)
|
||||
// //
|
||||
// const omittedModules = [];
|
||||
// const componentModules = componentList
|
||||
// .filter(component => !omittedModules.includes(component.tagName.split(/wa-/)[1]))
|
||||
// .map(component => {
|
||||
// const name = component.tagName.split(/wa-/)[1];
|
||||
// const componentDirectory = process.env.UNBUNDLED_DIST_DIRECTORY || path.join('.', 'dist');
|
||||
// return path.join(componentDirectory, 'components', name, `${name}.js`);
|
||||
// });
|
||||
//
|
||||
// eleventyConfig.addPlugin(litPlugin, {
|
||||
// mode: 'worker',
|
||||
// componentModules,
|
||||
// });
|
||||
// }
|
||||
|
||||
return {
|
||||
markdownTemplateEngine: 'njk',
|
||||
dir: {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" data-fa-kit-code="b10bfbde90" data-cdn-url="{% cdnUrl %}" class="wa-cloak">
|
||||
<html lang="en" data-fa-kit-code="b10bfbde90" data-cdn-url="{% cdnUrl %}">
|
||||
<head>
|
||||
{% include 'head.njk' %}
|
||||
<meta name="theme-color" content="#f36944">
|
||||
@@ -50,9 +50,6 @@
|
||||
Search
|
||||
<kbd slot="suffix" class="only-desktop">/</kbd>
|
||||
</wa-button>
|
||||
|
||||
{# Login #}
|
||||
{% server "loginOrAvatar" %}
|
||||
</div>
|
||||
</header>
|
||||
|
||||
@@ -79,19 +76,14 @@
|
||||
</aside>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{# Main #}
|
||||
<main id="content">
|
||||
{# Expandable outline #}
|
||||
{% if hasOutline %}
|
||||
<nav id="outline-expandable">
|
||||
<details class="outline-links">
|
||||
<summary>On this page</summary>
|
||||
</details>
|
||||
</nav>
|
||||
{% endif %}
|
||||
|
||||
<div id="flashes">{% server "flashes" %}</div>
|
||||
|
||||
{% block header %}
|
||||
{% include 'breadcrumbs.njk' %}
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
{% set ancestors = page.url | ancestors %}
|
||||
|
||||
{% if ancestors.length > 0 %}
|
||||
{% set breadcrumbs = page.url | breadcrumbs %}
|
||||
{% if breadcrumbs.length > 0 %}
|
||||
<wa-breadcrumb id="docs-breadcrumbs">
|
||||
{% for ancestor in ancestors %}
|
||||
{% if ancestor.page.url != "/" %}
|
||||
<wa-breadcrumb-item href="{{ ancestor.page.url }}">{{ ancestor.data.title }}</wa-breadcrumb-item>
|
||||
{% endif %}
|
||||
{% for crumb in breadcrumbs %}
|
||||
<wa-breadcrumb-item href="{{ crumb.url }}">{{ crumb.title }}</wa-breadcrumb-item>
|
||||
{% endfor %}
|
||||
<wa-breadcrumb-item>{# Current page #}</wa-breadcrumb-item>
|
||||
</wa-breadcrumb>
|
||||
|
||||
@@ -1,18 +1,12 @@
|
||||
{# Cards for pages listed by category #}
|
||||
|
||||
<section id="grid" class="index-grid">
|
||||
{% set groupedPages = allPages | groupPages(categories, page) %}
|
||||
{% for category, pages in groupedPages -%}
|
||||
{% if groupedPages.meta.groupCount > 1 and pages.length > 0 %}
|
||||
<h2 class="index-category" id="{{ category | slugify }}">
|
||||
{% if pages.meta.url %}<a href="{{ pages.meta.url }}">{{ pages.meta.title }}</a>
|
||||
{% else %}
|
||||
{{ pages.meta.title }}
|
||||
{% endif %}
|
||||
</h2>
|
||||
{% endif %}
|
||||
{%- for page in pages -%}
|
||||
{% include "page-card.njk" %}
|
||||
{%- endfor -%}
|
||||
{% for category, pages in allPages | groupByTags(categories) -%}
|
||||
<h2 class="index-category">{{ category | getCategoryTitle(categories) }}</h2>
|
||||
{%- for page in pages -%}
|
||||
{%- if not page.data.parent or listChildren -%}
|
||||
{% include "page-card.njk" %}
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
{%- endfor -%}
|
||||
</section>
|
||||
|
||||
@@ -23,12 +23,10 @@
|
||||
<script src="/assets/scripts/hydration-errors.js"></script>
|
||||
<link rel="stylesheet" href="/assets/styles/hydration-errors.css">
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net">
|
||||
|
||||
{# Internal components #}
|
||||
<script type="module" src="/assets/components/scoped.js"></script>
|
||||
<script type="module" src="https://cdn.jsdelivr.net/npm/@hotwired/turbo@8.0.10/+esm"></script>
|
||||
|
||||
{# Web Awesome #}
|
||||
<script type="module" src="/dist/webawesome.loader.js"></script>
|
||||
<script type="module" src="/dist/webawesome.ssr-loader.js"></script>
|
||||
|
||||
<script type="module" src="/assets/scripts/theme-picker.js"></script>
|
||||
{# Preset Theme #}
|
||||
@@ -49,6 +47,3 @@
|
||||
<link rel="stylesheet" href="/dist/styles/webawesome.css" />
|
||||
<link id="color-stylesheet" rel="stylesheet" href="/dist/styles/utilities.css" />
|
||||
<link rel="stylesheet" href="/dist/styles/forms.css" />
|
||||
|
||||
{# Used by Web Awesome App to inject other assets into the head. #}
|
||||
{% server "head" %}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<a href="{{ page.url }}"{{ page.data.keywords | attr('data-keywords') }}>
|
||||
<wa-card with-header>
|
||||
<div slot="header">
|
||||
{% include "svgs/" + (page.data.icon or "thumbnail-placeholder") + ".njk" ignore missing %}
|
||||
{% include "svgs/" + (page.data.icon or "thumbnail-placeholder") + ".njk" %}
|
||||
</div>
|
||||
<span class="page-name">{{ page.data.title }}</span>
|
||||
{% if pageSubtitle -%}
|
||||
|
||||
@@ -1,12 +1,9 @@
|
||||
{# Some collections (like "patterns") will not have any items in the alpha build for example. So this checks to make sure the collection exists. #}
|
||||
{% if collections[tag] -%}
|
||||
{% set groupUrl %}/docs/{{ tag }}/{% endset %}
|
||||
{% set groupItem = groupUrl | getCollectionItemFromUrl %}
|
||||
{% set children = groupItem.data.children if groupItem.data.children.length > 0 else (collections[tag] | sort) %}
|
||||
|
||||
<wa-details {{ ((tag in (tags or [])) or (groupUrl in page.url)) | attr('open') }}>
|
||||
<h2 slot="summary">
|
||||
{% if groupItem %}
|
||||
{% if groupUrl | getCollectionItemFromUrl %}
|
||||
<a href="{{ groupUrl }}" title="Overview">{{ title or (tag | capitalize) }}
|
||||
<wa-icon name="grid-2"></wa-icon>
|
||||
</a>
|
||||
@@ -15,8 +12,10 @@
|
||||
{% endif %}
|
||||
</h2>
|
||||
<ul>
|
||||
{% for page in children %}
|
||||
{% for page in collections[tag] | sort %}
|
||||
{% if not page.data.parent -%}
|
||||
{% include 'sidebar-link.njk' %}
|
||||
{%- endif %}
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</wa-details>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{% if page | show -%}
|
||||
{% if not (isAlpha and page.data.noAlpha) and page.fileSlug != tag and not page.data.unlisted -%}
|
||||
<li>
|
||||
<a href="{{ page.url }}">{{ page.data.title }}</a>
|
||||
{% if page.data.status == 'experimental' %}<wa-icon name="flask"></wa-icon>{% endif %}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{# Getting started #}
|
||||
<h2>Getting Started</h2>
|
||||
<ul>
|
||||
<li><a href="/docs/">Installation</a></li>
|
||||
<li><a href="/docs/installation">Installation</a></li>
|
||||
<li><a href="/docs/usage">Usage</a></li>
|
||||
<li><a href="/docs/customizing">Customizing</a></li>
|
||||
<li><a href="/docs/form-controls">Form Controls</a></li>
|
||||
|
||||
@@ -1,20 +1,31 @@
|
||||
{% set paletteId = palette.fileSlug or page.fileSlug %}
|
||||
{% set suffixes = ['-80', '', '-20'] %}
|
||||
{% set width = 20 %}
|
||||
{% set height = 12 %}
|
||||
{% set height_core = 20 %}
|
||||
{% set gap_x = 4 %}
|
||||
{% set gap_y = 4 %}
|
||||
|
||||
<wa-scoped class="palette-icon-host">
|
||||
<template>
|
||||
<link rel="stylesheet" href="/dist/styles/color/{{ paletteId }}.css">
|
||||
<link rel="stylesheet" href="/assets/styles/theme-icons.css">
|
||||
{% set total_width = (width + gap_x) * hues|length %}
|
||||
{% set total_height = (height + gap_y) * suffixes|length + (height_core - height) %}
|
||||
<svg viewBox="0 0 {{ total_width }} {{ total_height }}" fill="none" xmlns="http://www.w3.org/2000/svg" class="wa-palette-{{ paletteId }} palette-icon">
|
||||
<style>
|
||||
@import url('/dist/styles/color/{{ paletteId }}.css') layer(palette.{{ paletteId }});
|
||||
.palette-icon {
|
||||
height: 8ch;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="palette-icon" style="--hues: {{ hues|length }}; --suffixes: {{ suffixes|length }}">
|
||||
{% for hue in hues -%}
|
||||
{% set hueIndex = loop.index %}
|
||||
{% for suffix in suffixes -%}
|
||||
<div class="swatch"
|
||||
data-hue="{{ hue }}" data-suffix="{{ suffix }}"
|
||||
style="--color: var(--wa-color-{{ hue }}{{ suffix }}); grid-column: {{ hueIndex }}; grid-row: {{ loop.index }}"> </div>
|
||||
{%- endfor %}
|
||||
{%- endfor %}
|
||||
</div>
|
||||
</template>
|
||||
</wa-scoped>
|
||||
{% for hue in hues -%}
|
||||
{% set hueIndex = loop.index0 %}
|
||||
{% set y = 0 %}
|
||||
{% for suffix in suffixes -%}
|
||||
{% set swatch_height = height if suffix else height_core %}
|
||||
|
||||
<rect x="{{ hueIndex * (width + gap_x) }}" y="{{ y }}"
|
||||
width="{{ width }}" height="{{ swatch_height }}"
|
||||
fill="var(--wa-color-{{ hue }}{{ suffix }})" rx="2" />
|
||||
{% set y = y + swatch_height + gap_y %}
|
||||
{%- endfor %}
|
||||
{% endfor %}
|
||||
</svg>
|
||||
|
||||
10
docs/_includes/svgs/preview.njk
Normal file
10
docs/_includes/svgs/preview.njk
Normal file
@@ -0,0 +1,10 @@
|
||||
<svg width="120" height="87" viewBox="0 0 240 178" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect y="39" width="67" height="63" rx="12" fill="#D9D9D9"/>
|
||||
<rect y="115" width="67" height="63" rx="12" fill="#D9D9D9"/>
|
||||
<rect width="67" height="19" rx="6" fill="#D9D9D9"/>
|
||||
<rect x="87" y="39" width="67" height="63" rx="12" fill="#D9D9D9"/>
|
||||
<rect x="174" y="39" width="67" height="63" rx="12" fill="#D9D9D9"/>
|
||||
<rect x="174" y="7" width="67" height="4.75" rx="2.375" fill="#D9D9D9"/>
|
||||
<rect x="87" y="115" width="67" height="63" rx="12" fill="#D9D9D9"/>
|
||||
<rect x="174" y="115" width="67" height="63" rx="12" fill="#D9D9D9"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 631 B |
@@ -1,13 +1,13 @@
|
||||
{% set themeId = theme.fileSlug %}
|
||||
|
||||
<wa-scoped class="theme-icon-host theme-color-icon-host">
|
||||
<template>
|
||||
<div>
|
||||
<template shadowrootmode="open">
|
||||
<link rel="stylesheet" href="/dist/styles/utilities.css">
|
||||
<link rel="stylesheet" href="/dist/styles/themes/{{ page.fileSlug or 'default' }}.css">
|
||||
<link rel="stylesheet" href="/dist/styles/themes/{{ themeId }}/color.css">
|
||||
<link rel="stylesheet" href="/assets/styles/theme-icons.css">
|
||||
|
||||
<div class="theme-icon theme-color-icon wa-theme-{{ themeId }}">
|
||||
<div class="theme-color-icon wa-theme-{{ themeId }}">
|
||||
<div class="wa-brand wa-accent">A</div>
|
||||
<div class="wa-brand wa-outlined">A</div>
|
||||
<div class="wa-brand wa-filled">A</div>
|
||||
@@ -21,4 +21,4 @@
|
||||
{# <div class="wa-warning wa-outlined wa-filled"><wa-icon slot="icon" name="triangle-exclamation" variant="regular"></wa-icon></div> #}
|
||||
</div>
|
||||
</template>
|
||||
</wa-scoped>
|
||||
</div>
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
{% set themeId = theme.fileSlug or page.fileSlug %}
|
||||
{% set themeId = theme.fileSlug %}
|
||||
|
||||
<wa-scoped class="theme-icon-host theme-typography-icon-host">
|
||||
<template>
|
||||
<div>
|
||||
<template shadowrootmode="open">
|
||||
<link rel="stylesheet" href="/dist/styles/native/content.css">
|
||||
<link rel="stylesheet" href="/dist/styles/native/blockquote.css">
|
||||
<link rel="stylesheet" href="/dist/styles/themes/{{ page.fileSlug or 'default' }}.css">
|
||||
<link rel="stylesheet" href="/dist/styles/themes/{{ themeId }}/typography.css">
|
||||
<link rel="stylesheet" href="/assets/styles/theme-icons.css">
|
||||
|
||||
<div class="theme-icon theme-typography-icon wa-theme-{{ themeId }}" data-no-outline data-no-anchor role="presentation">
|
||||
<div class="theme-typography-icon wa-theme-{{ themeId }}" data-no-outline data-no-anchor role="presentation">
|
||||
<h3>Title</h3>
|
||||
<p>Body text</p>
|
||||
</div>
|
||||
</template>
|
||||
</wa-scoped>
|
||||
</div>
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
{% set themeId = theme.fileSlug or page.fileSlug %}
|
||||
|
||||
|
||||
<wa-scoped class="theme-icon-host theme-overall-icon-host">
|
||||
<template>
|
||||
<link rel="stylesheet" href="/dist/styles/utilities.css">
|
||||
<link rel="stylesheet" href="/dist/styles/native/content.css">
|
||||
<link rel="stylesheet" href="/dist/styles/themes/{{ themeId }}.css">
|
||||
<link rel="stylesheet" href="/assets/styles/theme-icons.css">
|
||||
|
||||
<div class="theme-icon theme-overall-icon" role="presentation" data-no-anchor data-no-outline>
|
||||
<div class="row row-1">
|
||||
<h2>Aa</h2>
|
||||
<div class="swatches">
|
||||
<div class="wa-brand"></div>
|
||||
|
||||
<div class="wa-success"></div>
|
||||
<div class="wa-warning"></div>
|
||||
<div class="wa-danger"></div>
|
||||
<div class="wa-neutral"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row row-2">
|
||||
<wa-input value="Input" size="small" inert></wa-input>
|
||||
<wa-button size="small" variant="brand" inert>Go</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</wa-scoped>
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
layout: page-outline
|
||||
tags: ["overview"]
|
||||
---
|
||||
{% set forTag = forTag or (page.url | split('/') | last) %}
|
||||
{% if description %}
|
||||
@@ -12,10 +13,8 @@ layout: page-outline
|
||||
</wa-input>
|
||||
</div>
|
||||
|
||||
{% set allPages = allPages or collections[forTag] %}
|
||||
{% if allPages and allPages.length > 0 %}
|
||||
{% set allPages = collections[forTag] %}
|
||||
{% include "grouped-pages.njk" %}
|
||||
{% endif %}
|
||||
|
||||
<link href="/assets/styles/filter.css" rel="stylesheet">
|
||||
<script type="module" src="/assets/scripts/filter.js"></script>
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
{% if hasSidebar == undefined %}
|
||||
{% set hasSidebar = true %}
|
||||
{% endif %}
|
||||
|
||||
{% if hasOutline == undefined %}
|
||||
{% set hasOutline = false %}
|
||||
{% endif %}
|
||||
{% set hasSidebar = true %}
|
||||
{% set hasOutline = false %}
|
||||
|
||||
{% extends "../_includes/base.njk" %}
|
||||
|
||||
5
docs/_layouts/patterns.njk
Normal file
5
docs/_layouts/patterns.njk
Normal file
@@ -0,0 +1,5 @@
|
||||
{% extends '../_layouts/block.njk' %}
|
||||
|
||||
{% block head %}
|
||||
<link href="{{ page.url }}../patterns.css" rel="stylesheet">
|
||||
{% endblock %}
|
||||
@@ -68,7 +68,7 @@ wa_data.palettes = {
|
||||
<wa-option label="{{ palette.data.title }}" value="{{ palette.fileSlug if not currentPalette }}" {{ (palette.fileSlug if currentPalette) | attr('data-id') }}>
|
||||
<wa-card with-header>
|
||||
<div slot="header">
|
||||
{% include "svgs/" + (palette.data.icon or "thumbnail-placeholder") + ".njk" ignore missing %}
|
||||
{% include "svgs/" + (palette.data.icon or "thumbnail-placeholder") + ".njk" %}
|
||||
</div>
|
||||
<span class="page-name">
|
||||
{{ palette.data.title }}
|
||||
|
||||
@@ -29,9 +29,6 @@ function getCollection(name) {
|
||||
}
|
||||
|
||||
export function getCollectionItemFromUrl(url, collection) {
|
||||
if (!url) {
|
||||
return null;
|
||||
}
|
||||
collection ??= getCollection.call(this, 'all') || [];
|
||||
return collection.find(item => item.url === url);
|
||||
}
|
||||
@@ -45,33 +42,35 @@ export function split(text, separator) {
|
||||
return (text + '').split(separator).filter(Boolean);
|
||||
}
|
||||
|
||||
export function ancestors(url, { withCurrent = false, withRoot = false } = {}) {
|
||||
let ret = [];
|
||||
let currentUrl = url;
|
||||
let currentItem = getCollectionItemFromUrl.call(this, url);
|
||||
export function breadcrumbs(url, { withCurrent = false } = {}) {
|
||||
const parts = split(url, '/');
|
||||
const ret = [];
|
||||
|
||||
if (!currentItem) {
|
||||
// Might have eleventyExcludeFromCollections, jump to parent
|
||||
let parentUrl = this.ctx.parentUrl;
|
||||
if (parentUrl) {
|
||||
url = parentUrl;
|
||||
while (parts.length) {
|
||||
let partialUrl = '/' + parts.join('/') + '/';
|
||||
let item = getCollectionItemFromUrl.call(this, partialUrl);
|
||||
|
||||
if (item && (partialUrl !== url || withCurrent)) {
|
||||
let title = item.data.title;
|
||||
if (title) {
|
||||
ret.unshift({ url: partialUrl, title });
|
||||
}
|
||||
}
|
||||
|
||||
parts.pop();
|
||||
|
||||
if (item?.data.parent) {
|
||||
let parentURL = item.data.parent;
|
||||
if (!item.data.parent.startsWith('/')) {
|
||||
// Parent is in the same directory
|
||||
parts.push(item.data.parent);
|
||||
parentURL = '/' + parts.join('/') + '/';
|
||||
}
|
||||
|
||||
let parentBreadcrumbs = breadcrumbs.call(this, parentURL, { withCurrent: true });
|
||||
return [...parentBreadcrumbs, ...ret];
|
||||
}
|
||||
}
|
||||
|
||||
for (let item; (item = getCollectionItemFromUrl.call(this, url)); url = item.data.parentUrl) {
|
||||
ret.unshift(item);
|
||||
}
|
||||
|
||||
if (!withRoot && ret[0]?.page.url === '/') {
|
||||
// Remove root
|
||||
ret.shift();
|
||||
}
|
||||
|
||||
if (!withCurrent && ret.at(-1)?.page.url === currentUrl) {
|
||||
// Remove current page
|
||||
ret.pop();
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -178,196 +177,72 @@ export function sort(arr, by = { 'data.order': 1, 'data.title': '' }) {
|
||||
});
|
||||
}
|
||||
|
||||
export function show(page) {
|
||||
return !(page.data.noAlpha && page.data.isAlpha) && !page.data.unlisted;
|
||||
}
|
||||
|
||||
/**
|
||||
* Group an 11ty collection (or any array of objects with a `data.tags` property) by certain tags.
|
||||
* @param {object[]} collection
|
||||
* @param { Object<string, string> | string[]} [options] Options object or array of tags to group by.
|
||||
* @param {string[] | true} [options.tags] Tags to group by. If true, groups by all tags.
|
||||
* If not provided/empty, defaults to grouping by page hierarchy, with any pages with more than 1 children becoming groups.
|
||||
* @param {string[]} [options.groups] The groups to use if only a subset or a specific order is desired. Defaults to `options.tags`.
|
||||
* @param {string[]} [options.titles] Any title overrides for groups.
|
||||
* @param {string | false} [options.other="Other"] The title to use for the "Other" group. If `false`, the "Other" group is removed..
|
||||
* @returns { Object.<string, object[]> } An object of group ids to arrays of page objects.
|
||||
* @param { Object<string, string> | (string | Object<string, string>)[]} [tags] The tags to group by. If not provided/empty, defaults to grouping by all tags.
|
||||
* @returns { Object.<string, object[]> } An object with keys for each tag, and an array of items for each tag.
|
||||
*/
|
||||
export function groupPages(collection, options = {}, page) {
|
||||
export function groupByTags(collection, tags) {
|
||||
if (!collection) {
|
||||
console.error(`Empty collection passed to groupPages() to group by ${JSON.stringify(options)}`);
|
||||
console.error(`Empty collection passed to groupByTags() to group by ${JSON.stringify(tags)}`);
|
||||
}
|
||||
if (!tags) {
|
||||
// Default to grouping by union of all tags
|
||||
tags = Array.from(new Set(collection.flatMap(item => item.data.tags)));
|
||||
} else if (Array.isArray(tags)) {
|
||||
// May contain objects of one-off tag -> label mappings
|
||||
tags = tags.map(tag => (typeof tag === 'object' ? Object.keys(tag)[0] : tag));
|
||||
} else if (typeof tags === 'object') {
|
||||
// tags is an object of tags to labels, so we just want the keys
|
||||
tags = Object.keys(tags);
|
||||
}
|
||||
|
||||
if (Array.isArray(options)) {
|
||||
options = { tags: options };
|
||||
}
|
||||
|
||||
let { tags, groups, titles = {}, other = 'Other', filter = show } = options;
|
||||
|
||||
if (groups === undefined && Array.isArray(tags)) {
|
||||
groups = tags;
|
||||
}
|
||||
|
||||
let grouping;
|
||||
|
||||
if (tags) {
|
||||
grouping = {
|
||||
isGroup: item => undefined,
|
||||
getCandidateGroups: item => item.data.tags,
|
||||
getGroupMeta: group => ({}),
|
||||
};
|
||||
} else {
|
||||
grouping = {
|
||||
isGroup: item => (item.data.children.length >= 2 ? item.page.url : undefined),
|
||||
getCandidateGroups: item => {
|
||||
let parentUrl = item.data.parentUrl;
|
||||
if (page?.url === parentUrl) {
|
||||
return [];
|
||||
}
|
||||
return [parentUrl];
|
||||
},
|
||||
getGroupMeta: group => {
|
||||
let item = byUrl[group] || getCollectionItemFromUrl.call(this, group);
|
||||
return {
|
||||
title: item?.data.title,
|
||||
url: group,
|
||||
item,
|
||||
};
|
||||
},
|
||||
sortGroups: groups => sort(groups.map(url => byUrl[url]).filter(Boolean)).map(item => item.page.url),
|
||||
};
|
||||
}
|
||||
|
||||
let byUrl = {};
|
||||
let byParentUrl = {};
|
||||
|
||||
if (filter) {
|
||||
collection = collection.filter(filter);
|
||||
}
|
||||
let ret = Object.fromEntries(tags.map(tag => [tag, []]));
|
||||
ret.other = [];
|
||||
|
||||
for (let item of collection) {
|
||||
let url = item.page.url;
|
||||
let parentUrl = item.data.parentUrl;
|
||||
let categorized = false;
|
||||
|
||||
byUrl[url] = item;
|
||||
|
||||
if (parentUrl) {
|
||||
byParentUrl[parentUrl] ??= [];
|
||||
byParentUrl[parentUrl].push(item);
|
||||
}
|
||||
}
|
||||
|
||||
let urlToGroups = {};
|
||||
|
||||
for (let item of collection) {
|
||||
let url = item.page.url;
|
||||
let parentUrl = item.data.parentUrl;
|
||||
|
||||
if (grouping.isGroup(item)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
let parentItem = byUrl[parentUrl];
|
||||
if (parentItem && !grouping.isGroup(parentItem)) {
|
||||
// Their parent is also here and is not a group
|
||||
continue;
|
||||
}
|
||||
|
||||
let candidateGroups = grouping.getCandidateGroups(item);
|
||||
|
||||
if (groups) {
|
||||
candidateGroups = candidateGroups.filter(group => groups.includes(group));
|
||||
}
|
||||
|
||||
urlToGroups[url] ??= [];
|
||||
|
||||
for (let group of candidateGroups) {
|
||||
urlToGroups[url].push(group);
|
||||
}
|
||||
}
|
||||
|
||||
let ret = {};
|
||||
|
||||
for (let url in urlToGroups) {
|
||||
let groups = urlToGroups[url];
|
||||
let item = byUrl[url];
|
||||
|
||||
if (groups.length === 0) {
|
||||
// Not filtered out but also not categorized
|
||||
groups = ['other'];
|
||||
}
|
||||
|
||||
for (let group of groups) {
|
||||
ret[group] ??= [];
|
||||
ret[group].push(item);
|
||||
|
||||
if (!ret[group].meta) {
|
||||
if (group === 'other') {
|
||||
ret[group].meta = { title: other };
|
||||
} else {
|
||||
ret[group].meta = grouping.getGroupMeta(group);
|
||||
ret[group].meta.title = titles[group] ?? ret[group].meta.title ?? capitalize(group);
|
||||
}
|
||||
for (let tag of tags) {
|
||||
if (item.data.tags.includes(tag)) {
|
||||
ret[tag].push(item);
|
||||
categorized = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (other === false) {
|
||||
delete ret.other;
|
||||
}
|
||||
|
||||
// Sort
|
||||
let sortedGroups = groups ?? grouping.sortGroups?.(Object.keys(ret));
|
||||
|
||||
if (sortedGroups) {
|
||||
ret = sortObject(ret, sortedGroups);
|
||||
} else {
|
||||
// At least make sure other is last
|
||||
if (ret.other) {
|
||||
let otherGroup = ret.other;
|
||||
delete ret.other;
|
||||
ret.other = otherGroup;
|
||||
if (!categorized) {
|
||||
ret.other.push(item);
|
||||
}
|
||||
}
|
||||
|
||||
Object.defineProperty(ret, 'meta', {
|
||||
value: {
|
||||
groupCount: Object.keys(ret).length,
|
||||
},
|
||||
enumerable: false,
|
||||
});
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sort an object by its keys
|
||||
* @param {*} obj
|
||||
* @param {function | string[]} order
|
||||
*/
|
||||
function sortObject(obj, order) {
|
||||
let ret = {};
|
||||
let sortedKeys = Array.isArray(order) ? order : Object.keys(obj).sort(order);
|
||||
|
||||
for (let key of sortedKeys) {
|
||||
if (key in obj) {
|
||||
ret[key] = obj[key];
|
||||
}
|
||||
}
|
||||
|
||||
// Add any keys that weren't in the order
|
||||
for (let key in obj) {
|
||||
if (!(key in ret)) {
|
||||
ret[key] = obj[key];
|
||||
// Remove empty categories
|
||||
for (let category in ret) {
|
||||
if (ret[category].length === 0) {
|
||||
delete ret[category];
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
function capitalize(str) {
|
||||
str += '';
|
||||
return str.charAt(0).toUpperCase() + str.slice(1);
|
||||
export function getCategoryTitle(category, categories) {
|
||||
let title;
|
||||
if (Array.isArray(categories)) {
|
||||
// Find relevant entry
|
||||
// [{id: "Title"}, id2, ...]
|
||||
title = categories.find(entry => typeof entry === 'object' && entry?.[category])?.[category];
|
||||
} else if (typeof categories === 'object') {
|
||||
// {id: "Title", id2: "Title 2", ...}
|
||||
title = categories[category];
|
||||
}
|
||||
|
||||
if (title) {
|
||||
return title;
|
||||
}
|
||||
|
||||
// Capitalized
|
||||
return category.charAt(0).toUpperCase() + category.slice(1);
|
||||
}
|
||||
|
||||
const IDENTITY = x => x;
|
||||
|
||||
@@ -39,7 +39,7 @@ export function outlinePlugin(options = {}) {
|
||||
}
|
||||
|
||||
// Create a clone of the heading so we can remove links and [data-no-outline] elements from the text content
|
||||
clone.querySelectorAll('.wa-visually-hidden, [hidden], [aria-hidden="true"]').forEach(el => el.remove());
|
||||
clone.querySelectorAll('a').forEach(a => a.remove());
|
||||
clone.querySelectorAll('[data-no-outline]').forEach(el => el.remove());
|
||||
|
||||
// Generate the link
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
import { mkdir, writeFile } from 'fs/promises';
|
||||
import lunr from 'lunr';
|
||||
import { parse } from 'node-html-parser';
|
||||
import * as path from 'path';
|
||||
import { dirname, join } from 'path';
|
||||
|
||||
function collapseWhitespace(string) {
|
||||
@@ -53,9 +52,8 @@ export function searchPlugin(options = {}) {
|
||||
return content;
|
||||
});
|
||||
|
||||
eleventyConfig.on('eleventy.after', ({ directories }) => {
|
||||
const { output } = directories;
|
||||
const outputFilename = path.resolve(join(output, 'search.json'));
|
||||
eleventyConfig.on('eleventy.after', ({ dir }) => {
|
||||
const outputFilename = join(dir.output, 'search.json');
|
||||
const map = [];
|
||||
const searchIndex = lunr(async function () {
|
||||
let index = 0;
|
||||
|
||||
@@ -1,171 +0,0 @@
|
||||
/**
|
||||
* Low-level utility to encapsulate a bit of HTML (mainly to apply certain stylesheets to it without them leaking to the rest of the page)
|
||||
* Usage: <wa-scoped><template><!-- your HTML here --></template></wa-scoped>
|
||||
*/
|
||||
import { discover } from '/dist/webawesome.js';
|
||||
|
||||
const imports = new Set();
|
||||
const fontFaceRules = new Set();
|
||||
|
||||
export default class WaScoped extends HTMLElement {
|
||||
constructor() {
|
||||
super();
|
||||
this.attachShadow({ mode: 'open' });
|
||||
|
||||
this.observer = new MutationObserver(() => this.render());
|
||||
this.observer.observe(this, { childList: true, subtree: true, characterData: true });
|
||||
}
|
||||
|
||||
connectedCallback() {
|
||||
this.render();
|
||||
this.ownerDocument.documentElement.addEventListener('wa-color-scheme-change', e =>
|
||||
this.#applyDarkMode(e.detail.dark),
|
||||
);
|
||||
}
|
||||
|
||||
render() {
|
||||
this.observer.takeRecords();
|
||||
this.observer.disconnect();
|
||||
|
||||
this.shadowRoot.innerHTML = '';
|
||||
|
||||
// To avoid mutating this.childNodes while iterating over it
|
||||
let nodes = [];
|
||||
|
||||
for (let template of this.childNodes) {
|
||||
// Other solutions we can try if needed: <script type="text/html">, or comment nodes
|
||||
if (template instanceof HTMLTemplateElement) {
|
||||
if (template.content.childNodes.length > 0) {
|
||||
nodes.push(template.content.cloneNode(true));
|
||||
} else if (template.childNodes.length > 0) {
|
||||
// Fake template, suck its children out of the light DOM
|
||||
nodes.push(...template.childNodes);
|
||||
}
|
||||
} else {
|
||||
// Regular child, suck it out of the light DOM
|
||||
nodes.push(template);
|
||||
}
|
||||
}
|
||||
|
||||
this.shadowRoot.append(...nodes);
|
||||
|
||||
this.#fixStyles();
|
||||
this.#applyDarkMode();
|
||||
|
||||
discover(this.shadowRoot);
|
||||
|
||||
this.observer.observe(this, { childList: true, subtree: true, characterData: true });
|
||||
}
|
||||
|
||||
#applyDarkMode(isDark = getComputedStyle(this).colorScheme === 'dark') {
|
||||
// Hack to make dark mode work
|
||||
// NOTE If any child nodes actually have .wa-dark, this will override it
|
||||
for (let node of this.shadowRoot.children) {
|
||||
node.classList.toggle('wa-dark', isDark);
|
||||
}
|
||||
this.classList.toggle('wa-dark', isDark);
|
||||
}
|
||||
|
||||
/**
|
||||
* @font-face does not work in shadow DOM in Chrome & FF, as of March 2025 https://issues.chromium.org/issues/41085401
|
||||
* This works around this issue by traversing the shadow DOM CSS looking
|
||||
* for @font-face rules or CSS imports to known font providers and copies them to the main document
|
||||
*/
|
||||
async #fixStyles() {
|
||||
let styleElements = [...this.shadowRoot.querySelectorAll('link[rel="stylesheet"], style')];
|
||||
|
||||
let loadStates = styleElements.map(element => {
|
||||
try {
|
||||
if (element.sheet?.cssRules) {
|
||||
// Already loaded
|
||||
return Promise.resolve(element.sheet);
|
||||
}
|
||||
} catch (e) {
|
||||
// CORS
|
||||
return Promise.resolve(null);
|
||||
}
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
element.addEventListener('load', e => resolve(element.sheet));
|
||||
element.addEventListener('error', e => reject(null));
|
||||
});
|
||||
});
|
||||
|
||||
await Promise.allSettled(loadStates);
|
||||
|
||||
let fontRules = findFontFaceRules(...this.shadowRoot.styleSheets);
|
||||
|
||||
if (!fontRules.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
let doc = this.ownerDocument;
|
||||
// Why not adoptedStyleSheets? Can't have @import in those yet
|
||||
let id = `wa-scoped-hoisted-fonts`;
|
||||
let style = doc.head.querySelector('style#' + id);
|
||||
if (!style) {
|
||||
style = Object.assign(doc.createElement('style'), { id, textContent: ' ' });
|
||||
doc.head.append(style);
|
||||
}
|
||||
let sheet = style.sheet;
|
||||
|
||||
for (let rule of fontRules) {
|
||||
let cssText = rule.cssText;
|
||||
if (rule.type === CSSRule.FONT_FACE_RULE) {
|
||||
if (fontFaceRules.has(cssText)) {
|
||||
continue;
|
||||
}
|
||||
fontFaceRules.add(cssText);
|
||||
sheet.insertRule(cssText);
|
||||
} else if (rule.type === CSSRule.IMPORT_RULE) {
|
||||
if (imports.has(rule.href)) {
|
||||
continue;
|
||||
}
|
||||
imports.add(rule.href);
|
||||
sheet.insertRule(cssText, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static observedAttributes = [];
|
||||
}
|
||||
|
||||
customElements.define('wa-scoped', WaScoped);
|
||||
|
||||
export const WEB_FONT_HOSTS = [
|
||||
'fonts.googleapis.com',
|
||||
'fonts.gstatic.com',
|
||||
'use.typekit.net',
|
||||
'fonts.adobe.com',
|
||||
'kit.fontawesome.com',
|
||||
'pro.fontawesome.com',
|
||||
'cdn.materialdesignicons.com',
|
||||
];
|
||||
|
||||
function findFontFaceRules(...stylesheets) {
|
||||
let ret = [];
|
||||
|
||||
for (let sheet of stylesheets) {
|
||||
let rules;
|
||||
try {
|
||||
rules = sheet.cssRules;
|
||||
} catch (e) {
|
||||
// CORS
|
||||
continue;
|
||||
}
|
||||
|
||||
for (let rule of rules) {
|
||||
if (rule.type === CSSRule.FONT_FACE_RULE) {
|
||||
ret.push(rule);
|
||||
} else if (rule.type === CSSRule.IMPORT_RULE) {
|
||||
if (WEB_FONT_HOSTS.some(host => rule.href.includes(host))) {
|
||||
ret.push(rule);
|
||||
} else if (rule.styleSheet) {
|
||||
ret.push(...findFontFaceRules(rule.styleSheet));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -17,7 +17,7 @@ document.addEventListener('click', event => {
|
||||
const code = codeExample.querySelector('code');
|
||||
const cdnUrl = document.documentElement.dataset.cdnUrl;
|
||||
const html =
|
||||
`<script data-fa-kit-code="b10bfbde90" type="module" src="${cdnUrl}webawesome.loader.js"></script>\n` +
|
||||
`<script type="module" src="${cdnUrl}webawesome.loader.js"></script>\n` +
|
||||
`<link rel="stylesheet" href="${cdnUrl}styles/themes/default.css">\n` +
|
||||
`<link rel="stylesheet" href="${cdnUrl}styles/webawesome.css">\n` +
|
||||
`<link rel="stylesheet" href="${cdnUrl}styles/utilities.css">\n\n` +
|
||||
|
||||
@@ -1,11 +1,3 @@
|
||||
function debounce(func, wait) {
|
||||
let timeout;
|
||||
return function (...args) {
|
||||
clearTimeout(timeout);
|
||||
timeout = setTimeout(() => func.apply(this, args), wait);
|
||||
};
|
||||
}
|
||||
|
||||
function updateResults(input) {
|
||||
const filter = input.value.toLowerCase().trim();
|
||||
let filtered = Boolean(filter);
|
||||
@@ -26,10 +18,8 @@ function updateResults(input) {
|
||||
}
|
||||
}
|
||||
|
||||
const debouncedUpdateResults = debounce(updateResults, 300);
|
||||
|
||||
document.documentElement.addEventListener('input', e => {
|
||||
if (e.target?.matches('#block-filter wa-input')) {
|
||||
debouncedUpdateResults(e.target);
|
||||
updateResults(e.target);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -1,32 +1,12 @@
|
||||
let initialPageLoadComplete = document.readyState === 'complete';
|
||||
|
||||
if (!initialPageLoadComplete) {
|
||||
window.addEventListener('load', () => {
|
||||
initialPageLoadComplete = true;
|
||||
});
|
||||
}
|
||||
|
||||
// Helper for view transitions
|
||||
export function domChange(fn, { behavior = 'smooth', ignoreInitialLoad = true } = {}) {
|
||||
export function domChange(fn, { behavior = 'smooth' } = {}) {
|
||||
const canUseViewTransitions =
|
||||
document.startViewTransition && !window.matchMedia('(prefers-reduced-motion: reduce)').matches;
|
||||
|
||||
// Skip transitions on initial page load
|
||||
if (!initialPageLoadComplete && ignoreInitialLoad) {
|
||||
fn(false);
|
||||
return null;
|
||||
}
|
||||
|
||||
if (canUseViewTransitions && behavior === 'smooth') {
|
||||
const transition = document.startViewTransition(() => {
|
||||
fn(true);
|
||||
// Wait a brief delay before finishing the transition to prevent jumpiness
|
||||
return new Promise(resolve => setTimeout(resolve, 200));
|
||||
});
|
||||
return transition;
|
||||
document.startViewTransition(fn);
|
||||
} else {
|
||||
fn(false);
|
||||
return null;
|
||||
fn(true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -120,7 +100,6 @@ const colorScheme = new ThemeAspect({
|
||||
domChange(() => {
|
||||
let dark = this.computedValue === 'dark';
|
||||
document.documentElement.classList.toggle(`wa-dark`, dark);
|
||||
document.documentElement.dispatchEvent(new CustomEvent('wa-color-scheme-change', { detail: { dark } }));
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
import 'https://cdn.jsdelivr.net/npm/@hotwired/turbo@8.0.10/+esm';
|
||||
import { preventTurboFouce } from '/dist/webawesome.js';
|
||||
|
||||
if (!window.___turboScrollPositions___) {
|
||||
window.___turboScrollPositions___ = {};
|
||||
}
|
||||
@@ -73,4 +70,3 @@ function fixDSD(e) {
|
||||
window.addEventListener('turbo:before-cache', saveScrollPosition);
|
||||
window.addEventListener('turbo:before-render', restoreScrollPosition);
|
||||
window.addEventListener('turbo:render', restoreScrollPosition);
|
||||
preventTurboFouce();
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
@import 'outline.css';
|
||||
@import 'search.css';
|
||||
@import 'cera_typeface.css';
|
||||
@import 'theme-icons.css';
|
||||
|
||||
:root {
|
||||
--wa-brand-orange: #f36944;
|
||||
@@ -371,22 +370,10 @@ wa-page > main:has(> .index-grid) {
|
||||
|
||||
.index-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(4, 1fr);
|
||||
grid-template-columns: repeat(auto-fit, minmax(min(22ch, 100%), 1fr));
|
||||
gap: var(--wa-space-2xl);
|
||||
margin-block-end: var(--wa-space-3xl);
|
||||
|
||||
@media screen and (max-width: 1470px) {
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
}
|
||||
|
||||
@media screen and (max-width: 960px) {
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
}
|
||||
|
||||
@media screen and (max-width: 500px) {
|
||||
grid-template-columns: repeat(1, 1fr);
|
||||
}
|
||||
|
||||
a {
|
||||
border-radius: var(--wa-border-radius-l);
|
||||
text-decoration: none;
|
||||
@@ -413,6 +400,7 @@ wa-page > main:has(> .index-grid) {
|
||||
|
||||
&::part(header) {
|
||||
background-color: var(--header-background, var(--wa-color-neutral-fill-quiet));
|
||||
border-bottom: none;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
||||
@@ -7,9 +7,8 @@
|
||||
margin: 0 auto;
|
||||
overflow: hidden;
|
||||
|
||||
&::part(dialog) {
|
||||
margin-block-start: 10vh;
|
||||
margin-block-end: 0;
|
||||
&::part(base) {
|
||||
margin-block: 10rem;
|
||||
}
|
||||
|
||||
&::part(body) {
|
||||
@@ -24,20 +23,20 @@
|
||||
@media screen and (max-width: 900px) {
|
||||
max-width: calc(100% - 2rem);
|
||||
|
||||
&::part(dialog) {
|
||||
&::part(base) {
|
||||
margin-block: 1rem;
|
||||
}
|
||||
|
||||
#site-search-container {
|
||||
max-height: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#site-search-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
max-height: calc(100vh - 18rem);
|
||||
max-height: calc(100vh - 20rem);
|
||||
|
||||
@media screen and (max-width: 900px) {
|
||||
max-height: calc(100dvh - 2rem);
|
||||
}
|
||||
}
|
||||
|
||||
/* Header */
|
||||
|
||||
@@ -1,61 +1,3 @@
|
||||
wa-card:has(> .theme-icon-host, > [slot='header'] > .theme-icon-host) {
|
||||
&::part(header) {
|
||||
/* We want to add a background color, so any spacing needs to go on .theme-icon */
|
||||
flex: 1;
|
||||
padding: 0;
|
||||
min-block-size: 0;
|
||||
}
|
||||
|
||||
[slot='header'] {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.theme-icon-host,
|
||||
.palette-icon-host {
|
||||
flex: 1;
|
||||
border-radius: inherit;
|
||||
|
||||
&[slot='header'],
|
||||
[slot='header']:has(&) {
|
||||
flex: 1;
|
||||
border-radius: inherit;
|
||||
}
|
||||
}
|
||||
|
||||
.palette-icon {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(var(--hues, 9), 1fr);
|
||||
gap: var(--wa-space-3xs);
|
||||
min-width: 20ch;
|
||||
min-height: 9ch;
|
||||
align-content: center;
|
||||
|
||||
.swatch {
|
||||
height: 0.7em;
|
||||
background: var(--color);
|
||||
border-radius: var(--wa-border-radius-s);
|
||||
|
||||
&[data-suffix=''] {
|
||||
height: 1.1em;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.theme-icon {
|
||||
min-width: 18ch;
|
||||
padding: var(--wa-space-xs) var(--wa-space-m);
|
||||
border-radius: inherit;
|
||||
box-sizing: border-box;
|
||||
|
||||
h2,
|
||||
h3,
|
||||
p {
|
||||
margin-block: 0;
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.theme-color-icon {
|
||||
display: grid;
|
||||
gap: var(--wa-space-xs);
|
||||
@@ -83,50 +25,10 @@ wa-card:has(> .theme-icon-host, > [slot='header'] > .theme-icon-host) {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--wa-space-xs);
|
||||
}
|
||||
|
||||
.theme-overall-icon {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
gap: var(--wa-space-xs);
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
min-height: 7.5rem;
|
||||
box-sizing: border-box;
|
||||
background: var(--wa-color-surface-lowered);
|
||||
|
||||
.row {
|
||||
display: flex;
|
||||
gap: var(--wa-space-xs);
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.row-2 {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr auto;
|
||||
contain: inline-size;
|
||||
width: 100%;
|
||||
|
||||
wa-input {
|
||||
min-width: 1em;
|
||||
}
|
||||
}
|
||||
|
||||
.swatches {
|
||||
display: flex;
|
||||
gap: var(--wa-space-3xs);
|
||||
|
||||
> div {
|
||||
width: 1.25rem;
|
||||
height: 1.25rem;
|
||||
border-radius: var(--wa-border-radius-s);
|
||||
background: var(--wa-color-fill-loud);
|
||||
color: var(--wa-color-on-loud);
|
||||
|
||||
&.wa-brand {
|
||||
width: 2.5rem;
|
||||
}
|
||||
}
|
||||
h3,
|
||||
p {
|
||||
margin-block: 0;
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,9 +15,9 @@ icon: card
|
||||
|
||||
<strong>Mittens</strong><br />
|
||||
This kitten is as cute as he is playful. Bring him home today!<br />
|
||||
<small class="wa-caption-m">6 weeks old</small>
|
||||
<small>6 weeks old</small>
|
||||
|
||||
<div slot="footer" class="wa-split">
|
||||
<div slot="footer">
|
||||
<wa-button variant="brand" pill>More Info</wa-button>
|
||||
<wa-rating label="Rating"></wa-rating>
|
||||
</div>
|
||||
@@ -27,6 +27,16 @@ icon: card
|
||||
.card-overview {
|
||||
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>
|
||||
```
|
||||
|
||||
@@ -55,9 +65,9 @@ If using SSR, you need to also use the `with-header` attribute to add a header t
|
||||
|
||||
```html {.example}
|
||||
<wa-card with-header class="card-header">
|
||||
<div slot="header" class="wa-split">
|
||||
<div slot="header">
|
||||
Header Title
|
||||
<wa-icon-button name="gear" variant="solid" label="Settings" class="wa-size-m"></wa-icon-button>
|
||||
<wa-icon-button name="gear" variant="solid" label="Settings"></wa-icon-button>
|
||||
</div>
|
||||
|
||||
This card has a header. You can put all sorts of things in it!
|
||||
@@ -68,9 +78,19 @@ If using SSR, you need to also use the `with-header` attribute to add a header t
|
||||
max-width: 300px;
|
||||
}
|
||||
|
||||
.card-header [slot='header'] {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.card-header h3 {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.card-header wa-icon-button {
|
||||
font-size: var(--wa-font-size-m);
|
||||
}
|
||||
</style>
|
||||
```
|
||||
|
||||
@@ -83,7 +103,7 @@ If using SSR, you need to also use the `with-footer` attribute to add a footer t
|
||||
<wa-card with-footer class="card-footer">
|
||||
This card has a footer. You can put all sorts of things in it!
|
||||
|
||||
<div slot="footer" class="wa-split">
|
||||
<div slot="footer">
|
||||
<wa-rating></wa-rating>
|
||||
<wa-button variant="brand">Preview</wa-button>
|
||||
</div>
|
||||
@@ -93,6 +113,12 @@ If using SSR, you need to also use the `with-footer` attribute to add a footer t
|
||||
.card-footer {
|
||||
max-width: 300px;
|
||||
}
|
||||
|
||||
.card-footer [slot='footer'] {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
</style>
|
||||
```
|
||||
|
||||
@@ -127,7 +153,7 @@ Use the `size` attribute to change a card's size.
|
||||
<wa-card with-footer size="small">
|
||||
This is a small card.
|
||||
|
||||
<footer slot="footer" class="wa-split">
|
||||
<footer slot="footer" class="wa-flank">
|
||||
<wa-button variant="brand" pill>More Info</wa-button>
|
||||
<wa-rating></wa-rating>
|
||||
</footer>
|
||||
@@ -136,7 +162,7 @@ Use the `size` attribute to change a card's size.
|
||||
<wa-card with-footer size="medium">
|
||||
This is a medium card (default).
|
||||
|
||||
<footer slot="footer" class="wa-split">
|
||||
<footer slot="footer" class="wa-flank">
|
||||
<wa-button variant="brand" pill>More Info</wa-button>
|
||||
<wa-rating></wa-rating>
|
||||
</footer>
|
||||
@@ -145,39 +171,14 @@ Use the `size` attribute to change a card's size.
|
||||
<wa-card with-footer size="large">
|
||||
This is a large card.
|
||||
|
||||
<footer slot="footer" class="wa-split">
|
||||
<footer slot="footer" class="wa-flank">
|
||||
<wa-button variant="brand" pill>More Info</wa-button>
|
||||
<wa-rating></wa-rating>
|
||||
</footer>
|
||||
</wa-card>
|
||||
</div>
|
||||
|
||||
```
|
||||
|
||||
### Appearance
|
||||
|
||||
Use the `appearance` attribute to change the card's visual appearance.
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-grid">
|
||||
<wa-card>
|
||||
<img
|
||||
slot="image"
|
||||
src="https://images.unsplash.com/photo-1559209172-0ff8f6d49ff7?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=500&q=80"
|
||||
alt="A kitten sits patiently between a terracotta pot and decorative grasses."
|
||||
/>
|
||||
<div slot="header">Outlined (default)</div>
|
||||
Card content.
|
||||
</wa-card>
|
||||
{% for appearance in ['outlined filled', 'outlined accent', 'plain', 'filled', 'accent'] -%}
|
||||
<wa-card appearance="{{ appearance }}">
|
||||
<img
|
||||
slot="image"
|
||||
src="https://images.unsplash.com/photo-1559209172-0ff8f6d49ff7?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=500&q=80"
|
||||
alt="A kitten sits patiently between a terracotta pot and decorative grasses."
|
||||
/>
|
||||
<div slot="header">{{ appearance | capitalize }}</div>
|
||||
Card content.
|
||||
</wa-card>
|
||||
{%- endfor %}
|
||||
</div>
|
||||
```
|
||||
<style>
|
||||
</style>
|
||||
|
||||
@@ -77,31 +77,6 @@ The details component automatically adapts to right-to-left languages:
|
||||
</wa-details>
|
||||
```
|
||||
|
||||
### Appearance
|
||||
|
||||
Use the `appearance` attribute to change the element’s visual appearance.
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-stack">
|
||||
<wa-details summary="Outlined (default)">
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
|
||||
aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
||||
</wa-details>
|
||||
<wa-details summary="Filled" appearance="filled">
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
|
||||
aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
||||
</wa-details>
|
||||
<wa-details summary="Filled + Outlined" appearance="filled outlined">
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
|
||||
aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
||||
</wa-details>
|
||||
<wa-details summary="Plain" appearance="plain">
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
|
||||
aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
||||
</wa-details>
|
||||
</div>
|
||||
```
|
||||
|
||||
### Grouping Details
|
||||
|
||||
Details are designed to function independently, but you can simulate a group or "accordion" where only one is shown at a time by listening for the `wa-show` event.
|
||||
|
||||
@@ -2,10 +2,13 @@
|
||||
title: Components
|
||||
description: Components are the essential building blocks to create intuitive, cohesive experiences. Browse the library of customizable, framework-friendly web components included in Web Awesome.
|
||||
layout: overview
|
||||
override:tags: []
|
||||
categories:
|
||||
tags: [actions, feedback, imagery, inputs, navigation, organization, helpers]
|
||||
titles:
|
||||
feedback: 'Feedback & Status'
|
||||
helpers: 'Utilities'
|
||||
- actions
|
||||
- feedback: 'Feedback & Status'
|
||||
- imagery
|
||||
- inputs
|
||||
- navigation
|
||||
- organization
|
||||
- helpers: 'Utilities'
|
||||
override:tags: []
|
||||
---
|
||||
|
||||
@@ -885,4 +885,4 @@ If you don’t want to use [native styles](/docs/native/), you can include this
|
||||
|
||||
```html
|
||||
<link rel="stylesheet" href="{% cdnUrl 'styles/components/page.css' %}" />
|
||||
```
|
||||
```
|
||||
|
||||
@@ -1,108 +1,10 @@
|
||||
/**
|
||||
* Global data for all pages
|
||||
*/
|
||||
import { sort } from '../_utils/filters.js';
|
||||
|
||||
export default {
|
||||
eleventyComputed: {
|
||||
/**
|
||||
* Default parent slug. Can be overridden by explicitly setting parent in the data.
|
||||
* It can be either the URL slug of a page in the same directory or a parent directory.
|
||||
* @returns {string | undefined}
|
||||
*/
|
||||
parent(data) {
|
||||
let { parent, page } = data;
|
||||
|
||||
if (parent) {
|
||||
return parent;
|
||||
}
|
||||
|
||||
return page.url.split('/').filter(Boolean).at(-2);
|
||||
},
|
||||
|
||||
/**
|
||||
* URL of parent page
|
||||
* @returns {string | undefined}
|
||||
*/
|
||||
parentUrl(data) {
|
||||
let { parent, page } = data;
|
||||
return getParentUrl(page.url, parent);
|
||||
},
|
||||
|
||||
/**
|
||||
* Collection item of parent page
|
||||
* @returns {object | undefined} Parent page item
|
||||
*/
|
||||
parentItem(data) {
|
||||
let { parentUrl } = data;
|
||||
return data.collections.all.find(item => item.url === parentUrl);
|
||||
},
|
||||
|
||||
/**
|
||||
* Child pages of current page
|
||||
* @returns {object[]} Array of child pages
|
||||
*/
|
||||
children(data) {
|
||||
let { collections, page, parentOf } = data;
|
||||
let mainTag = data.tags?.[0];
|
||||
let collection = data.collections[mainTag] ?? [];
|
||||
|
||||
if (parentOf) {
|
||||
return collections[parentOf];
|
||||
}
|
||||
|
||||
let collection = collections.all ?? [];
|
||||
let url = page.url;
|
||||
|
||||
let ret = collection.filter(item => {
|
||||
return item.data.parentUrl === url;
|
||||
});
|
||||
|
||||
sort(ret);
|
||||
|
||||
return ret;
|
||||
return collection.filter(item => item.data.parent === data.page.fileSlug);
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* Resolve a parent slug against a page URL
|
||||
* @param {string} url - The URL of the page
|
||||
* @param {string} parent - The slug of the parent page
|
||||
* @returns {string} The resolved URL of the parent page
|
||||
*/
|
||||
function getParentUrl(url, parent) {
|
||||
if (!parent) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
let parts = url.split('/').filter(Boolean);
|
||||
let ancestorIndex = parts.findLastIndex(part => part === parent);
|
||||
let retParts = parts.slice();
|
||||
|
||||
if (ancestorIndex > -1) {
|
||||
// parent is an ancestor
|
||||
retParts.splice(ancestorIndex + 1);
|
||||
} else {
|
||||
// parent is a sibling in the same directory
|
||||
retParts.splice(-1, 1, parent);
|
||||
}
|
||||
|
||||
let ret = retParts.join('/');
|
||||
|
||||
if (url.startsWith('/')) {
|
||||
// If the current page starts with a slash, make sure the parent does too
|
||||
// This is pretty much always the case with 11ty page URLs
|
||||
ret = '/' + ret;
|
||||
}
|
||||
|
||||
if (!retParts.at(-1)?.includes('.') && !ret.endsWith('/')) {
|
||||
// If no extension, make sure to end with a slash
|
||||
ret += '/';
|
||||
}
|
||||
|
||||
if (ret === '/docs/') {
|
||||
// We don't want anyone's parent to be "Installation"!
|
||||
ret = '/';
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -32,11 +32,15 @@ To get everything included in Web Awesome, add the following code to the `<head>
|
||||
|
||||
This snippet includes three parts:
|
||||
1. **The default theme**, a stylesheet that gives a cohesive look to Web Awesome components with both light and dark modes
|
||||
2. **Web Awesome styles**, an optional stylesheet that [styles native HTML elements](/docs/native) and includes [utility classes](/docs/utilities) you can use in your project
|
||||
2. **Web Awesome styles**, an optional stylesheet that [styles native HTML elements](/docs/native) and includes [utility classes](/docs/utilities) you can use in your project
|
||||
3. **The autoloader**, a lightweight script watches the DOM for unregistered Web Awesome elements and lazy loads them for you — even if they're added dynamically
|
||||
|
||||
Now you can [start using Web Awesome!](/docs/usage)
|
||||
|
||||
:::info
|
||||
While convenient, autoloading may lead to a [Flash of Undefined Custom Elements](https://www.abeautifulsite.net/posts/flash-of-undefined-custom-elements/). The linked article describes some ways to alleviate it.
|
||||
:::
|
||||
|
||||
---
|
||||
|
||||
## Using Font Awesome Kit Codes
|
||||
@@ -58,7 +62,7 @@ Font Awesome users can set their kit code to unlock Font Awesome Pro icons. You
|
||||
|
||||
## Advanced Setup
|
||||
|
||||
The autoloader is the easiest way to use Web Awesome, but different projects (or your own preferences!) may require different installation methods.
|
||||
The autoloader is the easiest way to use Web Awesome, but different projects (or your own preferences!) may require different installation methods.
|
||||
|
||||
### Installing via npm
|
||||
|
||||
@@ -122,4 +126,4 @@ Most of the magic behind assets is handled internally by Web Awesome, but if you
|
||||
// Get the path to an asset, e.g. /path/to/assets/file.ext
|
||||
const assetPath = getBasePath('file.ext');
|
||||
</script>
|
||||
```
|
||||
```
|
||||
@@ -2,7 +2,6 @@
|
||||
title: Layout
|
||||
description: Layout components and utility classes help you organize content that can adapt to any device or screen size. See the [installation instructions](#installation) to use Web Awesome's layout tools in your project.
|
||||
layout: overview
|
||||
parentOf: layout
|
||||
categories: ["components", "utilities"]
|
||||
override:tags: []
|
||||
---
|
||||
@@ -23,4 +22,4 @@ Or, you can choose to import _only_ the utilities:
|
||||
```html
|
||||
<link rel="stylesheet" href="{% cdnUrl 'styles/utilities.css' %}" />
|
||||
```
|
||||
{% endmarkdown %}
|
||||
{% endmarkdown %}
|
||||
@@ -33,7 +33,7 @@ Use the [variant utility classes](../utilities/color.md) to set the button's sem
|
||||
|
||||
### Appearance
|
||||
|
||||
Use the [appearance utility classes](/docs/utilities/appearance) to change the button's visual appearance:
|
||||
Use the [appearance utility classes](../utilities/appearance.md) to change the button's visual appearance:
|
||||
|
||||
```html {.example}
|
||||
<div style="margin-block-end: 1rem;">
|
||||
|
||||
@@ -57,7 +57,7 @@ Use the [variant utility classes](../utilities/color.md) to set the callout's co
|
||||
|
||||
### Appearance
|
||||
|
||||
Use the [appearance utility classes](/docs/utilities/appearance) to change the callout's visual appearance (the default is `outlined filled`).
|
||||
Use the [appearance utility classes](../utilities/appearance.md) to change the callout's visual appearance (the default is `outlined filled`).
|
||||
|
||||
```html {.example}
|
||||
<article class="wa-callout wa-brand wa-outlined wa-accent">
|
||||
|
||||
@@ -19,35 +19,6 @@ file: styles/native/details.css
|
||||
|
||||
## Examples
|
||||
|
||||
### Appearance
|
||||
|
||||
Use the [appearance utility classes](/docs/utilities/appearance) to change the element's visual appearance:
|
||||
|
||||
```html {.example}
|
||||
<div class="wa-stack">
|
||||
<details>
|
||||
<summary>Outlined (default)</summary>
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
|
||||
aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
||||
</details>
|
||||
<details class="wa-filled">
|
||||
<summary>Filled</summary>
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
|
||||
aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
||||
</details>
|
||||
<details class="wa-filled wa-outlined">
|
||||
<summary>Filled + Outlined</summary>
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
|
||||
aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
||||
</details>
|
||||
<details class="wa-plain">
|
||||
<summary>Plain</summary>
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
|
||||
aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
||||
</details>
|
||||
</div>
|
||||
```
|
||||
|
||||
### Right-to-Left Languages
|
||||
|
||||
The details styling automatically adapts to right-to-left languages:
|
||||
|
||||
@@ -5,6 +5,6 @@ layout: overview
|
||||
override:tags: []
|
||||
forTag: palette
|
||||
categories:
|
||||
tags: [other, pro]
|
||||
other: Free
|
||||
pro: Pro
|
||||
---
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
43
docs/docs/patterns/app/action-panel.md
Normal file
43
docs/docs/patterns/app/action-panel.md
Normal file
@@ -0,0 +1,43 @@
|
||||
---
|
||||
title: Action Panel
|
||||
description: 'These patterns help add user actions to dashboards'
|
||||
parent: app
|
||||
tags: app
|
||||
---
|
||||
## Examples
|
||||
|
||||
### Simple
|
||||
```html {.example}
|
||||
<wa-card style="max-width: 480px; margin: 0 auto;">
|
||||
<div class="wa-align-items-start wa-stack wa-gap-xs">
|
||||
<h3 class="wa-heading-m">New Dashboard</h3>
|
||||
<p>Arrange your data into a single view.</p>
|
||||
<wa-button variant="brand">Build Dashboard</wa-button>
|
||||
</div>
|
||||
</wa-card>
|
||||
```
|
||||
### with right flank
|
||||
|
||||
```html {.example}
|
||||
<wa-card style="max-width: 960px; margin: 0 auto;">
|
||||
<div class="wa-flank:end">
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<h3 class="wa-heading-m">Query with the SQL Runner</h3>
|
||||
<p>Access your database to run ad-hoc queries.</p>
|
||||
</div>
|
||||
<wa-button appearance="outlined">New Query</wa-button>
|
||||
</div>
|
||||
</wa-card>
|
||||
```
|
||||
### with switch
|
||||
```html {.example}
|
||||
<wa-card style="max-width: 960px; margin: 0 auto;">
|
||||
<div class="wa-flank:end">
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<h3 class="wa-heading-m">Auto-renew</h3>
|
||||
<p>We'll send you a reminder 30 days before we draft your account.</p>
|
||||
</div>
|
||||
<wa-switch size="large"></wa-switch>
|
||||
</div>
|
||||
</wa-card>
|
||||
```
|
||||
75
docs/docs/patterns/app/comments.md
Normal file
75
docs/docs/patterns/app/comments.md
Normal file
@@ -0,0 +1,75 @@
|
||||
---
|
||||
title: Comments
|
||||
description: 'For feedback forms and message boxes'
|
||||
parent: app
|
||||
tags: app
|
||||
---
|
||||
## Examples
|
||||
|
||||
### In card with footer
|
||||
```html{.example}
|
||||
<form class="comment-box" style="max-width: 960px; margin: 0 auto;">
|
||||
<wa-card with-footer>
|
||||
<wa-textarea resize="horizontal"></wa-textarea>
|
||||
<div slot="footer" class="wa-cluster" style="justify-content: flex-end;">
|
||||
<wa-button appearance="outlined">
|
||||
<wa-icon slot="prefix" name="paperclip" variant="solid"></wa-icon>
|
||||
Attach a file
|
||||
</wa-button>
|
||||
<wa-button variant="success">Comment</wa-button>
|
||||
</div>
|
||||
</wa-card>
|
||||
</form>
|
||||
```
|
||||
|
||||
### with avatar and icon buttons
|
||||
```html{.example}
|
||||
<div class="wa-callout wa-neutral wa-outlined" style="max-width: 960px; margin: 0 auto;">
|
||||
<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..." size="medium"></wa-textarea>
|
||||
<div class="wa-split">
|
||||
<div>
|
||||
<wa-icon-button name="link" variant="solid" label="Bold"></wa-icon-button>
|
||||
<wa-icon-button name="face-smile" variant="solid" label="Italic"></wa-icon-button>
|
||||
</div>
|
||||
</wa-button><wa-button>Comment</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
### With multiple actions
|
||||
|
||||
```html{.example}
|
||||
<wa-card with-header with-footer style="max-width: 640px; margin: 0 auto;">
|
||||
<div slot="header">
|
||||
<h2 class="wa-heading-s">I watched...</h2>
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-flank">
|
||||
<div>
|
||||
<img src="https://a.ltrbxd.com/resized/film-poster/1/0/2/5/3/3/1/1025331-heretic-2024-0-1000-0-1500-crop.jpg?v=c79c5c8121" width="40"/>
|
||||
</div>
|
||||
<span class="wa-heading-l">Heretic</span>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-split">
|
||||
<span class="wa-heading-s">Date</span><span class="wa-caption-m">Thursday, March 13, 2025</span>
|
||||
</div>
|
||||
<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..."></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>
|
||||
```
|
||||
161
docs/docs/patterns/app/data-display.md
Normal file
161
docs/docs/patterns/app/data-display.md
Normal file
@@ -0,0 +1,161 @@
|
||||
---
|
||||
title: Data Display
|
||||
description: TODO
|
||||
parent: app
|
||||
tags: app
|
||||
---
|
||||
## Examples
|
||||
|
||||
### With icon
|
||||
|
||||
```html{.example}
|
||||
<div class="wa-grid" style="max-width: 960px; margin: 0 auto">
|
||||
<wa-card>
|
||||
<div class="wa-flank">
|
||||
<wa-avatar shape="square" label="Square avatar" class="wa-callout wa-neutral">
|
||||
<wa-icon slot="icon" name="user-plus" variant="solid"></wa-icon>
|
||||
</wa-avatar>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span class="wa-heading-xs">Total Subscribers</span>
|
||||
<div class="wa-cluster">
|
||||
<span class="wa-heading-l">71,897</span>
|
||||
<wa-tag size="small" variant="success" appearance="filled outlined" pill><wa-icon fixed-width name="arrow-up"></wa-icon> 122</wa-tag>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card>
|
||||
<div class="wa-flank">
|
||||
<wa-avatar shape="square" label="Square avatar" class="wa-callout wa-neutral">
|
||||
<wa-icon slot="icon" name="user-plus" variant="solid"></wa-icon>
|
||||
</wa-avatar>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span class="wa-heading-xs">Total Subscribers</span>
|
||||
<div class="wa-cluster">
|
||||
<span class="wa-heading-l">71,897</span>
|
||||
<wa-tag size="small" variant="success" appearance="filled outlined" pill><wa-icon fixed-width name="arrow-up"></wa-icon> 122</wa-tag>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card>
|
||||
<div class="wa-flank">
|
||||
<wa-avatar shape="square" label="Square avatar" class="wa-callout wa-neutral">
|
||||
<wa-icon slot="icon" name="user-plus" variant="solid"></wa-icon>
|
||||
</wa-avatar>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span class="wa-heading-xs">Total Subscribers</span>
|
||||
<div class="wa-cluster">
|
||||
<span class="wa-heading-l">71,897</span>
|
||||
<wa-tag size="small" variant="success" appearance="filled outlined" pill><wa-icon fixed-width name="arrow-up"></wa-icon> 122</wa-tag>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
</div>
|
||||
```
|
||||
|
||||
### Multi column
|
||||
|
||||
```html{.example}
|
||||
<div style="max-width: 480px; margin: 0 auto">
|
||||
<wa-card>
|
||||
<div>
|
||||
<div class="wa-flank">
|
||||
<wa-icon family="brands" name="youtube"></wa-icon>
|
||||
<div class="wa-align-items-center wa-cluster" style="justify-content: space-between;">
|
||||
<span>YouTube Premium</span>
|
||||
<span>5 minutes ago</span>
|
||||
<wa-tag variant="danger" appearance="outlined filled" pill>-$5.00</wa-tag>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-flank">
|
||||
<wa-icon family="brands" name="youtube"></wa-icon>
|
||||
<div class="wa-align-items-center wa-cluster" style="justify-content: space-between;">
|
||||
<span>YouTube Premium</span>
|
||||
<span>5 minutes ago</span>
|
||||
<wa-tag variant="danger" appearance="outlined filled" pill>-$5.00</wa-tag>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-flank">
|
||||
<wa-icon family="brands" name="youtube"></wa-icon>
|
||||
<div class="wa-align-items-center wa-cluster" style="justify-content: space-between;">
|
||||
<span>YouTube Premium</span>
|
||||
<span>5 minutes ago</span>
|
||||
<wa-tag variant="danger" appearance="outlined filled" pill>-$5.00</wa-tag>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-flank">
|
||||
<wa-icon family="brands" name="youtube"></wa-icon>
|
||||
<div class="wa-align-items-center wa-cluster" style="justify-content: space-between;">
|
||||
<span>YouTube Premium</span>
|
||||
<span>5 minutes ago</span>
|
||||
<wa-tag variant="danger" appearance="outlined filled" pill>-$5.00</wa-tag>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-flank">
|
||||
<wa-icon family="brands" name="youtube"></wa-icon>
|
||||
<div class="wa-align-items-center wa-cluster" style="justify-content: space-between;">
|
||||
<span>YouTube Premium</span>
|
||||
<span>5 minutes ago</span>
|
||||
<wa-tag variant="danger" appearance="outlined filled" pill>-$5.00</wa-tag>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</div>
|
||||
</wa-card>
|
||||
</div>
|
||||
```
|
||||
|
||||
### Card with condensed information
|
||||
```html{.example}
|
||||
<wa-card style="max-width: 480px; margin: 0 auto;">
|
||||
<div class="wa-stack">
|
||||
<section class="wa-split">
|
||||
<a href="#" class="wa-cluster wa-gap-xs wa-align-items-center">
|
||||
<span class="wa-caption-m">query</span>
|
||||
<span class="wa-heading-m">getUser</span>
|
||||
<wa-icon fixed-width name="arrow-right"></wa-icon>
|
||||
</a>
|
||||
<wa-icon-button fixed-width name="ellipsis" label="actions"></wa-icon-button>
|
||||
</section>
|
||||
<section class="wa-cluster">
|
||||
<span class="wa-caption-l">7.15M request • 9% • 734msP95</span>
|
||||
</section>
|
||||
<section class="wa-split">
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<span class="wa-caption-l">Cache Hit Rate</span>
|
||||
<span class="wa-heading-2xl">12.3%</span>
|
||||
<wa-badge appearance="filled outlined" variant="danger"><wa-icon name="arrow-down"></wa-icon> down from 19.6%</wa-badge>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<span class="wa-caption-l">Max CHR</span>
|
||||
<span class="wa-heading-2xl">72.6%</span>
|
||||
<wa-badge appearance="filled outlined" variant="success"><wa-icon name="arrow-up"></wa-icon> CHR Impact +5.4%</wa-badge>
|
||||
</div>
|
||||
</section>
|
||||
<wa-divider></wa-divider>
|
||||
<section class="wa-stack">
|
||||
<span class="wa-heading-m">90.5 GB (69.8%)</span>
|
||||
<div class="wa-split">
|
||||
<span>Cacheable Bandwidth</span>
|
||||
<span class="wa-cluster wa-gap-2xs">
|
||||
<wa-icon fixed-width name="dollar-sign"></wa-icon>
|
||||
<span>$9.50</span>
|
||||
<wa-icon fixed-width name="circle-question"></wa-icon>
|
||||
</span>
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<wa-progress-bar value="9.8" label="Upload progress"></wa-progress-bar>
|
||||
<span class="wa-caption-m">Cached 12.8GB (9.8%)</span>
|
||||
<span class="wa-caption-m">Non-Cacheable 26.3GB (91.2)</span>
|
||||
<span class="wa-heading-s">Total 129.6GB</span>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</wa-card>
|
||||
```
|
||||
244
docs/docs/patterns/app/description-list.md
Normal file
244
docs/docs/patterns/app/description-list.md
Normal file
@@ -0,0 +1,244 @@
|
||||
---
|
||||
title: Description List
|
||||
description: 'Shows the user information with labels and values in an easy to read format.'
|
||||
parent: app
|
||||
tags: app
|
||||
---
|
||||
## Examples
|
||||
|
||||
### Simple
|
||||
```html{.example}
|
||||
<div style="max-width: 960px; margin: 0 auto">
|
||||
<h3 class="wa-heading-m">Applicant Info</h3>
|
||||
<p class="wa-caption-m">Personal details.</p>
|
||||
<wa-divider></wa-divider>
|
||||
<dl class="wa-stack wa-gap-2xl">
|
||||
<div class="wa-align-items-start wa-flank" style="--flank-size: 15%;">
|
||||
<dt class="wa-heading-xs">Full name</dt>
|
||||
<dd class="wa-caption-m">Bucky Barnes</dd>
|
||||
</div>
|
||||
<div class="wa-align-items-start wa-flank" style="--flank-size: 15%;">
|
||||
<dt class="wa-heading-xs">Application for</dt>
|
||||
<dd class="wa-caption-m">Machine Learning Engineer</dd>
|
||||
</div>
|
||||
<div class="wa-align-items-start wa-flank" style="--flank-size: 15%;">
|
||||
<dt class="wa-heading-xs">Email address</dt>
|
||||
<dd class="wa-caption-m">winter_soldier@example.com</dd>
|
||||
</div>
|
||||
<div class="wa-align-items-start wa-flank" style="--flank-size: 15%;">
|
||||
<dt class="wa-heading-xs">Salary expectation</dt>
|
||||
<dd class="wa-caption-m">
|
||||
$240,00
|
||||
</dd>
|
||||
</div>
|
||||
<div class="wa-align-items-start wa-flank" style="--flank-size: 15%;">
|
||||
<dt class="wa-heading-xs">About</dt>
|
||||
<dd class="wa-caption-m">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 loves, and I'm always striving to atone for those dark days as the Winter Soldier.
|
||||
</dd>
|
||||
</div>
|
||||
<div class="wa-align-items-start wa-flank" style="--flank-size: 15%;">
|
||||
<dt class="wa-heading-xs">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>
|
||||
```
|
||||
|
||||
### Two Column
|
||||
```html{.example}
|
||||
<div style="max-width: 960px; margin: 0 auto">
|
||||
<h2 class="wa-heading-m">Applicant Information</h2>
|
||||
<p class="wa-caption-m">Personal details and application.</p>
|
||||
<wa-divider></wa-divider>
|
||||
<dl class="wa-grid wa-gap-2xl" style="--min-column-size: 40ch;">
|
||||
<div class="wa-align-items-start wa-flank" style="--flank-size: 15%;">
|
||||
<dt class="wa-heading-xs">Full name</dt>
|
||||
<dd class="wa-caption-m">Bucky Barnes</dd>
|
||||
</div>
|
||||
<div class="wa-align-items-start wa-flank" style="--flank-size: 15%;">
|
||||
<dt class="wa-heading-xs">Application for</dt>
|
||||
<dd class="wa-caption-m">Machine Learning Engineer</dd>
|
||||
</div>
|
||||
<div class="wa-align-items-start wa-flank" style="--flank-size: 15%;">
|
||||
<dt class="wa-heading-xs">Email address</dt>
|
||||
<dd class="wa-caption-m">winter_soldier@example.com</dd>
|
||||
</div>
|
||||
<div class="wa-align-items-start wa-flank" style="--flank-size: 15%;">
|
||||
<dt class="wa-heading-xs">Salary expectation</dt>
|
||||
<dd class="wa-caption-m">
|
||||
$240,00
|
||||
</dd>
|
||||
</div>
|
||||
<div class="wa-align-items-start wa-flank wa-span-grid" style="--flank-size: 15%;">
|
||||
<dt class="wa-heading-xs">About</dt>
|
||||
<dd class="wa-caption-m">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 loves, and I'm always striving to atone for those dark days as the Winter Soldier.
|
||||
</dd>
|
||||
</div>
|
||||
<div class="wa-align-items-start wa-flank wa-span-grid" style="--flank-size: 15%;">
|
||||
<dt class="wa-heading-xs">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>
|
||||
```
|
||||
### Multi Column
|
||||
```html{.example}
|
||||
<div style="max-width: 960px; margin: 0 auto">
|
||||
<h2 class="wa-heading-m">Applicant Information</h2>
|
||||
<p class="wa-caption-m">Personal details and application.</p>
|
||||
<wa-divider></wa-divider>
|
||||
<dl class="wa-stack wa-gap-2xl">
|
||||
<div class="wa-align-items-start wa-flank" style="--flank-size: 15%;">
|
||||
<dt class="wa-heading-xs">Full name</dt>
|
||||
<dd class="wa-caption-m wa-split">
|
||||
<span>Bucky Barnes</span>
|
||||
<wa-button appearance="plain" variant="brand" size="small">Update</wa-button>
|
||||
</dd>
|
||||
</div>
|
||||
<div class="wa-align-items-start wa-flank" style="--flank-size: 15%;">
|
||||
<dt class="wa-heading-xs">Application for</dt>
|
||||
<dd class="wa-caption-m wa-split">
|
||||
<span>Machine Learning Engineer</span>
|
||||
<wa-button appearance="plain" variant="brand" size="small">Update</wa-button>
|
||||
</dd>
|
||||
</div>
|
||||
<div class="wa-align-items-start wa-flank" style="--flank-size: 15%;">
|
||||
<dt class="wa-heading-xs">Email address</dt>
|
||||
<dd class="wa-caption-m wa-split">
|
||||
<span>winter_soldier@example.com</span>
|
||||
<wa-button appearance="plain" variant="brand" size="small">Update</wa-button>
|
||||
</dd>
|
||||
</div>
|
||||
<div class="wa-align-items-start wa-flank" style="--flank-size: 15%;">
|
||||
<dt class="wa-heading-xs">Salary expectation</dt>
|
||||
<dd class="wa-caption-m wa-split">
|
||||
<span>$240,00</span>
|
||||
<wa-button appearance="plain" variant="brand" size="small">Update</wa-button>
|
||||
</dd>
|
||||
</div>
|
||||
<div class="wa-align-items-start wa-flank" style="--flank-size: 15%;">
|
||||
<dt class="wa-heading-xs">About</dt>
|
||||
<dd class="wa-caption-m wa-split">
|
||||
<p style="max-width: 70ch;">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 loves, and I'm always striving to atone for those dark days as the Winter Soldier.</p>
|
||||
<wa-button appearance="plain" variant="brand" size="small">Update</wa-button>
|
||||
</dd>
|
||||
</div>
|
||||
<div class="wa-align-items-start wa-flank" style="--flank-size: 15%;">
|
||||
<dt class="wa-heading-xs">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>
|
||||
```
|
||||
### Narrow with Invoice Details
|
||||
```html{.example}
|
||||
<wa-card with-header with-footer class="wa-callout wa-neutral" style="max-width: 480px; margin: 0 auto;">
|
||||
<div slot="header" class="wa-split">
|
||||
<dl class="wa-stack wa-gap-2xs">
|
||||
<dt class="wa-heading-s">Amount</dt>
|
||||
<dd class="wa-heading-l">$10,560.00</dd>
|
||||
</dl>
|
||||
<wa-badge appearance="filled outlined" variant="success">Paid</wa-badge>
|
||||
</div>
|
||||
<div>
|
||||
<dl class="wa-stack" style="margin: 0;">
|
||||
<div class="wa-flank wa-align-items-stretch">
|
||||
<dt><wa-icon name="user"></wa-icon></dt>
|
||||
<dd class="wa-heading-s">Sam Wilson</dd>
|
||||
</div>
|
||||
<div class="wa-flank wa-align-items-stretch">
|
||||
<dt><wa-icon name="calendar-days"></wa-icon></dt>
|
||||
<dd class="wa-heading-s">June 8, 2015</dd>
|
||||
</div>
|
||||
<div class="wa-flank wa-align-items-stretch">
|
||||
<dt><wa-icon family="brands" name="cc-visa"></wa-icon></dt>
|
||||
<dd class="wa-heading-s">Paid with Visa</dd>
|
||||
</div>
|
||||
</dl>
|
||||
</div>
|
||||
<div slot="footer">
|
||||
<a href="#" class="wa-flank wa-align-items-center wa-gap-2xs">
|
||||
<span>Download Receipt</span>
|
||||
<wa-icon name="arrow-right"></wa-icon>
|
||||
</a>
|
||||
</div>
|
||||
</wa-card>
|
||||
```
|
||||
113
docs/docs/patterns/app/empty-state.md
Normal file
113
docs/docs/patterns/app/empty-state.md
Normal file
@@ -0,0 +1,113 @@
|
||||
---
|
||||
title: Empty State
|
||||
description: TODO
|
||||
parent: app
|
||||
tags: app
|
||||
---
|
||||
## Examples
|
||||
|
||||
### Simple
|
||||
```html{.example}
|
||||
<div class="wa-stack wa-align-items-center">
|
||||
<wa-icon name="folder" style="font-size: 60px;"></wa-icon>
|
||||
<span class="wa-heading-s">No Projects</span>
|
||||
<p class="wa-caption-m">Get started by creating a new project.</p>
|
||||
<wa-button>
|
||||
<wa-icon slot="prefix" name="plus"></wa-icon>
|
||||
New Project
|
||||
</wa-button>
|
||||
</div>
|
||||
```
|
||||
|
||||
### With border
|
||||
|
||||
```html{.example}
|
||||
<a href="#" class="wa-align-items-center wa-callout wa-neutral wa-outlined wa-stack" style="max-width: 480px; margin: 0 auto; text-decoration: none;">
|
||||
<wa-icon name="database" style="font-size: 64px;"></wa-icon>
|
||||
<div class="wa-stack wa-align-items-center wa-gap-2xs">
|
||||
<p class="wa-heading-m">No DBs</p>
|
||||
<p>Get started by creating a database.</p>
|
||||
</div>
|
||||
</a>
|
||||
```
|
||||
### With starting points
|
||||
|
||||
```html{.example}
|
||||
<wa-card with-header with-footer style="max-width: 720px; margin: 0 auto;">
|
||||
<div slot="header" class="wa-stack wa-gap-xs">
|
||||
<h2 class="wa-heading-m">Projects</h2>
|
||||
<p class="wa-caption-m">You haven’t created a project yet. Get started by selecting a template or start from an empty project.</p>
|
||||
</div>
|
||||
<div class="wa-grid" style="--min-column-size: 30ch;">
|
||||
<a href="#" class="wa-flank" style="text-decoration: none;">
|
||||
<wa-icon name="bars" class="wa-callout wa-neutral wa-outlined" style="font-size: 16px;"></wa-icon>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span class="wa-align-items-center wa-cluster wa-gap-xs wa-heading-s">
|
||||
Create a List <wa-icon name="arrow-right"></wa-icon>
|
||||
</span>
|
||||
<p class="wa-caption-m">
|
||||
Another to-do system you’ll try but eventually give up on.
|
||||
</p>
|
||||
</div>
|
||||
</a>
|
||||
<a href="#" class="wa-flank" style="text-decoration: none;">
|
||||
<wa-icon name="image" class="wa-callout wa-neutral wa-outlined" style="font-size: 16px;"></wa-icon>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span class="wa-align-items-center wa-cluster wa-gap-xs wa-heading-s">
|
||||
Create a Gallery <wa-icon name="arrow-right"></wa-icon>
|
||||
</span>
|
||||
<p class="wa-caption-m">
|
||||
Great for mood boards and inspiration.
|
||||
</p>
|
||||
</div>
|
||||
</a>
|
||||
<a href="#"class="wa-flank" style="text-decoration: none;">
|
||||
<wa-icon name="table-cells" class="wa-callout wa-neutral wa-outlined" style="font-size: 16px;"></wa-icon>
|
||||
<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">
|
||||
Helps keep up with the numbers.
|
||||
</p>
|
||||
</div>
|
||||
</a>
|
||||
<a href="#" class="wa-flank" style="text-decoration: none;">
|
||||
<wa-icon name="calendar" class="wa-callout wa-neutral wa-outlined" style="font-size: 16px;"></wa-icon>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span class="wa-align-items-center wa-cluster wa-gap-xs wa-heading-s">
|
||||
Create a Calendar <wa-icon name="arrow-right"></wa-icon>
|
||||
</span>
|
||||
<p class="wa-caption-m">
|
||||
Stay on top of your deadlines, or don’t — it’s up to you.
|
||||
</p>
|
||||
</div>
|
||||
</a>
|
||||
<a href="#" class="wa-flank" style="text-decoration: none;">
|
||||
<wa-icon name="table-columns" class="wa-callout wa-neutral wa-outlined" style="font-size: 16px;"></wa-icon>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span class="wa-align-items-center wa-cluster wa-gap-xs wa-heading-s">
|
||||
Create a Board <wa-icon name="arrow-right"></wa-icon>
|
||||
</span>
|
||||
<p class="wa-caption-m">
|
||||
Track tasks in different stages of your project.
|
||||
</p>
|
||||
</div>
|
||||
</a>
|
||||
<a href="#" class="wa-flank" style="text-decoration: none;">
|
||||
<wa-icon name="clock" class="wa-callout wa-neutral wa-outlined" style="font-size: 16px;"></wa-icon>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span class="wa-align-items-center wa-cluster wa-gap-xs wa-heading-s">
|
||||
Create a Timeline <wa-icon name="arrow-right"></wa-icon>
|
||||
</span>
|
||||
<p class="wa-caption-m">
|
||||
Get a birds-eye-view of your procrastination.
|
||||
</p>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
<div slot="footer">
|
||||
<a href="#">Or start from an empty project →</a>
|
||||
</div>
|
||||
</wa-card>
|
||||
```
|
||||
92
docs/docs/patterns/app/faq.md
Normal file
92
docs/docs/patterns/app/faq.md
Normal file
@@ -0,0 +1,92 @@
|
||||
---
|
||||
title: FAQ
|
||||
description: TODO
|
||||
parent: app
|
||||
tags: app
|
||||
---
|
||||
|
||||
```html{.example}
|
||||
<div class="wa-grid">
|
||||
<div>
|
||||
<h2>Frequently Asked Questions</h2>
|
||||
<p>Can’t find the answer you’re looking for? Reach out to our <a href="#">customer support</a> team.</p>
|
||||
</div>
|
||||
<dl class="wa-stack wa-gap-m">
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<dt class="wa-heading-m">How do you make holy water?</dt>
|
||||
<dd class="wa-caption-l">You boil the hell out of it. Lorem ipsum dolor sit amet consectetur adipisicing elit. Quas cupiditate laboriosam fugiat.</dd>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<dt class="wa-heading-m">How do you make holy water?</dt>
|
||||
<dd class="wa-caption-l">You boil the hell out of it. Lorem ipsum dolor sit amet consectetur adipisicing elit. Quas cupiditate laboriosam fugiat.</dd>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<dt class="wa-heading-m">How do you make holy water?</dt>
|
||||
<dd class="wa-caption-l">You boil the hell out of it. Lorem ipsum dolor sit amet consectetur adipisicing elit. Quas cupiditate laboriosam fugiat.</dd>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<dt class="wa-heading-m">How do you make holy water?</dt>
|
||||
<dd class="wa-caption-l">You boil the hell out of it. Lorem ipsum dolor sit amet consectetur adipisicing elit. Quas cupiditate laboriosam fugiat.</dd>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<dt class="wa-heading-m">How do you make holy water?</dt>
|
||||
<dd class="wa-caption-l">You boil the hell out of it. Lorem ipsum dolor sit amet consectetur adipisicing elit. Quas cupiditate laboriosam fugiat.</dd>
|
||||
</div>
|
||||
</dl>
|
||||
</div>
|
||||
```
|
||||
|
||||
```html{.example}
|
||||
<div style="max-width: 960px; margin: 0 auto;">
|
||||
<h2>Frequently Asked Questions</h2>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<wa-details summary="How do you make holy water?">
|
||||
You boil the hell out of it.
|
||||
</wa-details>
|
||||
<wa-details summary="How do you make holy water?">
|
||||
You boil the hell out of it.
|
||||
</wa-details>
|
||||
<wa-details summary="How do you make holy water?">
|
||||
You boil the hell out of it.
|
||||
</wa-details>
|
||||
<wa-details summary="How do you make holy water?">
|
||||
You boil the hell out of it.
|
||||
</wa-details>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
```html{.example}
|
||||
<div>
|
||||
|
||||
<h2>Frequently Asked Questions</h2>
|
||||
|
||||
|
||||
<dl class="wa-stack wa-gap-m">
|
||||
<div class="wa-grid wa-gap-xs">
|
||||
<dt class="wa-heading-m">How do you make holy water?</dt>
|
||||
<dd class="wa-caption-l">You boil the hell out of it. Lorem ipsum dolor sit amet consectetur adipisicing elit. Quas cupiditate laboriosam fugiat.</dd>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-grid wa-gap-xs">
|
||||
<dt class="wa-heading-m">How do you make holy water?</dt>
|
||||
<dd class="wa-caption-l">You boil the hell out of it. Lorem ipsum dolor sit amet consectetur adipisicing elit. Quas cupiditate laboriosam fugiat.</dd>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-grid wa-gap-xs">
|
||||
<dt class="wa-heading-m">How do you make holy water?</dt>
|
||||
<dd class="wa-caption-l">You boil the hell out of it. Lorem ipsum dolor sit amet consectetur adipisicing elit. Quas cupiditate laboriosam fugiat.</dd>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-grid wa-gap-xs">
|
||||
<dt class="wa-heading-m">How do you make holy water?</dt>
|
||||
<dd class="wa-caption-l">You boil the hell out of it. Lorem ipsum dolor sit amet consectetur adipisicing elit. Quas cupiditate laboriosam fugiat.</dd>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-grid wa-gap-xs">
|
||||
<dt class="wa-heading-m">How do you make holy water?</dt>
|
||||
<dd class="wa-caption-l">You boil the hell out of it. Lorem ipsum dolor sit amet consectetur adipisicing elit. Quas cupiditate laboriosam fugiat.</dd>
|
||||
</div>
|
||||
</dl>
|
||||
</div>
|
||||
```
|
||||
86
docs/docs/patterns/app/feed.md
Normal file
86
docs/docs/patterns/app/feed.md
Normal file
@@ -0,0 +1,86 @@
|
||||
---
|
||||
title: Feed
|
||||
description: TODO
|
||||
parent: app
|
||||
tags: app
|
||||
---
|
||||
|
||||
```html {.example}
|
||||
<div class="activity-feed">
|
||||
<div class="activity-group">
|
||||
<span class="connector"></span>
|
||||
<div class="activity">
|
||||
<wa-icon name="user-circle" class="fa-fw"></wa-icon>
|
||||
<p>Kicked ass and <strong>chewed bubblegum</strong></p>
|
||||
<span style="margin-left: auto"><em>Oct. 31st</em></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="activity-group">
|
||||
<span class="connector"></span>
|
||||
<div class="activity">
|
||||
<wa-icon name="thumbs-up" style="color: blue" class="fa-fw"></wa-icon>
|
||||
<p>Kicked ass and <strong>chewed bubblegum</strong></p>
|
||||
<span style="margin-left: auto"><em>Oct. 31st</em></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="activity-group">
|
||||
<span class="connector"></span>
|
||||
<div class="activity">
|
||||
<wa-icon name="crown" class="fa-fw"></wa-icon>
|
||||
<p>Kicked ass and <strong>chewed bubblegum</strong></p>
|
||||
<span style="margin-left: auto"><em>Oct. 31st</em></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="activity-group">
|
||||
<span class="connector"></span>
|
||||
<div class="activity">
|
||||
<wa-icon name="turtle" style="color: green" class="fa-fw"></wa-icon>
|
||||
<p>Kicked ass and <strong>chewed bubblegum</strong></p>
|
||||
<span style="margin-left: auto"><em>Oct. 31st</em></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<style>
|
||||
:root {
|
||||
--border-color: var(--wa-color-surface-border);
|
||||
}
|
||||
.activity-feed {
|
||||
wa-icon {
|
||||
margin-right: 1rem;
|
||||
font-size: 32px;
|
||||
}
|
||||
.fa-fw {
|
||||
text-align: center;
|
||||
width: 1.25em;
|
||||
}
|
||||
.activity {
|
||||
display: flex;
|
||||
justify-content: flex-start;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.activity-group:not(:first-child) {
|
||||
margin-top: .5rem;
|
||||
}
|
||||
.activity-group {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.connector {
|
||||
position: absolute;
|
||||
background-color: var(--border-color);
|
||||
height: 25%;
|
||||
width: 0.125rem;
|
||||
margin-left: -1px;
|
||||
top: 2.5rem;
|
||||
left: 1rem;
|
||||
}
|
||||
|
||||
.activity-group:last-of-type .connector {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
```
|
||||
166
docs/docs/patterns/app/grid.md
Normal file
166
docs/docs/patterns/app/grid.md
Normal file
@@ -0,0 +1,166 @@
|
||||
---
|
||||
title: Grid
|
||||
description: TODO
|
||||
parent: app
|
||||
tags: app
|
||||
---
|
||||
|
||||
```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-0">
|
||||
<span>
|
||||
<strong>John Carpenter</strong>
|
||||
<wa-badge pill>Admin</wa-badge>
|
||||
</span>
|
||||
<span>Master of Horror</span>
|
||||
</div>
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1529778873920-4da4926a72c2?ixlib=rb-1.2.1&auto=format&fit=crop&w=300&q=80"label="Avatar of a gray tabby kitten looking down">
|
||||
</wa-avatar>
|
||||
</div>
|
||||
<div slot="footer" class="wa-grid" style="--min-column-size: 16ch;">
|
||||
<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-0">
|
||||
<span>
|
||||
<strong>John Carpenter</strong>
|
||||
<wa-badge pill>Admin</wa-badge>
|
||||
</span>
|
||||
<span>Master of Horror</span>
|
||||
</div>
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1529778873920-4da4926a72c2?ixlib=rb-1.2.1&auto=format&fit=crop&w=300&q=80"label="Avatar of a gray tabby kitten looking down">
|
||||
</wa-avatar>
|
||||
</div>
|
||||
<div slot="footer" class="wa-grid" style="--min-column-size: 16ch;">
|
||||
<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-0">
|
||||
<span>
|
||||
<strong>John Carpenter</strong>
|
||||
<wa-badge pill>Admin</wa-badge>
|
||||
</span>
|
||||
<span>Master of Horror</span>
|
||||
</div>
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1529778873920-4da4926a72c2?ixlib=rb-1.2.1&auto=format&fit=crop&w=300&q=80"label="Avatar of a gray tabby kitten looking down">
|
||||
</wa-avatar>
|
||||
</div>
|
||||
<div slot="footer" class="wa-grid" style="--min-column-size: 16ch;">
|
||||
<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-0">
|
||||
<span>
|
||||
<strong>John Carpenter</strong>
|
||||
<wa-badge pill>Admin</wa-badge>
|
||||
</span>
|
||||
<span>Master of Horror</span>
|
||||
</div>
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1529778873920-4da4926a72c2?ixlib=rb-1.2.1&auto=format&fit=crop&w=300&q=80"label="Avatar of a gray tabby kitten looking down">
|
||||
</wa-avatar>
|
||||
</div>
|
||||
<div slot="footer" class="wa-grid" style="--min-column-size: 16ch;">
|
||||
<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-0">
|
||||
<span>
|
||||
<strong>John Carpenter</strong>
|
||||
<wa-badge pill>Admin</wa-badge>
|
||||
</span>
|
||||
<span>Master of Horror</span>
|
||||
</div>
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1529778873920-4da4926a72c2?ixlib=rb-1.2.1&auto=format&fit=crop&w=300&q=80"label="Avatar of a gray tabby kitten looking down">
|
||||
</wa-avatar>
|
||||
</div>
|
||||
<div slot="footer" class="wa-grid" style="--min-column-size: 16ch;">
|
||||
<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-0">
|
||||
<span>
|
||||
<strong>John Carpenter</strong>
|
||||
<wa-badge pill>Admin</wa-badge>
|
||||
</span>
|
||||
<span>Master of Horror</span>
|
||||
</div>
|
||||
<wa-avatar image="https://images.unsplash.com/photo-1529778873920-4da4926a72c2?ixlib=rb-1.2.1&auto=format&fit=crop&w=300&q=80"label="Avatar of a gray tabby kitten looking down">
|
||||
</wa-avatar>
|
||||
</div>
|
||||
<div slot="footer" class="wa-grid" style="--min-column-size: 16ch;">
|
||||
<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>
|
||||
```
|
||||
|
||||
```html{.example}
|
||||
<div class="wa-grid">
|
||||
<wa-card>
|
||||
<div class="wa-flank">
|
||||
<div class="wa-callout wa-neutral">GA</div>
|
||||
<div class="wa-split">
|
||||
<div class="wa-gap-0 wa-stack">
|
||||
<span class="wa-heading-xs">Graph API</span>
|
||||
<span class="wa-caption-m">16 Members</span>
|
||||
</div>
|
||||
<wa-icon-button name="ellipsis-vertical" label="actions"></wa-icon-button>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card>
|
||||
<div class="wa-flank">
|
||||
<div class="wa-callout wa-success">GA</div>
|
||||
<div class="wa-split">
|
||||
<div class="wa-gap-0 wa-stack">
|
||||
<span class="wa-heading-xs">Graph API</span>
|
||||
<span class="wa-caption-m">16 Members</span>
|
||||
</div>
|
||||
<wa-icon-button name="ellipsis-vertical" label="actions"></wa-icon-button>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card>
|
||||
<div class="wa-flank">
|
||||
<div class="wa-callout wa-danger">GA</div>
|
||||
<div class="wa-split">
|
||||
<div class="wa-gap-0 wa-stack">
|
||||
<span class="wa-heading-xs">Graph API</span>
|
||||
<span class="wa-caption-m">16 Members</span>
|
||||
</div>
|
||||
<wa-icon-button name="ellipsis-vertical" label="actions"></wa-icon-button>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card>
|
||||
<div class="wa-flank">
|
||||
<div class="wa-callout wa-warning">GA</div>
|
||||
<div class="wa-split">
|
||||
<div class="wa-gap-0 wa-stack">
|
||||
<span class="wa-heading-xs">Graph API</span>
|
||||
<span class="wa-caption-m">16 Members</span>
|
||||
</div>
|
||||
<wa-icon-button name="ellipsis-vertical" label="actions"></wa-icon-button>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
</div>
|
||||
```
|
||||
7
docs/docs/patterns/app/index.njk
Normal file
7
docs/docs/patterns/app/index.njk
Normal file
@@ -0,0 +1,7 @@
|
||||
---
|
||||
title: App
|
||||
description: TODO
|
||||
layout: overview
|
||||
categories: ["app"]
|
||||
listChildren: true
|
||||
---
|
||||
369
docs/docs/patterns/app/leaderboard.md
Normal file
369
docs/docs/patterns/app/leaderboard.md
Normal file
@@ -0,0 +1,369 @@
|
||||
---
|
||||
title: Leaderboard
|
||||
description: TODO
|
||||
parent: app
|
||||
tags: app
|
||||
---
|
||||
|
||||
```html{.example}
|
||||
<div class="wa-stack wa-gap-xs" style="max-width: 960px; margin: 0 auto">
|
||||
<h2>Collective Activity for Yesterday</h2>
|
||||
<div class="wa-grid">
|
||||
<wa-callout>
|
||||
<wa-icon slot="icon" name="book"></wa-icon>
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<div class="wa-heading-xs">Items Studied</div>
|
||||
<div class="wa-heading-2xl">482,813</div>
|
||||
</div>
|
||||
</wa-callout>
|
||||
<wa-callout variant="warning">
|
||||
<wa-icon slot="icon" name="medal"></wa-icon>
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<div class="wa-heading-xs">Items Mastered</div>
|
||||
<div class="wa-heading-2xl">67,106</div>
|
||||
</div>
|
||||
</wa-callout>
|
||||
<wa-callout variant="success">
|
||||
<wa-icon slot="icon" name="plus"></wa-icon>
|
||||
<div class="wa-stack wa-gap-0">
|
||||
<div class="wa-heading-xs">Items Created</div>
|
||||
<div class="wa-heading-2xl">2,080</div>
|
||||
</div>
|
||||
</wa-callout>
|
||||
</div>
|
||||
<!-- -->
|
||||
<div class="wa-grid">
|
||||
<wa-card with-header>
|
||||
<div slot="header" class="wa-flank">
|
||||
<wa-icon name="trophy"></wa-icon>
|
||||
<span class="wa-gap-0 wa-stack">
|
||||
<h4>Study Leaders</h4>
|
||||
<p>items mastered last 7 days</p>
|
||||
</span>
|
||||
</div>
|
||||
<div>
|
||||
<ol>
|
||||
<li>
|
||||
<div class="wa-flank">
|
||||
<div class="wa-frame wa-border-radius-m">
|
||||
<img src="https://images.unsplash.com/photo-1620428268482-cf1851a36764?q=80&w=40&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" width="40" />
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span>mitsuwo</span>
|
||||
<span>2,753</span>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
<li>
|
||||
<div class="wa-flank">
|
||||
<div class="wa-frame wa-border-radius-m">
|
||||
<img src="https://images.unsplash.com/photo-1639628735078-ed2f038a193e?q=80&w=40&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" width="40" />
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span>mitsuwo</span>
|
||||
<span>2,753</span>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
<li>
|
||||
<div class="wa-flank">
|
||||
<div class="wa-frame wa-border-radius-m">
|
||||
<img src="https://images.unsplash.com/photo-1638803040283-7a5ffd48dad5?q=80&w=40&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" width="40" />
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span>mitsuwo</span>
|
||||
<span>2,753</span>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
<li>
|
||||
<div class="wa-flank">
|
||||
<div class="wa-frame wa-border-radius-m">
|
||||
<img src="https://images.unsplash.com/photo-1620428268482-cf1851a36764?q=80&w=40&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" width="40" />
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span>mitsuwo</span>
|
||||
<span>2,753</span>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
<li>
|
||||
<div class="wa-flank">
|
||||
<div class="wa-frame wa-border-radius-m">
|
||||
<img src="https://images.unsplash.com/photo-1639628735078-ed2f038a193e?q=80&w=40&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" width="40" />
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span>mitsuwo</span>
|
||||
<span>2,753</span>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
<li>
|
||||
<div class="wa-flank">
|
||||
<div class="wa-frame wa-border-radius-m">
|
||||
<img src="https://images.unsplash.com/photo-1638803040283-7a5ffd48dad5?q=80&w=40&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" width="40" />
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span>mitsuwo</span>
|
||||
<span>2,753</span>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
<li>
|
||||
<div class="wa-flank">
|
||||
<div class="wa-frame wa-border-radius-m">
|
||||
<img src="https://images.unsplash.com/photo-1620428268482-cf1851a36764?q=80&w=40&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" width="40" />
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span>mitsuwo</span>
|
||||
<span>2,753</span>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
<li>
|
||||
<div class="wa-flank">
|
||||
<div class="wa-frame wa-border-radius-m">
|
||||
<img src="https://images.unsplash.com/photo-1639628735078-ed2f038a193e?q=80&w=40&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" width="40" />
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span>mitsuwo</span>
|
||||
<span>2,753</span>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
<li>
|
||||
<div class="wa-flank">
|
||||
<div class="wa-frame wa-border-radius-m">
|
||||
<img src="https://images.unsplash.com/photo-1638803040283-7a5ffd48dad5?q=80&w=40&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" width="40" />
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span>mitsuwo</span>
|
||||
<span>2,753</span>
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
<li>
|
||||
<div class="wa-flank">
|
||||
<div class="wa-frame wa-border-radius-m">
|
||||
<img src="https://images.unsplash.com/photo-1638803040283-7a5ffd48dad5?q=80&w=40&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" width="40" />
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<span>mitsuwo</span>
|
||||
<span>2,753</span>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ol>
|
||||
</div>
|
||||
</wa-card>
|
||||
<!-- -->
|
||||
<wa-card with-header>
|
||||
<div slot="header" class="wa-flank">
|
||||
<wa-icon name="trophy"></wa-icon>
|
||||
<span class="wa-gap-0 wa-stack">
|
||||
<h4>Creation Leaders</h4>
|
||||
<p>items created last 7 days</p>
|
||||
</span>
|
||||
</div>
|
||||
<div>
|
||||
<ol>
|
||||
<li>
|
||||
<p>Item 1</p>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
<li>
|
||||
<p>Item 1</p>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
<li>
|
||||
<p>Item 1</p>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
</ol>
|
||||
</div>
|
||||
</wa-card>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
### Two Column
|
||||
```html{.example}
|
||||
<div style="max-width: 960px; margin: 0 auto">
|
||||
<h2>WTA Rankings</h2>
|
||||
<div class="wa-grid wa-gap-3xl">
|
||||
<div class="wa-stack">
|
||||
<div class="wa-flank">
|
||||
<div class="wa-border-radius-l wa-frame">
|
||||
<img src="https://uploads.webawesome.com/serena-2.jpg" />
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-s">
|
||||
<span class="wa-heading-m">Serena Williams</span>
|
||||
<span class="wa-caption-l">United States</span>
|
||||
</div>
|
||||
</div>
|
||||
<span class="wa-heading-l">SINGLES</span>
|
||||
<ol class="wa-stack wa-gap-2xs">
|
||||
<li>
|
||||
<div class="wa-split">
|
||||
<span>Williams, Serena</span>
|
||||
<span>9231</span>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
<li>
|
||||
<div class="wa-split">
|
||||
<span>Williams, Serena</span>
|
||||
<span>6960</span>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
<li>
|
||||
<div class="wa-split">
|
||||
<span>Li, Na</span>
|
||||
<span>6785</span>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
<li>
|
||||
<div class="wa-split">
|
||||
<span>Halep, Simona</span>
|
||||
<span>6070</span>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
<li>
|
||||
<div class="wa-split">
|
||||
<span>Radwanska, Agnieszka</span>
|
||||
<span>5130</span>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
<li>
|
||||
<div class="wa-split">
|
||||
<span>Sharapova, Maria</span>
|
||||
<span>4661</span>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
<li>
|
||||
<div class="wa-split">
|
||||
<span>Bouchard, Eugenie</span>
|
||||
<span>4460</span>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
<li>
|
||||
<div class="wa-split">
|
||||
<span>Kerber, Angelique</span>
|
||||
<span>4365</span>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
<li>
|
||||
<div class="wa-split">
|
||||
<span>Jankovic, Jelena</span>
|
||||
<span>3900</span>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
<li>
|
||||
<div class="wa-split">
|
||||
<span>Azarenka, Victoria</span>
|
||||
<span>3812</span>
|
||||
</div>
|
||||
</li>
|
||||
</ol>
|
||||
</div>
|
||||
<!-- -->
|
||||
<div class="wa-stack">
|
||||
<div class="wa-cluster">
|
||||
<div class="wa-border-radius-l wa-frame">
|
||||
<img src="https://uploads.webawesome.com/roberta.jpg" />
|
||||
</div>
|
||||
<div class="wa-border-radius-l wa-frame">
|
||||
<img src="https://uploads.webawesome.com/sara.jpg" />
|
||||
</div>
|
||||
</div>
|
||||
<span class="wa-heading-l">DOUBLES</span>
|
||||
<ol class="wa-stack wa-gap-2xs">
|
||||
<li>
|
||||
<div class="wa-split">
|
||||
<span>Errani, Vinci</span>
|
||||
<span>9231</span>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
<li>
|
||||
<div class="wa-split">
|
||||
<span>Roberts, Paxson</span>
|
||||
<span>9231</span>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
<li>
|
||||
<div class="wa-split">
|
||||
<span>Smith, Wexler</span>
|
||||
<span>9231</span>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
<li>
|
||||
<div class="wa-split">
|
||||
<span>Elena, Hisieh</span>
|
||||
<span>9231</span>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
<li>
|
||||
<div class="wa-split">
|
||||
<span>Pen, Sania</span>
|
||||
<span>9231</span>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
<li>
|
||||
<div class="wa-split">
|
||||
<span>Makarova, Cara</span>
|
||||
<span>9231</span>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
<li>
|
||||
<div class="wa-split">
|
||||
<span>Washington, Roosevelt</span>
|
||||
<span>9231</span>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
<li>
|
||||
<div class="wa-split">
|
||||
<span>King, Little</span>
|
||||
<span>9231</span>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
<li>
|
||||
<div class="wa-split">
|
||||
<span>Grier, Brown</span>
|
||||
<span>9231</span>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</li>
|
||||
<li>
|
||||
<div class="wa-split">
|
||||
<span>Burkhart, Silverton</span>
|
||||
<span>9231</span>
|
||||
</div>
|
||||
</li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
44
docs/docs/patterns/app/pagination.md
Normal file
44
docs/docs/patterns/app/pagination.md
Normal file
@@ -0,0 +1,44 @@
|
||||
---
|
||||
title: Pagination
|
||||
description: TODO
|
||||
parent: app
|
||||
tags: app
|
||||
---
|
||||
|
||||
## Simple Pagination
|
||||
|
||||
```html{.example}
|
||||
<div>
|
||||
<wa-divider></wa-divider>
|
||||
<div class="wa-split">
|
||||
<span class="wa-caption-l">Showing 1 to 10 of 50 Results</span>
|
||||
<span>
|
||||
<wa-button><wa-icon slot="prefix" name="gear" variant="solid"></wa-icon> Prev</wa-button>
|
||||
<wa-button><wa-icon slot="suffix" name="gear" variant="solid"></wa-icon>Next </wa-button>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
## Multi Page
|
||||
|
||||
```html {.example}
|
||||
<wa-card with-footer>
|
||||
<div class="wa-stack" style="opacity: 25%;">
|
||||
<div>
|
||||
<div class="wa-flank">
|
||||
<wa-avatar label="User avatar"></wa-avatar>
|
||||
<div>
|
||||
Some stuff
|
||||
</div>
|
||||
</div>
|
||||
<wa-divider></wa-divider>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div slot="footer" class="wa-split">
|
||||
<wa-button><wa-icon slot="prefix" name="gear" variant="solid"></wa-icon> Prev</wa-button>
|
||||
<wa-button><wa-icon slot="suffix" name="gear" variant="solid"></wa-icon>Next </wa-button>
|
||||
</div>
|
||||
</wa-card>
|
||||
```
|
||||
137
docs/docs/patterns/app/pricing.md
Normal file
137
docs/docs/patterns/app/pricing.md
Normal file
@@ -0,0 +1,137 @@
|
||||
---
|
||||
title: Pricing
|
||||
description: TODO
|
||||
parent: app
|
||||
tags: app
|
||||
---
|
||||
|
||||
```html{.example}
|
||||
<div class="wa-grid">
|
||||
<wa-card with-header>
|
||||
<div slot="header">
|
||||
<span class="wa-split">
|
||||
<span class="wa-heading-s">Plan</span>
|
||||
<wa-badge appearance="filled outlined" variant="success" pill>Most Popular</wa-badge>
|
||||
</span>
|
||||
<span class="wa-flank wa-gap-2xs">
|
||||
<span class="wa-heading-2xl">$10</span>
|
||||
<span class="wa-caption-l">per user/per month</span>
|
||||
</span>
|
||||
<p class="wa-caption-l">Basic Features</p>
|
||||
<span class="wa-grid">
|
||||
<wa-button>Get Started</wa-button>
|
||||
<wa-button appearance="outlined">Talk to sales</wa-button>
|
||||
</span>
|
||||
</div>
|
||||
<div class="wa-stack">
|
||||
<p class="wa-heading-s">Features</p>
|
||||
<p class="wa-caption-m">Everything in out free plan plus</p>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-flank">
|
||||
<wa-icon name="check"></wa-icon>
|
||||
<span class="wa-caption-m">Access to basic features</span>
|
||||
</div>
|
||||
<div class="wa-flank">
|
||||
<wa-icon name="check"></wa-icon>
|
||||
<span class="wa-caption-m">Basic Reporting and Analytics</span>
|
||||
</div>
|
||||
<div class="wa-flank">
|
||||
<wa-icon name="check"></wa-icon>
|
||||
<span class="wa-caption-m">10 Individual users</span>
|
||||
</div>
|
||||
<div class="wa-flank">
|
||||
<wa-icon name="check"></wa-icon>
|
||||
<span class="wa-caption-m">20GB of data for user</span>
|
||||
</div>
|
||||
<div class="wa-flank">
|
||||
<wa-icon name="check"></wa-icon>
|
||||
<span class="wa-caption-m">Basic Chat and email</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card with-header>
|
||||
<div slot="header">
|
||||
<span class="wa-split">
|
||||
<span class="wa-heading-s">Plan</span>
|
||||
<wa-badge appearance="filled outlined" variant="success" pill>Most Popular</wa-badge>
|
||||
</span>
|
||||
<span class="wa-flank wa-gap-2xs">
|
||||
<span class="wa-heading-2xl">$10</span>
|
||||
<span class="wa-caption-l">per user/per month</span>
|
||||
</span>
|
||||
<p class="wa-caption-l">Basic Features</p>
|
||||
<span class="wa-grid">
|
||||
<wa-button>Get Started</wa-button>
|
||||
<wa-button appearance="outlined">Talk to sales</wa-button>
|
||||
</span>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<p class="wa-heading-s">Features</p>
|
||||
<p class="wa-caption-m">Everything in out free plan plus</p>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-flank">
|
||||
<wa-icon name="check"></wa-icon>
|
||||
<span class="wa-caption-m">Access to basic features</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card with-header>
|
||||
<div slot="header">
|
||||
<span class="wa-split">
|
||||
<span class="wa-heading-s">Plan</span>
|
||||
<wa-badge appearance="filled outlined" variant="success" pill>Most Popular</wa-badge>
|
||||
</span>
|
||||
<span class="wa-flank wa-gap-2xs">
|
||||
<span class="wa-heading-2xl">$10</span>
|
||||
<span class="wa-caption-l">per user/per month</span>
|
||||
</span>
|
||||
<p class="wa-caption-l">Basic Features</p>
|
||||
<span class="wa-grid">
|
||||
<wa-button>Get Started</wa-button>
|
||||
<wa-button appearance="outlined">Talk to sales</wa-button>
|
||||
</span>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-2xs">
|
||||
<p class="wa-heading-s">Features</p>
|
||||
<p class="wa-caption-m">Everything in out free plan plus</p>
|
||||
<div class="wa-stack">
|
||||
<div class="wa-flank">
|
||||
<wa-icon name="check"></wa-icon>
|
||||
<span class="wa-caption-m">Access to basic features</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
</div>
|
||||
```
|
||||
```html{.example}
|
||||
<div class="wa-callout wa-neutral wa-outlined wa-grid">
|
||||
<div class="wa-stack">
|
||||
<h2 class="wa-heading-l">Lifetime membership</h2>
|
||||
<p>Lorem ipsum dolor sit amet consect etur adipisicing elit. Itaque amet indis perferendis blanditiis repellendus etur quidem assumenda.</p>
|
||||
<wa-divider></wa-divider>
|
||||
<h3 class="wa-heading-s">What's included</h3>
|
||||
<div class="wa-grid">
|
||||
<span class="wa-flank wa-gap-xs"><wa-icon name="check"></wa-icon><p class="wa-caption-m">Private forum access</p></span>
|
||||
<span class="wa-flank wa-gap-xs"><wa-icon name="check"></wa-icon><p class="wa-caption-m">Entry to annual conference</p></span>
|
||||
<span class="wa-flank wa-gap-xs"><wa-icon name="check"></wa-icon><p class="wa-caption-m">Member resources</p></span>
|
||||
<span class="wa-flank wa-gap-xs"><wa-icon name="check"></wa-icon><p class="wa-caption-m">Official member t-shirt</p></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wa-callout wa-neutral wa-stack wa-align-items-center">
|
||||
<h3 class="wa-heading-s">Pay once, own it forever</h3>
|
||||
<div>
|
||||
<span class="wa-heading-3xl">$349</span>
|
||||
<span>USD</span>
|
||||
</div>
|
||||
<wa-button variant="success">Get Access</wa-button>
|
||||
<p class="wa-caption-s">Invoices and receipts available for easy company reimbursement</p>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
### With templates
|
||||
|
||||
### With recommendations grid
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
title: Blog
|
||||
description: TODO
|
||||
unlisted: true
|
||||
---
|
||||
|
||||
TODO Page Description
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
title: Business
|
||||
description: TODO
|
||||
unlisted: true
|
||||
---
|
||||
|
||||
TODO Page Description
|
||||
|
||||
@@ -1,13 +1,85 @@
|
||||
---
|
||||
title: Category Filter
|
||||
description: TODO
|
||||
description: 'Helps the user find the right products with filters to refine search results by specific attributes.'
|
||||
parent: ecommerce
|
||||
tags: e-commerce
|
||||
icon: checkbox
|
||||
---
|
||||
|
||||
TODO Page Description
|
||||
## Sidebar with Checkboxes & Expandable Filters
|
||||
|
||||
## With inline actions and expandable sidebar 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,12 +1,164 @@
|
||||
---
|
||||
title: Category Preview
|
||||
description: TODO
|
||||
description: 'Help shoppers discover your product offerings with showcases of product categories.'
|
||||
parent: ecommerce
|
||||
tags: e-commerce
|
||||
icon: preview
|
||||
---
|
||||
|
||||
TODO Page Description
|
||||
|
||||
## Three Column (WIP)
|
||||
## 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>
|
||||
```
|
||||
246
docs/docs/patterns/ecommerce-checkout-form.md
Normal file
246
docs/docs/patterns/ecommerce-checkout-form.md
Normal file
@@ -0,0 +1,246 @@
|
||||
---
|
||||
title: Checkout Form
|
||||
description: 'Let shoppers checkout with ease with streamlined forms to capture shipping and payment info.'
|
||||
parent: ecommerce
|
||||
tags: e-commerce
|
||||
---
|
||||
|
||||
|
||||
## 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>
|
||||
```
|
||||
125
docs/docs/patterns/ecommerce-incentives.md
Normal file
125
docs/docs/patterns/ecommerce-incentives.md
Normal file
@@ -0,0 +1,125 @@
|
||||
---
|
||||
title: Incentives
|
||||
description: 'Encourage shoppers to buy your products with value propositions, discounts, and promotions.'
|
||||
parent: ecommerce
|
||||
tags: e-commerce
|
||||
---
|
||||
|
||||
## 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">Get the Best Instruction from our Educators.</span>
|
||||
<p class="wa-caption-l">At the beginning at least, but then we realized we could make a lot more money if we kinda stopped caring about that. Our new strategy is to write a bunch of things that look really good in the headlines, then clarify in the small print but hope people don't actually read it.</p>
|
||||
</div>
|
||||
<div class="wa-frame wa-border-radius-l">
|
||||
<img src="https://uploads.webawesome.com/online-learning.jpg" />
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="wa-grid">
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<wa-icon name="stopwatch" style="font-size: 32px;"></wa-icon>
|
||||
<span class="wa-heading-s">Learn at your Speed</span>
|
||||
<p class="wa-caption-m">It's not actually free we just price it into the products. Someone's paying for it, and it's not us.</p>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<wa-icon name="chart-line" style="font-size: 32px;"></wa-icon>
|
||||
<span class="wa-heading-s">Track Progress</span>
|
||||
<p class="wa-caption-m">If it breaks in the first 10 years we'll replace it. After that you're on your own though.</p>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<wa-icon name="people-group" style="font-size: 32px;"></wa-icon>
|
||||
<span class="wa-heading-s">Active Community</span>
|
||||
<p class="wa-caption-m">If you don't like it, trade it to one of your friends for something of theirs. Don't send it here though.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
## 2 Column with Cards
|
||||
|
||||
```html{.example}
|
||||
<div class="wa-grid" style="--min-column-size: 41ch;">
|
||||
<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">
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<wa-icon name="magnifying-glass" style="font-size: 32px;"></wa-icon>
|
||||
<span class="wa-heading-s">SEO Consulting</span>
|
||||
<p class="wa-caption-m">It's not actually free we just price it into the products. Someone's paying for it, and it's not us.</p>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<wa-icon name="chalkboard-user" style="font-size: 32px;"></wa-icon>
|
||||
<span class="wa-heading-s">In Person Training</span>
|
||||
<p class="wa-caption-m">If it breaks in the first 10 years we'll replace it. After that you're on your own though.</p>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<wa-icon name="people-arrows" style="font-size: 32px;"></wa-icon>
|
||||
<span class="wa-heading-s">1 on 1 Sessions</span>
|
||||
<p class="wa-caption-m">If you don't like it, trade it to one of your friends for something of theirs. Don't send it here though.</p>
|
||||
</div>
|
||||
<div class="wa-stack wa-gap-xs">
|
||||
<wa-icon name="code" style="font-size: 32px;"></wa-icon>
|
||||
<span class="wa-heading-s">Web Development</span>
|
||||
<p class="wa-caption-m">If you don't like it, trade it to one of your friends for something of theirs. Don't send it here though.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
@@ -1,14 +1,190 @@
|
||||
---
|
||||
title: Order History
|
||||
description: TODO
|
||||
description: 'Empower your customers to view past purchases and track upcoming orders with comprehensive order histories.'
|
||||
parent: ecommerce
|
||||
tags: e-commerce
|
||||
---
|
||||
|
||||
TODO Page Description
|
||||
|
||||
## Invoice panels
|
||||
|
||||
```html{.example}
|
||||
## 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>
|
||||
```
|
||||
|
||||
@@ -1,13 +1,296 @@
|
||||
---
|
||||
title: Product List
|
||||
description: TODO
|
||||
title: Order Summary
|
||||
description: 'Give shoppers confidence in their purchases with summaries of everything included in their order.'
|
||||
parent: ecommerce
|
||||
tags: e-commerce
|
||||
---
|
||||
|
||||
TODO Page Description
|
||||
|
||||
## With split image
|
||||
```html{.example}
|
||||
|
||||
## 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,129 +0,0 @@
|
||||
---
|
||||
title: Product Detail
|
||||
description: TODO
|
||||
parent: ecommerce
|
||||
tags: e-commerce
|
||||
---
|
||||
|
||||
TODO Page Description
|
||||
|
||||
## With color and size selector
|
||||
```html{.example}
|
||||
<div class="with-inline-price">
|
||||
<wa-card with-header>
|
||||
<div class="card-header" slot="header">
|
||||
<span class="card-title">Graphic Tank</span>
|
||||
<wa-icon-button name="close" label="close-modal"></wa-icon-button>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<img style="border-radius: var(--border-radius)" src="/assets/images/patterns/gervyn-louis-IS03ajI00Fc-unsplash.jpg" />
|
||||
<form class="detail">
|
||||
<span class="price">$32</span>
|
||||
<span class="rating"><wa-rating></wa-rating><a style="margin-left: .5rem; " href="*">36 Reviews</a></span>
|
||||
<wa-radio-group style="margin-bottom: 1rem;" label="Select an option" name="a" value="1">
|
||||
<wa-radio-button value="Black">Black</wa-radio-button>
|
||||
<wa-radio-button value="White">White</wa-radio-button>
|
||||
<wa-radio-button value="Gray">Gray</wa-radio-button>
|
||||
</wa-radio-group>
|
||||
<wa-select label="Sizes" placeholder="select size">
|
||||
<wa-option value="option-1">Option 1</wa-option>
|
||||
<wa-option value="option-2">Option 2</wa-option>
|
||||
<wa-option value="option-3">Option 3</wa-option>
|
||||
</wa-select>
|
||||
<wa-button size="medium" style="width: 100%; margin-top: auto;">Medium</wa-button>
|
||||
</form>
|
||||
</div>
|
||||
</wa-card>
|
||||
</div>
|
||||
<style>
|
||||
.with-inline-price {
|
||||
wa-card {
|
||||
width: 100%;
|
||||
.card-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
.card-title {
|
||||
font-size: large;
|
||||
font-weight: 600;
|
||||
}
|
||||
}
|
||||
.card-body {
|
||||
display: grid;
|
||||
grid-template-columns: 35% 1fr;
|
||||
gap: 1rem;
|
||||
|
||||
.detail {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
.price {
|
||||
font-size: xx-large;
|
||||
font-weight: 600;
|
||||
}
|
||||
.rating {
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
```
|
||||
|
||||
## with large selector
|
||||
```html{.example}
|
||||
<wa-card class="large-selector">
|
||||
<div class="card-body">
|
||||
<div style="grid-column: 1/6">
|
||||
<img style="border-radius: var(--border-radius); height: 100%; object-fit: cover;" src="/assets/images/patterns/gervyn-louis-IS03ajI00Fc-unsplash.jpg" />
|
||||
</div>
|
||||
<div style="grid-column: 6/-1" class="info">
|
||||
<h2>Basic Tank</h2>
|
||||
<wa-icon-button name="close" label="close-modal"></wa-icon-button>
|
||||
<section>
|
||||
<p style="font-size: x-large;font-weight: 600;">$32</p>
|
||||
<div style="display: flex; align-items: flex-start">
|
||||
<p>3.9</p>
|
||||
<wa-rating></wa-rating>
|
||||
<a href="*" style="margin-left: auto;">See all 512 Reviews</a>
|
||||
</div>
|
||||
</section>
|
||||
<section>
|
||||
<form>
|
||||
<wa-radio-group label="Color" hint="Choose the most appropriate option." name="a" value="black" style="margin-bottom: 1rem;">
|
||||
<wa-radio value="black">Black</wa-radio>
|
||||
<wa-radio value="gray">Gray</wa-radio>
|
||||
</wa-radio-group>
|
||||
<wa-radio-group label="Size" hint="Select an option that makes you proud." name="a" value="medium" style="margin-bottom: 1rem;">
|
||||
<wa-radio-button value="small">S</wa-radio-button>
|
||||
<wa-radio-button value="medium">M</wa-radio-button>
|
||||
<wa-radio-button value="large">L</wa-radio-button>
|
||||
<wa-radio-button value="extra-large">XL</wa-radio-button>
|
||||
</wa-radio-group>
|
||||
<wa-button size="medium" style="width: 100%; margin-top: auto;margin-bottom: 1rem;">Medium</wa-button>
|
||||
<a href="*" style="display: inline-block;width: 100%;text-align: center;">View full details</a>
|
||||
</form>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</wa-card>
|
||||
<style>
|
||||
.large-selector .card-body {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(12, 1fr);
|
||||
gap: 1rem;
|
||||
|
||||
.info {
|
||||
position: relative;
|
||||
|
||||
wa-icon-button {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
```
|
||||
@@ -1,166 +1,184 @@
|
||||
---
|
||||
title: Product Lists
|
||||
description: TODO
|
||||
description: 'Let shoppers browse and compare products with detailed lists of the products in your store.'
|
||||
parent: ecommerce
|
||||
tags: e-commerce
|
||||
---
|
||||
|
||||
TODO Page Description
|
||||
## With Product Grid
|
||||
## Simple Grid with Ratings
|
||||
|
||||
```html{.example}
|
||||
<div class="with-product-grid">
|
||||
<div class="grid-item">
|
||||
<img class="grid-item-image" src="/assets/images/patterns/mad-rabbit-tattoo-7N4FMowSGek-unsplash.jpg" />
|
||||
<div class="grid-item-name">Shirt</div>
|
||||
<wa-rating label="Rating" readonly value="3"></wa-rating>
|
||||
<a class="grid-item-reviews" href="#">38 Reviews</a>
|
||||
<div class="grid-item-price">$170</div>
|
||||
```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>
|
||||
<div class="grid-item">
|
||||
<img class="grid-item-image" src="/assets/images/patterns/mad-rabbit-tattoo-7N4FMowSGek-unsplash.jpg" />
|
||||
<div class="grid-item-name">Shirt</div>
|
||||
<wa-rating label="Rating" readonly value="3"></wa-rating>
|
||||
<a class="grid-item-reviews" href="#">38 Reviews</a>
|
||||
<div class="grid-item-price">$170</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>
|
||||
<div class="grid-item">
|
||||
<img class="grid-item-image" src="/assets/images/patterns/mad-rabbit-tattoo-7N4FMowSGek-unsplash.jpg" />
|
||||
<div class="grid-item-name">Shirt</div>
|
||||
<wa-rating label="Rating" readonly value="3"></wa-rating>
|
||||
<a class="grid-item-reviews" href="#">38 Reviews</a>
|
||||
<div class="grid-item-price">$170</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>
|
||||
<div class="grid-item">
|
||||
<img class="grid-item-image" src="/assets/images/patterns/mad-rabbit-tattoo-7N4FMowSGek-unsplash.jpg" />
|
||||
<div class="grid-item-name">Shirt</div>
|
||||
<wa-rating label="Rating" readonly value="3"></wa-rating>
|
||||
<a class="grid-item-reviews" href="#">38 Reviews</a>
|
||||
<div class="grid-item-price">$170</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>
|
||||
<style>
|
||||
.with-product-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
border: var(--wa-panel-border-width) var(--wa-border-style) var(--wa-color-neutral-border-quiet);
|
||||
|
||||
.grid-item {
|
||||
padding: 1.5rem;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
.grid-item:nth-of-type(odd) {
|
||||
|
||||
border-right: var(--wa-panel-border-width) var(--wa-border-style) var(--wa-color-neutral-border-quiet);
|
||||
}
|
||||
.grid-item:not(:nth-last-child(-n + 2)) {
|
||||
border-bottom: var(--wa-panel-border-width) var(--wa-border-style) var(--wa-color-neutral-border-quiet);
|
||||
}
|
||||
|
||||
.grid-item-image {
|
||||
width: 100%;
|
||||
object-fit: cover;
|
||||
}
|
||||
|
||||
.grid-item-name {
|
||||
margin-top: 1rem;
|
||||
font-weight: var(--wa-font-weight-bold);
|
||||
}
|
||||
|
||||
.grid-item wa-rating {
|
||||
--symbol-size: var(--wa-font-size-m);
|
||||
margin-top: .5rem;
|
||||
}
|
||||
.grid-item-reviews {
|
||||
--wa-link-decoration-default: none;
|
||||
--wa-color-text-link: var(--wa-color-gray-50);
|
||||
font-size: var(--wa-font-size-m);
|
||||
}
|
||||
.grid-item-price {
|
||||
font-size: var(--wa-font-size-2xl);
|
||||
font-weight: var(--wa-font-weight-bold);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
```
|
||||
## Card with full details
|
||||
```html{.example}
|
||||
<div class="card-with-details">
|
||||
<wa-card with-footer>
|
||||
<img class="grid-item-image" src="/assets/images/patterns/mad-rabbit-tattoo-7N4FMowSGek-unsplash.jpg" />
|
||||
<div slot="footer" class="card-footer details">
|
||||
<span class="detail-name">Basic Tee 8-pack</span>
|
||||
<p class="detail-description">Get the full lineup of our Basic Tees. Have a fresh shirt all week, and an extra for laundry day.</p>
|
||||
<span class="detail-color">8 colors</span>
|
||||
<span class="detail-price">$256</span>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card with-footer>
|
||||
<img class="grid-item-image" src="/assets/images/patterns/mad-rabbit-tattoo-7N4FMowSGek-unsplash.jpg" />
|
||||
<div slot="footer" class="card-footer details">
|
||||
<span class="detail-name">Basic Tee 8-pack</span>
|
||||
<p class="detail-description">Get the full lineup of our Basic Tees. Have a fresh shirt all week, and an extra for laundry day.</p>
|
||||
<span class="detail-color">8 colors</span>
|
||||
<span class="detail-price">$256</span>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card with-footer>
|
||||
<img class="grid-item-image" src="/assets/images/patterns/mad-rabbit-tattoo-7N4FMowSGek-unsplash.jpg" />
|
||||
<div slot="footer" class="card-footer details">
|
||||
<span class="detail-name">Basic Tee 8-pack</span>
|
||||
<p class="detail-description">Get the full lineup of our Basic Tees. Have a fresh shirt all week, and an extra for laundry day.</p>
|
||||
<span class="detail-color">8 colors</span>
|
||||
<span class="detail-price">$256</span>
|
||||
</div>
|
||||
</wa-card>
|
||||
<wa-card with-footer>
|
||||
<img class="grid-item-image" src="/assets/images/patterns/mad-rabbit-tattoo-7N4FMowSGek-unsplash.jpg" />
|
||||
<div slot="footer" class="card-footer details">
|
||||
<span class="detail-name">Basic Tee 8-pack</span>
|
||||
<p class="detail-description">Get the full lineup of our Basic Tees. Have a fresh shirt all week, and an extra for laundry day.</p>
|
||||
<span class="detail-color">8 colors</span>
|
||||
<span class="detail-price">$256</span>
|
||||
</div>
|
||||
</wa-card>
|
||||
<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>
|
||||
<style>
|
||||
.card-with-details {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 1rem;
|
||||
}
|
||||
.card-with-details wa-card::part(body) {
|
||||
padding: 0;
|
||||
}
|
||||
.card-with-details .card-footer {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.details {
|
||||
.detail-description {
|
||||
color: var(--wa-color-gray-50);
|
||||
}
|
||||
.detail-name {
|
||||
font-size: var(--wa-font-size-l);
|
||||
font-weight: var(--wa-font-weight-action);
|
||||
}
|
||||
.detail-color {
|
||||
color: var(--wa-color-gray-50);
|
||||
font-style: italic;
|
||||
}
|
||||
.detail-price {
|
||||
font-size: var(--wa-font-size-xl);
|
||||
font-weight: var(--wa-font-weight-action);
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
```
|
||||
## With color swatches (WIP)
|
||||
```html{.example}
|
||||
|
||||
```
|
||||
</div>
|
||||
```
|
||||
431
docs/docs/patterns/ecommerce-product-overview.md
Normal file
431
docs/docs/patterns/ecommerce-product-overview.md
Normal file
@@ -0,0 +1,431 @@
|
||||
---
|
||||
title: Product Overview
|
||||
description: 'Showcase your products with overviews including images, ratings, features, options, and more.'
|
||||
parent: ecommerce
|
||||
tags: e-commerce
|
||||
---
|
||||
|
||||
## 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>
|
||||
```
|
||||
162
docs/docs/patterns/ecommerce-product-preview.md
Normal file
162
docs/docs/patterns/ecommerce-product-preview.md
Normal file
@@ -0,0 +1,162 @@
|
||||
---
|
||||
title: Product Preview
|
||||
description: 'Give shoppers a quick look at your products as they browse with modal previews.'
|
||||
parent: ecommerce
|
||||
tags: e-commerce
|
||||
icon: preview
|
||||
---
|
||||
|
||||
## 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,465 +0,0 @@
|
||||
---
|
||||
title: Product Reviews
|
||||
description: TODO
|
||||
parent: ecommerce
|
||||
tags: e-commerce
|
||||
---
|
||||
|
||||
TODO Page Description
|
||||
|
||||
## With images grid
|
||||
```html{.example}
|
||||
<div class="with-image-grid">
|
||||
<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="image-grid">
|
||||
<img src="/assets/images/patterns/gervyn-louis-IS03ajI00Fc-unsplash.jpg" />
|
||||
<img src="/assets/images/patterns/gervyn-louis-KXvd7y7AU6Q-unsplash.jpg" />
|
||||
<img src="/assets/images/patterns/gervyn-louis-semwwyXFQho-unsplash.jpg" />
|
||||
<img src="/assets/images/patterns/mad-rabbit-tattoo-7N4FMowSGek-unsplash.jpg" />
|
||||
</div>
|
||||
<div>
|
||||
<h2>Tank top</h2>
|
||||
<p>The Basic Tee 6-Pack allows you to fully express your vibrant personality with three grayscale options. Feeling adventurous? Put on a heather gray tee. Want to be a trendsetter? Try our exclusive colorway: "Black". Need to add an extra pop of color to your outfit? Our white tee has you covered.</p>
|
||||
<h3>Highlights</h3>
|
||||
<ul>
|
||||
<li>Hand cut and sewn locally</li>
|
||||
</ul>
|
||||
|
||||
<h3>Highlights</h3>
|
||||
<p>The 6-Pack includes two black, two white, and two heather gray Basic Tees. Sign up for our subscription service and be the first to get new, exciting colors, like our upcoming "Charcoal Gray" limited release.</p>
|
||||
|
||||
<span>$192</span>
|
||||
<div>
|
||||
<wa-rating label="Rating" precision="0.5" value="2.5"></wa-rating>
|
||||
<a href="#">117 Reviews</a>
|
||||
</div>
|
||||
<wa-radio-group label="Select an option" hint="Select an option that makes you proud." name="a" value="1">
|
||||
<wa-radio-button value="1">Option 1</wa-radio-button>
|
||||
<wa-radio-button value="2">Option 2</wa-radio-button>
|
||||
<wa-radio-button value="3">Option 3</wa-radio-button>
|
||||
</wa-radio-group>
|
||||
<wa-radio-group label="Select an option" hint="Select an option that makes you proud." name="a" value="1">
|
||||
<wa-radio-button value="1">Option 1</wa-radio-button>
|
||||
<wa-radio-button value="2">Option 2</wa-radio-button>
|
||||
<wa-radio-button value="3">Option 3</wa-radio-button>
|
||||
</wa-radio-group>
|
||||
<wa-button>Add to Cart</wa-button>
|
||||
</div>
|
||||
</div>
|
||||
<style>
|
||||
.with-image-grid {
|
||||
wa-breadcrumb::part(base) {
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.image-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(12, 1fr);
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.image-grid img:nth-of-type(1) {
|
||||
grid-column: 1/-1;
|
||||
}
|
||||
|
||||
.image-grid img:nth-of-type(2) {
|
||||
grid-column: 1/7;
|
||||
}
|
||||
.image-grid img:nth-of-type(3) {
|
||||
grid-column: 7/-1;
|
||||
}
|
||||
.image-grid img:nth-of-type(4) {
|
||||
grid-column: 1/-1;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
```
|
||||
|
||||
## With Tiered Images
|
||||
|
||||
```html{.example}
|
||||
<div class="with-tiered-images">
|
||||
<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>
|
||||
<div class="heading">
|
||||
<h2>Basic Tee</h2>
|
||||
<span style="font-size: var(--wa-font-size-2xl)">$35</span>
|
||||
</div>
|
||||
<div class="rating">
|
||||
<span>3.9</span>
|
||||
<wa-rating label="Rating" precision="0.5" value="3.9"></wa-rating>
|
||||
<a href="#">117 Reviews</a>
|
||||
</div>
|
||||
<div class="tiered-images">
|
||||
<img src="/assets/images/patterns/gervyn-louis-IS03ajI00Fc-unsplash.jpg" />
|
||||
<img src="/assets/images/patterns/gervyn-louis-KXvd7y7AU6Q-unsplash.jpg" />
|
||||
<img src="/assets/images/patterns/gervyn-louis-semwwyXFQho-unsplash.jpg" />
|
||||
</div>
|
||||
</div>
|
||||
<wa-radio-group label="Select an option" hint="Select an option that makes you proud." name="a" value="1">
|
||||
<wa-radio-button value="1">Option 1</wa-radio-button>
|
||||
<wa-radio-button value="2">Option 2</wa-radio-button>
|
||||
<wa-radio-button value="3">Option 3</wa-radio-button>
|
||||
</wa-radio-group>
|
||||
<wa-radio-group label="Select an option" hint="Select an option that makes you proud." name="a" value="1">
|
||||
<wa-radio-button value="1">Option 1</wa-radio-button>
|
||||
<wa-radio-button value="2">Option 2</wa-radio-button>
|
||||
<wa-radio-button value="3">Option 3</wa-radio-button>
|
||||
</wa-radio-group>
|
||||
<wa-button>Add to Cart</wa-button>
|
||||
<h3>Description</h3>
|
||||
<p>The Basic tee is an honest new take on a classic. The tee uses super soft, pre-shrunk cotton for true comfort and a dependable fit. They are hand cut and sewn locally, with a special dye technique that gives each tee it's own look.</p>
|
||||
<p>Looking to stock your closet? The Basic tee also comes in a 3-pack or 5-pack at a bundle discount.</p>
|
||||
<hr />
|
||||
<h3>Highlights</h3>
|
||||
<ul>
|
||||
<li>Hand cut and sewn locally</li>
|
||||
</ul>
|
||||
<div>
|
||||
<wa-card>
|
||||
<wa-icon family="solid" name="earth-americas"></wa-icon>
|
||||
<h3>International delivery</h3>
|
||||
<p>Get your order in 2 years</p>
|
||||
</wa-card>
|
||||
<wa-card>
|
||||
<wa-icon family="solid" name="earth-americas"></wa-icon>
|
||||
<h3>International delivery</h3>
|
||||
<p>Get your order in 2 years</p>
|
||||
|
||||
</wa-card>
|
||||
</div>
|
||||
</div>
|
||||
<style>
|
||||
.with-tiered-images {
|
||||
wa-breadcrumb::part(base) {
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
.heading {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.rating {
|
||||
display: flex;
|
||||
|
||||
span {
|
||||
display: inline-block;
|
||||
margin-right: 1rem;
|
||||
}
|
||||
|
||||
wa-rating {
|
||||
margin-right: 1rem;
|
||||
}
|
||||
}
|
||||
|
||||
.tiered-images {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(12, 1fr);
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.tiered-images img:nth-of-type(1) {
|
||||
grid-column: 1/-1;
|
||||
}
|
||||
|
||||
.tiered-images img:nth-of-type(2) {
|
||||
grid-column: 1/7;
|
||||
}
|
||||
.tiered-images img:nth-of-type(3) {
|
||||
grid-column: 7/-1;
|
||||
}
|
||||
</style>
|
||||
```
|
||||
## with images and expandable details
|
||||
|
||||
```html {.example}
|
||||
<wa-carousel class="carousel-thumbnails" navigation loop>
|
||||
<wa-carousel-item>
|
||||
<img
|
||||
alt="The sun shines on the mountains and trees (by Adam Kool on Unsplash)"
|
||||
src="/assets/examples/carousel/pullover-1.jpg"
|
||||
/>
|
||||
</wa-carousel-item>
|
||||
<wa-carousel-item>
|
||||
<img
|
||||
alt="A waterfall in the middle of a forest (by Thomas Kelly on Unsplash)"
|
||||
src="/assets/examples/carousel/pullover-2.jpg"
|
||||
/>
|
||||
</wa-carousel-item>
|
||||
<wa-carousel-item>
|
||||
<img
|
||||
alt="The sun is setting over a lavender field (by Leonard Cotte on Unsplash)"
|
||||
src="/assets/examples/carousel/pullover-3.jpg"
|
||||
/>
|
||||
</wa-carousel-item>
|
||||
<wa-carousel-item>
|
||||
<img
|
||||
alt="A field of grass with the sun setting in the background (by Sapan Patel on Unsplash)"
|
||||
src="/assets/examples/carousel/pullover-4.jpg"
|
||||
/>
|
||||
</wa-carousel-item>
|
||||
<wa-carousel-item>
|
||||
<img
|
||||
alt="A scenic view of a mountain with clouds rolling in (by V2osk on Unsplash)"
|
||||
src="/assets/examples/carousel/pullover-5.jpg"
|
||||
/>
|
||||
</wa-carousel-item>
|
||||
</wa-carousel>
|
||||
|
||||
<div class="thumbnails">
|
||||
<div class="thumbnails__scroller">
|
||||
<img alt="Thumbnail by 1" class="thumbnails__image active" src="/assets/examples/carousel/pullover-1.jpg" />
|
||||
<img alt="Thumbnail by 2" class="thumbnails__image" src="/assets/examples/carousel/pullover-2.jpg" />
|
||||
<img alt="Thumbnail by 3" class="thumbnails__image" src="/assets/examples/carousel/pullover-3.jpg" />
|
||||
<img alt="Thumbnail by 4" class="thumbnails__image" src="/assets/examples/carousel/pullover-4.jpg" />
|
||||
<img alt="Thumbnail by 5" class="thumbnails__image" src="/assets/examples/carousel/pullover-5.jpg" />
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h3 style="--wa-space-xl: 0;">Pullover Sweater</h3>
|
||||
<span class="price-big">$140</span>
|
||||
<wa-rating class="sweater-rating" label="Rating" precision="0.5" value="2.5"></wa-rating>
|
||||
<p>The Zip Tote Basket is the perfect midpoint between shopping tote and comfy backpack. With convertible straps, you can hand carry, should sling, or backpack this convenient and spacious bag. The zip top and durable canvas construction keeps your goods protected for all-day use.</p>
|
||||
<wa-radio-group label="Select Color" hint="Select an option that makes you proud." name="a" value="1">
|
||||
<wa-radio-button value="1"></wa-radio-button>
|
||||
<wa-radio-button value="2"></wa-radio-button>
|
||||
<wa-radio-button value="3"></wa-radio-button>
|
||||
</wa-radio-group>
|
||||
<div>
|
||||
<wa-button>Add to cart</wa-button>
|
||||
<wa-icon-button name="gear" label="Settings"></wa-icon-button>
|
||||
</div>
|
||||
<div class="details-group-example">
|
||||
<wa-details summary="First" open>
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
|
||||
aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
||||
</wa-details>
|
||||
|
||||
<wa-details summary="Second">
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
|
||||
aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
||||
</wa-details>
|
||||
|
||||
<wa-details summary="Third">
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
|
||||
aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
||||
</wa-details>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.carousel-thumbnails {
|
||||
--slide-aspect-ratio: 3 / 2;
|
||||
}
|
||||
|
||||
wa-radio-button #shadow-root div .button--medium {
|
||||
padding: var(--wa-space-xs) var(--wa-space-xs);
|
||||
}
|
||||
|
||||
.color-circle {
|
||||
--background: #000;
|
||||
background: var(--background);
|
||||
|
||||
width: 50px;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.sweater-rating {
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
.price-big {
|
||||
display: block;
|
||||
font-size: 32px;
|
||||
}
|
||||
|
||||
.thumbnails {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.thumbnails__scroller {
|
||||
display: flex;
|
||||
gap: var(--wa-space-s);
|
||||
overflow-x: auto;
|
||||
scrollbar-width: none;
|
||||
scroll-behavior: smooth;
|
||||
scroll-padding: var(--wa-space-s);
|
||||
}
|
||||
|
||||
.thumbnails__scroller::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.thumbnails__image {
|
||||
width: 64px;
|
||||
height: 64px;
|
||||
object-fit: cover;
|
||||
|
||||
opacity: 0.3;
|
||||
will-change: opacity;
|
||||
transition: 250ms opacity;
|
||||
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.thumbnails__image.active {
|
||||
opacity: 1;
|
||||
}
|
||||
.details-group-example wa-details:not(:last-of-type) {
|
||||
margin-bottom: var(--wa-space-2xs);
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
{
|
||||
const carousel = document.querySelector('.carousel-thumbnails');
|
||||
const scroller = document.querySelector('.thumbnails__scroller');
|
||||
const thumbnails = document.querySelectorAll('.thumbnails__image');
|
||||
|
||||
scroller.addEventListener('click', e => {
|
||||
const target = e.target;
|
||||
|
||||
if (target.matches('.thumbnails__image')) {
|
||||
const index = [...thumbnails].indexOf(target);
|
||||
carousel.goToSlide(index);
|
||||
}
|
||||
});
|
||||
|
||||
carousel.addEventListener('wa-slide-change', e => {
|
||||
const slideIndex = e.detail.index;
|
||||
|
||||
[...thumbnails].forEach((thumb, i) => {
|
||||
thumb.classList.toggle('active', i === slideIndex);
|
||||
if (i === slideIndex) {
|
||||
thumb.scrollIntoView({
|
||||
block: 'nearest'
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
const container = document.querySelector('.details-group-example');
|
||||
|
||||
// Close all other details when one is shown
|
||||
container.addEventListener('wa-show', event => {
|
||||
if (event.target.localName === 'wa-details') {
|
||||
[...container.querySelectorAll('wa-details')].map(details => (details.open = event.target === details));
|
||||
}
|
||||
});
|
||||
</script>
|
||||
```
|
||||
|
||||
## Split with image
|
||||
|
||||
```html {.example}
|
||||
<div class="split-with-image">
|
||||
<div class="div-1">
|
||||
<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>
|
||||
<h2>Everyday Ruck Snack</h2>
|
||||
<span>
|
||||
<span>$220</span> |
|
||||
<wa-rating label="Rating" precision="0.5" value="2.5"></wa-rating>
|
||||
<span>1624 reviews</span>
|
||||
</span>
|
||||
<p>Don't compromise on snack-carrying capacity with this lightweight and spacious bag. The drawstring top keeps all your favorite chips, crisps, fries, biscuits, crackers, and cookies secure.</p>
|
||||
<span><wa-icon family="solid" name="check"></wa-icon> In stock and ready to ship</span>
|
||||
|
||||
|
||||
</div>
|
||||
<div class="div-2">
|
||||
<img src="/assets/images/patterns/gervyn-louis-IS03ajI00Fc-unsplash.jpg" />
|
||||
</div>
|
||||
<div class="div-3">
|
||||
<wa-radio-group label="Select an option" hint="Select an option that makes you proud." name="a" value="1">
|
||||
<wa-radio-button value="1">Option 1</wa-radio-button>
|
||||
<wa-radio-button value="2">Option 2</wa-radio-button>
|
||||
<wa-radio-button value="3">Option 3</wa-radio-button>
|
||||
</wa-radio-group>
|
||||
</div>
|
||||
</div>
|
||||
<style>
|
||||
.split-with-image {
|
||||
display: grid;
|
||||
/* grid-template-columns: repeat(2, 1fr); */
|
||||
/* height: 1000px; */
|
||||
/* gap: 1rem; */
|
||||
.div-1 {
|
||||
|
||||
}
|
||||
.div-2 {
|
||||
/* background-color: black;
|
||||
grid-column-start: 2;
|
||||
grid-row: span 2 / span 2; */
|
||||
}
|
||||
.div-3 {
|
||||
|
||||
}
|
||||
}
|
||||
</style>
|
||||
```
|
||||
## With tabs
|
||||
|
||||
```html{.example}
|
||||
<div>
|
||||
<wa-rating class="sweater-rating" label="Rating" precision="0.5" value="2.5"></wa-rating>
|
||||
<h2>Application UI Icon Pack</h2>
|
||||
<img alt="Sample of 30 icons with friendly and fun details in outline, filled, and brand color styles." src="https://tailwindui.com/img/ecommerce-images/product-page-05-product-01.jpg" class="aqk aql">
|
||||
<p>The Application UI Icon Pack comes with over 200 icons in 3 styles: outline, filled, and branded. This playful icon pack is tailored for complex application user interfaces with a friendly and legible look.</p>
|
||||
<wa-button variant="brand">Brand</wa-button>
|
||||
|
||||
<wa-button variant="success">Success</wa-button>
|
||||
<hr />
|
||||
<h3>Highlights</h3>
|
||||
<ul>
|
||||
<li>200+ SVG icons in 3 unique styles</li>
|
||||
<li>Compatible with Figma, Sketch, and Adobe XD</li>
|
||||
<li>Drawn on 24 x 24 pixel grid</li>
|
||||
</ul>
|
||||
<hr />
|
||||
<h3>License</h3>
|
||||
<p>For personal and professional use. You cannot resell or redistribute these icons in their original or modified state. <a href="#">Read full license</a></p>
|
||||
<hr />
|
||||
<h3>Share</h3>
|
||||
|
||||
|
||||
<wa-icon family="brands" name="facebook"></wa-icon>
|
||||
<wa-icon family="brands" name="instagram"></wa-icon>
|
||||
<wa-icon family="brands" name="x-twitter"></wa-icon>
|
||||
<wa-tab-group>
|
||||
<wa-tab panel="general">General</wa-tab>
|
||||
<wa-tab panel="custom">Custom</wa-tab>
|
||||
<wa-tab panel="advanced">Advanced</wa-tab>
|
||||
<wa-tab panel="disabled" disabled>Disabled</wa-tab>
|
||||
|
||||
<wa-tab-panel name="general">
|
||||
<div></div>
|
||||
<div>
|
||||
<h3>Hector Gibbons</h3>
|
||||
<p>July 12, 2021</p>
|
||||
<wa-rating label="Rating" precision="0.5" value="2.5"></wa-rating>
|
||||
<p>Blown away by how polished this icon pack is. Everything looks so consistent and each SVG is optimized out of the box so I can use it directly with confidence. It would take me several hours to create a single icon this good, so it's a steal at this price.</p>
|
||||
</div>
|
||||
</wa-tab-panel>
|
||||
<wa-tab-panel name="custom">This is the custom tab panel.</wa-tab-panel>
|
||||
<wa-tab-panel name="advanced">This is the advanced tab panel.</wa-tab-panel>
|
||||
<wa-tab-panel name="disabled">This is a disabled tab panel.</wa-tab-panel>
|
||||
</wa-tab-group>
|
||||
|
||||
</div>
|
||||
|
||||
```
|
||||
213
docs/docs/patterns/ecommerce-review.md
Normal file
213
docs/docs/patterns/ecommerce-review.md
Normal file
@@ -0,0 +1,213 @@
|
||||
---
|
||||
title: Product Reviews
|
||||
description: 'Help shoppers make informed decisions with ratings, reviews, and testimonials from your customers.'
|
||||
parent: ecommerce
|
||||
tags: e-commerce
|
||||
---
|
||||
## 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>
|
||||
<span class="wa-caption-m"><em>September 23rd, 2023</em></span>
|
||||
</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">Rating Title</span>
|
||||
<p class="wa-caption-m">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>
|
||||
<span class="wa-caption-m"><em>May 5th, 2023</em></span>
|
||||
</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">Rating Title</span>
|
||||
<p class="wa-caption-m">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>
|
||||
<span class="wa-caption-m"><em>March 3rd, 2023</em></span>
|
||||
</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">Rating Title</span>
|
||||
<p class="wa-caption-m">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>
|
||||
<span class="wa-caption-m"><em>February 26th, 2023</em></span>
|
||||
</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">Rating Title</span>
|
||||
<p class="wa-caption-m">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>
|
||||
<span>63%</span>
|
||||
</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>
|
||||
<span>17%</span>
|
||||
</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>
|
||||
<span>15%</span>
|
||||
</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>
|
||||
<span>3%</span>
|
||||
</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>
|
||||
<span>2%</span>
|
||||
</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">Emily Selman</span>
|
||||
<wa-rating label="Rating" precision="0.5" value="2.5"></wa-rating>
|
||||
</div>
|
||||
</div>
|
||||
<p class="wa-caption-l"><em>This is the bag of my dreams. I took it on my last vacation and was able to fit an absurd amount of snacks for the many long and hungry flights.</em></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">Emily Selman</span>
|
||||
<wa-rating label="Rating" precision="0.5" value="2.5"></wa-rating>
|
||||
</div>
|
||||
</div>
|
||||
<p class="wa-caption-l"><em>This is the bag of my dreams. I took it on my last vacation and was able to fit an absurd amount of snacks for the many long and hungry flights.</em></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">Emily Selman</span>
|
||||
<wa-rating label="Rating" precision="0.5" value="2.5"></wa-rating>
|
||||
</div>
|
||||
</div>
|
||||
<p class="wa-caption-l"><em>This is the bag of my dreams. I took it on my last vacation and was able to fit an absurd amount of snacks for the many long and hungry flights.</em></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">Emily Selman</span>
|
||||
<wa-rating label="Rating" precision="0.5" value="2.5"></wa-rating>
|
||||
</div>
|
||||
</div>
|
||||
<p class="wa-caption-l"><em>This is the bag of my dreams. I took it on my last vacation and was able to fit an absurd amount of snacks for the many long and hungry flights.</em></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" style="color: var(--wa-color-success-fill-loud);"></wa-icon-button>
|
||||
<wa-icon-button name="thumbs-down" label="I like this review" style="color: var(--wa-color-danger-fill-loud);"></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" style="color: var(--wa-color-success-fill-loud);"></wa-icon-button>
|
||||
<wa-icon-button name="thumbs-down" label="I like this review" style="color: var(--wa-color-danger-fill-loud);"></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" style="color: var(--wa-color-success-fill-loud);"></wa-icon-button>
|
||||
<wa-icon-button name="thumbs-down" label="I like this review" style="color: var(--wa-color-danger-fill-loud);"></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,10 +1,279 @@
|
||||
---
|
||||
title: Shopping Cart
|
||||
description: TODO
|
||||
description: 'Give shoppers an overview of selected items with shopping carts that let them edit items and proceed to checkout.'
|
||||
parent: ecommerce
|
||||
tags: e-commerce
|
||||
---
|
||||
|
||||
TODO Page Description
|
||||
## Two Columns with Summary Card
|
||||
|
||||
## Examples
|
||||
```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>
|
||||
```
|
||||
85
docs/docs/patterns/ecommerce-store-navigation.md
Normal file
85
docs/docs/patterns/ecommerce-store-navigation.md
Normal file
@@ -0,0 +1,85 @@
|
||||
---
|
||||
title: Store Navigation
|
||||
description: 'Help shoppers explore categories and find products with all of the links they need to navigate your store.'
|
||||
parent: ecommerce
|
||||
unlisted: 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>
|
||||
```
|
||||
File diff suppressed because it is too large
Load Diff
26
docs/docs/patterns/ecommerce.njk
Normal file
26
docs/docs/patterns/ecommerce.njk
Normal file
@@ -0,0 +1,26 @@
|
||||
---
|
||||
title: E-commerce
|
||||
description: ''
|
||||
layout: page
|
||||
---
|
||||
|
||||
{% set ecommercePages = collections['e-commerce'] %}
|
||||
|
||||
<section class="index-grid">
|
||||
{%- for page in ecommercePages -%}
|
||||
|
||||
<a href="{{ page.url }}"{{ page.data.keywords | attr('data-keywords') }}>
|
||||
<wa-card with-header>
|
||||
<div slot="header">
|
||||
{% include "svgs/" + (page.data.icon or "thumbnail-placeholder") + ".njk" %}
|
||||
</div>
|
||||
<span class="page-name">{{ page.data.title }}</span>
|
||||
{% if pageSubtitle -%}
|
||||
<div class="wa-caption-s">{{ pageSubtitle }}</div>
|
||||
{%- endif %}
|
||||
</wa-card>
|
||||
</a>
|
||||
|
||||
{%- endfor -%}
|
||||
|
||||
</section>
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
title: Business
|
||||
description: TODO
|
||||
unlisted: true
|
||||
---
|
||||
|
||||
TODO Page Description
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
title: Entertainment
|
||||
description: TODO
|
||||
unlisted: true
|
||||
---
|
||||
|
||||
TODO Page Description
|
||||
|
||||
@@ -1,6 +1,29 @@
|
||||
---
|
||||
title: Patterns
|
||||
description: Patterns are reusable solutions to common design problems.
|
||||
description: Patterns are reusable UI solutions to common design problems, ready to copy and paste into any project.
|
||||
layout: overview
|
||||
categories: ["app", "e-commerce"]
|
||||
listChildren: true
|
||||
override:tags: []
|
||||
---
|
||||
|
||||
<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/installation) to set up all of these features in your project.
|
||||
|
||||
{% endmarkdown %}
|
||||
</div>
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
title: Membership
|
||||
description: TODO
|
||||
unlisted: true
|
||||
---
|
||||
|
||||
TODO Page Description
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
title: News
|
||||
description: TODO
|
||||
unlisted: true
|
||||
---
|
||||
|
||||
TODO Page Description
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
title: Non-profit
|
||||
description: TODO
|
||||
unlisted: true
|
||||
---
|
||||
|
||||
TODO Page Description
|
||||
|
||||
7
docs/docs/patterns/patterns.css
Normal file
7
docs/docs/patterns/patterns.css
Normal file
@@ -0,0 +1,7 @@
|
||||
.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,5 +1,5 @@
|
||||
{
|
||||
"layout": "block.njk",
|
||||
"layout": "patterns.njk",
|
||||
"tags": ["patterns"],
|
||||
"wide": true,
|
||||
"noAlpha": true
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
title: Portfolio
|
||||
description: TODO
|
||||
unlisted: true
|
||||
---
|
||||
|
||||
TODO Page Description
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
title: Product Landing
|
||||
description: TODO
|
||||
unlisted: true
|
||||
---
|
||||
|
||||
TODO Page Description
|
||||
|
||||
@@ -12,37 +12,11 @@ Components with the <wa-badge variant="warning" pill>Experimental</wa-badge> bad
|
||||
During the alpha period, things might break! We take breaking changes very seriously, but sometimes they're necessary to make the final product that much better. We appreciate your patience!
|
||||
:::
|
||||
|
||||
## 3.0.0-alpha.12
|
||||
## Next
|
||||
|
||||
### Enhancements
|
||||
|
||||
- Added `appearance` to [`<wa-details>`](/docs/components/details) and [`<wa-card>`](/docs/components/card) and support for the [appearance utilities](/docs/utilities/appearance/) in the [`<details>` native styles](/docs/native/details).
|
||||
- Added an `orange` scale to all color palettes
|
||||
- Added the [`.wa-cloak` utility](/docs/utilities/fouce) to prevent FOUCE
|
||||
- Added the [`allDefined()` utility](/docs/usage/#all-defined) for awaiting component registration
|
||||
|
||||
### Bug fixes
|
||||
|
||||
- Specifying inherited CSS properties on `<wa-tooltip>` now works as expected ([thanks Dennis!](https://github.com/shoelace-style/webawesome-alpha/discussions/203))
|
||||
- Fixed a bug in `<wa-select>` that made it hard to use with VueJS, Svelte, and many other frameworks
|
||||
- Fixed a bug in `<wa-select multiple>` that sometimes resulted in empty `<div>` elements being output
|
||||
- Fixed a bug where changing a `<wa-option>` label wouldn't update the display label in `<wa-select>`
|
||||
- Added default spacing to icons slotted into `<wa-tab>`
|
||||
- Lots of fixes around pill-shaped elements:
|
||||
- Fixed the `wa-pill` class for text fields
|
||||
- Fixed `pill` style for `<wa-input>` and `<wa-radio-button>` elements
|
||||
- Fixed a bug in `<wa-radio-button>` that prevented active buttons from receiving the correct styles
|
||||
- Fixed a bug in `<wa-button>` that prevented the focus ring from showing in Safari
|
||||
- Fixed alignment of `<wa-dropdown>` inside button groups
|
||||
- Removed close watcher logic to backdrop hide animation bugs in `<wa-dialog>` and `<wa-drawer>`; this logic is already handled and we'll revisit `CloseWatcher` when browser support is better and behaviors are consistent
|
||||
- Revert `<wa-dialog>` structure and CSS to fix clipped content in dialogs (WA-A #123) and light dismiss in iOS Safari (WA-A #201)
|
||||
- Fixed `wa-pill` class for text fields
|
||||
- Fixed `pill` style for `<wa-input>` elements
|
||||
- Fixed a bug in `<wa-color-picker>` that prevented light dismiss from working when clicking immediately above the color picker dropdown
|
||||
- Fixed a bug in `<wa-progress>` that prevented Safari from animation progress changes
|
||||
- Fixed the missing indeterminate icon in [native checkbox styles](/docs/native/checkbox)
|
||||
- Fixed a bug in `<wa-radio>` where elements would stack instead of display inline
|
||||
- Docs fixes:
|
||||
- Fixed the search dialog's styles so it doesn't jump around as you search
|
||||
- Theme cards now have icons
|
||||
|
||||
## 3.0.0-alpha.11
|
||||
|
||||
|
||||
3
docs/docs/themes/creating.md
vendored
3
docs/docs/themes/creating.md
vendored
@@ -31,7 +31,8 @@ If you're customizing the default dark styles, scope your styles to the followin
|
||||
|
||||
```css
|
||||
.wa-dark,
|
||||
.wa-invert {
|
||||
.wa-invert,
|
||||
:is(:host-context(.wa-dark)) {
|
||||
/* your custom styles here */
|
||||
}
|
||||
```
|
||||
|
||||
9
docs/docs/themes/index.njk
vendored
9
docs/docs/themes/index.njk
vendored
@@ -1,13 +1,13 @@
|
||||
---
|
||||
title: Themes
|
||||
description: Themes are collections of design tokens that thread through every Web Awesome component and pattern.
|
||||
description: Themes are collections of design tokens that thread through every Web Awesome component and pattern.
|
||||
Themes play a crucial role in [customizing Web Awesome](/docs/customizing).
|
||||
layout: overview
|
||||
override:tags: []
|
||||
forTag: theme
|
||||
categories:
|
||||
tags: [other, pro]
|
||||
other: Free
|
||||
pro: Pro
|
||||
---
|
||||
|
||||
<div class="max-line-length">
|
||||
@@ -30,7 +30,7 @@ In pre-made themes, we use a light color scheme by default.
|
||||
Additionally, styles may be scoped to the `:root` selector to be activated automatically.
|
||||
For pre-made themes, *all* custom properties are scoped to `:root`, the theme class, and `wa-light`.
|
||||
|
||||
Finally, we scope themes to `:host` to ensure the styles are applied to the shadow roots of custom elements.
|
||||
Finally, we scope themes to `:host` and `:host-context()` to ensure the styles are applied to the shadow roots of custom elements.
|
||||
|
||||
For example, the default theme is set up like this:
|
||||
|
||||
@@ -44,7 +44,8 @@ For example, the default theme is set up like this:
|
||||
}
|
||||
|
||||
.wa-dark,
|
||||
.wa-invert {
|
||||
.wa-invert,
|
||||
:host-context(.wa-dark) {
|
||||
/* subset of CSS custom properties for a dark color scheme */
|
||||
}
|
||||
```
|
||||
|
||||
1
docs/docs/themes/themes.json
vendored
1
docs/docs/themes/themes.json
vendored
@@ -3,7 +3,6 @@
|
||||
"wide": true,
|
||||
"tags": ["themes", "theme"],
|
||||
"brand": "blue",
|
||||
"icon": "theme",
|
||||
"eleventyComputed": {
|
||||
"file": "styles/themes/{{ page.fileSlug }}.css"
|
||||
}
|
||||
|
||||
@@ -3,5 +3,4 @@ title: Design Tokens
|
||||
description: A theme is a collection of predefined CSS custom properties that control global styles from color to shadows. These custom properties thread through all Web Awesome components for a consistent look and feel.
|
||||
layout: overview
|
||||
override:tags: []
|
||||
categories: {tags: true}
|
||||
---
|
||||
|
||||
@@ -8,61 +8,6 @@ Web Awesome components are just regular HTML elements, or [custom elements](http
|
||||
|
||||
If you're new to custom elements, often referred to as "web components," this section will familiarize you with how to use them.
|
||||
|
||||
## Awaiting Registration
|
||||
|
||||
Unlike traditional frameworks, custom elements don't have a centralized initialization phase. This means you need to verify that a custom element has been properly registered before attempting to interact with its properties or methods.
|
||||
|
||||
### Individual components: `customElements.whenDefined()` { #when-defined}
|
||||
|
||||
You can use the [`customElements.whenDefined()`](https://developer.mozilla.org/en-US/docs/Web/API/CustomElementRegistry/whenDefined) method to ensure a specific component is ready:
|
||||
|
||||
```ts
|
||||
await customElements.whenDefined('wa-button');
|
||||
|
||||
// <wa-button> is ready to use!
|
||||
const button = document.querySelector('wa-button');
|
||||
```
|
||||
|
||||
### All Web Awesome components: `allDefined()` { #all-defined }
|
||||
|
||||
When working with multiple components, checking each one individually can become tedious. For convenience, Web Awesome provides the `allDefined()` function which automatically detects and waits for all Web Awesome components in the DOM to be initialized before resolving.
|
||||
|
||||
```ts
|
||||
import { allDefined } from '/dist/webawesome.js';
|
||||
|
||||
// Waits for all Web Awesome components in the DOM to be registered
|
||||
await allDefined();
|
||||
|
||||
// All Web Awesome components on the page are ready!
|
||||
```
|
||||
|
||||
#### Advanced Usage
|
||||
|
||||
By default, `allDefined()` will wait for all `wa-` prefixed custom elements within the current `document` to be registered.
|
||||
You can customize this behavior by passing in options:
|
||||
- `root` allows you to pass in a different element to search within, or a different document entirely (defaults to `document`).
|
||||
- `match` allows you to specify a custom function to determine which elements to wait for. This function should return `true` for elements you want to wait for and `false` for those you don't.
|
||||
- `additionalElements` allows you to wait for custom elements to be defined that may not be present in the DOM at the time `allDefined()` is called. This can be useful for elements that are loaded dynamically via JS.
|
||||
|
||||
Here is an example of using `match` and `root` to await registration of Web Awesome components inside an element with an id of `sidebar`, plus a `<my-component>` element if present in the DOM, and `<wa-slider>` and `<other-slider>` elements whether present in the DOM or not:
|
||||
|
||||
```js
|
||||
import { allDefined } from '/dist/webawesome.js';
|
||||
|
||||
await allDefined({
|
||||
match: tagName => tagName.startsWith('wa-') || tagName === 'my-component',
|
||||
root: document.getElementById('sidebar'),
|
||||
additionalElements: ['wa-slider', 'other-slider']
|
||||
});
|
||||
```
|
||||
|
||||
:::warning
|
||||
`additionalElements` will only wait for elements to be registered — it will not load them.
|
||||
If you're using the autoloader plus custom JS to inject HTML dynamically, **you need to make sure your JS runs _before_ the `await allDefined()` call**,
|
||||
otherwise you could run into a chicken and egg issue:
|
||||
since the autoloader will not load elements until they are present in the DOM, the promise will never resolve and your JS to inject them will not run.
|
||||
:::
|
||||
|
||||
## Attributes & Properties
|
||||
|
||||
Many components have properties that can be set using attributes. For example, buttons accept a `size` attribute that maps to the `size` property which dictates the button's size.
|
||||
@@ -143,6 +88,49 @@ For example, `<button>` and `<wa-button>` both have a `type` attribute, but the
|
||||
**Don't make assumptions about a component's API!** To prevent unexpected behaviors, please take the time to review the documentation and make sure you understand what each attribute, property, method, and event is intended to do.
|
||||
:::
|
||||
|
||||
## Waiting for Components to Load
|
||||
|
||||
Web components are registered with JavaScript, so depending on how and when you load Web Awesome, you may notice a [Flash of Undefined Custom Elements (FOUCE)](https://www.abeautifulsite.net/posts/flash-of-undefined-custom-elements/) when the page loads. There are a couple ways to prevent this, both of which are described in the linked article.
|
||||
|
||||
One option is to use the [`:defined`](https://developer.mozilla.org/en-US/docs/Web/CSS/:defined) CSS pseudo-class to "hide" custom elements that haven't been registered yet. You can scope it to specific tags or you can hide all undefined custom elements as shown below.
|
||||
|
||||
```css
|
||||
:not(:defined) {
|
||||
visibility: hidden;
|
||||
}
|
||||
```
|
||||
|
||||
As soon as a custom element is registered, it will immediately appear with all of its styles, effectively eliminating FOUCE. Note the use of `visibility: hidden` instead of `display: none` to reduce shifting as elements are registered. The drawback to this approach is that custom elements can potentially appear one by one instead of all at the same time.
|
||||
|
||||
Another option is to use [`customElements.whenDefined()`](https://developer.mozilla.org/en-US/docs/Web/API/CustomElementRegistry/whenDefined), which returns a promise that resolves when the specified element gets registered. You'll probably want to use it with [`Promise.allSettled()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled) in case an element fails to load for some reason.
|
||||
|
||||
A clever way to use this method is to hide the `<body>` with `opacity: 0` and add a class that fades it in as soon as all your custom elements are defined.
|
||||
|
||||
```html
|
||||
<style>
|
||||
body {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
body.ready {
|
||||
opacity: 1;
|
||||
transition: 0.25s opacity;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script type="module">
|
||||
await Promise.allSettled([
|
||||
customElements.whenDefined('wa-button'),
|
||||
customElements.whenDefined('wa-card'),
|
||||
customElements.whenDefined('wa-rating')
|
||||
]);
|
||||
|
||||
// Button, card, and rating are registered now! Add
|
||||
// the `ready` class so the UI fades in.
|
||||
document.body.classList.add('ready');
|
||||
</script>
|
||||
```
|
||||
|
||||
## Component Rendering and Updating
|
||||
|
||||
Web Awesome components are built with [Lit](https://lit.dev/), a tiny library that makes authoring custom elements easier, more maintainable, and a lot of fun! As a Web Awesome user, here is some helpful information about rendering and updating you should probably be aware of.
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
---
|
||||
title: Reduce FOUCE
|
||||
description: Utility to improve the loading experience by hiding non-prerendered custom elements until they are registered.
|
||||
file: styles/utilities/fouce.css
|
||||
icon: spinner
|
||||
snippet: .wa-cloak
|
||||
---
|
||||
|
||||
Often, components are shown before their logic and styles have had a chance to load, also known as a [Flash of Undefined Custom Elements](https://www.abeautifulsite.net/posts/flash-of-undefined-custom-elements/).
|
||||
The FOUCE style utility (which is automatically applied if you use our [style utilities](/docs/utilities/)) automatically takes care of hiding custom elements until **both they and their contents** have been registered, up to a maximum of two seconds.
|
||||
|
||||
In many cases, this is not enough, and you may wish to hide a broader wrapper element or even the entire page until all WA elements within it have loaded.
|
||||
To do that, you can add the `wa-cloak` class to any element on the page or even apply it to the whole page by placing the class on the `<html>` element:
|
||||
|
||||
```html
|
||||
<html class="wa-cloak">
|
||||
...
|
||||
</html>
|
||||
```
|
||||
|
||||
As soon as all elements are registered _or_ after two seconds have elapsed, the autoloader will show the page. The two-second timeout prevents blank screens from persisting on slow networks and pages that have errors.
|
||||
|
||||
:::details Are you using Turbo in your app?
|
||||
|
||||
If you're using [Turbo](https://turbo.hotwired.dev/) to serve a multi-page application (MPA) as a single page application (SPA), you might notice FOUCE when navigating from page to page. This is because Turbo renders the new page's content before the autoloader has a change to register new components.
|
||||
|
||||
The following function acts as a middleware to ensure components are registered _before_ the page shows, eliminating FOUCE for page-to-page navigation with Turbo.
|
||||
|
||||
```js
|
||||
import { preventTurboFouce } from '/dist/webawesome.js';
|
||||
|
||||
preventTurboFouce();
|
||||
```
|
||||
:::
|
||||
131
docs/docs/utilities/fouce.njk
Normal file
131
docs/docs/utilities/fouce.njk
Normal file
@@ -0,0 +1,131 @@
|
||||
---
|
||||
title: Reduce FOUCE
|
||||
description: Utility to improve the loading experience by hiding non-prerendered custom elements until they are registered.
|
||||
file: styles/utilities/fouce.css
|
||||
icon: spinner
|
||||
---
|
||||
{% markdown %}
|
||||
No class is needed to use this utility, it will be applied automatically as long as it its CSS is included.
|
||||
|
||||
Here is a comparison of the loading experience with and without this utility,
|
||||
with a simulated slow loading time:
|
||||
|
||||
{% endmarkdown %}
|
||||
|
||||
|
||||
<div class="wa-split wa-align-items-end">
|
||||
<strong>Normal loading</strong>
|
||||
<wa-button onclick="document.querySelectorAll('iframe').forEach(iframe => iframe.srcdoc = iframe.srcdoc)">
|
||||
<wa-icon name="refresh"></wa-icon>
|
||||
Refresh
|
||||
</wa-button>
|
||||
<strong>With FOUCE reduction</strong>
|
||||
</div>
|
||||
|
||||
|
||||
{% set sample_card %}
|
||||
<link id="theme-stylesheet" rel="stylesheet" href="/dist/styles/themes/default.css" render="blocking" fetchpriority="high">
|
||||
<link rel="stylesheet" href="/dist/styles/webawesome.css">
|
||||
<link rel="stylesheet" href="/dist/styles/forms.css">
|
||||
<script type=module>
|
||||
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
|
||||
const loadScript = src => new Promise((resolve, reject) => {
|
||||
const script = document.createElement("script");
|
||||
script.src = src;
|
||||
script.type = "module";
|
||||
script.onload = resolve;
|
||||
script.onerror = reject;
|
||||
document.head.appendChild(script);
|
||||
});
|
||||
|
||||
await delay(500);
|
||||
await loadScript("/dist/components/button/button.js");
|
||||
await delay(500);
|
||||
await loadScript("/dist/components/card/card.js");
|
||||
await delay(500);
|
||||
await loadScript("/dist/components/rating/rating.js");
|
||||
</script>
|
||||
|
||||
<wa-card with-footer with-image class="card-overview">
|
||||
<img
|
||||
slot="image"
|
||||
src="https://images.unsplash.com/photo-1559209172-0ff8f6d49ff7?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=500&q=80"
|
||||
alt="A kitten sits patiently between a terracotta pot and decorative grasses."
|
||||
/>
|
||||
|
||||
<strong>Mittens</strong><br />
|
||||
This kitten is as cute as he is playful. Bring him home today!<br />
|
||||
<small>6 weeks old</small>
|
||||
|
||||
<div slot="footer">
|
||||
<wa-button variant="brand" pill>More Info</wa-button>
|
||||
<wa-rating></wa-rating>
|
||||
</div>
|
||||
</wa-card>
|
||||
|
||||
<style>
|
||||
.card-overview small {
|
||||
color: var(--wa-color-text-quiet);
|
||||
}
|
||||
|
||||
.card-overview [slot=footer] {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
</style>
|
||||
{% endset %}
|
||||
|
||||
|
||||
<div class="iframes">
|
||||
<iframe srcdoc='<body class="wa-fouce-off">{{ sample_card }}</body>'></iframe>
|
||||
<iframe srcdoc='{{ sample_card }}'></iframe>
|
||||
</div>
|
||||
<style>
|
||||
.iframes {
|
||||
display: flex;
|
||||
gap: var(--wa-space-m);
|
||||
margin-top: var(--wa-space-l);
|
||||
|
||||
iframe {
|
||||
flex: 1;
|
||||
height: 60ch;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
{% markdown %}
|
||||
## How does it work?
|
||||
|
||||
The utility consists of a timeout (`2s` by default) and a fade duration (`200ms` by default).
|
||||
- If the element is _ready_ before the timeout, it will appear immediately.
|
||||
- If it takes longer than _timeout_ + _fade_, it will fade in over the fade duration.
|
||||
- If it takes somewhere between _timeout_ and _timeout_ + _fade_, you will get an interrupted fade.
|
||||
|
||||
An element is considered ready when both of these are true:
|
||||
1. Either It has been registered or has a `did-ssr` attribute (indicating it was pre-rendered)
|
||||
2. If it’s a Web Awesome component, its contents are also ready
|
||||
|
||||
## Customization
|
||||
|
||||
You can use the following CSS variables to customize the behavior:
|
||||
|
||||
| Variable | Description | Default |
|
||||
| --- | --- | --- |
|
||||
| `--wa-fouce-fade` | The transition duration for the fade effect. | `200ms` |
|
||||
| `--wa-fouce-timeout` | The timeout after which elements will appear even if not registered | `2s` |
|
||||
|
||||
The fade duration cannot be longer than the timeout.
|
||||
This means that you can disable FOUCE reduction on an element by setting `--wa-fouce-timeout: 0s`.
|
||||
|
||||
For example, if instead of `did-ssr` you used an `ssr` attribute to mark elements that were pre-rendered, you can do this to get them to appear immediately:
|
||||
|
||||
```css
|
||||
[ssr] {
|
||||
--wa-fouce-timeout: 0s;
|
||||
}
|
||||
```
|
||||
|
||||
You can also opt-out from FOUCE reduction for an element and its contents by adding the `.wa-fouce-off` class to it.
|
||||
Applying this class to the root element will disable the utility for the entire page.
|
||||
{% endmarkdown %}
|
||||
@@ -4,6 +4,8 @@ description: Build better with Web Awesome, the open source library of web compo
|
||||
layout: page
|
||||
---
|
||||
|
||||
|
||||
|
||||
<style>
|
||||
.title,
|
||||
.anchor-heading a,
|
||||
@@ -385,4 +387,4 @@ layout: page
|
||||
© Fonticons, Inc.
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@shoelace-style/webawesome",
|
||||
"version": "3.0.0-alpha.12",
|
||||
"version": "3.0.0-alpha.11",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@shoelace-style/webawesome",
|
||||
"version": "3.0.0-alpha.12",
|
||||
"version": "3.0.0-alpha.11",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@ctrl/tinycolor": "^4.1.0",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@shoelace-style/webawesome",
|
||||
"description": "A forward-thinking library of web components.",
|
||||
"version": "3.0.0-alpha.12",
|
||||
"version": "3.0.0-alpha.11",
|
||||
"homepage": "https://webawesome.com/",
|
||||
"author": "Web Awesome",
|
||||
"license": "MIT",
|
||||
@@ -52,8 +52,8 @@
|
||||
"start:alpha": "node scripts/build.js --alpha --develop",
|
||||
"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": "web-test-runner --group default",
|
||||
"test:component": "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 .",
|
||||
|
||||
@@ -4,7 +4,6 @@ import { execSync } from 'child_process';
|
||||
import { deleteAsync } from 'del';
|
||||
import esbuild from 'esbuild';
|
||||
import { replace } from 'esbuild-plugin-replace';
|
||||
|
||||
import { mkdir, readFile } from 'fs/promises';
|
||||
import getPort, { portNumbers } from 'get-port';
|
||||
import { globby } from 'globby';
|
||||
@@ -267,13 +266,6 @@ async function regenerateBundle() {
|
||||
* 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 = [];
|
||||
|
||||
@@ -109,7 +109,7 @@ export default class WaButton extends WebAwesomeFormAssociatedElement {
|
||||
@property({ reflect: true }) value: string | null = null;
|
||||
|
||||
/** When set, the underlying button will be rendered as an `<a>` with this `href` instead of a `<button>`. */
|
||||
@property({ reflect: true }) href = null;
|
||||
@property() href = '';
|
||||
|
||||
/** Tells the browser where to open the link. Only used when `href` is present. */
|
||||
@property() target: '_blank' | '_parent' | '_self' | '_top';
|
||||
|
||||
@@ -5,16 +5,15 @@
|
||||
|
||||
--spacing: var(--wa-space);
|
||||
--border-width: var(--wa-panel-border-width);
|
||||
--outlined-background-color: var(--wa-color-surface-default);
|
||||
--outlined-border-color: var(--wa-color-surface-border);
|
||||
--border-color: var(--wa-color-surface-border);
|
||||
--border-radius: var(--wa-panel-border-radius);
|
||||
|
||||
--inner-border-radius: calc(var(--border-radius) - var(--border-width));
|
||||
--inner-border-color: var(--outlined-border-color);
|
||||
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
background-color: var(--background-color, var(--wa-color-surface-default));
|
||||
border-color: var(--border-color, var(--wa-color-surface-border));
|
||||
background-color: var(--wa-color-surface-default);
|
||||
border-color: var(--border-color);
|
||||
border-radius: var(--border-radius);
|
||||
border-style: var(--wa-panel-border-style);
|
||||
box-shadow: var(--wa-shadow-s);
|
||||
@@ -22,20 +21,6 @@
|
||||
color: var(--wa-color-text-normal);
|
||||
}
|
||||
|
||||
:host(:is([appearance~='accent'], .wa-accent)) {
|
||||
color: var(--text-color, var(--wa-color-text-normal));
|
||||
}
|
||||
|
||||
:host([appearance~='filled']),
|
||||
:host(.wa-filled) {
|
||||
--inner-border-color: oklab(from var(--outlined-border-color) l a b / 65%);
|
||||
}
|
||||
|
||||
:host([appearance='plain']) {
|
||||
--inner-border-color: transparent;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
/* Take care of top and bottom radii */
|
||||
.image,
|
||||
:host(:not([with-image])) .header,
|
||||
@@ -61,19 +46,10 @@
|
||||
}
|
||||
}
|
||||
|
||||
/* Round all corners for plain appearance */
|
||||
:host([appearance='plain']) .image {
|
||||
border-radius: var(--inner-border-radius);
|
||||
|
||||
&::slotted(img) {
|
||||
border-radius: inherit !important;
|
||||
}
|
||||
}
|
||||
|
||||
.header {
|
||||
display: block;
|
||||
border-block-end-style: inherit;
|
||||
border-block-end-color: var(--inner-border-color);
|
||||
border-block-end-color: var(--border-color);
|
||||
border-block-end-width: var(--border-width);
|
||||
padding: calc(var(--spacing) / 2) var(--spacing);
|
||||
}
|
||||
@@ -86,7 +62,7 @@
|
||||
.footer {
|
||||
display: block;
|
||||
border-block-start-style: inherit;
|
||||
border-block-start-color: var(--inner-border-color);
|
||||
border-block-start-color: var(--border-color);
|
||||
border-block-start-width: var(--border-width);
|
||||
padding: var(--spacing);
|
||||
}
|
||||
|
||||
@@ -2,7 +2,6 @@ import { html } from 'lit';
|
||||
import { customElement, property } from 'lit/decorators.js';
|
||||
import { HasSlotController } from '../../internal/slot.js';
|
||||
import WebAwesomeElement from '../../internal/webawesome-element.js';
|
||||
import appearanceStyles from '../../styles/utilities/appearance.css';
|
||||
import sizeStyles from '../../styles/utilities/size.css';
|
||||
import styles from './card.css';
|
||||
|
||||
@@ -23,24 +22,19 @@ import styles from './card.css';
|
||||
* @csspart footer - The container that wraps the card's footer.
|
||||
*
|
||||
* @cssproperty [--border-radius=var(--wa-panel-border-radius)] - The radius for the card's corners. Expects a single value.
|
||||
* @cssproperty [--border-color=var(--wa-color-surface-border)] - The color of the card's borders. Expects a single value.
|
||||
* @cssproperty [--inner-border-color=var(--wa-color-surface-border)] - The color of the card's inner borders, e.g. those separating headers and footers from the main content. Expects a single value.
|
||||
* @cssproperty [--border-color=var(--wa-color-surface-border)] - The color of the card's borders, including inner borders. Expects a single value.
|
||||
* @cssproperty [--border-width=var(--wa-panel-border-width)] - The width of the card's borders. Expects a single value.
|
||||
* @cssproperty [--spacing=var(--wa-space)] - The amount of space around and between sections of the card. Expects a single value.
|
||||
*/
|
||||
@customElement('wa-card')
|
||||
export default class WaCard extends WebAwesomeElement {
|
||||
static shadowStyle = [sizeStyles, appearanceStyles, styles];
|
||||
static shadowStyle = [sizeStyles, styles];
|
||||
|
||||
private readonly hasSlotController = new HasSlotController(this, 'footer', 'header', 'image');
|
||||
|
||||
/** The component's size. Will be inherited by any descendants with a `size` attribute. */
|
||||
@property({ reflect: true, initial: 'medium' }) size: 'small' | 'medium' | 'large' | 'inherit' = 'inherit';
|
||||
|
||||
/** The card's visual appearance. */
|
||||
@property({ reflect: true })
|
||||
appearance: 'accent' | 'filled' | 'outlined' | 'plain' = 'outlined';
|
||||
|
||||
/** Renders the card with a header. Only needed for SSR, otherwise is automatically added. */
|
||||
@property({ attribute: 'with-header', type: Boolean, reflect: true }) withHeader = false;
|
||||
|
||||
|
||||
@@ -9,7 +9,6 @@ import { getTargetElement, waitForEvent } from '../../internal/event.js';
|
||||
import { watch } from '../../internal/watch.js';
|
||||
import WebAwesomeElement from '../../internal/webawesome-element.js';
|
||||
import nativeStyles from '../../styles/native/details.css';
|
||||
import appearanceStyles from '../../styles/utilities/appearance.css';
|
||||
import { LocalizeController } from '../../utilities/localize.js';
|
||||
import '../icon/icon.js';
|
||||
import styles from './details.css';
|
||||
@@ -46,7 +45,7 @@ import styles from './details.css';
|
||||
*/
|
||||
@customElement('wa-details')
|
||||
export default class WaDetails extends WebAwesomeElement {
|
||||
static shadowStyle = [appearanceStyles, nativeStyles, styles];
|
||||
static shadowStyle = [nativeStyles, styles];
|
||||
|
||||
private detailsObserver: MutationObserver;
|
||||
private readonly localize = new LocalizeController(this);
|
||||
@@ -68,9 +67,6 @@ export default class WaDetails extends WebAwesomeElement {
|
||||
/** Disables the details so it can't be toggled. */
|
||||
@property({ type: Boolean, reflect: true }) disabled = false;
|
||||
|
||||
/** The element's visual appearance. */
|
||||
@property({ reflect: true }) appearance: 'filled' | 'outlined' | 'plain' = 'outlined';
|
||||
|
||||
firstUpdated() {
|
||||
this.body.style.height = this.open ? 'auto' : '0';
|
||||
if (this.open) {
|
||||
|
||||
@@ -1,89 +1,24 @@
|
||||
:host {
|
||||
--background-color: var(--wa-color-surface-raised);
|
||||
--border-radius: var(--wa-panel-border-radius);
|
||||
--box-shadow: var(--wa-shadow-l);
|
||||
--width: 31rem;
|
||||
--spacing: var(--wa-space-xl);
|
||||
--show-duration: 200ms;
|
||||
--hide-duration: 200ms;
|
||||
|
||||
display: contents;
|
||||
}
|
||||
|
||||
:host(:not([open])) {
|
||||
display: none;
|
||||
}
|
||||
|
||||
:host([open]) {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.dialog {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
width: var(--width);
|
||||
max-width: calc(100% - var(--wa-space-2xl));
|
||||
max-height: calc(100% - var(--wa-space-2xl));
|
||||
background-color: var(--background-color);
|
||||
border-radius: var(--border-radius);
|
||||
border: none;
|
||||
box-shadow: var(--box-shadow);
|
||||
padding: 0;
|
||||
dialog {
|
||||
width: inherit;
|
||||
max-width: inherit;
|
||||
max-height: inherit;
|
||||
background-color: inherit;
|
||||
border-radius: inherit;
|
||||
border: inherit;
|
||||
box-shadow: inherit;
|
||||
padding: inherit;
|
||||
margin: auto;
|
||||
|
||||
&.show {
|
||||
animation: show-dialog var(--show-duration) ease;
|
||||
|
||||
&::backdrop {
|
||||
animation: show-backdrop var(--show-duration, 200ms) ease;
|
||||
}
|
||||
}
|
||||
|
||||
&.hide {
|
||||
animation: show-dialog var(--hide-duration) ease reverse;
|
||||
|
||||
&::backdrop {
|
||||
animation: show-backdrop var(--hide-duration, 200ms) ease reverse;
|
||||
}
|
||||
}
|
||||
|
||||
&.pulse {
|
||||
animation: pulse 250ms ease;
|
||||
}
|
||||
}
|
||||
|
||||
.dialog:focus {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
/* Ensure there's enough vertical padding for phones that don't update vh when chrome appears (e.g. iPhone) */
|
||||
@media screen and (max-width: 420px) {
|
||||
.dialog {
|
||||
max-height: 80vh;
|
||||
}
|
||||
}
|
||||
|
||||
.dialog--open {
|
||||
display: flex;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.header {
|
||||
flex: 0 0 auto;
|
||||
display: flex;
|
||||
flex-wrap: nowrap;
|
||||
padding: var(--spacing);
|
||||
padding-block-end: 0;
|
||||
}
|
||||
|
||||
.title {
|
||||
align-self: center;
|
||||
flex: 1 1 auto;
|
||||
font-family: inherit;
|
||||
font-size: var(--wa-font-size-l);
|
||||
font-weight: var(--wa-font-weight-heading);
|
||||
line-height: var(--wa-line-height-condensed);
|
||||
margin: 0;
|
||||
transition: inherit;
|
||||
}
|
||||
|
||||
.header-actions {
|
||||
@@ -93,81 +28,13 @@
|
||||
flex-wrap: wrap;
|
||||
justify-content: end;
|
||||
gap: var(--wa-space-2xs);
|
||||
padding-inline-start: var(--spacing);
|
||||
}
|
||||
margin-inline-start: auto;
|
||||
|
||||
.header-actions wa-icon-button,
|
||||
.header-actions ::slotted(wa-icon-button) {
|
||||
flex: 0 0 auto;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-size: var(--wa-font-size-m);
|
||||
}
|
||||
|
||||
.body {
|
||||
flex: 1 1 auto;
|
||||
display: block;
|
||||
padding: var(--spacing);
|
||||
overflow: auto;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
}
|
||||
|
||||
.footer {
|
||||
flex: 0 0 auto;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: var(--wa-space-xs);
|
||||
justify-content: end;
|
||||
padding: var(--spacing);
|
||||
padding-block-start: 0;
|
||||
}
|
||||
|
||||
.footer ::slotted(wa-button:not(:first-of-type)) {
|
||||
margin-inline-start: var(--wa-spacing-xs);
|
||||
}
|
||||
|
||||
.dialog::backdrop {
|
||||
/*
|
||||
NOTE: the ::backdrop element doesn't inherit properly in Safari yet, but it will in 17.4! At that time, we can
|
||||
remove the fallback values here.
|
||||
*/
|
||||
background-color: var(--wa-color-overlay-modal, rgb(0 0 0 / 0.25));
|
||||
}
|
||||
|
||||
@keyframes pulse {
|
||||
0% {
|
||||
scale: 1;
|
||||
}
|
||||
50% {
|
||||
scale: 1.02;
|
||||
}
|
||||
100% {
|
||||
scale: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes show-dialog {
|
||||
from {
|
||||
opacity: 0;
|
||||
scale: 0.8;
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
scale: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes show-backdrop {
|
||||
from {
|
||||
opacity: 0;
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@media (forced-colors: active) {
|
||||
.dialog {
|
||||
border: solid 1px white;
|
||||
wa-icon-button,
|
||||
::slotted(wa-icon-button) {
|
||||
flex: 0 0 auto;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-size: var(--wa-font-size-m);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import { html, isServer } from 'lit';
|
||||
import { customElement, property, query } from 'lit/decorators.js';
|
||||
import { classMap } from 'lit/directives/class-map.js';
|
||||
import { customElement, property, query, state } from 'lit/decorators.js';
|
||||
import { WaAfterHideEvent } from '../../events/after-hide.js';
|
||||
import { WaAfterShowEvent } from '../../events/after-show.js';
|
||||
import { WaHideEvent } from '../../events/hide.js';
|
||||
@@ -9,6 +8,7 @@ import { animateWithClass } from '../../internal/animate.js';
|
||||
import { lockBodyScrolling, unlockBodyScrolling } from '../../internal/scroll.js';
|
||||
import { watch } from '../../internal/watch.js';
|
||||
import WebAwesomeElement from '../../internal/webawesome-element.js';
|
||||
import dialogStyles from '../../styles/native/dialog.css';
|
||||
import { LocalizeController } from '../../utilities/localize.js';
|
||||
import '../icon-button/icon-button.js';
|
||||
import styles from './dialog.css';
|
||||
@@ -35,6 +35,7 @@ import styles from './dialog.css';
|
||||
* behavior such as data loss.
|
||||
* @event wa-after-hide - Emitted after the dialog closes and all animations are complete.
|
||||
*
|
||||
* @csspart base - The inner `<dialog>` used to render this component.
|
||||
* @csspart header - The dialog's header. This element wraps the title and header actions.
|
||||
* @csspart header-actions - Optional actions to add to the header. Works best with `<wa-icon-button>`.
|
||||
* @csspart title - The dialog's title.
|
||||
@@ -43,22 +44,16 @@ import styles from './dialog.css';
|
||||
* @csspart body - The dialog's body.
|
||||
* @csspart footer - The dialog's footer.
|
||||
*
|
||||
* @cssproperty --background-color - The dialog's background color.
|
||||
* @cssproperty --border-radius - The radius of the dialog's corners.
|
||||
* @cssproperty --box-shadow - The shadow effects around the edges of the dialog.
|
||||
* @cssproperty --spacing - The amount of space around and between the dialog's content.
|
||||
* @cssproperty --width - The preferred width of the dialog. Note that the dialog will shrink to accommodate smaller screens.
|
||||
* @cssproperty [--show-duration=200ms] - The animation duration when showing the dialog.
|
||||
* @cssproperty [--hide-duration=200ms] - The animation duration when hiding the dialog.
|
||||
*/
|
||||
@customElement('wa-dialog')
|
||||
export default class WaDialog extends WebAwesomeElement {
|
||||
static shadowStyle = styles;
|
||||
static shadowStyle = [dialogStyles, styles];
|
||||
|
||||
private readonly localize = new LocalizeController(this);
|
||||
private originalTrigger: HTMLElement | null;
|
||||
private closeWatcher: CloseWatcher | null;
|
||||
|
||||
@query('.dialog') dialog: HTMLDialogElement;
|
||||
@query('dialog') dialog: HTMLDialogElement;
|
||||
|
||||
/**
|
||||
* Indicates whether or not the dialog is open. You can toggle this attribute to show and hide the dialog, or you can
|
||||
@@ -81,6 +76,9 @@ export default class WaDialog extends WebAwesomeElement {
|
||||
/** When enabled, the dialog will be closed when the user clicks outside of it. */
|
||||
@property({ attribute: 'light-dismiss', type: Boolean }) lightDismiss = false;
|
||||
|
||||
@state()
|
||||
hasOpened = this.open;
|
||||
|
||||
firstUpdated() {
|
||||
if (this.open) {
|
||||
this.addOpenListeners();
|
||||
@@ -102,14 +100,12 @@ export default class WaDialog extends WebAwesomeElement {
|
||||
|
||||
if (waHideEvent.defaultPrevented) {
|
||||
this.open = true;
|
||||
animateWithClass(this.dialog, 'pulse');
|
||||
animateWithClass(this.dialog, 'wa-dialog-pulse');
|
||||
return;
|
||||
}
|
||||
|
||||
this.removeOpenListeners();
|
||||
|
||||
await animateWithClass(this.dialog, 'hide');
|
||||
|
||||
this.open = false;
|
||||
this.dialog.close();
|
||||
unlockBodyScrolling(this);
|
||||
@@ -124,7 +120,16 @@ export default class WaDialog extends WebAwesomeElement {
|
||||
}
|
||||
|
||||
private addOpenListeners() {
|
||||
document.addEventListener('keydown', this.handleDocumentKeyDown);
|
||||
if ('CloseWatcher' in window) {
|
||||
this.closeWatcher?.destroy();
|
||||
this.closeWatcher = new CloseWatcher();
|
||||
this.closeWatcher.onclose = () => {
|
||||
this.requestClose(this.dialog);
|
||||
};
|
||||
} else {
|
||||
this.closeWatcher?.destroy();
|
||||
document.addEventListener('keydown', this.handleDocumentKeyDown);
|
||||
}
|
||||
}
|
||||
|
||||
private removeOpenListeners() {
|
||||
@@ -156,7 +161,7 @@ export default class WaDialog extends WebAwesomeElement {
|
||||
if (this.lightDismiss) {
|
||||
this.requestClose(this.dialog);
|
||||
} else {
|
||||
await animateWithClass(this.dialog, 'pulse');
|
||||
await animateWithClass(this.dialog, 'wa-dialog-pulse');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -193,6 +198,7 @@ export default class WaDialog extends WebAwesomeElement {
|
||||
this.addOpenListeners();
|
||||
this.originalTrigger = document.activeElement as HTMLElement;
|
||||
this.open = true;
|
||||
this.hasOpened = true;
|
||||
this.dialog.showModal();
|
||||
|
||||
lockBodyScrolling(this);
|
||||
@@ -205,28 +211,20 @@ export default class WaDialog extends WebAwesomeElement {
|
||||
}
|
||||
});
|
||||
|
||||
await animateWithClass(this.dialog, 'show');
|
||||
|
||||
this.dispatchEvent(new WaAfterShowEvent());
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<dialog
|
||||
part="dialog"
|
||||
class=${classMap({
|
||||
dialog: true,
|
||||
'dialog--open': this.open,
|
||||
'dialog--with-header': this.withHeader,
|
||||
'dialog--with-footer': this.withFooter,
|
||||
})}
|
||||
part="base"
|
||||
@cancel=${this.handleDialogCancel}
|
||||
@click=${this.handleDialogClick}
|
||||
@pointerdown=${this.handleDialogPointerDown}
|
||||
>
|
||||
${this.withHeader
|
||||
? html`
|
||||
<header part="header" class="header">
|
||||
<header part="header">
|
||||
<h2 part="title" class="title" id="title">
|
||||
<!-- If there's no label, use an invisible character to prevent the header from collapsing -->
|
||||
<slot name="label"> ${this.label.length > 0 ? this.label : String.fromCharCode(65279)} </slot>
|
||||
@@ -248,11 +246,11 @@ export default class WaDialog extends WebAwesomeElement {
|
||||
`
|
||||
: ''}
|
||||
|
||||
<div part="body" class="body"><slot></slot></div>
|
||||
<slot part="body" class="body"></slot>
|
||||
|
||||
${this.withFooter
|
||||
? html`
|
||||
<footer part="footer" class="footer">
|
||||
<footer part="footer">
|
||||
<slot name="footer"></slot>
|
||||
</footer>
|
||||
`
|
||||
@@ -264,7 +262,7 @@ export default class WaDialog extends WebAwesomeElement {
|
||||
|
||||
// Ugly, but it fixes light dismiss in Safari: https://bugs.webkit.org/show_bug.cgi?id=267688
|
||||
if (!isServer) {
|
||||
document.addEventListener('pointerdown', () => {
|
||||
document.body.addEventListener('pointerdown', () => {
|
||||
/* empty */
|
||||
});
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user