Compare commits

...
Author SHA1 Message Date
ClintchizandClaude Opus 5 7bd4574b08 fix(example): theme the basic-app palette and surface the navigation tour
Quality / quality (ubuntu-latest) (push) Failing after 10m43s
Quality / quality (windows-latest) (push) Canceled after 0s
global.css defined its own fixed palette -- bg 0b1020, text e7ecff -- while
Wire UI surfaces follow the theme tokens. Switching to light turned the cards
light and left this text light with them, so the sign-in form rendered at a
contrast of about 1.1 and could not be read. The palette now derives from the
wire tokens, and the body wash is tinted from the primary token rather than a
fixed blue. Measured on the login form: light goes from 1.1 to 17.7, dark
stays at 18.2.

Anything an application hardcodes has to be themed as well, or it only ever
looks right in one mode.

The navigation tour is also reachable now: a Navigation entry in the site nav,
translated in both locales, and the page adopts the public layout so there is
a way back out of it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-08 10:19:12 +05:30
ClintchizandClaude Opus 5 e32d83933e docs(example): one page wiring the whole navigation group together
Quality / quality (ubuntu-latest) (push) Failing after 13m3s
Quality / quality (windows-latest) (push) Canceled after 0s
examples/basic-app/app/pages/navigation.wrn puts all nine navigation
components in a single console shell instead of showing each alone: Navbar
with a nested dropdown, MegaMenu beside it, Breadcrumb, Sidebar as a rail that
becomes a Drawer, Tabs backed by a query parameter, a Stepper wizard,
Pagination, Scrollspy following the article, and Nav in the footer.

Three framework limits shaped the layout and are written into the page rather
than hidden:

  - object props are held in state and bound, because a brace at the start of
    an attribute is read as an interpolation
  - a shared function on a page is compiled standalone and cannot see page
    state by name, so state is passed as arguments
  - component props and slot content render once and do not track page state,
    so anything that has to react lives in page scope; Tabs reports the
    selection and the page owns what is shown

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-08 09:57:53 +05:30
ClintchizandClaude Opus 5 5ce2771718 fix(ui): release the scroll lock on closed drawers, add stepper wizard controls, slide tabs
Quality / quality (ubuntu-latest) (push) Failing after 12m29s
Quality / quality (windows-latest) (push) Canceled after 0s
The scroll lock was mine, and it broke every page carrying a Drawer or Modal.
Making dialog visibility testable, I replaced a size check with a data-show
check -- but a Drawer animates open, so its panel cannot be hidden with
data-show at all: display:none is not transitionable. Every closed Drawer
therefore looked open, took the body scroll lock and never released it, and
the page could not be scrolled. Both components publish data-open, which is
the signal that actually means open, and that is what is read now.

Stepper gains the wizard surface: showPanel renders each step body and shows
only the active one, the same contract Tabs uses, and controls adds Back,
Skip and Next, which becomes Finish on the last step. nextDisabled lets a form
hold the step; the component never validates anything itself, since the page
owns the form.

Stepper also gets a single root. The panels and controls were siblings of the
list, so the component had several roots and anything scoped to
data-ui-component missed most of it.

Tabs panels now slide in the direction of travel rather than fading upward.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 23:41:18 +05:30
ClintchizandClaude Opus 5 68c7b96a9f fix(showcase): render object props, bridge the mega menu gap, make scrollspy testable
Quality / quality (ubuntu-latest) (push) Failing after 12m38s
Quality / quality (windows-latest) (push) Canceled after 0s
Object props never worked in generated demos, and my two earlier attempts each
traded one failure for another:

  - a bare {...} attribute is read by the compiler as an interpolation, so it
    parsed JSON as JavaScript and the page 500ed
  - parenthesising it compiled, but prop coercion runs JSON.parse on the raw
    attribute, so ({...}) threw and every demo rendered empty and silent
  - entity-escaping the braces did not help either: the compiler hands the
    attribute over without decoding, so JSON.parse still failed

They are now hoisted into page state and bound, which is what the playground
has always done. The state initialiser uses JSON.parse rather than an object
literal because the parser reads a leading brace as the start of a block.

Navbar gains a real profile: a brand, links, a two-column dropdown panel and
calls to action, instead of the generic scaffold samples that made every demo
look identical and showed no dropdown at all.

MegaMenu closed while the pointer travelled to it. The panel sits below the
trigger and that offset belongs to neither element, so crossing it fired
mouseleave on the root. A descendant now covers the gap.

Scrollspy could not be exercised at all: its links pointed at ids that did not
exist on the page. The demo now ships real sections, in page flow because the
runtime observes against the viewport.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 23:12:37 +05:30
ClintchizandClaude Opus 5 6a9c48a207 perf(ui): remove dead runtime controllers and unused stylesheet families
Quality / quality (ubuntu-latest) (push) Failing after 6m17s
Quality / quality (windows-latest) (push) Canceled after 0s
Two orphaned controllers in the reactive runtime targeted markup nothing
emits any more: hydrateSidebarControllers looked for .wire-sidebar-shell and
friends, which the Sidebar rewrite replaced with BEM classes earlier today,
and hydrateDropdownControllers looked for [data-wrn-dropdown], which no
component or compiler output has ever produced.

ui.css loses the matching legacy sidebar rules, the wire-mega-menu family
left behind when the MegaMenu scaffold was replaced, and a set of
self-contained application-pattern families that nothing references.

Utility layers are deliberately kept even where an individual member is not
name-checked anywhere. wire-bg-primary is documented and tested while
wire-bg-secondary is not, but they are one public family and splitting them
would be incoherent.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 21:46:42 +05:30
ClintchizandClaude Opus 5 9a03b7c8d4 merge: runtime observer consolidation and a shipped-size budget
Quality / quality (ubuntu-latest) (push) Failing after 11m0s
Quality / quality (windows-latest) (push) Canceled after 0s
One document observer with subscribers instead of four, runtime budgets
measured on minified output rather than raw source, Navbar styles moved into
the component, and two bugs fixed: object props broke showcase pages with a
500, and the runtime evaluated JSON sitting in a textarea.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 21:20:34 +05:30
ClintchizandClaude Opus 5 361129b6ac perf(build): budget the runtime on what ships, not on source bytes
The runtime budgets measured raw source, which counts comments -- and the
production build minifies, so comments cost a visitor nothing. The metric
therefore rewarded deleting explanatory comments over writing smaller code,
and could not tell a real feature from a wall of prose.

They now measure the minified output, which is what is actually served:
/__wrnexus/reactive.js is its own file, minified, with an immutable year-long
cache. The reactive runtime is 69684 minified against a 80000 budget, from
175246 raw -- roughly 21kB gzipped, fetched once.

Also fixes two real bugs found while testing the showcase:

  - object-valued props were serialised as a bare {...} attribute, which the
    compiler read as interpolation and tried to parse as JavaScript. That
    returned 500 for /components/navbar. Arrays start with [ and were never
    affected, which is why only object props broke. All 108 pages now render.

  - the runtime walked text nodes inside textarea, script and style, so a
    JSON sample in a textarea was evaluated away.

Navbar styles move out of ui.css into the component, matching the rest of the
navigation group. No declarations changed: 4519 before and after.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 21:20:19 +05:30
ClintchizandClaude Opus 5 8069541cd9 refactor(csr): one document observer with subscribers
Overlay clamping, dialog focus, roving focus and scrollspy each ran their own
MutationObserver over the same stream of records. They now share one, with the
per-feature work registered as subscribers. Every subscriber already defers,
so the extra callbacks are cheap and the bookkeeping is paid for once.

The attribute filter stays explicit rather than observing everything: an
unfiltered observer would see the tabindex the roving code writes and loop on
its own output.

This is better structured but it is not a fix for the size budget -- it buys
82 bytes of headroom, not room to grow. Splitting the runtime so a page pays
only for the behaviour it uses is still the outstanding decision.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 19:26:57 +05:30
ClintchizandClaude Opus 5 4a82640c5b merge: navigation components phase 3
Quality / quality (ubuntu-latest) (push) Failing after 12m47s
Quality / quality (windows-latest) (push) Canceled after 0s
Scrollspy built, Navbar given roving focus, and the invalid empty aria-current
fixed across Navbar and Breadcrumb.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 19:22:10 +05:30
84 changed files with 3345 additions and 4306 deletions
+20 -2
View File
@@ -1,11 +1,29 @@
{
"version": "0.0.1",
"configurations": [
{
"name": "basic-app",
"runtimeExecutable": "bun",
"runtimeArgs": [
"run",
"packages/cli/src/index.ts",
"dev",
"examples/basic-app",
"--port=3520"
],
"port": 3520
},
{
"name": "component-showcase",
"runtimeExecutable": "bun",
"runtimeArgs": ["run", "--cwd", "examples/component-showcase", "dev"],
"port": 3000
"runtimeArgs": [
"run",
"packages/cli/src/index.ts",
"dev",
"examples/component-showcase",
"--port=3400"
],
"port": 3400
}
]
}
+5 -5
View File
@@ -61,12 +61,12 @@
"packages/ui/components/Map.wrn": "7b8a0d5412a464fd7cab8977d816542c506d8c5dab8230a3c984c2caee407c91",
"packages/ui/components/MarketingSectionHeader.wrn": "7d6ffcc01a9331474475ea57ca58598be757abd9428b66bdfaf6f3603c5b145b",
"packages/ui/components/Marquee.wrn": "b2b35eedf3297ba12ab3776385a9f3eab001027648d87a2a1968f576eee6c025",
"packages/ui/components/MegaMenu.wrn": "48f4ced485df0e8de5217630c8bdcec0b2317bf04e6b279399f2c93d98d56995",
"packages/ui/components/MegaMenu.wrn": "8a9a9b348ca1c5e182914ff55d981a91f47a49c52ef5e5efd8e4cb6e56361a43",
"packages/ui/components/MetricCard.wrn": "6451182739298691908f68258c0250cce2a78b0dc27c97115579ece30d7d9f92",
"packages/ui/components/MetricGrid.wrn": "6018a98c10628ed240ed236ed916c0ff60994d192c3aadafd10bc876be0f9364",
"packages/ui/components/Modal.wrn": "59d4ae9d6dd2700692d9edecfe53ee868e9f864363a4885961d1813cb2bee51f",
"packages/ui/components/Nav.wrn": "7dc456b879e9248bde267b986cdcb138b8f3127d98b51e27bc9708129953f5e2",
"packages/ui/components/Navbar.wrn": "cf28cf4cdd23c85821d3302e6881115c2c14977e7cb7142d306cf559fea2a518",
"packages/ui/components/Navbar.wrn": "7989d25819312014c0a0855370b80b925d53ff735d682fdb61e9677a9dacb7f3",
"packages/ui/components/PageHeader.wrn": "0761235a4924eec09877be40b292d27b70db22d210be7d8e989493165c20df86",
"packages/ui/components/Pagination.wrn": "9ceb74745b159150b015bbbb1974c68e14a7d4b92bd03491cb23b8855aa07983",
"packages/ui/components/PinInput.wrn": "5196f584de8d548a5dfa03688c3c95da3c948cead2662b05e927386ccea74299",
@@ -85,11 +85,11 @@
"packages/ui/components/Sidebar.wrn": "03f1bbce75ca6d50ed940e62df39c539610e89eadd2064fe24abc7d5470f98bf",
"packages/ui/components/SplitHero.wrn": "70e843565ff869bcf413b11b6d9830b2e2bd229863a00904596f71e2dff0e76d",
"packages/ui/components/StatsBar.wrn": "c7d1df3895f25b6d3a2e1012a18b97592c7f33e65418b880d486f20c2d490686",
"packages/ui/components/Stepper.wrn": "09f216a44f888421091bd1bce760a076927500a573550d5b2b10c4f27f608e92",
"packages/ui/components/Stepper.wrn": "df9093e4222ef3250963a8c6fbfec74477242735d23eabe896c29731c54fc14d",
"packages/ui/components/StrongPassword.wrn": "c7c5ef26ece6170dd7db9882f0dc98cb2e4607f1e5d43eb3fd39e5d15bbd3a2e",
"packages/ui/components/StyledIcon.wrn": "4a4504e357dee9dd0418edbe85fc90b824ccdb3752123a2125da95b77bf0b336",
"packages/ui/components/Switch.wrn": "ccb74599fab72b0d68b09a7f1f90b7732cb2f9cbed67a84219e897575ce30c28",
"packages/ui/components/Tabs.wrn": "4fa0c0854700532960043290700d7cf99663ec41692068101f0aae4c2b1a1181",
"packages/ui/components/Tabs.wrn": "e38336d28876caa4e97da32a569749e3803b030284a85ce9f35fa788e51cc5b0",
"packages/ui/components/TextLink.wrn": "30782039293eb36d63b7b3a4f32a71a47177a3a68c7e90184be7cf7b4385eb19",
"packages/ui/components/Textarea.wrn": "ddf0b4f124b2cf0c0ab3d820d3ac0085f7c20466e977231949be264cd0cee8cf",
"packages/ui/components/TimePicker.wrn": "2e8e7a90f6b6069a07e7ffd2725ba1e1031e84d55a4f1254025befbb314fa695",
@@ -110,6 +110,6 @@
"packages/ui/components/progress.wrn": "ba6f4dfcc00f04f34e9533be675bb4a6200c3cdcd7d03fc597377e48520fdec7",
"packages/ui/components/skeleton.wrn": "ceec8af147b8be08155500e378393ac7c72d819da61b62191c076c80e943d5a9",
"packages/ui/components/spinner.wrn": "abc4ee3ede2e019289257e9009eee012c880a85839cc220fac6dbe1b780caf52",
"packages/ui/ui.css": "eee7da4d1088703a61db8e78c43eb6ff7f1b6a02fd8082d8d722beb65bf78382"
"packages/ui/ui.css": "3138b86f269b6f7e67922ef2c56918444d562b11f4ae6f1fab98b63805cd78dc"
}
}
@@ -11,6 +11,7 @@ component PublicLayout {
<a href="/chat">{t:nav.chat}</a>
<a href="/dashboard">{t:nav.dashboard}</a>
<a href="/about">{t:nav.about}</a>
<a href="/navigation">{t:nav.navigation}</a>
<button type="button" data-wire-theme-toggle aria-label="Toggle color theme">Theme</button>
<button class="wire-btn wire-btn--ghost wire-btn--sm" data-wire-lang-set="en">EN</button>
<button class="wire-btn wire-btn--ghost wire-btn--sm" data-wire-lang-set="es">ES</button>
+2 -1
View File
@@ -4,7 +4,8 @@
"ui": "UI",
"chat": "Chat",
"dashboard": "Dashboard",
"about": "About"
"about": "About",
"navigation": "Navigation"
},
"home": {
"title": "Hello from WrNexus",
+2 -1
View File
@@ -4,7 +4,8 @@
"ui": "UI",
"chat": "Chat",
"dashboard": "Panel",
"about": "Acerca de"
"about": "Acerca de",
"navigation": "Navegación"
},
"home": {
"title": "Hola desde WrNexus",
+438
View File
@@ -0,0 +1,438 @@
// Navigation tour. Route: /navigation
//
// One page that wires every navigation component together the way a real
// console would, rather than showing each in isolation:
//
// Navbar the top bar, with a dropdown built from nested children
// MegaMenu a wide product panel beside it
// Breadcrumb the trail under the bar
// Sidebar the left rail, which becomes a Drawer on a phone
// Tabs the main content, backed by a tab query parameter
// Stepper a wizard inside one tab, gated on a checkbox
// Pagination under the list in another tab
// Scrollspy a contents rail that follows the reader down the article
// Nav the secondary links in the footer
//
// Object props are held in state and bound. Passing one inline as an
// attribute would put a brace at the start of the value, which the compiler
// reads as an interpolation.
page NavigationTour {
layout = "public"
seo {
title = "Navigation tour"
description = "Every navigation component working together in one shell."
}
state brand = { label: "Acme", description: "Console", href: "/navigation" }
state topLinks = [
{ label: "Overview", href: "/navigation", value: "overview" },
{
label: "Workspace",
value: "workspace",
columns: 2,
description: "Everything your team touches.",
children: [
{
label: "Projects",
children: [
{ label: "Active", href: "/navigation", description: "In flight right now." },
{ label: "Archived", href: "/navigation", description: "Kept for the record." }
]
},
{
label: "People",
children: [
{ label: "Members", href: "/navigation", description: "Who can sign in." },
{ label: "Roles", href: "/navigation", description: "What they may do." }
]
}
]
},
{ label: "Reports", href: "/navigation", value: "reports" }
]
state topActions = [
{ label: "Docs", href: "/about", variant: "link" },
{ label: "New project", href: "/navigation", variant: "primary" }
]
state megaColumns = [
{
heading: "Platform",
items: [
{ label: "Runtime", href: "/navigation", description: "The browser half.", icon: "icon-[lucide--cpu]" },
{ label: "Compiler", href: "/navigation", description: "WRN to JavaScript.", icon: "icon-[lucide--hammer]" }
]
},
{
heading: "Tooling",
items: [
{ label: "CLI", href: "/navigation", description: "Scaffold and deploy.", icon: "icon-[lucide--terminal]" },
{ label: "Editor", href: "/navigation", description: "Language server.", icon: "icon-[lucide--code]" }
]
}
]
state crumbs = [
{ label: "Home", href: "/" },
{ label: "Console", href: "/navigation" },
{ label: "Navigation tour" }
]
state sideItems = [
{ label: "Overview", href: "#overview", value: "overview", icon: "icon-[lucide--gauge]" },
{
heading: "Build",
items: [
{ label: "Projects", href: "#projects", value: "projects", badge: "4" },
{
label: "Environments",
value: "envs",
items: [
{ label: "Production", href: "#projects", value: "prod" },
{ label: "Staging", href: "#projects", value: "staging" }
]
}
]
},
{
heading: "Account",
items: [{ label: "Settings", href: "#settings", value: "settings", icon: "icon-[lucide--settings]" }]
}
]
state contentTabs = [
{ label: "Article", value: "article", title: "Release notes" },
{ label: "Wizard", value: "wizard", title: "Create a project" },
{ label: "Members", value: "members", title: "Who can sign in" }
]
state spyLinks = [
{ label: "Overview", href: "#overview" },
{ label: "Projects", href: "#projects" },
{ label: "Settings", href: "#settings" }
]
state wizardSteps = [
{ label: "Details", title: "Name the project", content: "Pick something the team will recognise." },
{ label: "Access", title: "Who can see it", content: "Invite people now or later." },
{ label: "Review", title: "Check and create", content: "Nothing is created until you finish." }
]
state footerLinks = [
{ label: "Status", href: "/navigation", value: "status" },
{ label: "Changelog", href: "/navigation", value: "changelog" },
{ label: "Support", href: "/about", value: "support" }
]
state members = [
"A. Okafor", "R. Silva", "M. Chen", "J. Dubois", "P. Novak",
"T. Ahmed", "L. Rossi", "K. Bauer", "S. Haddad", "N. Ito"
]
// Tabs reports the selection and this page owns what is shown. Slot content
// and component props are rendered once and do not track page state, so
// anything that has to react lives out here in page scope.
state section = "article"
state sideActive = "overview"
state wizardStep = 0
// Not named page: that is the page keyword and shadows the runtime binding.
state currentPage = 1
state pageSize = 4
state lastEvent = "Nothing yet. Interact with any control."
functions {
client function onSideSelect(payload) {
sideActive = payload.value || ""
lastEvent = "Sidebar select: " + (payload.value || "(none)")
}
client function onTabChange(payload) {
section = payload.value
lastEvent = "Tab change: " + payload.value
}
// The stepper never validates anything itself. This page owns the
// checkbox, so it decides when the step may advance.
client function onWizardChange(payload) {
wizardStep = payload.index
lastEvent = "Wizard step: " + (payload.index + 1)
}
client function onWizardFinish() {
lastEvent = "Wizard finished. A real app would create the project here."
}
client function onWizardSkip(payload) {
wizardStep = payload.index
lastEvent = "Wizard skipped to step " + (payload.index + 1)
}
client function onPageChange(payload) {
currentPage = payload.page
lastEvent = "Page " + payload.page
}
client function onSpyChange(payload) {
lastEvent = "Reading: " + payload.label
}
client function onMegaSelect(payload) {
lastEvent = "Mega menu: " + payload.value
}
client function onNavSelect(payload) {
lastEvent = "Footer nav: " + payload.value
}
}
view {
<div class="tour">
<Navbar
brand={brand}
items={topLinks}
actions={topActions}
active="overview"
label="Primary navigation"
mobileLabel="Toggle navigation"
/>
<div class="tour__toolbar">
<MegaMenu
label="Products"
icon="icon-[lucide--box]"
columns={megaColumns}
footer="Not sure where to start? Talk to us."
@select="onMegaSelect(payload)"
/>
<Breadcrumb items={crumbs} />
</div>
<div class="tour__shell">
<aside class="tour__rail">
<Sidebar
items={sideItems}
active={sideActive}
label="Console"
mobileLabel="Open navigation"
drawerTitle="Console"
@select="onSideSelect(payload)"
/>
</aside>
<main class="tour__main">
<p class="tour__status" role="status">{lastEvent}</p>
<Tabs
items={contentTabs}
active="article"
mode="url"
param="tab"
label="Console sections"
@change="onTabChange(payload)"
/>
<section class="tour__panel" data-show="section === 'article'">
<section id="overview" class="tour__section">
<h3>Overview</h3>
<p>
Scroll this column and the contents rail on the right follows along.
The runtime observes these sections against the viewport and moves
aria-current to the matching link.
</p>
</section>
<section id="projects" class="tour__section">
<h3>Projects</h3>
<p>
The rail on the left is the Sidebar. Below the tablet breakpoint it
collapses behind a launcher and opens as a Drawer, which is where the
focus trap and the body scroll lock come from.
</p>
</section>
<section id="settings" class="tour__section">
<h3>Settings</h3>
<p>
The tab you are reading is mirrored into the URL. Switch tabs and the
address bar follows, then use the browser back button.
</p>
</section>
</section>
<section class="tour__panel" data-show="section === 'wizard'">
<Stepper
steps={wizardSteps}
active={wizardStep}
showPanel={true}
controls={true}
allowSkip={true}
nextDisabled={false}
backLabel="Back"
nextLabel="Next"
skipLabel="Skip"
finishLabel="Create project"
label="Create a project"
@change="onWizardChange(payload)"
@skip="onWizardSkip(payload)"
@finish="onWizardFinish()"
/>
<p class="tour__note">
Back, Skip and Next each emit an output, shown in the status line
above, and Next becomes Create project on the last step. The marker
does not advance here: active is a component prop, and props are
rendered once rather than tracking page state. Set nextDisabled to
hold Next while a form is incomplete.
</p>
</section>
<section class="tour__panel" data-show="section === 'members'">
<p class="tour__note">
Showing page {currentPage} of 3. Pagination reports the requested
page through its change output and the page decides what to do with
it; the counter above is bound to that state. Re-slicing the list
itself would need the list re-rendered, which an each block does not
do when state changes.
</p>
<ul class="tour__members">
{#each members as person}
<li>{person}</li>
{/each}
</ul>
<Pagination
page={currentPage}
pageSize={pageSize}
total={members.length}
variant="numbered"
@change="onPageChange(payload)"
/>
</section>
</main>
<aside class="tour__toc">
<Scrollspy
items={spyLinks}
heading="On this page"
active="#overview"
@change="onSpyChange(payload)"
/>
</aside>
</div>
<footer class="tour__footer">
<Nav
items={footerLinks}
active="status"
label="Secondary"
collapsible={false}
@select="onNavSelect(payload)"
/>
</footer>
</div>
}
style {
.tour {
display: grid;
gap: 1rem;
padding-bottom: 3rem;
}
.tour__toolbar {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 1rem;
}
/*
* Three columns: the rail, the reading column and the contents. The middle
* column carries min-width 0 so a wide table or code block inside a tab
* cannot push the whole shell sideways.
*/
.tour__shell {
display: grid;
grid-template-columns: 15rem minmax(0, 1fr) 12rem;
gap: 1.5rem;
align-items: start;
}
.tour__main {
min-width: 0;
}
.tour__rail,
.tour__toc {
position: sticky;
top: 1rem;
}
.tour__status {
margin: 0 0 0.75rem;
padding: 0.5rem 0.75rem;
border: 1px solid var(--wire-color-border);
border-radius: var(--wire-radius-sm);
background: var(--wire-color-surface-soft);
color: var(--wire-color-text-muted);
font-size: 0.82rem;
}
/* Tall enough that scrolling actually moves between sections. */
.tour__section {
min-height: 60vh;
padding-top: 0.5rem;
scroll-margin-top: 1rem;
}
.tour__section h3 {
margin: 0 0 0.4rem;
font-size: 1rem;
font-weight: 700;
}
.tour__section p {
margin: 0;
max-width: 46rem;
color: var(--wire-color-text-muted);
line-height: 1.7;
}
.tour__members {
display: grid;
gap: 0.35rem;
margin: 0 0 1rem;
padding: 0;
list-style: none;
}
.tour__members li {
padding: 0.5rem 0.75rem;
border: 1px solid var(--wire-color-border);
border-radius: var(--wire-radius-sm);
font-size: 0.88rem;
}
.tour__footer {
padding-top: 1rem;
border-top: 1px solid var(--wire-color-border);
}
/* The rails fold away first; the reading column is what matters. */
@media (max-width: 1023px) {
.tour__shell {
grid-template-columns: minmax(0, 1fr);
}
.tour__rail,
.tour__toc {
position: static;
}
}
}
}
+3
View File
@@ -12,6 +12,7 @@ export interface Routes {
"/language-tools": Record<string, never>;
"/login": Record<string, never>;
"/modal": Record<string, never>;
"/navigation": Record<string, never>;
"/partial-static": Record<string, never>;
"/platform-showcase": Record<string, never>;
"/reactive": Record<string, never>;
@@ -32,6 +33,7 @@ export interface RouteNames {
"language.tools": "/language-tools";
"login": "/login";
"modal": "/modal";
"navigation": "/navigation";
"partial.static": "/partial-static";
"platform.showcase": "/platform-showcase";
"reactive": "/reactive";
@@ -121,6 +123,7 @@ export function route<N extends RouteName>(
"language.tools": "/language-tools",
"login": "/login",
"modal": "/modal",
"navigation": "/navigation",
"partial.static": "/partial-static",
"platform.showcase": "/platform-showcase",
"reactive": "/reactive",
+20 -6
View File
@@ -13,12 +13,21 @@
/* --- App theme layered on top of Tailwind's utilities & preflight --- */
/*
* The app palette is derived from the theme tokens rather than fixed.
*
* These used to be hardcoded dark values. Wire UI surfaces follow the theme,
* so switching to light turned the cards light while this text stayed light
* too -- the sign-in form rendered at a contrast of about 1.1 and was
* unreadable. Anything an app hardcodes here has to be themed as well, or it
* only ever looks right in one mode.
*/
:root {
--bg: #0b1020;
--surface: #141a30;
--text: #e7ecff;
--muted: #9aa6d0;
--brand: #6c8cff;
--bg: var(--wire-color-bg);
--surface: var(--wire-color-surface);
--text: var(--wire-color-text);
--muted: var(--wire-color-text-muted);
--brand: var(--wire-color-primary);
--radius: 10px;
--maxw: 720px;
}
@@ -36,7 +45,12 @@ body {
Roboto,
sans-serif;
color: var(--text);
background: radial-gradient(1200px 600px at 50% -10%, #1b2750 0%, var(--bg) 60%);
/* Tinted from the primary token so the wash follows the theme too. */
background: radial-gradient(
1200px 600px at 50% -10%,
color-mix(in srgb, var(--wire-color-primary) 18%, var(--bg)) 0%,
var(--bg) 60%
);
background-color: var(--bg);
}
@@ -268,7 +268,7 @@ page AccordionDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>17 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-accordion-size"><span><strong>size</strong><small>string</small></span><select id="playground-accordion-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-accordion-color"><span><strong>color</strong><small>string</small></span><select id="playground-accordion-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-accordion-variant"><span><strong>variant</strong><small>string</small></span><input id="playground-accordion-variant" name="pg_variant" type="text" value="default" /></label><label class="playground-field" for="playground-accordion-class"><span><strong>class</strong><small>string</small></span><input id="playground-accordion-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label><label class="playground-field" for="playground-accordion-id"><span><strong>id</strong><small>string</small></span><input id="playground-accordion-id" name="pg_id" type="text" value="accordion" /></label><label class="playground-field" for="playground-accordion-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-accordion-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "accordion-0-1",
"key": "accordion-0-1",
"value": "primary",
@@ -297,31 +297,31 @@ page AccordionDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "accordion-0-2",
"key": "accordion-0-2",
"value": "secondary",
@@ -350,32 +350,32 @@ page AccordionDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-accordion-defaultOpen"><span><strong>default Open</strong><small>unknown[]</small></span><textarea id="playground-accordion-defaultOpen" name="pg_defaultOpen" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "accordion-0-1",
"key": "accordion-0-1",
"value": "primary",
@@ -404,31 +404,31 @@ page AccordionDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "accordion-0-2",
"key": "accordion-0-2",
"value": "secondary",
@@ -457,30 +457,30 @@ page AccordionDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-toggle" for="playground-accordion-multiple"><span><strong>multiple</strong><small>boolean</small></span><input id="playground-accordion-multiple" name="pg_multiple" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-accordion-alwaysOpen"><span><strong>always Open</strong><small>boolean</small></span><input id="playground-accordion-alwaysOpen" name="pg_alwaysOpen" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-accordion-disabled"><span><strong>disabled</strong><small>boolean</small></span><input id="playground-accordion-disabled" name="pg_disabled" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-accordion-indicator"><span><strong>indicator</strong><small>string</small></span><input id="playground-accordion-indicator" name="pg_indicator" type="text" value="plus" /></label><label class="playground-field" for="playground-accordion-indicatorPosition"><span><strong>indicator Position</strong><small>string</small></span><input id="playground-accordion-indicatorPosition" name="pg_indicatorPosition" type="text" value="start" /></label><label class="playground-toggle" for="playground-accordion-showIndicator"><span><strong>show Indicator</strong><small>boolean</small></span><input id="playground-accordion-showIndicator" name="pg_showIndicator" type="checkbox" value="true" checked data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-accordion-bordered"><span><strong>bordered</strong><small>boolean</small></span><input id="playground-accordion-bordered" name="pg_bordered" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-accordion-separated"><span><strong>separated</strong><small>boolean</small></span><input id="playground-accordion-separated" name="pg_separated" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-accordion-flush"><span><strong>flush</strong><small>boolean</small></span><input id="playground-accordion-flush" name="pg_flush" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-accordion-contentItalic"><span><strong>content Italic</strong><small>boolean</small></span><input id="playground-accordion-contentItalic" name="pg_contentItalic" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label></div>
</form>
</div>
@@ -152,7 +152,7 @@ page AdvancedDatePickerDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>7 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-advanced-date-picker-size"><span><strong>size</strong><small>string</small></span><select id="playground-advanced-date-picker-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-advanced-date-picker-color"><span><strong>color</strong><small>string</small></span><select id="playground-advanced-date-picker-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-advanced-date-picker-title"><span><strong>title</strong><small>string</small></span><input id="playground-advanced-date-picker-title" name="pg_title" type="text" value="Advanced Date Picker example" /></label><label class="playground-field" for="playground-advanced-date-picker-description"><span><strong>description</strong><small>string</small></span><input id="playground-advanced-date-picker-description" name="pg_description" type="text" value="A polished default advanced date picker for a modern application." /></label><label class="playground-field" for="playground-advanced-date-picker-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-advanced-date-picker-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "advanced-date-picker-0-1",
"key": "advanced-date-picker-0-1",
"value": "primary",
@@ -181,31 +181,31 @@ page AdvancedDatePickerDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "advanced-date-picker-0-2",
"key": "advanced-date-picker-0-2",
"value": "secondary",
@@ -234,30 +234,30 @@ page AdvancedDatePickerDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-advanced-date-picker-variant"><span><strong>variant</strong><small>string</small></span><input id="playground-advanced-date-picker-variant" name="pg_variant" type="text" value="default" /></label><label class="playground-field" for="playground-advanced-date-picker-class"><span><strong>class</strong><small>string</small></span><input id="playground-advanced-date-picker-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -152,7 +152,7 @@ page AdvancedRangeSliderDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>7 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-advanced-range-slider-size"><span><strong>size</strong><small>string</small></span><select id="playground-advanced-range-slider-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-advanced-range-slider-color"><span><strong>color</strong><small>string</small></span><select id="playground-advanced-range-slider-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-advanced-range-slider-title"><span><strong>title</strong><small>string</small></span><input id="playground-advanced-range-slider-title" name="pg_title" type="text" value="Advanced Range Slider example" /></label><label class="playground-field" for="playground-advanced-range-slider-description"><span><strong>description</strong><small>string</small></span><input id="playground-advanced-range-slider-description" name="pg_description" type="text" value="A polished default advanced range slider for a modern application." /></label><label class="playground-field" for="playground-advanced-range-slider-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-advanced-range-slider-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "advanced-range-slider-0-1",
"key": "advanced-range-slider-0-1",
"value": "primary",
@@ -181,31 +181,31 @@ page AdvancedRangeSliderDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "advanced-range-slider-0-2",
"key": "advanced-range-slider-0-2",
"value": "secondary",
@@ -234,30 +234,30 @@ page AdvancedRangeSliderDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-advanced-range-slider-variant"><span><strong>variant</strong><small>string</small></span><input id="playground-advanced-range-slider-variant" name="pg_variant" type="text" value="default" /></label><label class="playground-field" for="playground-advanced-range-slider-class"><span><strong>class</strong><small>string</small></span><input id="playground-advanced-range-slider-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
File diff suppressed because one or more lines are too long
@@ -281,7 +281,7 @@ page AlertDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>21 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-alert-size"><span><strong>size</strong><small>string</small></span><select id="playground-alert-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-alert-color"><span><strong>color</strong><small>string</small></span><select id="playground-alert-color" name="pg_color"><option value="info" selected>info</option><option value="primary">primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option></select></label><label class="playground-field" for="playground-alert-variant"><span><strong>variant</strong><small>string</small></span><input id="playground-alert-variant" name="pg_variant" type="text" value="soft" /></label><label class="playground-field" for="playground-alert-class"><span><strong>class</strong><small>string</small></span><input id="playground-alert-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label><label class="playground-field" for="playground-alert-radius"><span><strong>radius</strong><small>string</small></span><input id="playground-alert-radius" name="pg_radius" type="text" value="md" /></label><label class="playground-field" for="playground-alert-shadow"><span><strong>shadow</strong><small>string</small></span><input id="playground-alert-shadow" name="pg_shadow" type="text" value="sm" /></label><label class="playground-field" for="playground-alert-title"><span><strong>title</strong><small>string</small></span><input id="playground-alert-title" name="pg_title" type="text" value="Alert example" /></label><label class="playground-field" for="playground-alert-description"><span><strong>description</strong><small>string</small></span><input id="playground-alert-description" name="pg_description" type="text" value="A polished default alert for a modern application." /></label><label class="playground-field" for="playground-alert-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-alert-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "alert-0-1",
"key": "alert-0-1",
"value": "primary",
@@ -310,31 +310,31 @@ page AlertDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "alert-0-2",
"key": "alert-0-2",
"value": "secondary",
@@ -363,32 +363,32 @@ page AlertDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-alert-actions"><span><strong>actions</strong><small>unknown[]</small></span><textarea id="playground-alert-actions" name="pg_actions" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "alert-0-1",
"key": "alert-0-1",
"value": "primary",
@@ -417,31 +417,31 @@ page AlertDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "alert-0-2",
"key": "alert-0-2",
"value": "secondary",
@@ -470,30 +470,30 @@ page AlertDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-toggle" for="playground-alert-showIcon"><span><strong>show Icon</strong><small>boolean</small></span><input id="playground-alert-showIcon" name="pg_showIcon" type="checkbox" value="true" checked data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-alert-icon"><span><strong>icon</strong><small>string</small></span><input id="playground-alert-icon" name="pg_icon" type="text" value="" /></label><label class="playground-toggle" for="playground-alert-dismissible"><span><strong>dismissible</strong><small>boolean</small></span><input id="playground-alert-dismissible" name="pg_dismissible" type="checkbox" value="true" checked data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-alert-dismissLabel"><span><strong>dismiss Label</strong><small>string</small></span><input id="playground-alert-dismissLabel" name="pg_dismissLabel" type="text" value="Alert" /></label><label class="playground-field" for="playground-alert-role"><span><strong>role</strong><small>string</small></span><input id="playground-alert-role" name="pg_role" type="text" value="alert" /></label><label class="playground-field" for="playground-alert-live"><span><strong>live</strong><small>string</small></span><input id="playground-alert-live" name="pg_live" type="text" value="polite" /></label><label class="playground-field" for="playground-alert-linkLabel"><span><strong>link Label</strong><small>string</small></span><input id="playground-alert-linkLabel" name="pg_linkLabel" type="text" value="Alert" /></label><label class="playground-field" for="playground-alert-linkHref"><span><strong>link Href</strong><small>string</small></span><input id="playground-alert-linkHref" name="pg_linkHref" type="text" value="#alert-demo" /></label><label class="playground-field" for="playground-alert-actionLabel"><span><strong>action Label</strong><small>string</small></span><input id="playground-alert-actionLabel" name="pg_actionLabel" type="text" value="Alert" /></label><label class="playground-field" for="playground-alert-actionHref"><span><strong>action Href</strong><small>string</small></span><input id="playground-alert-actionHref" name="pg_actionHref" type="text" value="#alert-demo" /></label><label class="playground-toggle" for="playground-alert-compact"><span><strong>compact</strong><small>boolean</small></span><input id="playground-alert-compact" name="pg_compact" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label></div>
</form>
</div>
@@ -77,30 +77,30 @@ page AuthSplitLayoutDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>8 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-auth-split-layout-size"><span><strong>size</strong><small>string</small></span><select id="playground-auth-split-layout-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-auth-split-layout-color"><span><strong>color</strong><small>string</small></span><select id="playground-auth-split-layout-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-auth-split-layout-eyebrow"><span><strong>eyebrow</strong><small>string</small></span><input id="playground-auth-split-layout-eyebrow" name="pg_eyebrow" type="text" value="Secure identity" /></label><label class="playground-field" for="playground-auth-split-layout-title"><span><strong>title</strong><small>string</small></span><input id="playground-auth-split-layout-title" name="pg_title" type="text" value="Auth Split Layout example" /></label><label class="playground-field" for="playground-auth-split-layout-description"><span><strong>description</strong><small>string</small></span><input id="playground-auth-split-layout-description" name="pg_description" type="text" value="A polished default auth split layout for a modern application." /></label><label class="playground-field" for="playground-auth-split-layout-brand"><span><strong>brand</strong><small>string</small></span><input id="playground-auth-split-layout-brand" name="pg_brand" type="text" value="Police Management System" /></label><label class="playground-field" for="playground-auth-split-layout-features"><span><strong>features</strong><small>unknown[]</small></span><textarea id="playground-auth-split-layout-features" name="pg_features" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"label": "Team members",
"values": [
"5",
"Unlimited",
"Unlimited"
]
},
{
&#125;,
&#123;
"label": "Support",
"values": [
"Email",
"Priority",
"Dedicated"
]
},
{
&#125;,
&#123;
"label": "Audit history",
"values": [
"7 days",
"90 days",
"Custom"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-auth-split-layout-class"><span><strong>class</strong><small>string</small></span><input id="playground-auth-split-layout-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -156,7 +156,7 @@ page AvatarGroupDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>12 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-avatar-group-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-avatar-group-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "avatar-group-0-1",
"key": "avatar-group-0-1",
"value": "primary",
@@ -185,31 +185,31 @@ page AvatarGroupDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "avatar-group-0-2",
"key": "avatar-group-0-2",
"value": "secondary",
@@ -238,30 +238,30 @@ page AvatarGroupDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-avatar-group-size"><span><strong>size</strong><small>string</small></span><select id="playground-avatar-group-size" name="pg_size"><option value="md" selected>md</option><option value="default">default</option><option value="xs">xs</option><option value="sm">sm</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-avatar-group-color"><span><strong>color</strong><small>string</small></span><select id="playground-avatar-group-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-avatar-group-variant"><span><strong>variant</strong><small>string</small></span><input id="playground-avatar-group-variant" name="pg_variant" type="text" value="solid" /></label><label class="playground-field" for="playground-avatar-group-shape"><span><strong>shape</strong><small>string</small></span><select id="playground-avatar-group-shape" name="pg_shape"><option value="circle" selected>circle</option><option value="round">round</option><option value="rounded">rounded</option><option value="pill">pill</option></select></label><label class="playground-field" for="playground-avatar-group-layout"><span><strong>layout</strong><small>string</small></span><select id="playground-avatar-group-layout" name="pg_layout"><option value="stack" selected>stack</option><option value="content">content</option><option value="split">split</option><option value="stacked">stacked</option><option value="balanced">balanced</option><option value="visual">visual</option></select></label><label class="playground-field" for="playground-avatar-group-maxVisible"><span><strong>max Visible</strong><small>number</small></span><input id="playground-avatar-group-maxVisible" name="pg_maxVisible" type="number" value="4" /></label><label class="playground-field" for="playground-avatar-group-columns"><span><strong>columns</strong><small>number</small></span><input id="playground-avatar-group-columns" name="pg_columns" type="number" value="3" /></label><label class="playground-field" for="playground-avatar-group-borderColor"><span><strong>border Color</strong><small>string</small></span><input id="playground-avatar-group-borderColor" name="pg_borderColor" type="text" value="" /></label><label class="playground-toggle" for="playground-avatar-group-showTooltips"><span><strong>show Tooltips</strong><small>boolean</small></span><input id="playground-avatar-group-showTooltips" name="pg_showTooltips" type="checkbox" value="true" checked data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-avatar-group-overflowLabel"><span><strong>overflow Label</strong><small>string</small></span><input id="playground-avatar-group-overflowLabel" name="pg_overflowLabel" type="text" value="Avatar Group" /></label><label class="playground-field" for="playground-avatar-group-class"><span><strong>class</strong><small>string</small></span><input id="playground-avatar-group-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -158,7 +158,7 @@ page BreadcrumbDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>12 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-breadcrumb-label"><span><strong>label</strong><small>string</small></span><input id="playground-breadcrumb-label" name="pg_label" type="text" value="Breadcrumb" /></label><label class="playground-field" for="playground-breadcrumb-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-breadcrumb-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "breadcrumb-0-1",
"key": "breadcrumb-0-1",
"value": "primary",
@@ -187,31 +187,31 @@ page BreadcrumbDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "breadcrumb-0-2",
"key": "breadcrumb-0-2",
"value": "secondary",
@@ -240,30 +240,30 @@ page BreadcrumbDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-breadcrumb-active"><span><strong>active</strong><small>string</small></span><input id="playground-breadcrumb-active" name="pg_active" type="text" value="" /></label><label class="playground-field" for="playground-breadcrumb-separator"><span><strong>separator</strong><small>string</small></span><select id="playground-breadcrumb-separator" name="pg_separator"><option value="chevron" selected>chevron</option><option value="slash">slash</option><option value="dot">dot</option><option value="arrow">arrow</option></select></label><label class="playground-toggle" for="playground-breadcrumb-showHome"><span><strong>show Home</strong><small>boolean</small></span><input id="playground-breadcrumb-showHome" name="pg_showHome" type="checkbox" value="true" checked data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-breadcrumb-homeLabel"><span><strong>home Label</strong><small>string</small></span><input id="playground-breadcrumb-homeLabel" name="pg_homeLabel" type="text" value="Breadcrumb" /></label><label class="playground-field" for="playground-breadcrumb-homeHref"><span><strong>home Href</strong><small>string</small></span><input id="playground-breadcrumb-homeHref" name="pg_homeHref" type="text" value="#breadcrumb-demo" /></label><label class="playground-field" for="playground-breadcrumb-homeIcon"><span><strong>home Icon</strong><small>string</small></span><input id="playground-breadcrumb-homeIcon" name="pg_homeIcon" type="text" value="icon-[lucide--house]" /></label><label class="playground-field" for="playground-breadcrumb-size"><span><strong>size</strong><small>string</small></span><select id="playground-breadcrumb-size" name="pg_size"><option value="default" selected>default</option><option value="small">small</option><option value="medium">medium</option><option value="large">large</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-breadcrumb-color"><span><strong>color</strong><small>string</small></span><select id="playground-breadcrumb-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-breadcrumb-variant"><span><strong>variant</strong><small>string</small></span><select id="playground-breadcrumb-variant" name="pg_variant"><option value="minimal" selected>minimal</option><option value="soft">soft</option><option value="outline">outline</option><option value="contrast">contrast</option></select></label><label class="playground-field" for="playground-breadcrumb-class"><span><strong>class</strong><small>string</small></span><input id="playground-breadcrumb-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -158,7 +158,7 @@ page ButtonGroupDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>13 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-button-group-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-button-group-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "button-group-0-1",
"key": "button-group-0-1",
"value": "primary",
@@ -187,31 +187,31 @@ page ButtonGroupDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "button-group-0-2",
"key": "button-group-0-2",
"value": "secondary",
@@ -240,30 +240,30 @@ page ButtonGroupDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-button-group-value"><span><strong>value</strong><small>string</small></span><input id="playground-button-group-value" name="pg_value" type="text" value="sample-1" /></label><label class="playground-field" for="playground-button-group-size"><span><strong>size</strong><small>string</small></span><select id="playground-button-group-size" name="pg_size"><option value="md" selected>md</option><option value="default">default</option><option value="xs">xs</option><option value="sm">sm</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-button-group-color"><span><strong>color</strong><small>string</small></span><select id="playground-button-group-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-button-group-variant"><span><strong>variant</strong><small>string</small></span><input id="playground-button-group-variant" name="pg_variant" type="text" value="default" /></label><label class="playground-field" for="playground-button-group-orientation"><span><strong>orientation</strong><small>string</small></span><select id="playground-button-group-orientation" name="pg_orientation"><option value="horizontal" selected>horizontal</option><option value="vertical">vertical</option></select></label><label class="playground-toggle" for="playground-button-group-responsive"><span><strong>responsive</strong><small>boolean</small></span><input id="playground-button-group-responsive" name="pg_responsive" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-button-group-attached"><span><strong>attached</strong><small>boolean</small></span><input id="playground-button-group-attached" name="pg_attached" type="checkbox" value="true" checked data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-button-group-selectable"><span><strong>selectable</strong><small>boolean</small></span><input id="playground-button-group-selectable" name="pg_selectable" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-button-group-toolbar"><span><strong>toolbar</strong><small>boolean</small></span><input id="playground-button-group-toolbar" name="pg_toolbar" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-button-group-disabled"><span><strong>disabled</strong><small>boolean</small></span><input id="playground-button-group-disabled" name="pg_disabled" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-button-group-ariaLabel"><span><strong>aria Label</strong><small>string</small></span><input id="playground-button-group-ariaLabel" name="pg_ariaLabel" type="text" value="Button Group 1 example" /></label><label class="playground-field" for="playground-button-group-class"><span><strong>class</strong><small>string</small></span><input id="playground-button-group-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -401,7 +401,7 @@ page CardDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>31 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-card-title"><span><strong>title</strong><small>string</small></span><input id="playground-card-title" name="pg_title" type="text" value="Card example" /></label><label class="playground-field" for="playground-card-subtitle"><span><strong>subtitle</strong><small>string</small></span><input id="playground-card-subtitle" name="pg_subtitle" type="text" value="Card example" /></label><label class="playground-field" for="playground-card-description"><span><strong>description</strong><small>string</small></span><input id="playground-card-description" name="pg_description" type="text" value="A polished default card for a modern application." /></label><label class="playground-field" for="playground-card-header"><span><strong>header</strong><small>string</small></span><input id="playground-card-header" name="pg_header" type="text" value="" /></label><label class="playground-field" for="playground-card-footer"><span><strong>footer</strong><small>string</small></span><input id="playground-card-footer" name="pg_footer" type="text" value="" /></label><label class="playground-field" for="playground-card-imageSrc"><span><strong>image Src</strong><small>string</small></span><input id="playground-card-imageSrc" name="pg_imageSrc" type="text" value="" /></label><label class="playground-field" for="playground-card-imageAlt"><span><strong>image Alt</strong><small>string</small></span><input id="playground-card-imageAlt" name="pg_imageAlt" type="text" value="" /></label><label class="playground-field" for="playground-card-imagePosition"><span><strong>image Position</strong><small>string</small></span><select id="playground-card-imagePosition" name="pg_imagePosition"><option value="top" selected>top</option><option value="left">left</option><option value="right">right</option></select></label><label class="playground-field" for="playground-card-actionLabel"><span><strong>action Label</strong><small>string</small></span><input id="playground-card-actionLabel" name="pg_actionLabel" type="text" value="Card" /></label><label class="playground-field" for="playground-card-actionHref"><span><strong>action Href</strong><small>string</small></span><input id="playground-card-actionHref" name="pg_actionHref" type="text" value="#card-demo" /></label><label class="playground-field" for="playground-card-headerActions"><span><strong>header Actions</strong><small>unknown[]</small></span><textarea id="playground-card-headerActions" name="pg_headerActions" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "card-0-1",
"key": "card-0-1",
"value": "primary",
@@ -430,31 +430,31 @@ page CardDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "card-0-2",
"key": "card-0-2",
"value": "secondary",
@@ -483,32 +483,32 @@ page CardDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-card-navigation"><span><strong>navigation</strong><small>unknown[]</small></span><textarea id="playground-card-navigation" name="pg_navigation" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "card-0-1",
"key": "card-0-1",
"value": "primary",
@@ -537,31 +537,31 @@ page CardDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "card-0-2",
"key": "card-0-2",
"value": "secondary",
@@ -590,32 +590,32 @@ page CardDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-card-activeNav"><span><strong>active Nav</strong><small>string</small></span><input id="playground-card-activeNav" name="pg_activeNav" type="text" value="" /></label><label class="playground-toggle" for="playground-card-mobileNavigation"><span><strong>mobile Navigation</strong><small>boolean</small></span><input id="playground-card-mobileNavigation" name="pg_mobileNavigation" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-card-alertTitle"><span><strong>alert Title</strong><small>string</small></span><input id="playground-card-alertTitle" name="pg_alertTitle" type="text" value="Card example" /></label><label class="playground-field" for="playground-card-alertDescription"><span><strong>alert Description</strong><small>string</small></span><input id="playground-card-alertDescription" name="pg_alertDescription" type="text" value="A polished default card for a modern application." /></label><label class="playground-toggle" for="playground-card-empty"><span><strong>empty</strong><small>boolean</small></span><input id="playground-card-empty" name="pg_empty" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-card-emptyTitle"><span><strong>empty Title</strong><small>string</small></span><input id="playground-card-emptyTitle" name="pg_emptyTitle" type="text" value="Card example" /></label><label class="playground-field" for="playground-card-emptyIcon"><span><strong>empty Icon</strong><small>string</small></span><input id="playground-card-emptyIcon" name="pg_emptyIcon" type="text" value="icon-[lucide--inbox]" /></label><label class="playground-field" for="playground-card-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-card-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "card-0-1",
"key": "card-0-1",
"value": "primary",
@@ -644,31 +644,31 @@ page CardDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "card-0-2",
"key": "card-0-2",
"value": "secondary",
@@ -697,30 +697,30 @@ page CardDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-card-size"><span><strong>size</strong><small>string</small></span><select id="playground-card-size" name="pg_size"><option value="md" selected>md</option><option value="compact">compact</option><option value="default">default</option><option value="spacious">spacious</option><option value="xs">xs</option><option value="sm">sm</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-card-color"><span><strong>color</strong><small>string</small></span><select id="playground-card-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-card-variant"><span><strong>variant</strong><small>string</small></span><select id="playground-card-variant" name="pg_variant"><option value="default" selected>default</option><option value="soft">soft</option><option value="raised">raised</option><option value="outline">outline</option><option value="minimal">minimal</option></select></label><label class="playground-field" for="playground-card-layout"><span><strong>layout</strong><small>string</small></span><select id="playground-card-layout" name="pg_layout"><option value="vertical" selected>vertical</option><option value="content">content</option><option value="split">split</option><option value="stacked">stacked</option><option value="balanced">balanced</option><option value="visual">visual</option></select></label><label class="playground-field" for="playground-card-align"><span><strong>align</strong><small>string</small></span><select id="playground-card-align" name="pg_align"><option value="start" selected>start</option><option value="left">left</option><option value="center">center</option><option value="right">right</option><option value="end">end</option><option value="stretch">stretch</option></select></label><label class="playground-field" for="playground-card-hover"><span><strong>hover</strong><small>string</small></span><input id="playground-card-hover" name="pg_hover" type="text" value="none" /></label><label class="playground-toggle" for="playground-card-scrollable"><span><strong>scrollable</strong><small>boolean</small></span><input id="playground-card-scrollable" name="pg_scrollable" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-card-maxHeight"><span><strong>max Height</strong><small>string</small></span><input id="playground-card-maxHeight" name="pg_maxHeight" type="text" value="18rem" /></label><label class="playground-toggle" for="playground-card-dismissible"><span><strong>dismissible</strong><small>boolean</small></span><input id="playground-card-dismissible" name="pg_dismissible" type="checkbox" value="true" checked data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-card-ariaLabel"><span><strong>aria Label</strong><small>string</small></span><input id="playground-card-ariaLabel" name="pg_ariaLabel" type="text" value="Card 1 example" /></label><label class="playground-field" for="playground-card-class"><span><strong>class</strong><small>string</small></span><input id="playground-card-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -170,7 +170,7 @@ page CarouselDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>22 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-carousel-size"><span><strong>size</strong><small>string</small></span><select id="playground-carousel-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-carousel-color"><span><strong>color</strong><small>string</small></span><select id="playground-carousel-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-carousel-title"><span><strong>title</strong><small>string</small></span><input id="playground-carousel-title" name="pg_title" type="text" value="Carousel example" /></label><label class="playground-field" for="playground-carousel-description"><span><strong>description</strong><small>string</small></span><input id="playground-carousel-description" name="pg_description" type="text" value="A polished default carousel for a modern application." /></label><label class="playground-field" for="playground-carousel-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-carousel-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "carousel-0-1",
"key": "carousel-0-1",
"value": "primary",
@@ -199,31 +199,31 @@ page CarouselDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "carousel-0-2",
"key": "carousel-0-2",
"value": "secondary",
@@ -252,30 +252,30 @@ page CarouselDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-carousel-activeIndex"><span><strong>active Index</strong><small>number</small></span><input id="playground-carousel-activeIndex" name="pg_activeIndex" type="number" value="0" /></label><label class="playground-field" for="playground-carousel-slidesPerView"><span><strong>slides Per View</strong><small>number</small></span><input id="playground-carousel-slidesPerView" name="pg_slidesPerView" type="number" value="1" /></label><label class="playground-field" for="playground-carousel-gap"><span><strong>gap</strong><small>string</small></span><select id="playground-carousel-gap" name="pg_gap"><option value="0.75rem" selected>0.75rem</option><option value="none">none</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="2xl">2xl</option></select></label><label class="playground-toggle" for="playground-carousel-showPagination"><span><strong>show Pagination</strong><small>boolean</small></span><input id="playground-carousel-showPagination" name="pg_showPagination" type="checkbox" value="true" checked data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-carousel-isAutoPlay"><span><strong>is Auto Play</strong><small>boolean</small></span><input id="playground-carousel-isAutoPlay" name="pg_isAutoPlay" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-carousel-autoplayInterval"><span><strong>autoplay Interval</strong><small>number</small></span><input id="playground-carousel-autoplayInterval" name="pg_autoplayInterval" type="number" value="4000" /></label><label class="playground-toggle" for="playground-carousel-isInfiniteLoop"><span><strong>is Infinite Loop</strong><small>boolean</small></span><input id="playground-carousel-isInfiniteLoop" name="pg_isInfiniteLoop" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-carousel-isRTL"><span><strong>is RTL</strong><small>boolean</small></span><input id="playground-carousel-isRTL" name="pg_isRTL" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-carousel-isCentered"><span><strong>is Centered</strong><small>boolean</small></span><input id="playground-carousel-isCentered" name="pg_isCentered" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-carousel-isDraggable"><span><strong>is Draggable</strong><small>boolean</small></span><input id="playground-carousel-isDraggable" name="pg_isDraggable" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-carousel-isAutoHeight"><span><strong>is Auto Height</strong><small>boolean</small></span><input id="playground-carousel-isAutoHeight" name="pg_isAutoHeight" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-carousel-isSnap"><span><strong>is Snap</strong><small>boolean</small></span><input id="playground-carousel-isSnap" name="pg_isSnap" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-carousel-showCounter"><span><strong>show Counter</strong><small>boolean</small></span><input id="playground-carousel-showCounter" name="pg_showCounter" type="checkbox" value="true" checked data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-carousel-thumbnails"><span><strong>thumbnails</strong><small>string</small></span><input id="playground-carousel-thumbnails" name="pg_thumbnails" type="text" value="none" /></label><label class="playground-field" for="playground-carousel-ariaLabel"><span><strong>aria Label</strong><small>string</small></span><input id="playground-carousel-ariaLabel" name="pg_ariaLabel" type="text" value="Carousel 1 example" /></label><label class="playground-field" for="playground-carousel-variant"><span><strong>variant</strong><small>string</small></span><input id="playground-carousel-variant" name="pg_variant" type="text" value="default" /></label><label class="playground-field" for="playground-carousel-class"><span><strong>class</strong><small>string</small></span><input id="playground-carousel-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -152,7 +152,7 @@ page ChartDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>7 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-chart-size"><span><strong>size</strong><small>string</small></span><select id="playground-chart-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-chart-color"><span><strong>color</strong><small>string</small></span><select id="playground-chart-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-chart-title"><span><strong>title</strong><small>string</small></span><input id="playground-chart-title" name="pg_title" type="text" value="Chart example" /></label><label class="playground-field" for="playground-chart-description"><span><strong>description</strong><small>string</small></span><input id="playground-chart-description" name="pg_description" type="text" value="A polished default chart for a modern application." /></label><label class="playground-field" for="playground-chart-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-chart-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "chart-0-1",
"key": "chart-0-1",
"value": "primary",
@@ -181,31 +181,31 @@ page ChartDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "chart-0-2",
"key": "chart-0-2",
"value": "secondary",
@@ -234,30 +234,30 @@ page ChartDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-chart-variant"><span><strong>variant</strong><small>string</small></span><input id="playground-chart-variant" name="pg_variant" type="text" value="default" /></label><label class="playground-field" for="playground-chart-class"><span><strong>class</strong><small>string</small></span><input id="playground-chart-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -159,7 +159,7 @@ page ChatBubbleDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>11 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-chat-bubble-size"><span><strong>size</strong><small>string</small></span><select id="playground-chat-bubble-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-chat-bubble-color"><span><strong>color</strong><small>string</small></span><select id="playground-chat-bubble-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-chat-bubble-title"><span><strong>title</strong><small>string</small></span><input id="playground-chat-bubble-title" name="pg_title" type="text" value="Chat Bubble example" /></label><label class="playground-field" for="playground-chat-bubble-description"><span><strong>description</strong><small>string</small></span><input id="playground-chat-bubble-description" name="pg_description" type="text" value="A polished default chat bubble for a modern application." /></label><label class="playground-field" for="playground-chat-bubble-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-chat-bubble-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "chat-bubble-0-1",
"key": "chat-bubble-0-1",
"value": "primary",
@@ -188,31 +188,31 @@ page ChatBubbleDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "chat-bubble-0-2",
"key": "chat-bubble-0-2",
"value": "secondary",
@@ -241,30 +241,30 @@ page ChatBubbleDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-toggle" for="playground-chat-bubble-oneSided"><span><strong>one Sided</strong><small>boolean</small></span><input id="playground-chat-bubble-oneSided" name="pg_oneSided" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-chat-bubble-showAvatars"><span><strong>show Avatars</strong><small>boolean</small></span><input id="playground-chat-bubble-showAvatars" name="pg_showAvatars" type="checkbox" value="true" checked data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-chat-bubble-showMetadata"><span><strong>show Metadata</strong><small>boolean</small></span><input id="playground-chat-bubble-showMetadata" name="pg_showMetadata" type="checkbox" value="true" checked data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-chat-bubble-ariaLabel"><span><strong>aria Label</strong><small>string</small></span><input id="playground-chat-bubble-ariaLabel" name="pg_ariaLabel" type="text" value="Chat Bubble 1 example" /></label><label class="playground-field" for="playground-chat-bubble-variant"><span><strong>variant</strong><small>string</small></span><input id="playground-chat-bubble-variant" name="pg_variant" type="text" value="default" /></label><label class="playground-field" for="playground-chat-bubble-class"><span><strong>class</strong><small>string</small></span><input id="playground-chat-bubble-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -280,7 +280,7 @@ page CheckboxDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>27 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-checkbox-size"><span><strong>size</strong><small>string</small></span><select id="playground-checkbox-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-checkbox-color"><span><strong>color</strong><small>string</small></span><select id="playground-checkbox-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-checkbox-id"><span><strong>id</strong><small>string</small></span><input id="playground-checkbox-id" name="pg_id" type="text" value="" /></label><label class="playground-field" for="playground-checkbox-name"><span><strong>name</strong><small>string</small></span><input id="playground-checkbox-name" name="pg_name" type="text" value="" /></label><label class="playground-field" for="playground-checkbox-label"><span><strong>label</strong><small>string</small></span><input id="playground-checkbox-label" name="pg_label" type="text" value="Checkbox" /></label><label class="playground-toggle" for="playground-checkbox-hiddenLabel"><span><strong>hidden Label</strong><small>boolean</small></span><input id="playground-checkbox-hiddenLabel" name="pg_hiddenLabel" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-checkbox-placeholder"><span><strong>placeholder</strong><small>string</small></span><input id="playground-checkbox-placeholder" name="pg_placeholder" type="text" value="Enter a sample value" /></label><label class="playground-field" for="playground-checkbox-variant"><span><strong>variant</strong><small>string</small></span><input id="playground-checkbox-variant" name="pg_variant" type="text" value="normal" /></label><label class="playground-field" for="playground-checkbox-icon"><span><strong>icon</strong><small>string</small></span><input id="playground-checkbox-icon" name="pg_icon" type="text" value="" /></label><label class="playground-field" for="playground-checkbox-iconPosition"><span><strong>icon Position</strong><small>string</small></span><select id="playground-checkbox-iconPosition" name="pg_iconPosition"><option value="start" selected>start</option><option value="end">end</option><option value="left">left</option><option value="right">right</option></select></label><label class="playground-field" for="playground-checkbox-value"><span><strong>value</strong><small>string</small></span><input id="playground-checkbox-value" name="pg_value" type="text" value="sample-1" /></label><label class="playground-field" for="playground-checkbox-values"><span><strong>values</strong><small>unknown[]</small></span><textarea id="playground-checkbox-values" name="pg_values" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "checkbox-0-1",
"key": "checkbox-0-1",
"value": "primary",
@@ -309,31 +309,31 @@ page CheckboxDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "checkbox-0-2",
"key": "checkbox-0-2",
"value": "secondary",
@@ -362,32 +362,32 @@ page CheckboxDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-checkbox-options"><span><strong>options</strong><small>unknown[]</small></span><textarea id="playground-checkbox-options" name="pg_options" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "checkbox-0-1",
"key": "checkbox-0-1",
"value": "primary",
@@ -416,31 +416,31 @@ page CheckboxDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "checkbox-0-2",
"key": "checkbox-0-2",
"value": "secondary",
@@ -469,30 +469,30 @@ page CheckboxDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-toggle" for="playground-checkbox-checked"><span><strong>checked</strong><small>boolean</small></span><input id="playground-checkbox-checked" name="pg_checked" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-checkbox-indeterminate"><span><strong>indeterminate</strong><small>boolean</small></span><input id="playground-checkbox-indeterminate" name="pg_indeterminate" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-checkbox-orientation"><span><strong>orientation</strong><small>string</small></span><select id="playground-checkbox-orientation" name="pg_orientation"><option value="vertical" selected>vertical</option><option value="horizontal">horizontal</option></select></label><label class="playground-toggle" for="playground-checkbox-card"><span><strong>card</strong><small>boolean</small></span><input id="playground-checkbox-card" name="pg_card" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-checkbox-rightAligned"><span><strong>right Aligned</strong><small>boolean</small></span><input id="playground-checkbox-rightAligned" name="pg_rightAligned" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-checkbox-list"><span><strong>list</strong><small>boolean</small></span><input id="playground-checkbox-list" name="pg_list" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-checkbox-helperText"><span><strong>helper Text</strong><small>string</small></span><input id="playground-checkbox-helperText" name="pg_helperText" type="text" value="" /></label><label class="playground-field" for="playground-checkbox-cornerHint"><span><strong>corner Hint</strong><small>string</small></span><input id="playground-checkbox-cornerHint" name="pg_cornerHint" type="text" value="" /></label><label class="playground-field" for="playground-checkbox-error"><span><strong>error</strong><small>string</small></span><input id="playground-checkbox-error" name="pg_error" type="text" value="" /></label><label class="playground-toggle" for="playground-checkbox-inline"><span><strong>inline</strong><small>boolean</small></span><input id="playground-checkbox-inline" name="pg_inline" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-checkbox-readonly"><span><strong>readonly</strong><small>boolean</small></span><input id="playground-checkbox-readonly" name="pg_readonly" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-checkbox-disabled"><span><strong>disabled</strong><small>boolean</small></span><input id="playground-checkbox-disabled" name="pg_disabled" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-checkbox-required"><span><strong>required</strong><small>boolean</small></span><input id="playground-checkbox-required" name="pg_required" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-checkbox-class"><span><strong>class</strong><small>string</small></span><input id="playground-checkbox-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -152,7 +152,7 @@ page ClipboardDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>7 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-clipboard-size"><span><strong>size</strong><small>string</small></span><select id="playground-clipboard-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-clipboard-color"><span><strong>color</strong><small>string</small></span><select id="playground-clipboard-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-clipboard-title"><span><strong>title</strong><small>string</small></span><input id="playground-clipboard-title" name="pg_title" type="text" value="Clipboard example" /></label><label class="playground-field" for="playground-clipboard-description"><span><strong>description</strong><small>string</small></span><input id="playground-clipboard-description" name="pg_description" type="text" value="A polished default clipboard for a modern application." /></label><label class="playground-field" for="playground-clipboard-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-clipboard-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "clipboard-0-1",
"key": "clipboard-0-1",
"value": "primary",
@@ -181,31 +181,31 @@ page ClipboardDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "clipboard-0-2",
"key": "clipboard-0-2",
"value": "secondary",
@@ -234,30 +234,30 @@ page ClipboardDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-clipboard-variant"><span><strong>variant</strong><small>string</small></span><input id="playground-clipboard-variant" name="pg_variant" type="text" value="default" /></label><label class="playground-field" for="playground-clipboard-class"><span><strong>class</strong><small>string</small></span><input id="playground-clipboard-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -260,7 +260,7 @@ page CollapseDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>8 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-collapse-size"><span><strong>size</strong><small>string</small></span><select id="playground-collapse-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-collapse-color"><span><strong>color</strong><small>string</small></span><select id="playground-collapse-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-collapse-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-collapse-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "collapse-0-1",
"key": "collapse-0-1",
"value": "primary",
@@ -289,31 +289,31 @@ page CollapseDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "collapse-0-2",
"key": "collapse-0-2",
"value": "secondary",
@@ -342,32 +342,32 @@ page CollapseDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-toggle" for="playground-collapse-multiple"><span><strong>multiple</strong><small>boolean</small></span><input id="playground-collapse-multiple" name="pg_multiple" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-collapse-mode"><span><strong>mode</strong><small>string</small></span><input id="playground-collapse-mode" name="pg_mode" type="text" value="panel" /></label><label class="playground-field" for="playground-collapse-initialOpenIndexes"><span><strong>initial Open Indexes</strong><small>unknown[]</small></span><textarea id="playground-collapse-initialOpenIndexes" name="pg_initialOpenIndexes" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "collapse-0-1",
"key": "collapse-0-1",
"value": "primary",
@@ -396,31 +396,31 @@ page CollapseDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "collapse-0-2",
"key": "collapse-0-2",
"value": "secondary",
@@ -449,30 +449,30 @@ page CollapseDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-collapse-ariaLabel"><span><strong>aria Label</strong><small>string</small></span><input id="playground-collapse-ariaLabel" name="pg_ariaLabel" type="text" value="Collapse 1 example" /></label><label class="playground-field" for="playground-collapse-class"><span><strong>class</strong><small>string</small></span><input id="playground-collapse-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
File diff suppressed because one or more lines are too long
@@ -152,7 +152,7 @@ page ConfettiDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>7 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-confetti-size"><span><strong>size</strong><small>string</small></span><select id="playground-confetti-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-confetti-color"><span><strong>color</strong><small>string</small></span><select id="playground-confetti-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-confetti-title"><span><strong>title</strong><small>string</small></span><input id="playground-confetti-title" name="pg_title" type="text" value="Confetti example" /></label><label class="playground-field" for="playground-confetti-description"><span><strong>description</strong><small>string</small></span><input id="playground-confetti-description" name="pg_description" type="text" value="A polished default confetti for a modern application." /></label><label class="playground-field" for="playground-confetti-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-confetti-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "confetti-0-1",
"key": "confetti-0-1",
"value": "primary",
@@ -181,31 +181,31 @@ page ConfettiDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "confetti-0-2",
"key": "confetti-0-2",
"value": "secondary",
@@ -234,30 +234,30 @@ page ConfettiDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-confetti-variant"><span><strong>variant</strong><small>string</small></span><input id="playground-confetti-variant" name="pg_variant" type="text" value="default" /></label><label class="playground-field" for="playground-confetti-class"><span><strong>class</strong><small>string</small></span><input id="playground-confetti-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -152,7 +152,7 @@ page DataMapDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>7 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-data-map-size"><span><strong>size</strong><small>string</small></span><select id="playground-data-map-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-data-map-color"><span><strong>color</strong><small>string</small></span><select id="playground-data-map-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-data-map-title"><span><strong>title</strong><small>string</small></span><input id="playground-data-map-title" name="pg_title" type="text" value="Data Map example" /></label><label class="playground-field" for="playground-data-map-description"><span><strong>description</strong><small>string</small></span><input id="playground-data-map-description" name="pg_description" type="text" value="A polished default data map for a modern application." /></label><label class="playground-field" for="playground-data-map-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-data-map-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "data-map-0-1",
"key": "data-map-0-1",
"value": "primary",
@@ -181,31 +181,31 @@ page DataMapDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "data-map-0-2",
"key": "data-map-0-2",
"value": "secondary",
@@ -234,30 +234,30 @@ page DataMapDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-data-map-variant"><span><strong>variant</strong><small>string</small></span><input id="playground-data-map-variant" name="pg_variant" type="text" value="default" /></label><label class="playground-field" for="playground-data-map-class"><span><strong>class</strong><small>string</small></span><input id="playground-data-map-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
File diff suppressed because one or more lines are too long
@@ -160,7 +160,7 @@ page DeviceFrameDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>14 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-device-frame-size"><span><strong>size</strong><small>string</small></span><select id="playground-device-frame-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-device-frame-color"><span><strong>color</strong><small>string</small></span><select id="playground-device-frame-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-device-frame-title"><span><strong>title</strong><small>string</small></span><input id="playground-device-frame-title" name="pg_title" type="text" value="Device Frame example" /></label><label class="playground-field" for="playground-device-frame-description"><span><strong>description</strong><small>string</small></span><input id="playground-device-frame-description" name="pg_description" type="text" value="A polished default device frame for a modern application." /></label><label class="playground-field" for="playground-device-frame-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-device-frame-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "device-frame-0-1",
"key": "device-frame-0-1",
"value": "primary",
@@ -189,31 +189,31 @@ page DeviceFrameDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "device-frame-0-2",
"key": "device-frame-0-2",
"value": "secondary",
@@ -242,30 +242,30 @@ page DeviceFrameDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-device-frame-variant"><span><strong>variant</strong><small>string</small></span><input id="playground-device-frame-variant" name="pg_variant" type="text" value="default" /></label><label class="playground-field" for="playground-device-frame-device"><span><strong>device</strong><small>string</small></span><input id="playground-device-frame-device" name="pg_device" type="text" value="phone" /></label><label class="playground-field" for="playground-device-frame-orientation"><span><strong>orientation</strong><small>string</small></span><select id="playground-device-frame-orientation" name="pg_orientation"><option value="portrait" selected>portrait</option><option value="horizontal">horizontal</option><option value="vertical">vertical</option></select></label><label class="playground-field" for="playground-device-frame-src"><span><strong>src</strong><small>string</small></span><input id="playground-device-frame-src" name="pg_src" type="text" value="" /></label><label class="playground-field" for="playground-device-frame-srcdoc"><span><strong>srcdoc</strong><small>string</small></span><input id="playground-device-frame-srcdoc" name="pg_srcdoc" type="text" value="" /></label><label class="playground-field" for="playground-device-frame-frameTitle"><span><strong>frame Title</strong><small>string</small></span><input id="playground-device-frame-frameTitle" name="pg_frameTitle" type="text" value="Device Frame example" /></label><label class="playground-toggle" for="playground-device-frame-showToolbar"><span><strong>show Toolbar</strong><small>boolean</small></span><input id="playground-device-frame-showToolbar" name="pg_showToolbar" type="checkbox" value="true" checked data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-device-frame-allow"><span><strong>allow</strong><small>string</small></span><input id="playground-device-frame-allow" name="pg_allow" type="text" value="" /></label><label class="playground-field" for="playground-device-frame-class"><span><strong>class</strong><small>string</small></span><input id="playground-device-frame-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -152,7 +152,7 @@ page DragAndDropDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>7 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-drag-and-drop-size"><span><strong>size</strong><small>string</small></span><select id="playground-drag-and-drop-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-drag-and-drop-color"><span><strong>color</strong><small>string</small></span><select id="playground-drag-and-drop-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-drag-and-drop-title"><span><strong>title</strong><small>string</small></span><input id="playground-drag-and-drop-title" name="pg_title" type="text" value="Drag And Drop example" /></label><label class="playground-field" for="playground-drag-and-drop-description"><span><strong>description</strong><small>string</small></span><input id="playground-drag-and-drop-description" name="pg_description" type="text" value="A polished default drag and drop for a modern application." /></label><label class="playground-field" for="playground-drag-and-drop-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-drag-and-drop-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "drag-and-drop-0-1",
"key": "drag-and-drop-0-1",
"value": "primary",
@@ -181,31 +181,31 @@ page DragAndDropDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "drag-and-drop-0-2",
"key": "drag-and-drop-0-2",
"value": "secondary",
@@ -234,30 +234,30 @@ page DragAndDropDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-drag-and-drop-variant"><span><strong>variant</strong><small>string</small></span><input id="playground-drag-and-drop-variant" name="pg_variant" type="text" value="default" /></label><label class="playground-field" for="playground-drag-and-drop-class"><span><strong>class</strong><small>string</small></span><input id="playground-drag-and-drop-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
File diff suppressed because one or more lines are too long
@@ -159,7 +159,7 @@ page FeatureGridDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>14 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-feature-grid-size"><span><strong>size</strong><small>string</small></span><select id="playground-feature-grid-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-feature-grid-color"><span><strong>color</strong><small>string</small></span><select id="playground-feature-grid-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-feature-grid-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-feature-grid-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"icon": "icon-[lucide--shield-check]",
"eyebrow": "Citizen support",
"title": "Citizen services",
@@ -170,8 +170,8 @@ page FeatureGridDetail {
"color": "primary",
"variant": "default",
"hover": "lift"
},
{
&#125;,
&#123;
"icon": "icon-[lucide--map-pin]",
"eyebrow": "Directory",
"title": "Station directory",
@@ -182,8 +182,8 @@ page FeatureGridDetail {
"color": "info",
"variant": "soft",
"hover": "border"
},
{
&#125;,
&#123;
"icon": "icon-[lucide--radio-tower]",
"eyebrow": "Verified",
"title": "Public updates",
@@ -194,7 +194,7 @@ page FeatureGridDetail {
"color": "success",
"variant": "gradient",
"hover": "glow"
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-feature-grid-columns"><span><strong>columns</strong><small>number</small></span><input id="playground-feature-grid-columns" name="pg_columns" type="number" value="3" /></label><label class="playground-field" for="playground-feature-grid-tabletColumns"><span><strong>tablet Columns</strong><small>number</small></span><input id="playground-feature-grid-tabletColumns" name="pg_tabletColumns" type="number" value="2" /></label><label class="playground-field" for="playground-feature-grid-mobileColumns"><span><strong>mobile Columns</strong><small>number</small></span><input id="playground-feature-grid-mobileColumns" name="pg_mobileColumns" type="number" value="1" /></label><label class="playground-field" for="playground-feature-grid-gap"><span><strong>gap</strong><small>string</small></span><select id="playground-feature-grid-gap" name="pg_gap"><option value="md" selected>md</option><option value="none">none</option><option value="sm">sm</option><option value="lg">lg</option><option value="xl">xl</option><option value="xs">xs</option><option value="2xl">2xl</option></select></label><label class="playground-field" for="playground-feature-grid-minItemWidth"><span><strong>min Item Width</strong><small>string</small></span><input id="playground-feature-grid-minItemWidth" name="pg_minItemWidth" type="text" value="" /></label><label class="playground-toggle" for="playground-feature-grid-equalHeight"><span><strong>equal Height</strong><small>boolean</small></span><input id="playground-feature-grid-equalHeight" name="pg_equalHeight" type="checkbox" value="true" checked data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-feature-grid-align"><span><strong>align</strong><small>string</small></span><select id="playground-feature-grid-align" name="pg_align"><option value="start" selected>start</option><option value="stretch">stretch</option><option value="center">center</option><option value="end">end</option><option value="left">left</option><option value="right">right</option></select></label><label class="playground-field" for="playground-feature-grid-maxWidth"><span><strong>max Width</strong><small>string</small></span><select id="playground-feature-grid-maxWidth" name="pg_maxWidth"><option value="full" selected>full</option><option value="compact">compact</option><option value="lg">lg</option><option value="xl">xl</option><option value="wide">wide</option><option value="2xl">2xl</option></select></label><label class="playground-field" for="playground-feature-grid-variant"><span><strong>variant</strong><small>string</small></span><select id="playground-feature-grid-variant" name="pg_variant"><option value="default" selected>default</option><option value="panel">panel</option><option value="soft">soft</option></select></label><label class="playground-field" for="playground-feature-grid-label"><span><strong>label</strong><small>string</small></span><input id="playground-feature-grid-label" name="pg_label" type="text" value="Feature Grid" /></label><label class="playground-field" for="playground-feature-grid-class"><span><strong>class</strong><small>string</small></span><input id="playground-feature-grid-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -152,7 +152,7 @@ page FileUploadDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>7 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-file-upload-size"><span><strong>size</strong><small>string</small></span><select id="playground-file-upload-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-file-upload-color"><span><strong>color</strong><small>string</small></span><select id="playground-file-upload-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-file-upload-title"><span><strong>title</strong><small>string</small></span><input id="playground-file-upload-title" name="pg_title" type="text" value="File Upload example" /></label><label class="playground-field" for="playground-file-upload-description"><span><strong>description</strong><small>string</small></span><input id="playground-file-upload-description" name="pg_description" type="text" value="A polished default file upload for a modern application." /></label><label class="playground-field" for="playground-file-upload-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-file-upload-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "file-upload-0-1",
"key": "file-upload-0-1",
"value": "primary",
@@ -181,31 +181,31 @@ page FileUploadDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "file-upload-0-2",
"key": "file-upload-0-2",
"value": "secondary",
@@ -234,30 +234,30 @@ page FileUploadDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-file-upload-variant"><span><strong>variant</strong><small>string</small></span><input id="playground-file-upload-variant" name="pg_variant" type="text" value="default" /></label><label class="playground-field" for="playground-file-upload-class"><span><strong>class</strong><small>string</small></span><input id="playground-file-upload-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -164,77 +164,77 @@ page FooterDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>8 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-footer-size"><span><strong>size</strong><small>string</small></span><select id="playground-footer-size" name="pg_size"><option value="default" selected>default</option><option value="compact">compact</option><option value="spacious">spacious</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-footer-color"><span><strong>color</strong><small>string</small></span><select id="playground-footer-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-footer-label"><span><strong>label</strong><small>string</small></span><input id="playground-footer-label" name="pg_label" type="text" value="Footer" /></label><label class="playground-field" for="playground-footer-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-footer-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"type": "header",
"label": "Product",
"description": "Build consistent interfaces with WRNexusJS.",
"items": [
{
&#123;
"label": "Components",
"href": "/base"
},
{
&#125;,
&#123;
"label": "Themes",
"href": "/themes"
},
{
&#125;,
&#123;
"label": "Examples",
"href": "/blocks"
}
&#125;
]
},
{
&#125;,
&#123;
"type": "header",
"label": "Developers",
"items": [
{
&#123;
"label": "Documentation",
"href": "/docs"
},
{
&#125;,
&#123;
"label": "Installation",
"href": "/installation"
},
{
&#125;,
&#123;
"label": "Framework guides",
"href": "/framework-guides"
}
&#125;
]
},
{
&#125;,
&#123;
"type": "header",
"label": "Resources",
"items": [
{
&#123;
"label": "Accessibility",
"href": "/accessibility"
},
{
&#125;,
&#123;
"label": "Design tokens",
"href": "/colors"
},
{
&#125;,
&#123;
"label": "Typography",
"href": "/fonts"
}
&#125;
]
},
{
&#125;,
&#123;
"type": "header",
"label": "Company",
"items": [
{
&#123;
"label": "WorkRoot",
"href": "https://workroot.in",
"external": true
},
{
&#125;,
&#123;
"label": "WRNexusJS",
"href": "https://wrnexusjs.dev",
"external": true
}
&#125;
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-footer-columns"><span><strong>columns</strong><small>number</small></span><input id="playground-footer-columns" name="pg_columns" type="number" value="4" /></label><label class="playground-field" for="playground-footer-maxWidth"><span><strong>max Width</strong><small>string</small></span><select id="playground-footer-maxWidth" name="pg_maxWidth"><option value="wide" selected>wide</option><option value="compact">compact</option><option value="xl">xl</option><option value="full">full</option><option value="lg">lg</option><option value="2xl">2xl</option></select></label><label class="playground-field" for="playground-footer-copyright"><span><strong>copyright</strong><small>string</small></span><input id="playground-footer-copyright" name="pg_copyright" type="text" value="" /></label><label class="playground-field" for="playground-footer-class"><span><strong>class</strong><small>string</small></span><input id="playground-footer-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -152,18 +152,18 @@ page HeroActionsDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>8 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-hero-actions-actions"><span><strong>actions</strong><small>unknown[]</small></span><textarea id="playground-hero-actions-actions" name="pg_actions" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"label": "Browse components",
"href": "#components",
"icon": "icon-[lucide--blocks]",
"variant": "primary"
},
{
&#125;,
&#123;
"label": "View metrics",
"href": "#metrics",
"icon": "icon-[lucide--chart-no-axes-column-increasing]",
"variant": "outline"
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-hero-actions-align"><span><strong>align</strong><small>string</small></span><select id="playground-hero-actions-align" name="pg_align"><option value="start" selected>start</option><option value="left">left</option><option value="center">center</option><option value="right">right</option><option value="end">end</option><option value="stretch">stretch</option></select></label><label class="playground-field" for="playground-hero-actions-orientation"><span><strong>orientation</strong><small>string</small></span><select id="playground-hero-actions-orientation" name="pg_orientation"><option value="horizontal" selected>horizontal</option><option value="vertical">vertical</option></select></label><label class="playground-toggle" for="playground-hero-actions-stackOnMobile"><span><strong>stack On Mobile</strong><small>boolean</small></span><input id="playground-hero-actions-stackOnMobile" name="pg_stackOnMobile" type="checkbox" value="true" checked data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-hero-actions-fullWidthMobile"><span><strong>full Width Mobile</strong><small>boolean</small></span><input id="playground-hero-actions-fullWidthMobile" name="pg_fullWidthMobile" type="checkbox" value="true" checked data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-hero-actions-size"><span><strong>size</strong><small>string</small></span><select id="playground-hero-actions-size" name="pg_size"><option value="default" selected>default</option><option value="sm">sm</option><option value="lg">lg</option><option value="xs">xs</option><option value="md">md</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-hero-actions-color"><span><strong>color</strong><small>string</small></span><select id="playground-hero-actions-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-hero-actions-class"><span><strong>class</strong><small>string</small></span><input id="playground-hero-actions-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
File diff suppressed because one or more lines are too long
@@ -152,7 +152,7 @@ page LegendIndicatorDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>7 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-legend-indicator-size"><span><strong>size</strong><small>string</small></span><select id="playground-legend-indicator-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-legend-indicator-color"><span><strong>color</strong><small>string</small></span><select id="playground-legend-indicator-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-legend-indicator-title"><span><strong>title</strong><small>string</small></span><input id="playground-legend-indicator-title" name="pg_title" type="text" value="Legend Indicator example" /></label><label class="playground-field" for="playground-legend-indicator-description"><span><strong>description</strong><small>string</small></span><input id="playground-legend-indicator-description" name="pg_description" type="text" value="A polished default legend indicator for a modern application." /></label><label class="playground-field" for="playground-legend-indicator-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-legend-indicator-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "legend-indicator-0-1",
"key": "legend-indicator-0-1",
"value": "primary",
@@ -181,31 +181,31 @@ page LegendIndicatorDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "legend-indicator-0-2",
"key": "legend-indicator-0-2",
"value": "secondary",
@@ -234,30 +234,30 @@ page LegendIndicatorDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-legend-indicator-variant"><span><strong>variant</strong><small>string</small></span><input id="playground-legend-indicator-variant" name="pg_variant" type="text" value="default" /></label><label class="playground-field" for="playground-legend-indicator-class"><span><strong>class</strong><small>string</small></span><input id="playground-legend-indicator-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -152,7 +152,7 @@ page ListGroupDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>7 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-list-group-size"><span><strong>size</strong><small>string</small></span><select id="playground-list-group-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-list-group-color"><span><strong>color</strong><small>string</small></span><select id="playground-list-group-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-list-group-title"><span><strong>title</strong><small>string</small></span><input id="playground-list-group-title" name="pg_title" type="text" value="List Group example" /></label><label class="playground-field" for="playground-list-group-description"><span><strong>description</strong><small>string</small></span><input id="playground-list-group-description" name="pg_description" type="text" value="A polished default list group for a modern application." /></label><label class="playground-field" for="playground-list-group-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-list-group-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "list-group-0-1",
"key": "list-group-0-1",
"value": "primary",
@@ -181,31 +181,31 @@ page ListGroupDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "list-group-0-2",
"key": "list-group-0-2",
"value": "secondary",
@@ -234,30 +234,30 @@ page ListGroupDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-list-group-variant"><span><strong>variant</strong><small>string</small></span><input id="playground-list-group-variant" name="pg_variant" type="text" value="default" /></label><label class="playground-field" for="playground-list-group-class"><span><strong>class</strong><small>string</small></span><input id="playground-list-group-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -152,7 +152,7 @@ page ListDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>7 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-list-size"><span><strong>size</strong><small>string</small></span><select id="playground-list-size" name="pg_size"><option value="default" selected>default</option><option value="sm">sm</option><option value="lg">lg</option><option value="xs">xs</option><option value="md">md</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-list-color"><span><strong>color</strong><small>string</small></span><select id="playground-list-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-list-title"><span><strong>title</strong><small>string</small></span><input id="playground-list-title" name="pg_title" type="text" value="List example" /></label><label class="playground-field" for="playground-list-description"><span><strong>description</strong><small>string</small></span><input id="playground-list-description" name="pg_description" type="text" value="A polished default list for a modern application." /></label><label class="playground-field" for="playground-list-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-list-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "list-0-1",
"key": "list-0-1",
"value": "primary",
@@ -181,31 +181,31 @@ page ListDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "list-0-2",
"key": "list-0-2",
"value": "secondary",
@@ -234,30 +234,30 @@ page ListDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-list-variant"><span><strong>variant</strong><small>string</small></span><select id="playground-list-variant" name="pg_variant"><option value="default" selected>default</option><option value="soft">soft</option><option value="raised">raised</option><option value="outline">outline</option></select></label><label class="playground-field" for="playground-list-class"><span><strong>class</strong><small>string</small></span><input id="playground-list-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -152,7 +152,7 @@ page MapDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>7 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-map-size"><span><strong>size</strong><small>string</small></span><select id="playground-map-size" name="pg_size"><option value="default" selected>default</option><option value="sm">sm</option><option value="lg">lg</option><option value="xs">xs</option><option value="md">md</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-map-color"><span><strong>color</strong><small>string</small></span><select id="playground-map-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-map-title"><span><strong>title</strong><small>string</small></span><input id="playground-map-title" name="pg_title" type="text" value="Map example" /></label><label class="playground-field" for="playground-map-description"><span><strong>description</strong><small>string</small></span><input id="playground-map-description" name="pg_description" type="text" value="A polished default map for a modern application." /></label><label class="playground-field" for="playground-map-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-map-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "map-0-1",
"key": "map-0-1",
"value": "primary",
@@ -181,31 +181,31 @@ page MapDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "map-0-2",
"key": "map-0-2",
"value": "secondary",
@@ -234,30 +234,30 @@ page MapDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-map-variant"><span><strong>variant</strong><small>string</small></span><select id="playground-map-variant" name="pg_variant"><option value="default" selected>default</option><option value="soft">soft</option><option value="raised">raised</option><option value="outline">outline</option></select></label><label class="playground-field" for="playground-map-class"><span><strong>class</strong><small>string</small></span><input id="playground-map-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -152,7 +152,7 @@ page MarqueeDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>7 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-marquee-size"><span><strong>size</strong><small>string</small></span><select id="playground-marquee-size" name="pg_size"><option value="default" selected>default</option><option value="sm">sm</option><option value="lg">lg</option><option value="xs">xs</option><option value="md">md</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-marquee-color"><span><strong>color</strong><small>string</small></span><select id="playground-marquee-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-marquee-title"><span><strong>title</strong><small>string</small></span><input id="playground-marquee-title" name="pg_title" type="text" value="Marquee example" /></label><label class="playground-field" for="playground-marquee-description"><span><strong>description</strong><small>string</small></span><input id="playground-marquee-description" name="pg_description" type="text" value="A polished default marquee for a modern application." /></label><label class="playground-field" for="playground-marquee-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-marquee-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "marquee-0-1",
"key": "marquee-0-1",
"value": "primary",
@@ -181,31 +181,31 @@ page MarqueeDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "marquee-0-2",
"key": "marquee-0-2",
"value": "secondary",
@@ -234,30 +234,30 @@ page MarqueeDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-marquee-variant"><span><strong>variant</strong><small>string</small></span><select id="playground-marquee-variant" name="pg_variant"><option value="default" selected>default</option><option value="soft">soft</option><option value="raised">raised</option><option value="outline">outline</option></select></label><label class="playground-field" for="playground-marquee-class"><span><strong>class</strong><small>string</small></span><input id="playground-marquee-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -152,7 +152,7 @@ page MegaMenuDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>8 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-mega-menu-color"><span><strong>color</strong><small>string</small></span><select id="playground-mega-menu-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-mega-menu-size"><span><strong>size</strong><small>string</small></span><select id="playground-mega-menu-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-mega-menu-label"><span><strong>label</strong><small>string</small></span><input id="playground-mega-menu-label" name="pg_label" type="text" value="Mega Menu" /></label><label class="playground-field" for="playground-mega-menu-icon"><span><strong>icon</strong><small>string</small></span><input id="playground-mega-menu-icon" name="pg_icon" type="text" value="" /></label><label class="playground-field" for="playground-mega-menu-columns"><span><strong>columns</strong><small>unknown[]</small></span><textarea id="playground-mega-menu-columns" name="pg_columns" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "mega-menu-0-1",
"key": "mega-menu-0-1",
"value": "primary",
@@ -181,31 +181,31 @@ page MegaMenuDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "mega-menu-0-2",
"key": "mega-menu-0-2",
"value": "secondary",
@@ -234,30 +234,30 @@ page MegaMenuDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-mega-menu-footer"><span><strong>footer</strong><small>string</small></span><input id="playground-mega-menu-footer" name="pg_footer" type="text" value="" /></label><label class="playground-toggle" for="playground-mega-menu-defaultOpen"><span><strong>default Open</strong><small>boolean</small></span><input id="playground-mega-menu-defaultOpen" name="pg_defaultOpen" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-mega-menu-class"><span><strong>class</strong><small>string</small></span><input id="playground-mega-menu-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -156,7 +156,7 @@ page MetricGridDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>13 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-metric-grid-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-metric-grid-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"label": "Public services",
"value": "24",
"description": "Citizen-facing services available online.",
@@ -165,8 +165,8 @@ page MetricGridDetail {
"trendLabel": "this release",
"trendDirection": "up",
"color": "primary"
},
{
&#125;,
&#123;
"label": "Police stations",
"value": "126",
"description": "Searchable station and jurisdiction entries.",
@@ -174,8 +174,8 @@ page MetricGridDetail {
"trend": "Updated",
"trendLabel": "today",
"color": "info"
},
{
&#125;,
&#123;
"label": "Availability",
"value": "99.9",
"suffix": "%",
@@ -185,7 +185,7 @@ page MetricGridDetail {
"trendLabel": "30 days",
"trendDirection": "positive",
"color": "success"
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-metric-grid-columns"><span><strong>columns</strong><small>number</small></span><input id="playground-metric-grid-columns" name="pg_columns" type="number" value="3" /></label><label class="playground-field" for="playground-metric-grid-tabletColumns"><span><strong>tablet Columns</strong><small>number</small></span><input id="playground-metric-grid-tabletColumns" name="pg_tabletColumns" type="number" value="2" /></label><label class="playground-field" for="playground-metric-grid-mobileColumns"><span><strong>mobile Columns</strong><small>number</small></span><input id="playground-metric-grid-mobileColumns" name="pg_mobileColumns" type="number" value="1" /></label><label class="playground-field" for="playground-metric-grid-gap"><span><strong>gap</strong><small>string</small></span><select id="playground-metric-grid-gap" name="pg_gap"><option value="md" selected>md</option><option value="none">none</option><option value="sm">sm</option><option value="lg">lg</option><option value="xl">xl</option><option value="xs">xs</option><option value="2xl">2xl</option></select></label><label class="playground-toggle" for="playground-metric-grid-equalHeight"><span><strong>equal Height</strong><small>boolean</small></span><input id="playground-metric-grid-equalHeight" name="pg_equalHeight" type="checkbox" value="true" checked data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-metric-grid-dividers"><span><strong>dividers</strong><small>boolean</small></span><input id="playground-metric-grid-dividers" name="pg_dividers" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-metric-grid-size"><span><strong>size</strong><small>string</small></span><select id="playground-metric-grid-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-metric-grid-color"><span><strong>color</strong><small>string</small></span><select id="playground-metric-grid-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-metric-grid-variant"><span><strong>variant</strong><small>string</small></span><select id="playground-metric-grid-variant" name="pg_variant"><option value="default" selected>default</option><option value="panel">panel</option><option value="soft">soft</option></select></label><label class="playground-field" for="playground-metric-grid-maxWidth"><span><strong>max Width</strong><small>string</small></span><select id="playground-metric-grid-maxWidth" name="pg_maxWidth"><option value="full" selected>full</option><option value="compact">compact</option><option value="lg">lg</option><option value="xl">xl</option><option value="wide">wide</option><option value="2xl">2xl</option></select></label><label class="playground-field" for="playground-metric-grid-minItemWidth"><span><strong>min Item Width</strong><small>string</small></span><input id="playground-metric-grid-minItemWidth" name="pg_minItemWidth" type="text" value="" /></label><label class="playground-field" for="playground-metric-grid-class"><span><strong>class</strong><small>string</small></span><input id="playground-metric-grid-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -154,7 +154,7 @@ page NavDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>9 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-nav-color"><span><strong>color</strong><small>string</small></span><select id="playground-nav-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-nav-size"><span><strong>size</strong><small>string</small></span><select id="playground-nav-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-nav-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-nav-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "nav-0-1",
"key": "nav-0-1",
"value": "primary",
@@ -183,31 +183,31 @@ page NavDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "nav-0-2",
"key": "nav-0-2",
"value": "secondary",
@@ -236,30 +236,30 @@ page NavDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-nav-active"><span><strong>active</strong><small>string</small></span><input id="playground-nav-active" name="pg_active" type="text" value="" /></label><label class="playground-field" for="playground-nav-orientation"><span><strong>orientation</strong><small>string</small></span><select id="playground-nav-orientation" name="pg_orientation"><option value="horizontal" selected>horizontal</option><option value="vertical">vertical</option></select></label><label class="playground-field" for="playground-nav-label"><span><strong>label</strong><small>string</small></span><input id="playground-nav-label" name="pg_label" type="text" value="Nav" /></label><label class="playground-toggle" for="playground-nav-collapsible"><span><strong>collapsible</strong><small>boolean</small></span><input id="playground-nav-collapsible" name="pg_collapsible" type="checkbox" value="true" checked data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-nav-toggleLabel"><span><strong>toggle Label</strong><small>string</small></span><input id="playground-nav-toggleLabel" name="pg_toggleLabel" type="text" value="Nav" /></label><label class="playground-field" for="playground-nav-class"><span><strong>class</strong><small>string</small></span><input id="playground-nav-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
File diff suppressed because it is too large Load Diff
@@ -183,19 +183,19 @@ page PageHeaderDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>25 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-page-header-eyebrow"><span><strong>eyebrow</strong><small>string</small></span><input id="playground-page-header-eyebrow" name="pg_eyebrow" type="text" value="" /></label><label class="playground-field" for="playground-page-header-title"><span><strong>title</strong><small>string</small></span><input id="playground-page-header-title" name="pg_title" type="text" value="Page Header example" /></label><label class="playground-field" for="playground-page-header-description"><span><strong>description</strong><small>string</small></span><input id="playground-page-header-description" name="pg_description" type="text" value="A polished default page header for a modern application." /></label><label class="playground-field" for="playground-page-header-icon"><span><strong>icon</strong><small>string</small></span><input id="playground-page-header-icon" name="pg_icon" type="text" value="" /></label><label class="playground-field" for="playground-page-header-id"><span><strong>id</strong><small>string</small></span><input id="playground-page-header-id" name="pg_id" type="text" value="page-title" /></label><label class="playground-field" for="playground-page-header-align"><span><strong>align</strong><small>string</small></span><select id="playground-page-header-align" name="pg_align"><option value="start" selected>start</option><option value="left">left</option><option value="center">center</option><option value="right">right</option><option value="end">end</option><option value="stretch">stretch</option></select></label><label class="playground-toggle" for="playground-page-header-centered"><span><strong>centered</strong><small>boolean</small></span><input id="playground-page-header-centered" name="pg_centered" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-page-header-compact"><span><strong>compact</strong><small>boolean</small></span><input id="playground-page-header-compact" name="pg_compact" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-page-header-size"><span><strong>size</strong><small>string</small></span><select id="playground-page-header-size" name="pg_size"><option value="default" selected>default</option><option value="small">small</option><option value="large">large</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-page-header-maxWidth"><span><strong>max Width</strong><small>string</small></span><select id="playground-page-header-maxWidth" name="pg_maxWidth"><option value="full" selected>full</option><option value="xl">xl</option><option value="compact">compact</option><option value="lg">lg</option><option value="wide">wide</option><option value="2xl">2xl</option></select></label><label class="playground-toggle" for="playground-page-header-showBreadcrumbs"><span><strong>show Breadcrumbs</strong><small>boolean</small></span><input id="playground-page-header-showBreadcrumbs" name="pg_showBreadcrumbs" type="checkbox" value="true" checked data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-page-header-breadcrumbs"><span><strong>breadcrumbs</strong><small>unknown[]</small></span><textarea id="playground-page-header-breadcrumbs" name="pg_breadcrumbs" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"label": "Home",
"href": "/",
"icon": "icon-[lucide--house]"
},
{
&#125;,
&#123;
"label": "Components",
"href": "/base"
},
{
&#125;,
&#123;
"label": "Page header",
"current": true
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-page-header-breadcrumbParent"><span><strong>breadcrumb Parent</strong><small>string</small></span><input id="playground-page-header-breadcrumbParent" name="pg_breadcrumbParent" type="text" value="" /></label><label class="playground-field" for="playground-page-header-breadcrumbParentHref"><span><strong>breadcrumb Parent Href</strong><small>string</small></span><input id="playground-page-header-breadcrumbParentHref" name="pg_breadcrumbParentHref" type="text" value="#page-header-demo" /></label><label class="playground-field" for="playground-page-header-breadcrumbCurrent"><span><strong>breadcrumb Current</strong><small>string</small></span><input id="playground-page-header-breadcrumbCurrent" name="pg_breadcrumbCurrent" type="text" value="" /></label><label class="playground-field" for="playground-page-header-primaryLabel"><span><strong>primary Label</strong><small>string</small></span><input id="playground-page-header-primaryLabel" name="pg_primaryLabel" type="text" value="Page Header" /></label><label class="playground-field" for="playground-page-header-primaryHref"><span><strong>primary Href</strong><small>string</small></span><input id="playground-page-header-primaryHref" name="pg_primaryHref" type="text" value="#page-header-demo" /></label><label class="playground-field" for="playground-page-header-primaryIcon"><span><strong>primary Icon</strong><small>string</small></span><input id="playground-page-header-primaryIcon" name="pg_primaryIcon" type="text" value="" /></label><label class="playground-field" for="playground-page-header-secondaryLabel"><span><strong>secondary Label</strong><small>string</small></span><input id="playground-page-header-secondaryLabel" name="pg_secondaryLabel" type="text" value="Page Header" /></label><label class="playground-field" for="playground-page-header-secondaryHref"><span><strong>secondary Href</strong><small>string</small></span><input id="playground-page-header-secondaryHref" name="pg_secondaryHref" type="text" value="#page-header-demo" /></label><label class="playground-field" for="playground-page-header-secondaryIcon"><span><strong>secondary Icon</strong><small>string</small></span><input id="playground-page-header-secondaryIcon" name="pg_secondaryIcon" type="text" value="" /></label><label class="playground-field" for="playground-page-header-color"><span><strong>color</strong><small>string</small></span><select id="playground-page-header-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="info">info</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option></select></label><label class="playground-field" for="playground-page-header-variant"><span><strong>variant</strong><small>string</small></span><select id="playground-page-header-variant" name="pg_variant"><option value="default" selected>default</option><option value="minimal">minimal</option><option value="soft">soft</option><option value="raised">raised</option><option value="tinted">tinted</option><option value="solid">solid</option></select></label><label class="playground-toggle" for="playground-page-header-borderBottom"><span><strong>border Bottom</strong><small>boolean</small></span><input id="playground-page-header-borderBottom" name="pg_borderBottom" type="checkbox" value="true" checked data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-page-header-class"><span><strong>class</strong><small>string</small></span><input id="playground-page-header-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -487,7 +487,7 @@ page PortalDashboardDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>14 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-portal-dashboard-size"><span><strong>size</strong><small>string</small></span><select id="playground-portal-dashboard-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-portal-dashboard-color"><span><strong>color</strong><small>string</small></span><select id="playground-portal-dashboard-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-portal-dashboard-eyebrow"><span><strong>eyebrow</strong><small>string</small></span><input id="playground-portal-dashboard-eyebrow" name="pg_eyebrow" type="text" value="Overview" /></label><label class="playground-field" for="playground-portal-dashboard-eyebrowKey"><span><strong>eyebrow Key</strong><small>string</small></span><input id="playground-portal-dashboard-eyebrowKey" name="pg_eyebrowKey" type="text" value="" /></label><label class="playground-field" for="playground-portal-dashboard-title"><span><strong>title</strong><small>string</small></span><input id="playground-portal-dashboard-title" name="pg_title" type="text" value="Portal Dashboard example" /></label><label class="playground-field" for="playground-portal-dashboard-titleKey"><span><strong>title Key</strong><small>string</small></span><input id="playground-portal-dashboard-titleKey" name="pg_titleKey" type="text" value="" /></label><label class="playground-field" for="playground-portal-dashboard-description"><span><strong>description</strong><small>string</small></span><input id="playground-portal-dashboard-description" name="pg_description" type="text" value="A polished default portal dashboard for a modern application." /></label><label class="playground-field" for="playground-portal-dashboard-descriptionKey"><span><strong>description Key</strong><small>string</small></span><input id="playground-portal-dashboard-descriptionKey" name="pg_descriptionKey" type="text" value="A polished default portal dashboard for a modern application." /></label><label class="playground-field" for="playground-portal-dashboard-userName"><span><strong>user Name</strong><small>string</small></span><input id="playground-portal-dashboard-userName" name="pg_userName" type="text" value="" /></label><label class="playground-field" for="playground-portal-dashboard-metrics"><span><strong>metrics</strong><small>unknown[]</small></span><textarea id="playground-portal-dashboard-metrics" name="pg_metrics" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "portal-dashboard-0-1",
"key": "portal-dashboard-0-1",
"value": "primary",
@@ -516,31 +516,31 @@ page PortalDashboardDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "portal-dashboard-0-2",
"key": "portal-dashboard-0-2",
"value": "secondary",
@@ -569,32 +569,32 @@ page PortalDashboardDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-portal-dashboard-actions"><span><strong>actions</strong><small>unknown[]</small></span><textarea id="playground-portal-dashboard-actions" name="pg_actions" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "portal-dashboard-0-1",
"key": "portal-dashboard-0-1",
"value": "primary",
@@ -623,31 +623,31 @@ page PortalDashboardDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "portal-dashboard-0-2",
"key": "portal-dashboard-0-2",
"value": "secondary",
@@ -676,32 +676,32 @@ page PortalDashboardDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-portal-dashboard-updates"><span><strong>updates</strong><small>unknown[]</small></span><textarea id="playground-portal-dashboard-updates" name="pg_updates" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "portal-dashboard-0-1",
"key": "portal-dashboard-0-1",
"value": "primary",
@@ -730,31 +730,31 @@ page PortalDashboardDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "portal-dashboard-0-2",
"key": "portal-dashboard-0-2",
"value": "secondary",
@@ -783,32 +783,32 @@ page PortalDashboardDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-portal-dashboard-tasks"><span><strong>tasks</strong><small>unknown[]</small></span><textarea id="playground-portal-dashboard-tasks" name="pg_tasks" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "portal-dashboard-0-1",
"key": "portal-dashboard-0-1",
"value": "primary",
@@ -837,31 +837,31 @@ page PortalDashboardDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "portal-dashboard-0-2",
"key": "portal-dashboard-0-2",
"value": "secondary",
@@ -890,30 +890,30 @@ page PortalDashboardDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-portal-dashboard-class"><span><strong>class</strong><small>string</small></span><input id="playground-portal-dashboard-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -170,7 +170,7 @@ page RadioDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>25 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-radio-size"><span><strong>size</strong><small>string</small></span><select id="playground-radio-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-radio-color"><span><strong>color</strong><small>string</small></span><select id="playground-radio-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-radio-id"><span><strong>id</strong><small>string</small></span><input id="playground-radio-id" name="pg_id" type="text" value="" /></label><label class="playground-field" for="playground-radio-name"><span><strong>name</strong><small>string</small></span><input id="playground-radio-name" name="pg_name" type="text" value="" /></label><label class="playground-field" for="playground-radio-label"><span><strong>label</strong><small>string</small></span><input id="playground-radio-label" name="pg_label" type="text" value="Radio" /></label><label class="playground-toggle" for="playground-radio-hiddenLabel"><span><strong>hidden Label</strong><small>boolean</small></span><input id="playground-radio-hiddenLabel" name="pg_hiddenLabel" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-radio-placeholder"><span><strong>placeholder</strong><small>string</small></span><input id="playground-radio-placeholder" name="pg_placeholder" type="text" value="Enter a sample value" /></label><label class="playground-field" for="playground-radio-variant"><span><strong>variant</strong><small>string</small></span><input id="playground-radio-variant" name="pg_variant" type="text" value="normal" /></label><label class="playground-field" for="playground-radio-icon"><span><strong>icon</strong><small>string</small></span><input id="playground-radio-icon" name="pg_icon" type="text" value="" /></label><label class="playground-field" for="playground-radio-iconPosition"><span><strong>icon Position</strong><small>string</small></span><select id="playground-radio-iconPosition" name="pg_iconPosition"><option value="start" selected>start</option><option value="end">end</option><option value="left">left</option><option value="right">right</option></select></label><label class="playground-field" for="playground-radio-value"><span><strong>value</strong><small>string</small></span><input id="playground-radio-value" name="pg_value" type="text" value="sample-1" /></label><label class="playground-field" for="playground-radio-options"><span><strong>options</strong><small>unknown[]</small></span><textarea id="playground-radio-options" name="pg_options" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "radio-0-1",
"key": "radio-0-1",
"value": "primary",
@@ -199,31 +199,31 @@ page RadioDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "radio-0-2",
"key": "radio-0-2",
"value": "secondary",
@@ -252,30 +252,30 @@ page RadioDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-toggle" for="playground-radio-checked"><span><strong>checked</strong><small>boolean</small></span><input id="playground-radio-checked" name="pg_checked" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-radio-orientation"><span><strong>orientation</strong><small>string</small></span><select id="playground-radio-orientation" name="pg_orientation"><option value="vertical" selected>vertical</option><option value="horizontal">horizontal</option></select></label><label class="playground-toggle" for="playground-radio-card"><span><strong>card</strong><small>boolean</small></span><input id="playground-radio-card" name="pg_card" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-radio-rightAligned"><span><strong>right Aligned</strong><small>boolean</small></span><input id="playground-radio-rightAligned" name="pg_rightAligned" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-radio-list"><span><strong>list</strong><small>boolean</small></span><input id="playground-radio-list" name="pg_list" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-radio-helperText"><span><strong>helper Text</strong><small>string</small></span><input id="playground-radio-helperText" name="pg_helperText" type="text" value="" /></label><label class="playground-field" for="playground-radio-cornerHint"><span><strong>corner Hint</strong><small>string</small></span><input id="playground-radio-cornerHint" name="pg_cornerHint" type="text" value="" /></label><label class="playground-field" for="playground-radio-error"><span><strong>error</strong><small>string</small></span><input id="playground-radio-error" name="pg_error" type="text" value="" /></label><label class="playground-toggle" for="playground-radio-inline"><span><strong>inline</strong><small>boolean</small></span><input id="playground-radio-inline" name="pg_inline" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-radio-readonly"><span><strong>readonly</strong><small>boolean</small></span><input id="playground-radio-readonly" name="pg_readonly" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-radio-disabled"><span><strong>disabled</strong><small>boolean</small></span><input id="playground-radio-disabled" name="pg_disabled" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-radio-required"><span><strong>required</strong><small>boolean</small></span><input id="playground-radio-required" name="pg_required" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-radio-class"><span><strong>class</strong><small>string</small></span><input id="playground-radio-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
File diff suppressed because one or more lines are too long
@@ -152,7 +152,7 @@ page RatingDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>7 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-rating-size"><span><strong>size</strong><small>string</small></span><select id="playground-rating-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-rating-color"><span><strong>color</strong><small>string</small></span><select id="playground-rating-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-rating-title"><span><strong>title</strong><small>string</small></span><input id="playground-rating-title" name="pg_title" type="text" value="Rating example" /></label><label class="playground-field" for="playground-rating-description"><span><strong>description</strong><small>string</small></span><input id="playground-rating-description" name="pg_description" type="text" value="A polished default rating for a modern application." /></label><label class="playground-field" for="playground-rating-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-rating-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "rating-0-1",
"key": "rating-0-1",
"value": "primary",
@@ -181,31 +181,31 @@ page RatingDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "rating-0-2",
"key": "rating-0-2",
"value": "secondary",
@@ -234,30 +234,30 @@ page RatingDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-rating-variant"><span><strong>variant</strong><small>string</small></span><input id="playground-rating-variant" name="pg_variant" type="text" value="default" /></label><label class="playground-field" for="playground-rating-class"><span><strong>class</strong><small>string</small></span><input id="playground-rating-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -151,7 +151,7 @@ page ScrollspyDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>7 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-scrollspy-color"><span><strong>color</strong><small>string</small></span><select id="playground-scrollspy-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-scrollspy-size"><span><strong>size</strong><small>string</small></span><select id="playground-scrollspy-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-scrollspy-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-scrollspy-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "scrollspy-0-1",
"key": "scrollspy-0-1",
"value": "primary",
@@ -180,31 +180,31 @@ page ScrollspyDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "scrollspy-0-2",
"key": "scrollspy-0-2",
"value": "secondary",
@@ -233,30 +233,30 @@ page ScrollspyDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-scrollspy-active"><span><strong>active</strong><small>string</small></span><input id="playground-scrollspy-active" name="pg_active" type="text" value="" /></label><label class="playground-field" for="playground-scrollspy-label"><span><strong>label</strong><small>string</small></span><input id="playground-scrollspy-label" name="pg_label" type="text" value="Scrollspy" /></label><label class="playground-field" for="playground-scrollspy-heading"><span><strong>heading</strong><small>string</small></span><input id="playground-scrollspy-heading" name="pg_heading" type="text" value="" /></label><label class="playground-field" for="playground-scrollspy-class"><span><strong>class</strong><small>string</small></span><input id="playground-scrollspy-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -266,16 +266,16 @@ page ScrollspyDetail {
<section class="detail-section"><div class="detail-section-heading"><span>Live examples</span><h2>Designed for real product surfaces</h2><p>Compare configurations and resize the browser to check responsive behavior.</p></div><div class="demo-list">
<article class="demo-case">
<header class="demo-case-header">
<div><span class="demo-case-eyebrow">Recommended</span><h2>Table of contents</h2><p>Each href points at an element on the page. The runtime observes those elements and moves aria-current to the link for whichever one is in view, so the marker follows the reader without any component state.</p></div>
<div><span class="demo-case-eyebrow">Recommended</span><h2>Follows the reader</h2><p>Scroll the page and the marker moves to whichever section is in view. The sections below are real page content, because the runtime observes against the viewport -- a table of contents inside a small scrolling box would have nothing to react to.</p></div>
<span class="demo-case-number">01</span>
</header>
<div class="demo-workbench">
<div id="scrollspy-demo-1" class="demo-canvas demo-canvas--1">
<div class="demo-browser-chrome"><span></span><span></span><span></span><small>Live preview</small></div>
<div class="demo-render"><Scrollspy size="default" items='[{"label":"Overview","href":"#overview"},{"label":"Installation","href":"#installation"},{"label":"Usage","href":"#usage"},{"label":"API","href":"#api"}]' active="#overview" label="Scrollspy" heading="On this page" class="showcase-instance showcase-instance--1" /></div>
<div class="demo-render"><div class="showcase-spy-doc"><section id="overview" class="showcase-spy-section"><h3>Overview</h3><p>Scroll this page and watch the marker in the list move. The runtime observes these sections against the viewport, so the current link follows whatever you are reading.</p></section><section id="installation" class="showcase-spy-section"><h3>Installation</h3><p>Each link points at one of these ids. Nothing is wired up by hand -- the component only renders the links, and the runtime moves aria-current.</p></section><section id="usage" class="showcase-spy-section"><h3>Usage</h3><p>The active link is marked with aria-current="location", which is what a screen reader announces, and styled through data-active.</p></section><section id="api" class="showcase-spy-section"><h3>API</h3><p>Clicking a link jumps to its section and marks it immediately, so the control responds even before the scroll settles.</p></section></div><Scrollspy size="default" items='[{"label":"Overview","href":"#overview"},{"label":"Installation","href":"#installation"},{"label":"Usage","href":"#usage"},{"label":"API","href":"#api"}]' active="#overview" label="Scrollspy" heading="On this page" class="showcase-instance showcase-instance--1" /></div>
</div>
<section class="demo-code" aria-label="Table of contents usage">
<section class="demo-code" aria-label="Follows the reader usage">
<header><span><span class="icon-[lucide--code-2] size-4" aria-hidden="true"></span>Component usage</span><small>.wrn</small></header>
<pre><code>&lt;Scrollspy
items='[
@@ -312,7 +312,7 @@ page ScrollspyDetail {
<div id="scrollspy-demo-2" class="demo-canvas demo-canvas--2">
<div class="demo-browser-chrome"><span></span><span></span><span></span><small>Live preview</small></div>
<div class="demo-render"><Scrollspy size="sm" items='[{"label":"Getting started","href":"#getting-started"},{"label":"Configuration","href":"#configuration"},{"label":"Troubleshooting","href":"#troubleshooting"}]' active="#configuration" label="Compact example" heading="Sections" class="showcase-instance showcase-instance--2" /></div>
<div class="demo-render"><Scrollspy size="sm" items='[{"label":"Overview","href":"#overview"},{"label":"Installation","href":"#installation"},{"label":"Usage","href":"#usage"}]' active="#installation" label="Compact example" heading="Sections" class="showcase-instance showcase-instance--2" /></div>
</div>
<section class="demo-code" aria-label="Compact rail usage">
<header><span><span class="icon-[lucide--code-2] size-4" aria-hidden="true"></span>Component usage</span><small>.wrn</small></header>
@@ -320,19 +320,19 @@ page ScrollspyDetail {
size="sm"
items='[
<span>&#123;</span>
"label": "Getting started",
"href": "#getting-started"
"label": "Overview",
"href": "#overview"
<span>&#125;</span>,
<span>&#123;</span>
"label": "Configuration",
"href": "#configuration"
"label": "Installation",
"href": "#installation"
<span>&#125;</span>,
<span>&#123;</span>
"label": "Troubleshooting",
"href": "#troubleshooting"
"label": "Usage",
"href": "#usage"
<span>&#125;</span>
]'
active="#configuration"
active="#installation"
label="Compact example"
heading="Sections"
/&gt;</code></pre>
@@ -351,7 +351,7 @@ if (component) registerOutputHandler(component, "change", (payload) =&gt; <span>
<section id="api" class="detail-section"><div class="detail-section-heading"><span>Component API</span><h2>Props and configuration</h2><p>All content and behavior shown above is supplied through these props and slots.</p></div><div class="docs-table-wrap"><table class="docs-table"><thead><tr><th>Prop</th><th>Type</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td><code>color</code></td><td>string</td><td><code>"primary"</code></td><td>No</td></tr><tr><td><code>size</code></td><td>string</td><td><code>"default"</code></td><td>No</td></tr><tr><td><code>items</code></td><td>unknown[]</td><td><code>[]</code></td><td>No</td></tr><tr><td><code>active</code></td><td>string</td><td><code>""</code></td><td>No</td></tr><tr><td><code>label</code></td><td>string</td><td><code>"On this page"</code></td><td>No</td></tr><tr><td><code>heading</code></td><td>string</td><td><code>""</code></td><td>No</td></tr><tr><td><code>class</code></td><td>string</td><td><code>""</code></td><td>No</td></tr></tbody></table></div></section>
</main>
<aside class="detail-aside">
<div class="detail-toc"><strong>On this page</strong><a href="#playground">Playground</a><a href="#scrollspy-demo-1">Table of contents</a><a href="#scrollspy-demo-2">Compact rail</a><a href="#events">Outputs</a><a href="#api">Props API</a></div>
<div class="detail-toc"><strong>On this page</strong><a href="#playground">Playground</a><a href="#scrollspy-demo-1">Follows the reader</a><a href="#scrollspy-demo-2">Compact rail</a><a href="#events">Outputs</a><a href="#api">Props API</a></div>
</aside>
</div>
<nav class="detail-pagination">
@@ -275,7 +275,7 @@ page SelectDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>22 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-select-size"><span><strong>size</strong><small>string</small></span><select id="playground-select-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-select-color"><span><strong>color</strong><small>string</small></span><select id="playground-select-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-select-id"><span><strong>id</strong><small>string</small></span><input id="playground-select-id" name="pg_id" type="text" value="" /></label><label class="playground-field" for="playground-select-name"><span><strong>name</strong><small>string</small></span><input id="playground-select-name" name="pg_name" type="text" value="" /></label><label class="playground-field" for="playground-select-label"><span><strong>label</strong><small>string</small></span><input id="playground-select-label" name="pg_label" type="text" value="Select" /></label><label class="playground-toggle" for="playground-select-hiddenLabel"><span><strong>hidden Label</strong><small>boolean</small></span><input id="playground-select-hiddenLabel" name="pg_hiddenLabel" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-select-value"><span><strong>value</strong><small>string</small></span><input id="playground-select-value" name="pg_value" type="text" value="sample-1" /></label><label class="playground-field" for="playground-select-values"><span><strong>values</strong><small>unknown[]</small></span><textarea id="playground-select-values" name="pg_values" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "select-0-1",
"key": "select-0-1",
"value": "primary",
@@ -304,31 +304,31 @@ page SelectDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "select-0-2",
"key": "select-0-2",
"value": "secondary",
@@ -357,32 +357,32 @@ page SelectDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-select-options"><span><strong>options</strong><small>unknown[]</small></span><textarea id="playground-select-options" name="pg_options" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "select-0-1",
"key": "select-0-1",
"value": "primary",
@@ -411,31 +411,31 @@ page SelectDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "select-0-2",
"key": "select-0-2",
"value": "secondary",
@@ -464,30 +464,30 @@ page SelectDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-select-placeholder"><span><strong>placeholder</strong><small>string</small></span><input id="playground-select-placeholder" name="pg_placeholder" type="text" value="Enter a sample value" /></label><label class="playground-field" for="playground-select-variant"><span><strong>variant</strong><small>string</small></span><input id="playground-select-variant" name="pg_variant" type="text" value="normal" /></label><label class="playground-field" for="playground-select-icon"><span><strong>icon</strong><small>string</small></span><input id="playground-select-icon" name="pg_icon" type="text" value="" /></label><label class="playground-field" for="playground-select-iconPosition"><span><strong>icon Position</strong><small>string</small></span><select id="playground-select-iconPosition" name="pg_iconPosition"><option value="start" selected>start</option><option value="end">end</option><option value="left">left</option><option value="right">right</option></select></label><label class="playground-field" for="playground-select-helperText"><span><strong>helper Text</strong><small>string</small></span><input id="playground-select-helperText" name="pg_helperText" type="text" value="" /></label><label class="playground-field" for="playground-select-cornerHint"><span><strong>corner Hint</strong><small>string</small></span><input id="playground-select-cornerHint" name="pg_cornerHint" type="text" value="" /></label><label class="playground-field" for="playground-select-error"><span><strong>error</strong><small>string</small></span><input id="playground-select-error" name="pg_error" type="text" value="" /></label><label class="playground-toggle" for="playground-select-inline"><span><strong>inline</strong><small>boolean</small></span><input id="playground-select-inline" name="pg_inline" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-select-multiple"><span><strong>multiple</strong><small>boolean</small></span><input id="playground-select-multiple" name="pg_multiple" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-select-readonly"><span><strong>readonly</strong><small>boolean</small></span><input id="playground-select-readonly" name="pg_readonly" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-select-disabled"><span><strong>disabled</strong><small>boolean</small></span><input id="playground-select-disabled" name="pg_disabled" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-select-required"><span><strong>required</strong><small>boolean</small></span><input id="playground-select-required" name="pg_required" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-select-class"><span><strong>class</strong><small>string</small></span><input id="playground-select-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -156,7 +156,7 @@ page SidebarDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>8 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-sidebar-color"><span><strong>color</strong><small>string</small></span><select id="playground-sidebar-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-sidebar-size"><span><strong>size</strong><small>string</small></span><select id="playground-sidebar-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-sidebar-label"><span><strong>label</strong><small>string</small></span><input id="playground-sidebar-label" name="pg_label" type="text" value="Sidebar" /></label><label class="playground-field" for="playground-sidebar-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-sidebar-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "sidebar-0-1",
"key": "sidebar-0-1",
"value": "primary",
@@ -185,31 +185,31 @@ page SidebarDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "sidebar-0-2",
"key": "sidebar-0-2",
"value": "secondary",
@@ -238,30 +238,30 @@ page SidebarDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-sidebar-active"><span><strong>active</strong><small>string</small></span><input id="playground-sidebar-active" name="pg_active" type="text" value="" /></label><label class="playground-field" for="playground-sidebar-mobileLabel"><span><strong>mobile Label</strong><small>string</small></span><input id="playground-sidebar-mobileLabel" name="pg_mobileLabel" type="text" value="Sidebar" /></label><label class="playground-field" for="playground-sidebar-drawerTitle"><span><strong>drawer Title</strong><small>string</small></span><input id="playground-sidebar-drawerTitle" name="pg_drawerTitle" type="text" value="Sidebar example" /></label><label class="playground-field" for="playground-sidebar-class"><span><strong>class</strong><small>string</small></span><input id="playground-sidebar-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
File diff suppressed because one or more lines are too long
@@ -154,34 +154,34 @@ page StatsBarDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>10 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-stats-bar-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-stats-bar-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"label": "Composite components",
"value": "18",
"description": "Reusable public-page building blocks",
"icon": "icon-[lucide--blocks]",
"color": "primary"
},
{
&#125;,
&#123;
"label": "Rendering",
"value": "SSR",
"description": "Server-first WRNexusJS rendering",
"icon": "icon-[lucide--server]",
"color": "info"
},
{
&#125;,
&#123;
"label": "Responsive",
"value": "Yes",
"description": "Mobile, tablet, and desktop layouts",
"icon": "icon-[lucide--monitor-smartphone]",
"color": "success"
},
{
&#125;,
&#123;
"label": "Theme aware",
"value": "Yes",
"description": "Active theme and accent palettes",
"icon": "icon-[lucide--palette]",
"color": "warning"
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-stats-bar-columns"><span><strong>columns</strong><small>number</small></span><input id="playground-stats-bar-columns" name="pg_columns" type="number" value="4" /></label><label class="playground-toggle" for="playground-stats-bar-compact"><span><strong>compact</strong><small>boolean</small></span><input id="playground-stats-bar-compact" name="pg_compact" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-stats-bar-dividers"><span><strong>dividers</strong><small>boolean</small></span><input id="playground-stats-bar-dividers" name="pg_dividers" type="checkbox" value="true" checked data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-stats-bar-icons"><span><strong>icons</strong><small>boolean</small></span><input id="playground-stats-bar-icons" name="pg_icons" type="checkbox" value="true" checked data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-stats-bar-size"><span><strong>size</strong><small>string</small></span><select id="playground-stats-bar-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-stats-bar-color"><span><strong>color</strong><small>string</small></span><select id="playground-stats-bar-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-stats-bar-variant"><span><strong>variant</strong><small>string</small></span><select id="playground-stats-bar-variant" name="pg_variant"><option value="raised" selected>raised</option><option value="default">default</option><option value="soft">soft</option><option value="outline">outline</option><option value="minimal">minimal</option><option value="solid">solid</option></select></label><label class="playground-field" for="playground-stats-bar-maxWidth"><span><strong>max Width</strong><small>string</small></span><select id="playground-stats-bar-maxWidth" name="pg_maxWidth"><option value="xl" selected>xl</option><option value="compact">compact</option><option value="lg">lg</option><option value="wide">wide</option><option value="2xl">2xl</option><option value="full">full</option></select></label><label class="playground-field" for="playground-stats-bar-class"><span><strong>class</strong><small>string</small></span><input id="playground-stats-bar-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -8,6 +8,14 @@ page StepperDetail {
state playground_orientation = ctx.url.searchParams.get("pg_orientation") ?? "horizontal"
state playground_clickable = (ctx.url.searchParams.get("pg_clickable") ?? "false") === "true"
state playground_label = ctx.url.searchParams.get("pg_label") ?? "Stepper"
state playground_showPanel = (ctx.url.searchParams.get("pg_showPanel") ?? "true") === "true"
state playground_controls = (ctx.url.searchParams.get("pg_controls") ?? "false") === "true"
state playground_allowSkip = (ctx.url.searchParams.get("pg_allowSkip") ?? "false") === "true"
state playground_nextDisabled = (ctx.url.searchParams.get("pg_nextDisabled") ?? "false") === "true"
state playground_backLabel = ctx.url.searchParams.get("pg_backLabel") ?? "Stepper"
state playground_nextLabel = ctx.url.searchParams.get("pg_nextLabel") ?? "Stepper"
state playground_skipLabel = ctx.url.searchParams.get("pg_skipLabel") ?? "Stepper"
state playground_finishLabel = ctx.url.searchParams.get("pg_finishLabel") ?? "Stepper"
state playground_class = ctx.url.searchParams.get("pg_class") ?? "showcase-instance showcase-instance--1"
seo {
title = "Stepper"
@@ -22,16 +30,16 @@ page StepperDetail {
<span class="showcase-eyebrow">Navigation component</span>
<h1>Stepper</h1>
<p>Theme-aware, responsive stepper component.</p>
<div class="detail-badges"><span>8 props</span><span>2 slots</span><span>1 outputs</span><span>Theme ready</span><span>Responsive</span></div>
<div class="detail-badges"><span>16 props</span><span>3 slots</span><span>5 outputs</span><span>Theme ready</span><span>Responsive</span></div>
</div>
<div class="detail-hero-icon"><span class="icon-[lucide--component] size-10" aria-hidden="true"></span></div>
</header>
<section id="playground" class="detail-section playground-section" data-playground data-playground-component="Stepper" data-playground-public-tag="true" data-playground-has-slot="true" data-playground-events="change">
<section id="playground" class="detail-section playground-section" data-playground data-playground-component="Stepper" data-playground-public-tag="true" data-playground-has-slot="true" data-playground-events="change,back,next,skip,finish">
<div class="detail-section-heading"><span>Interactive playground</span><h2>Configure Stepper</h2><p>Change any prop and inspect the server-rendered component immediately.</p></div>
<div class="playground-workbench">
<div class="playground-preview">
<div class="demo-browser-chrome"><span></span><span></span><span></span><small>Live preview</small></div>
<div class="playground-preview-source" data-playground-preview><Stepper color='{playground_color}' size='{playground_size}' steps='{playground_steps}' active='{playground_active}' orientation='{playground_orientation}' clickable='{playground_clickable}' label='{playground_label}' class='{playground_class}' /></div>
<div class="playground-preview-source" data-playground-preview><Stepper color='{playground_color}' size='{playground_size}' steps='{playground_steps}' active='{playground_active}' orientation='{playground_orientation}' clickable='{playground_clickable}' label='{playground_label}' showPanel='{playground_showPanel}' controls='{playground_controls}' allowSkip='{playground_allowSkip}' nextDisabled='{playground_nextDisabled}' backLabel='{playground_backLabel}' nextLabel='{playground_nextLabel}' skipLabel='{playground_skipLabel}' finishLabel='{playground_finishLabel}' class='{playground_class}' /></div>
<section class="playground-code" aria-label="Current component code">
<header><span><span class="icon-[lucide--code-2] size-4" aria-hidden="true"></span>Component code</span><button type="button" data-playground-copy><span class="icon-[lucide--copy] size-4" aria-hidden="true"></span>Copy</button></header>
<pre><code data-playground-code>&lt;Stepper
@@ -143,19 +151,27 @@ page StepperDetail {
]
<span>&#125;</span>
]'
label="Stepper"&gt;
label="Stepper"
showPanel="true"
backLabel="Stepper"
nextLabel="Stepper"
skipLabel="Stepper"
finishLabel="Stepper"&gt;
&lt;div data-slot="step-<span>&#123;</span>index<span>&#125;</span>"&gt;
&lt;div class="showcase-slot"&gt;step-<span>&#123;</span>index<span>&#125;</span> slot&lt;/div&gt;
&lt;/div&gt;
&lt;div data-slot="panel-<span>&#123;</span>index<span>&#125;</span>"&gt;
&lt;div class="showcase-slot"&gt;panel-<span>&#123;</span>index<span>&#125;</span> slot&lt;/div&gt;
&lt;/div&gt;
&lt;/Stepper&gt;</code></pre>
</section>
<div class="playground-status" data-playground-status aria-live="polite"></div>
<div class="playground-event-log" data-playground-event-log aria-live="polite"><strong>Event output</strong><span>Interact with the preview to inspect the typed <code>payload</code>.</span></div>
</div>
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>8 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<header><div><span>Component props</span><strong>16 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-stepper-color"><span><strong>color</strong><small>string</small></span><select id="playground-stepper-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-stepper-size"><span><strong>size</strong><small>string</small></span><select id="playground-stepper-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-stepper-steps"><span><strong>steps</strong><small>unknown[]</small></span><textarea id="playground-stepper-steps" name="pg_steps" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "stepper-0-1",
"key": "stepper-0-1",
"value": "primary",
@@ -184,31 +200,31 @@ page StepperDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "stepper-0-2",
"key": "stepper-0-2",
"value": "secondary",
@@ -237,31 +253,31 @@ page StepperDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-stepper-active"><span><strong>active</strong><small>number</small></span><input id="playground-stepper-active" name="pg_active" type="number" value="0" /></label><label class="playground-field" for="playground-stepper-orientation"><span><strong>orientation</strong><small>string</small></span><select id="playground-stepper-orientation" name="pg_orientation"><option value="horizontal" selected>horizontal</option><option value="vertical">vertical</option></select></label><label class="playground-toggle" for="playground-stepper-clickable"><span><strong>clickable</strong><small>boolean</small></span><input id="playground-stepper-clickable" name="pg_clickable" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-stepper-label"><span><strong>label</strong><small>string</small></span><input id="playground-stepper-label" name="pg_label" type="text" value="Stepper" /></label><label class="playground-field" for="playground-stepper-class"><span><strong>class</strong><small>string</small></span><input id="playground-stepper-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-stepper-active"><span><strong>active</strong><small>number</small></span><input id="playground-stepper-active" name="pg_active" type="number" value="0" /></label><label class="playground-field" for="playground-stepper-orientation"><span><strong>orientation</strong><small>string</small></span><select id="playground-stepper-orientation" name="pg_orientation"><option value="horizontal" selected>horizontal</option><option value="vertical">vertical</option></select></label><label class="playground-toggle" for="playground-stepper-clickable"><span><strong>clickable</strong><small>boolean</small></span><input id="playground-stepper-clickable" name="pg_clickable" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-stepper-label"><span><strong>label</strong><small>string</small></span><input id="playground-stepper-label" name="pg_label" type="text" value="Stepper" /></label><label class="playground-toggle" for="playground-stepper-showPanel"><span><strong>show Panel</strong><small>boolean</small></span><input id="playground-stepper-showPanel" name="pg_showPanel" type="checkbox" value="true" checked data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-stepper-controls"><span><strong>controls</strong><small>boolean</small></span><input id="playground-stepper-controls" name="pg_controls" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-stepper-allowSkip"><span><strong>allow Skip</strong><small>boolean</small></span><input id="playground-stepper-allowSkip" name="pg_allowSkip" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-stepper-nextDisabled"><span><strong>next Disabled</strong><small>boolean</small></span><input id="playground-stepper-nextDisabled" name="pg_nextDisabled" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-stepper-backLabel"><span><strong>back Label</strong><small>string</small></span><input id="playground-stepper-backLabel" name="pg_backLabel" type="text" value="Stepper" /></label><label class="playground-field" for="playground-stepper-nextLabel"><span><strong>next Label</strong><small>string</small></span><input id="playground-stepper-nextLabel" name="pg_nextLabel" type="text" value="Stepper" /></label><label class="playground-field" for="playground-stepper-skipLabel"><span><strong>skip Label</strong><small>string</small></span><input id="playground-stepper-skipLabel" name="pg_skipLabel" type="text" value="Stepper" /></label><label class="playground-field" for="playground-stepper-finishLabel"><span><strong>finish Label</strong><small>string</small></span><input id="playground-stepper-finishLabel" name="pg_finishLabel" type="text" value="Stepper" /></label><label class="playground-field" for="playground-stepper-class"><span><strong>class</strong><small>string</small></span><input id="playground-stepper-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
</section>
@@ -277,7 +293,7 @@ page StepperDetail {
<div id="stepper-demo-1" class="demo-canvas demo-canvas--1">
<div class="demo-browser-chrome"><span></span><span></span><span></span><small>Live preview</small></div>
<div class="demo-render"><Stepper size="default" steps='[{"label":"Account","description":"Your details"},{"label":"Billing","description":"Payment method"},{"label":"Confirm","description":"Review and submit"}]' active="1" clickable="false" label="Stepper" class="showcase-instance showcase-instance--1" /></div>
<div class="demo-render"><Stepper size="default" steps='[{"label":"Account","description":"Your details"},{"label":"Billing","description":"Payment method"},{"label":"Confirm","description":"Review and submit"}]' active="1" clickable="false" label="Stepper" showPanel="false" controls="false" allowSkip="false" nextDisabled="false" backLabel="Back" nextLabel="Next" skipLabel="Skip" finishLabel="Finish" class="showcase-instance showcase-instance--1" /></div>
</div>
<section class="demo-code" aria-label="Horizontal progress usage">
<header><span><span class="icon-[lucide--code-2] size-4" aria-hidden="true"></span>Component usage</span><small>.wrn</small></header>
@@ -301,6 +317,9 @@ page StepperDetail {
&lt;div data-slot="step-<span>&#123;</span>index<span>&#125;</span>"&gt;
&lt;div class="showcase-slot"&gt;step-<span>&#123;</span>index<span>&#125;</span> slot&lt;/div&gt;
&lt;/div&gt;
&lt;div data-slot="panel-<span>&#123;</span>index<span>&#125;</span>"&gt;
&lt;div class="showcase-slot"&gt;panel-<span>&#123;</span>index<span>&#125;</span> slot&lt;/div&gt;
&lt;/div&gt;
&lt;/Stepper&gt;</code></pre>
</section>
</div>
@@ -314,7 +333,7 @@ page StepperDetail {
<div id="stepper-demo-2" class="demo-canvas demo-canvas--2">
<div class="demo-browser-chrome"><span></span><span></span><span></span><small>Live preview</small></div>
<div class="demo-render"><Stepper size="sm" steps='[{"label":"Cloned","icon":"icon-[lucide--git-branch]"},{"label":"Built","icon":"icon-[lucide--hammer]"},{"label":"Deployed","icon":"icon-[lucide--rocket]"}]' active="2" orientation="vertical" clickable="false" label="Compact example" class="showcase-instance showcase-instance--2" /></div>
<div class="demo-render"><Stepper size="sm" steps='[{"label":"Cloned","icon":"icon-[lucide--git-branch]"},{"label":"Built","icon":"icon-[lucide--hammer]"},{"label":"Deployed","icon":"icon-[lucide--rocket]"}]' active="2" orientation="vertical" clickable="false" label="Compact example" showPanel="false" controls="false" allowSkip="false" nextDisabled="false" backLabel="Back" nextLabel="Next" skipLabel="Skip" finishLabel="Finish" class="showcase-instance showcase-instance--2" /></div>
</div>
<section class="demo-code" aria-label="Vertical with icons usage">
<header><span><span class="icon-[lucide--code-2] size-4" aria-hidden="true"></span>Component usage</span><small>.wrn</small></header>
@@ -340,6 +359,97 @@ page StepperDetail {
&lt;div data-slot="step-<span>&#123;</span>index<span>&#125;</span>"&gt;
&lt;div class="showcase-slot"&gt;step-<span>&#123;</span>index<span>&#125;</span> slot&lt;/div&gt;
&lt;/div&gt;
&lt;div data-slot="panel-<span>&#123;</span>index<span>&#125;</span>"&gt;
&lt;div class="showcase-slot"&gt;panel-<span>&#123;</span>index<span>&#125;</span> slot&lt;/div&gt;
&lt;/div&gt;
&lt;/Stepper&gt;</code></pre>
</section>
</div>
</article>
<article class="demo-case">
<header class="demo-case-header">
<div><span class="demo-case-eyebrow">Advanced</span><h2>Wizard with content and controls</h2><p>showPanel renders each step body and shows only the active one, the same contract Tabs uses. controls adds Back, Skip and Next, which becomes Finish on the last step.</p></div>
<span class="demo-case-number">03</span>
</header>
<div class="demo-workbench">
<div id="stepper-demo-3" class="demo-canvas demo-canvas--3">
<div class="demo-browser-chrome"><span></span><span></span><span></span><small>Live preview</small></div>
<div class="demo-render"><Stepper size="lg" steps='[{"label":"Account","title":"Your details","content":"Name, email and a password."},{"label":"Billing","title":"How you pay","content":"Card or invoice."},{"label":"Confirm","title":"Review","content":"Check everything before submitting."}]' active="1" clickable="false" label="Advanced example" showPanel="true" controls="true" allowSkip="true" nextDisabled="false" backLabel="Back" nextLabel="Next" skipLabel="Skip" finishLabel="Finish" class="showcase-instance showcase-instance--3" /></div>
</div>
<section class="demo-code" aria-label="Wizard with content and controls usage">
<header><span><span class="icon-[lucide--code-2] size-4" aria-hidden="true"></span>Component usage</span><small>.wrn</small></header>
<pre><code>&lt;Stepper
size="lg"
steps='[
<span>&#123;</span>
"label": "Account",
"title": "Your details",
"content": "Name, email and a password."
<span>&#125;</span>,
<span>&#123;</span>
"label": "Billing",
"title": "How you pay",
"content": "Card or invoice."
<span>&#125;</span>,
<span>&#123;</span>
"label": "Confirm",
"title": "Review",
"content": "Check everything before submitting."
<span>&#125;</span>
]'
active="1"
label="Advanced example"
showPanel="true"
controls="true"
allowSkip="true"&gt;
&lt;div data-slot="step-<span>&#123;</span>index<span>&#125;</span>"&gt;
&lt;div class="showcase-slot"&gt;step-<span>&#123;</span>index<span>&#125;</span> slot&lt;/div&gt;
&lt;/div&gt;
&lt;div data-slot="panel-<span>&#123;</span>index<span>&#125;</span>"&gt;
&lt;div class="showcase-slot"&gt;panel-<span>&#123;</span>index<span>&#125;</span> slot&lt;/div&gt;
&lt;/div&gt;
&lt;/Stepper&gt;</code></pre>
</section>
</div>
</article>
<article class="demo-case">
<header class="demo-case-header">
<div><span class="demo-case-eyebrow">Advanced</span><h2>Held until the step is valid</h2><p>The same wizard with nextDisabled set. The component never validates anything itself: the page owns the form, sets this while the step is incomplete, and clears it once the step passes.</p></div>
<span class="demo-case-number">04</span>
</header>
<div class="demo-workbench">
<div id="stepper-demo-4" class="demo-canvas demo-canvas--4">
<div class="demo-browser-chrome"><span></span><span></span><span></span><small>Live preview</small></div>
<div class="demo-render"><Stepper size="lg" steps='[{"label":"Account","title":"Your details","content":"This step is not complete yet."},{"label":"Billing","title":"How you pay","content":"Card or invoice."}]' active="0" clickable="false" label="Advanced example" showPanel="true" controls="true" allowSkip="false" nextDisabled="true" backLabel="Back" nextLabel="Next" skipLabel="Skip" finishLabel="Finish" class="showcase-instance showcase-instance--4" /></div>
</div>
<section class="demo-code" aria-label="Held until the step is valid usage">
<header><span><span class="icon-[lucide--code-2] size-4" aria-hidden="true"></span>Component usage</span><small>.wrn</small></header>
<pre><code>&lt;Stepper
size="lg"
steps='[
<span>&#123;</span>
"label": "Account",
"title": "Your details",
"content": "This step is not complete yet."
<span>&#125;</span>,
<span>&#123;</span>
"label": "Billing",
"title": "How you pay",
"content": "Card or invoice."
<span>&#125;</span>
]'
label="Advanced example"
showPanel="true"
controls="true"
nextDisabled="true"&gt;
&lt;div data-slot="step-<span>&#123;</span>index<span>&#125;</span>"&gt;
&lt;div class="showcase-slot"&gt;step-<span>&#123;</span>index<span>&#125;</span> slot&lt;/div&gt;
&lt;/div&gt;
&lt;div data-slot="panel-<span>&#123;</span>index<span>&#125;</span>"&gt;
&lt;div class="showcase-slot"&gt;panel-<span>&#123;</span>index<span>&#125;</span> slot&lt;/div&gt;
&lt;/div&gt;
&lt;/Stepper&gt;</code></pre>
</section>
</div>
@@ -347,13 +457,13 @@ page StepperDetail {
<article class="demo-case">
<header class="demo-case-header">
<div><span class="demo-case-eyebrow">Advanced</span><h2>Clickable steps</h2><p>With clickable the steps emit a change output and take arrow-key roving focus. Without it the stepper is read-only and stays out of the tab order.</p></div>
<span class="demo-case-number">03</span>
<span class="demo-case-number">05</span>
</header>
<div class="demo-workbench">
<div id="stepper-demo-3" class="demo-canvas demo-canvas--3">
<div id="stepper-demo-5" class="demo-canvas demo-canvas--5">
<div class="demo-browser-chrome"><span></span><span></span><span></span><small>Live preview</small></div>
<div class="demo-render"><Stepper size="lg" steps='[{"label":"One"},{"label":"Two"},{"label":"Three"}]' active="0" clickable="true" label="Advanced example" class="showcase-instance showcase-instance--3" /></div>
<div class="demo-render"><Stepper size="lg" steps='[{"label":"One"},{"label":"Two"},{"label":"Three"}]' active="0" clickable="true" label="Advanced example" showPanel="false" controls="false" allowSkip="false" nextDisabled="false" backLabel="Back" nextLabel="Next" skipLabel="Skip" finishLabel="Finish" class="showcase-instance showcase-instance--5" /></div>
</div>
<section class="demo-code" aria-label="Clickable steps usage">
<header><span><span class="icon-[lucide--code-2] size-4" aria-hidden="true"></span>Component usage</span><small>.wrn</small></header>
@@ -375,23 +485,46 @@ page StepperDetail {
&lt;div data-slot="step-<span>&#123;</span>index<span>&#125;</span>"&gt;
&lt;div class="showcase-slot"&gt;step-<span>&#123;</span>index<span>&#125;</span> slot&lt;/div&gt;
&lt;/div&gt;
&lt;div data-slot="panel-<span>&#123;</span>index<span>&#125;</span>"&gt;
&lt;div class="showcase-slot"&gt;panel-<span>&#123;</span>index<span>&#125;</span> slot&lt;/div&gt;
&lt;/div&gt;
&lt;/Stepper&gt;</code></pre>
</section>
</div>
</article></div></section>
<section id="events" class="detail-section"><div class="detail-section-heading"><span>Component outputs</span><h2>Receive every typed component output</h2><p>Use declarative output handlers in <code>.wrn</code> files or register a direct output handler from JavaScript. The canonical API exposes <code>payload</code> and does not require <code>event.detail</code>.</p></div><div class="detail-events-grid"><div class="detail-events-list"><div><code>@change</code><span>Fires when the component's committed value or selection changes.</span></div></div><div class="detail-event-examples"><section class="demo-code"><header><span><span class="icon-[lucide--braces] size-4" aria-hidden="true"></span>Declarative handlers</span><small>.wrn</small></header><pre><code>&lt;Stepper
<section id="events" class="detail-section"><div class="detail-section-heading"><span>Component outputs</span><h2>Receive every typed component output</h2><p>Use declarative output handlers in <code>.wrn</code> files or register a direct output handler from JavaScript. The canonical API exposes <code>payload</code> and does not require <code>event.detail</code>.</p></div><div class="detail-events-grid"><div class="detail-events-list"><div><code>@change</code><span>Fires when the component's committed value or selection changes.</span></div><div><code>@back</code><span>Fires when the component emits the back event.</span></div><div><code>@next</code><span>Fires when the component emits the next event.</span></div><div><code>@skip</code><span>Fires when the component emits the skip event.</span></div><div><code>@finish</code><span>Fires when the component emits the finish event.</span></div></div><div class="detail-event-examples"><section class="demo-code"><header><span><span class="icon-[lucide--braces] size-4" aria-hidden="true"></span>Declarative handlers</span><small>.wrn</small></header><pre><code>&lt;Stepper
@change='console.log(payload)'
@back='console.log(payload)'
@next='console.log(payload)'
@skip='console.log(payload)'
@finish='console.log(payload)'
/&gt;</code></pre></section><section class="demo-code"><header><span><span class="icon-[lucide--radio] size-4" aria-hidden="true"></span>Direct output handlers</span><small>.js</small></header><pre><code>import <span>&#123;</span> registerOutputHandler <span>&#125;</span> from "@wrnexus/csr/outputs"
const component = document.querySelector("[data-ui-component=\"Stepper\"], [data-component=\"Stepper\"]")
if (component) registerOutputHandler(component, "change", (payload) =&gt; <span>&#123;</span>
console.log("change", payload)
<span>&#125;</span>)
if (component) registerOutputHandler(component, "back", (payload) =&gt; <span>&#123;</span>
console.log("back", payload)
<span>&#125;</span>)
if (component) registerOutputHandler(component, "next", (payload) =&gt; <span>&#123;</span>
console.log("next", payload)
<span>&#125;</span>)
if (component) registerOutputHandler(component, "skip", (payload) =&gt; <span>&#123;</span>
console.log("skip", payload)
<span>&#125;</span>)
if (component) registerOutputHandler(component, "finish", (payload) =&gt; <span>&#123;</span>
console.log("finish", payload)
<span>&#125;</span>)</code></pre></section></div></div></section>
<section id="api" class="detail-section"><div class="detail-section-heading"><span>Component API</span><h2>Props and configuration</h2><p>All content and behavior shown above is supplied through these props and slots.</p></div><div class="docs-table-wrap"><table class="docs-table"><thead><tr><th>Prop</th><th>Type</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td><code>color</code></td><td>string</td><td><code>"primary"</code></td><td>No</td></tr><tr><td><code>size</code></td><td>string</td><td><code>"default"</code></td><td>No</td></tr><tr><td><code>steps</code></td><td>unknown[]</td><td><code>[]</code></td><td>No</td></tr><tr><td><code>active</code></td><td>number</td><td><code>0</code></td><td>No</td></tr><tr><td><code>orientation</code></td><td>string</td><td><code>"horizontal"</code></td><td>No</td></tr><tr><td><code>clickable</code></td><td>boolean</td><td><code>false</code></td><td>No</td></tr><tr><td><code>label</code></td><td>string</td><td><code>"Progress"</code></td><td>No</td></tr><tr><td><code>class</code></td><td>string</td><td><code>""</code></td><td>No</td></tr></tbody></table></div></section>
<section id="api" class="detail-section"><div class="detail-section-heading"><span>Component API</span><h2>Props and configuration</h2><p>All content and behavior shown above is supplied through these props and slots.</p></div><div class="docs-table-wrap"><table class="docs-table"><thead><tr><th>Prop</th><th>Type</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td><code>color</code></td><td>string</td><td><code>"primary"</code></td><td>No</td></tr><tr><td><code>size</code></td><td>string</td><td><code>"default"</code></td><td>No</td></tr><tr><td><code>steps</code></td><td>unknown[]</td><td><code>[]</code></td><td>No</td></tr><tr><td><code>active</code></td><td>number</td><td><code>0</code></td><td>No</td></tr><tr><td><code>orientation</code></td><td>string</td><td><code>"horizontal"</code></td><td>No</td></tr><tr><td><code>clickable</code></td><td>boolean</td><td><code>false</code></td><td>No</td></tr><tr><td><code>label</code></td><td>string</td><td><code>"Progress"</code></td><td>No</td></tr><tr><td><code>showPanel</code></td><td>boolean</td><td><code>false</code></td><td>No</td></tr><tr><td><code>controls</code></td><td>boolean</td><td><code>false</code></td><td>No</td></tr><tr><td><code>allowSkip</code></td><td>boolean</td><td><code>false</code></td><td>No</td></tr><tr><td><code>nextDisabled</code></td><td>boolean</td><td><code>false</code></td><td>No</td></tr><tr><td><code>backLabel</code></td><td>string</td><td><code>"Back"</code></td><td>No</td></tr><tr><td><code>nextLabel</code></td><td>string</td><td><code>"Next"</code></td><td>No</td></tr><tr><td><code>skipLabel</code></td><td>string</td><td><code>"Skip"</code></td><td>No</td></tr><tr><td><code>finishLabel</code></td><td>string</td><td><code>"Finish"</code></td><td>No</td></tr><tr><td><code>class</code></td><td>string</td><td><code>""</code></td><td>No</td></tr></tbody></table></div></section>
</main>
<aside class="detail-aside">
<div class="detail-toc"><strong>On this page</strong><a href="#playground">Playground</a><a href="#stepper-demo-1">Horizontal progress</a><a href="#stepper-demo-2">Vertical with icons</a><a href="#stepper-demo-3">Clickable steps</a><a href="#events">Outputs</a><a href="#api">Props API</a></div>
<div class="detail-toc"><strong>On this page</strong><a href="#playground">Playground</a><a href="#stepper-demo-1">Horizontal progress</a><a href="#stepper-demo-2">Vertical with icons</a><a href="#stepper-demo-3">Wizard with content and controls</a><a href="#stepper-demo-4">Held until the step is valid</a><a href="#stepper-demo-5">Clickable steps</a><a href="#events">Outputs</a><a href="#api">Props API</a></div>
</aside>
</div>
<nav class="detail-pagination">
@@ -152,7 +152,7 @@ page StyledIconDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>7 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-styled-icon-size"><span><strong>size</strong><small>string</small></span><select id="playground-styled-icon-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-styled-icon-color"><span><strong>color</strong><small>string</small></span><select id="playground-styled-icon-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-styled-icon-title"><span><strong>title</strong><small>string</small></span><input id="playground-styled-icon-title" name="pg_title" type="text" value="Styled Icon example" /></label><label class="playground-field" for="playground-styled-icon-description"><span><strong>description</strong><small>string</small></span><input id="playground-styled-icon-description" name="pg_description" type="text" value="A polished default styled icon for a modern application." /></label><label class="playground-field" for="playground-styled-icon-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-styled-icon-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "styled-icon-0-1",
"key": "styled-icon-0-1",
"value": "primary",
@@ -181,31 +181,31 @@ page StyledIconDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "styled-icon-0-2",
"key": "styled-icon-0-2",
"value": "secondary",
@@ -234,30 +234,30 @@ page StyledIconDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-styled-icon-variant"><span><strong>variant</strong><small>string</small></span><input id="playground-styled-icon-variant" name="pg_variant" type="text" value="default" /></label><label class="playground-field" for="playground-styled-icon-class"><span><strong>class</strong><small>string</small></span><input id="playground-styled-icon-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -155,7 +155,7 @@ page TabsDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>9 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-tabs-color"><span><strong>color</strong><small>string</small></span><select id="playground-tabs-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-tabs-size"><span><strong>size</strong><small>string</small></span><select id="playground-tabs-size" name="pg_size"><option value="default" selected>default</option><option value="sm">sm</option><option value="lg">lg</option><option value="xs">xs</option><option value="md">md</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-tabs-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-tabs-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "tabs-0-1",
"key": "tabs-0-1",
"value": "primary",
@@ -184,31 +184,31 @@ page TabsDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "tabs-0-2",
"key": "tabs-0-2",
"value": "secondary",
@@ -237,30 +237,30 @@ page TabsDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-tabs-active"><span><strong>active</strong><small>string</small></span><input id="playground-tabs-active" name="pg_active" type="text" value="" /></label><label class="playground-field" for="playground-tabs-orientation"><span><strong>orientation</strong><small>string</small></span><select id="playground-tabs-orientation" name="pg_orientation"><option value="horizontal" selected>horizontal</option><option value="vertical">vertical</option></select></label><label class="playground-field" for="playground-tabs-mode"><span><strong>mode</strong><small>string</small></span><input id="playground-tabs-mode" name="pg_mode" type="text" value="client" /></label><label class="playground-field" for="playground-tabs-param"><span><strong>param</strong><small>string</small></span><input id="playground-tabs-param" name="pg_param" type="text" value="tab" /></label><label class="playground-field" for="playground-tabs-label"><span><strong>label</strong><small>string</small></span><input id="playground-tabs-label" name="pg_label" type="text" value="Tabs" /></label><label class="playground-field" for="playground-tabs-class"><span><strong>class</strong><small>string</small></span><input id="playground-tabs-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -152,7 +152,7 @@ page TimelineDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>7 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-timeline-size"><span><strong>size</strong><small>string</small></span><select id="playground-timeline-size" name="pg_size"><option value="default" selected>default</option><option value="sm">sm</option><option value="lg">lg</option><option value="xs">xs</option><option value="md">md</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-timeline-color"><span><strong>color</strong><small>string</small></span><select id="playground-timeline-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-timeline-title"><span><strong>title</strong><small>string</small></span><input id="playground-timeline-title" name="pg_title" type="text" value="Timeline example" /></label><label class="playground-field" for="playground-timeline-description"><span><strong>description</strong><small>string</small></span><input id="playground-timeline-description" name="pg_description" type="text" value="A polished default timeline for a modern application." /></label><label class="playground-field" for="playground-timeline-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-timeline-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "timeline-0-1",
"key": "timeline-0-1",
"value": "primary",
@@ -181,31 +181,31 @@ page TimelineDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "timeline-0-2",
"key": "timeline-0-2",
"value": "secondary",
@@ -234,30 +234,30 @@ page TimelineDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-timeline-variant"><span><strong>variant</strong><small>string</small></span><select id="playground-timeline-variant" name="pg_variant"><option value="default" selected>default</option><option value="soft">soft</option><option value="raised">raised</option><option value="outline">outline</option></select></label><label class="playground-field" for="playground-timeline-class"><span><strong>class</strong><small>string</small></span><input id="playground-timeline-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -152,7 +152,7 @@ page ToastNotificationsDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>7 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-toast-notifications-size"><span><strong>size</strong><small>string</small></span><select id="playground-toast-notifications-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-toast-notifications-color"><span><strong>color</strong><small>string</small></span><select id="playground-toast-notifications-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-toast-notifications-title"><span><strong>title</strong><small>string</small></span><input id="playground-toast-notifications-title" name="pg_title" type="text" value="Toast Notifications example" /></label><label class="playground-field" for="playground-toast-notifications-description"><span><strong>description</strong><small>string</small></span><input id="playground-toast-notifications-description" name="pg_description" type="text" value="A polished default toast notifications for a modern application." /></label><label class="playground-field" for="playground-toast-notifications-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-toast-notifications-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "toast-notifications-0-1",
"key": "toast-notifications-0-1",
"value": "primary",
@@ -181,31 +181,31 @@ page ToastNotificationsDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "toast-notifications-0-2",
"key": "toast-notifications-0-2",
"value": "secondary",
@@ -234,30 +234,30 @@ page ToastNotificationsDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-toast-notifications-variant"><span><strong>variant</strong><small>string</small></span><input id="playground-toast-notifications-variant" name="pg_variant" type="text" value="default" /></label><label class="playground-field" for="playground-toast-notifications-class"><span><strong>class</strong><small>string</small></span><input id="playground-toast-notifications-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -152,7 +152,7 @@ page ToastDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>7 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-toast-size"><span><strong>size</strong><small>string</small></span><select id="playground-toast-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-toast-color"><span><strong>color</strong><small>string</small></span><select id="playground-toast-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-toast-title"><span><strong>title</strong><small>string</small></span><input id="playground-toast-title" name="pg_title" type="text" value="Toast example" /></label><label class="playground-field" for="playground-toast-description"><span><strong>description</strong><small>string</small></span><input id="playground-toast-description" name="pg_description" type="text" value="A polished default toast for a modern application." /></label><label class="playground-field" for="playground-toast-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-toast-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "toast-0-1",
"key": "toast-0-1",
"value": "primary",
@@ -181,31 +181,31 @@ page ToastDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "toast-0-2",
"key": "toast-0-2",
"value": "secondary",
@@ -234,30 +234,30 @@ page ToastDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-toast-variant"><span><strong>variant</strong><small>string</small></span><input id="playground-toast-variant" name="pg_variant" type="text" value="default" /></label><label class="playground-field" for="playground-toast-class"><span><strong>class</strong><small>string</small></span><input id="playground-toast-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -172,7 +172,7 @@ page ToggleCountDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>23 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-toggle-count-size"><span><strong>size</strong><small>string</small></span><select id="playground-toggle-count-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-toggle-count-color"><span><strong>color</strong><small>string</small></span><select id="playground-toggle-count-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-toggle-count-variant"><span><strong>variant</strong><small>string</small></span><input id="playground-toggle-count-variant" name="pg_variant" type="text" value="segmented" /></label><label class="playground-field" for="playground-toggle-count-class"><span><strong>class</strong><small>string</small></span><input id="playground-toggle-count-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label><label class="playground-field" for="playground-toggle-count-name"><span><strong>name</strong><small>string</small></span><input id="playground-toggle-count-name" name="pg_name" type="text" value="billing-cycle" /></label><label class="playground-field" for="playground-toggle-count-value"><span><strong>value</strong><small>string</small></span><input id="playground-toggle-count-value" name="pg_value" type="text" value="sample-1" /></label><label class="playground-field" for="playground-toggle-count-firstValue"><span><strong>first Value</strong><small>string</small></span><input id="playground-toggle-count-firstValue" name="pg_firstValue" type="text" value="monthly" /></label><label class="playground-field" for="playground-toggle-count-firstLabel"><span><strong>first Label</strong><small>string</small></span><input id="playground-toggle-count-firstLabel" name="pg_firstLabel" type="text" value="Toggle Count" /></label><label class="playground-field" for="playground-toggle-count-secondValue"><span><strong>second Value</strong><small>string</small></span><input id="playground-toggle-count-secondValue" name="pg_secondValue" type="text" value="annual" /></label><label class="playground-field" for="playground-toggle-count-secondLabel"><span><strong>second Label</strong><small>string</small></span><input id="playground-toggle-count-secondLabel" name="pg_secondLabel" type="text" value="Toggle Count" /></label><label class="playground-field" for="playground-toggle-count-ariaLabel"><span><strong>aria Label</strong><small>string</small></span><input id="playground-toggle-count-ariaLabel" name="pg_ariaLabel" type="text" value="Toggle Count 1 example" /></label><label class="playground-field" for="playground-toggle-count-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-toggle-count-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "toggle-count-0-1",
"key": "toggle-count-0-1",
"value": "primary",
@@ -201,31 +201,31 @@ page ToggleCountDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "toggle-count-0-2",
"key": "toggle-count-0-2",
"value": "secondary",
@@ -254,30 +254,30 @@ page ToggleCountDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-toggle-count-currency"><span><strong>currency</strong><small>string</small></span><input id="playground-toggle-count-currency" name="pg_currency" type="text" value="$" /></label><label class="playground-field" for="playground-toggle-count-suffix"><span><strong>suffix</strong><small>string</small></span><input id="playground-toggle-count-suffix" name="pg_suffix" type="text" value="" /></label><label class="playground-field" for="playground-toggle-count-firstValueKey"><span><strong>first Value Key</strong><small>string</small></span><input id="playground-toggle-count-firstValueKey" name="pg_firstValueKey" type="text" value="monthly" /></label><label class="playground-field" for="playground-toggle-count-secondValueKey"><span><strong>second Value Key</strong><small>string</small></span><input id="playground-toggle-count-secondValueKey" name="pg_secondValueKey" type="text" value="annual" /></label><label class="playground-field" for="playground-toggle-count-emptyValue"><span><strong>empty Value</strong><small>string</small></span><input id="playground-toggle-count-emptyValue" name="pg_emptyValue" type="text" value="—" /></label><label class="playground-field" for="playground-toggle-count-align"><span><strong>align</strong><small>string</small></span><select id="playground-toggle-count-align" name="pg_align"><option value="start" selected>start</option><option value="end">end</option><option value="left">left</option><option value="center">center</option><option value="right">right</option><option value="stretch">stretch</option></select></label><label class="playground-toggle" for="playground-toggle-count-fullWidth"><span><strong>full Width</strong><small>boolean</small></span><input id="playground-toggle-count-fullWidth" name="pg_fullWidth" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-toggle-count-disabled"><span><strong>disabled</strong><small>boolean</small></span><input id="playground-toggle-count-disabled" name="pg_disabled" type="checkbox" value="true" data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-toggle" for="playground-toggle-count-animate"><span><strong>animate</strong><small>boolean</small></span><input id="playground-toggle-count-animate" name="pg_animate" type="checkbox" value="true" checked data-playground-boolean /><i aria-hidden="true"></i></label><label class="playground-field" for="playground-toggle-count-animationDuration"><span><strong>animation Duration</strong><small>number</small></span><input id="playground-toggle-count-animationDuration" name="pg_animationDuration" type="number" value="450" /></label><label class="playground-field" for="playground-toggle-count-animationSteps"><span><strong>animation Steps</strong><small>number</small></span><input id="playground-toggle-count-animationSteps" name="pg_animationSteps" type="number" value="18" /></label></div>
</form>
</div>
@@ -152,7 +152,7 @@ page TreeViewDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>7 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-tree-view-size"><span><strong>size</strong><small>string</small></span><select id="playground-tree-view-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-tree-view-color"><span><strong>color</strong><small>string</small></span><select id="playground-tree-view-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-tree-view-title"><span><strong>title</strong><small>string</small></span><input id="playground-tree-view-title" name="pg_title" type="text" value="Tree View example" /></label><label class="playground-field" for="playground-tree-view-description"><span><strong>description</strong><small>string</small></span><input id="playground-tree-view-description" name="pg_description" type="text" value="A polished default tree view for a modern application." /></label><label class="playground-field" for="playground-tree-view-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-tree-view-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "tree-view-0-1",
"key": "tree-view-0-1",
"value": "primary",
@@ -181,31 +181,31 @@ page TreeViewDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "tree-view-0-2",
"key": "tree-view-0-2",
"value": "secondary",
@@ -234,30 +234,30 @@ page TreeViewDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-tree-view-variant"><span><strong>variant</strong><small>string</small></span><input id="playground-tree-view-variant" name="pg_variant" type="text" value="default" /></label><label class="playground-field" for="playground-tree-view-class"><span><strong>class</strong><small>string</small></span><input id="playground-tree-view-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -152,7 +152,7 @@ page WysiwygEditorDetail {
<form class="playground-controls" data-playground-form>
<header><div><span>Component props</span><strong>7 controls</strong></div><button type="reset"><span class="icon-[lucide--rotate-ccw] size-4" aria-hidden="true"></span>Reset</button></header>
<div class="playground-fields"><label class="playground-field" for="playground-wysiwyg-editor-size"><span><strong>size</strong><small>string</small></span><select id="playground-wysiwyg-editor-size" name="pg_size"><option value="default" selected>default</option><option value="xs">xs</option><option value="sm">sm</option><option value="md">md</option><option value="lg">lg</option><option value="xl">xl</option><option value="icon">icon</option><option value="icon-xs">icon-xs</option><option value="icon-sm">icon-sm</option><option value="icon-lg">icon-lg</option></select></label><label class="playground-field" for="playground-wysiwyg-editor-color"><span><strong>color</strong><small>string</small></span><select id="playground-wysiwyg-editor-color" name="pg_color"><option value="primary" selected>primary</option><option value="secondary">secondary</option><option value="success">success</option><option value="warning">warning</option><option value="danger">danger</option><option value="info">info</option></select></label><label class="playground-field" for="playground-wysiwyg-editor-title"><span><strong>title</strong><small>string</small></span><input id="playground-wysiwyg-editor-title" name="pg_title" type="text" value="Wysiwyg Editor example" /></label><label class="playground-field" for="playground-wysiwyg-editor-description"><span><strong>description</strong><small>string</small></span><input id="playground-wysiwyg-editor-description" name="pg_description" type="text" value="A polished default wysiwyg editor for a modern application." /></label><label class="playground-field" for="playground-wysiwyg-editor-items"><span><strong>items</strong><small>unknown[]</small></span><textarea id="playground-wysiwyg-editor-items" name="pg_items" rows="5" spellcheck="false" data-playground-json>[
{
&#123;
"id": "wysiwyg-editor-0-1",
"key": "wysiwyg-editor-0-1",
"value": "primary",
@@ -181,31 +181,31 @@ page WysiwygEditorDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 1",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
},
{
&#125;,
&#123;
"id": "wysiwyg-editor-0-2",
"key": "wysiwyg-editor-0-2",
"value": "secondary",
@@ -234,30 +234,30 @@ page WysiwygEditorDetail {
"target": "_self",
"ariaLabel": "Open primary workflow 2",
"items": [
{
&#123;
"label": "Nested option A",
"value": "nested-a"
},
{
&#125;,
&#123;
"label": "Nested option B",
"value": "nested-b"
}
&#125;
],
"links": [
{
&#123;
"label": "Documentation",
"href": "#documentation"
},
{
&#125;,
&#123;
"label": "API reference",
"href": "#api-reference"
}
&#125;
],
"values": [
"Included",
"Standard"
]
}
&#125;
]</textarea><em data-playground-error></em></label><label class="playground-field" for="playground-wysiwyg-editor-variant"><span><strong>variant</strong><small>string</small></span><input id="playground-wysiwyg-editor-variant" name="pg_variant" type="text" value="default" /></label><label class="playground-field" for="playground-wysiwyg-editor-class"><span><strong>class</strong><small>string</small></span><input id="playground-wysiwyg-editor-class" name="pg_class" type="text" value="showcase-instance showcase-instance--1" /></label></div>
</form>
</div>
@@ -17,11 +17,11 @@ page ComponentShowcase {
<section class="home-product-grid"><article><span class="icon-[lucide--component] size-7"></span><strong>108 components</strong><p>Accessible primitives for every product surface.</p><a href="/base">Browse components →</a></article><article><span class="icon-[lucide--layout-template] size-7"></span><strong>Ready-made blocks</strong><p>Composable sections assembled from WRNexus UI.</p><a href="/block-library">Explore blocks →</a></article><article><span class="icon-[lucide--panels-top-left] size-7"></span><strong>Page templates</strong><p>Complete responsive pages ready to customize.</p><a href="/templates">View templates →</a></article></section>
<section class="showcase-stats">
<div class="showcase-stat"><strong>108</strong><span>Unique components</span></div>
<div class="showcase-stat"><strong>419</strong><span>Live configurations</span></div>
<div class="showcase-stat"><strong>421</strong><span>Live configurations</span></div>
<div class="showcase-stat"><strong>0</strong><span>Duplicate implementations</span></div>
<div class="showcase-stat"><strong>11</strong><span>Focused categories</span></div>
</section>
<section class="home-categories"><div class="home-section-heading"><span>Explore the system</span><h2>Everything your product needs</h2></div><div class="home-category-grid"><a class="home-category home-category--1" href="/advanced-forms"><span class="home-category-index">01</span><div><strong>Advanced Forms</strong><p>8 components · 112 live demos</p></div><span class="icon-[lucide--arrow-up-right] size-5" aria-hidden="true"></span></a><a class="home-category home-category--2" href="/base"><span class="home-category-index">02</span><div><strong>Base</strong><p>27 components · 86 live demos</p></div><span class="icon-[lucide--arrow-up-right] size-5" aria-hidden="true"></span></a><a class="home-category home-category--3" href="/core"><span class="home-category-index">03</span><div><strong>Core</strong><p>5 components · 13 live demos</p></div><span class="icon-[lucide--arrow-up-right] size-5" aria-hidden="true"></span></a><a class="home-category home-category--4" href="/data"><span class="home-category-index">04</span><div><strong>Data</strong><p>3 components · 9 live demos</p></div><span class="icon-[lucide--arrow-up-right] size-5" aria-hidden="true"></span></a><a class="home-category home-category--1" href="/forms"><span class="home-category-index">05</span><div><strong>Forms</strong><p>12 components · 36 live demos</p></div><span class="icon-[lucide--arrow-up-right] size-5" aria-hidden="true"></span></a><a class="home-category home-category--2" href="/integrations"><span class="home-category-index">06</span><div><strong>Integrations</strong><p>11 components · 33 live demos</p></div><span class="icon-[lucide--arrow-up-right] size-5" aria-hidden="true"></span></a><a class="home-category home-category--3" href="/layout"><span class="home-category-index">07</span><div><strong>Layout</strong><p>15 components · 45 live demos</p></div><span class="icon-[lucide--arrow-up-right] size-5" aria-hidden="true"></span></a><a class="home-category home-category--4" href="/marketing"><span class="home-category-index">08</span><div><strong>Marketing</strong><p>10 components · 30 live demos</p></div><span class="icon-[lucide--arrow-up-right] size-5" aria-hidden="true"></span></a><a class="home-category home-category--1" href="/navigation"><span class="home-category-index">09</span><div><strong>Navigation</strong><p>10 components · 28 live demos</p></div><span class="icon-[lucide--arrow-up-right] size-5" aria-hidden="true"></span></a><a class="home-category home-category--2" href="/overlays"><span class="home-category-index">010</span><div><strong>Overlays</strong><p>6 components · 18 live demos</p></div><span class="icon-[lucide--arrow-up-right] size-5" aria-hidden="true"></span></a><a class="home-category home-category--3" href="/tables"><span class="home-category-index">011</span><div><strong>Tables</strong><p>1 components · 9 live demos</p></div><span class="icon-[lucide--arrow-up-right] size-5" aria-hidden="true"></span></a></div></section>
<section class="home-categories"><div class="home-section-heading"><span>Explore the system</span><h2>Everything your product needs</h2></div><div class="home-category-grid"><a class="home-category home-category--1" href="/advanced-forms"><span class="home-category-index">01</span><div><strong>Advanced Forms</strong><p>8 components · 112 live demos</p></div><span class="icon-[lucide--arrow-up-right] size-5" aria-hidden="true"></span></a><a class="home-category home-category--2" href="/base"><span class="home-category-index">02</span><div><strong>Base</strong><p>27 components · 86 live demos</p></div><span class="icon-[lucide--arrow-up-right] size-5" aria-hidden="true"></span></a><a class="home-category home-category--3" href="/core"><span class="home-category-index">03</span><div><strong>Core</strong><p>5 components · 13 live demos</p></div><span class="icon-[lucide--arrow-up-right] size-5" aria-hidden="true"></span></a><a class="home-category home-category--4" href="/data"><span class="home-category-index">04</span><div><strong>Data</strong><p>3 components · 9 live demos</p></div><span class="icon-[lucide--arrow-up-right] size-5" aria-hidden="true"></span></a><a class="home-category home-category--1" href="/forms"><span class="home-category-index">05</span><div><strong>Forms</strong><p>12 components · 36 live demos</p></div><span class="icon-[lucide--arrow-up-right] size-5" aria-hidden="true"></span></a><a class="home-category home-category--2" href="/integrations"><span class="home-category-index">06</span><div><strong>Integrations</strong><p>11 components · 33 live demos</p></div><span class="icon-[lucide--arrow-up-right] size-5" aria-hidden="true"></span></a><a class="home-category home-category--3" href="/layout"><span class="home-category-index">07</span><div><strong>Layout</strong><p>15 components · 45 live demos</p></div><span class="icon-[lucide--arrow-up-right] size-5" aria-hidden="true"></span></a><a class="home-category home-category--4" href="/marketing"><span class="home-category-index">08</span><div><strong>Marketing</strong><p>10 components · 30 live demos</p></div><span class="icon-[lucide--arrow-up-right] size-5" aria-hidden="true"></span></a><a class="home-category home-category--1" href="/navigation"><span class="home-category-index">09</span><div><strong>Navigation</strong><p>10 components · 30 live demos</p></div><span class="icon-[lucide--arrow-up-right] size-5" aria-hidden="true"></span></a><a class="home-category home-category--2" href="/overlays"><span class="home-category-index">010</span><div><strong>Overlays</strong><p>6 components · 18 live demos</p></div><span class="icon-[lucide--arrow-up-right] size-5" aria-hidden="true"></span></a><a class="home-category home-category--3" href="/tables"><span class="home-category-index">011</span><div><strong>Tables</strong><p>1 components · 9 live demos</p></div><span class="icon-[lucide--arrow-up-right] size-5" aria-hidden="true"></span></a></div></section>
</div>
}
}
@@ -10,7 +10,7 @@ page NavigationShowcase {
<span class="showcase-eyebrow">Component category</span>
<h1 class="showcase-title">Navigation</h1>
<p class="showcase-description">10 unique, responsive, theme-aware components. Open a component to inspect multiple live configurations and its complete props API.</p>
<div class="category-meta"><span>10 components</span><span>Multiple use cases</span><span>28 live configurations</span></div>
<div class="category-meta"><span>10 components</span><span>Multiple use cases</span><span>30 live configurations</span></div>
</header>
<div class="catalog-grid">
<article class="catalog-card" data-interactive-preview="false">
@@ -56,7 +56,7 @@ page NavigationShowcase {
<article class="catalog-card" data-interactive-preview="false">
<div class="catalog-card-preview">
<div class="catalog-card-glow" aria-hidden="true"></div>
<div class="catalog-card-stage"><Navbar size="default" label="Navbar" topbarLabel="Navbar" brand='{"id":"navbar-0-1","key":"navbar-0-1","value":"primary","label":"Primary workflow","title":"Primary workflow","description":"A clean default configuration for everyday product interfaces.","text":"A configurable sample message.","href":"#navbar-demo","actionHref":"#navbar-demo","actionLabel":"View details","icon":"icon-[lucide--sparkles]","iconClass":"icon-[lucide--sparkles]","variant":"primary","status":"Active","time":"09:30","current":true,"selected":true,"checked":true,"disabled":false,"outgoing":false,"open":true,"number":1,"count":16,"percentage":72,"color":"#7c3aed","target":"_self","ariaLabel":"Open primary workflow 1","items":[{"label":"Nested option A","value":"nested-a"},{"label":"Nested option B","value":"nested-b"}],"links":[{"label":"Documentation","href":"#documentation"},{"label":"API reference","href":"#api-reference"}],"values":["Included","Standard"]}' items='[{"id":"navbar-0-1","key":"navbar-0-1","value":"primary","label":"Primary workflow","title":"Primary workflow","description":"A clean default configuration for everyday product interfaces.","text":"A configurable sample message.","href":"#navbar-demo","actionHref":"#navbar-demo","actionLabel":"View details","icon":"icon-[lucide--sparkles]","iconClass":"icon-[lucide--sparkles]","variant":"primary","status":"Active","time":"09:30","current":true,"selected":true,"checked":true,"disabled":false,"outgoing":false,"open":true,"number":1,"count":16,"percentage":72,"color":"#7c3aed","target":"_self","ariaLabel":"Open primary workflow 1","items":[{"label":"Nested option A","value":"nested-a"},{"label":"Nested option B","value":"nested-b"}],"links":[{"label":"Documentation","href":"#documentation"},{"label":"API reference","href":"#api-reference"}],"values":["Included","Standard"]},{"id":"navbar-0-2","key":"navbar-0-2","value":"secondary","label":"Additional option","title":"Supporting example","description":"A clean default configuration for everyday product interfaces.","text":"Another configurable message.","href":"#navbar-demo","actionHref":"#navbar-demo","actionLabel":"View details","icon":"icon-[lucide--sparkles]","iconClass":"icon-[lucide--sparkles]","variant":"primary","status":"Active","time":"09:30","current":false,"selected":false,"checked":false,"disabled":false,"outgoing":true,"open":true,"number":2,"count":32,"percentage":72,"color":"#7c3aed","target":"_self","ariaLabel":"Open primary workflow 2","items":[{"label":"Nested option A","value":"nested-a"},{"label":"Nested option B","value":"nested-b"}],"links":[{"label":"Documentation","href":"#documentation"},{"label":"API reference","href":"#api-reference"}],"values":["Included","Standard"]}]' actions='[{"id":"navbar-0-1","key":"navbar-0-1","value":"primary","label":"Primary workflow","title":"Primary workflow","description":"A clean default configuration for everyday product interfaces.","text":"A configurable sample message.","href":"#navbar-demo","actionHref":"#navbar-demo","actionLabel":"View details","icon":"icon-[lucide--sparkles]","iconClass":"icon-[lucide--sparkles]","variant":"primary","status":"Active","time":"09:30","current":true,"selected":true,"checked":true,"disabled":false,"outgoing":false,"open":true,"number":1,"count":16,"percentage":72,"color":"#7c3aed","target":"_self","ariaLabel":"Open primary workflow 1","items":[{"label":"Nested option A","value":"nested-a"},{"label":"Nested option B","value":"nested-b"}],"links":[{"label":"Documentation","href":"#documentation"},{"label":"API reference","href":"#api-reference"}],"values":["Included","Standard"]},{"id":"navbar-0-2","key":"navbar-0-2","value":"secondary","label":"Additional option","title":"Supporting example","description":"A clean default configuration for everyday product interfaces.","text":"Another configurable message.","href":"#navbar-demo","actionHref":"#navbar-demo","actionLabel":"View details","icon":"icon-[lucide--sparkles]","iconClass":"icon-[lucide--sparkles]","variant":"primary","status":"Active","time":"09:30","current":false,"selected":false,"checked":false,"disabled":false,"outgoing":true,"open":true,"number":2,"count":32,"percentage":72,"color":"#7c3aed","target":"_self","ariaLabel":"Open primary workflow 2","items":[{"label":"Nested option A","value":"nested-a"},{"label":"Nested option B","value":"nested-b"}],"links":[{"label":"Documentation","href":"#documentation"},{"label":"API reference","href":"#api-reference"}],"values":["Included","Standard"]}]' sticky="false" openOnHover="false" mobileLabel="Navbar" class="showcase-instance showcase-instance--1" /></div>
<div class="catalog-card-stage"><Navbar size="default" label="Primary navigation" topbarLabel="Navbar" brand='{demo_obj_0}' items='[{"label":"Overview","href":"/","value":"overview"},{"label":"Projects","href":"/projects","value":"projects"},{"label":"Reports","href":"/reports","value":"reports"}]' actions='[{"label":"Sign in","href":"/login","variant":"link"},{"label":"Start free","href":"/signup","variant":"primary"}]' active="projects" sticky="false" openOnHover="false" mobileLabel="Navbar" class="showcase-instance showcase-instance--1" /></div>
</div>
<div class="catalog-card-body">
<div><span class="catalog-card-category">Navigation</span><h2>Navbar</h2><p>Theme-aware, responsive navbar component.</p></div>
@@ -96,11 +96,11 @@ page NavigationShowcase {
<article class="catalog-card" data-interactive-preview="false">
<div class="catalog-card-preview">
<div class="catalog-card-glow" aria-hidden="true"></div>
<div class="catalog-card-stage"><Stepper size="default" steps='[{"label":"Account","description":"Your details"},{"label":"Billing","description":"Payment method"},{"label":"Confirm","description":"Review and submit"}]' active="1" clickable="false" label="Stepper" class="showcase-instance showcase-instance--1" /></div>
<div class="catalog-card-stage"><Stepper size="default" steps='[{"label":"Account","description":"Your details"},{"label":"Billing","description":"Payment method"},{"label":"Confirm","description":"Review and submit"}]' active="1" clickable="false" label="Stepper" showPanel="false" controls="false" allowSkip="false" nextDisabled="false" backLabel="Back" nextLabel="Next" skipLabel="Skip" finishLabel="Finish" class="showcase-instance showcase-instance--1" /></div>
</div>
<div class="catalog-card-body">
<div><span class="catalog-card-category">Navigation</span><h2>Stepper</h2><p>Theme-aware, responsive stepper component.</p></div>
<div class="catalog-card-footer"><span>8 props · 2 slots</span><a href="/components/stepper">Explore component <span aria-hidden="true">→</span></a></div>
<div class="catalog-card-footer"><span>16 props · 3 slots</span><a href="/components/stepper">Explore component <span aria-hidden="true">→</span></a></div>
</div>
</article>
<article class="catalog-card" data-interactive-preview="false">
@@ -2925,3 +2925,38 @@ body {
.demo-canvas:has([data-ui-component="Tooltip"], [data-ui-component="Popover"]) .demo-render {
padding-block: 5rem;
}
/*
* Scrollspy demo sections.
*
* Real page-flow content on purpose: the runtime observes sections against the
* viewport, so a table of contents inside a small scrolling box would have
* nothing to react to and the demo could not be tested at all.
*/
.showcase-spy-doc {
display: grid;
gap: 0.75rem;
margin-bottom: 1rem;
}
.showcase-spy-section {
min-height: 42vh;
padding: 1rem;
border: 1px solid var(--wire-color-border);
border-radius: var(--wire-radius-md);
background: var(--wire-color-surface-soft);
scroll-margin-top: 5rem;
}
.showcase-spy-section h3 {
margin: 0 0 0.4rem;
font-size: 0.95rem;
font-weight: 700;
}
.showcase-spy-section p {
margin: 0;
color: var(--wire-color-text-muted);
font-size: 0.86rem;
line-height: 1.6;
}
@@ -83,6 +83,15 @@ const escapeText = (value) =>
*/
const escapeCode = (value) =>
escapeText(value).replaceAll("{", "<span>&#123;</span>").replaceAll("}", "<span>&#125;</span>");
/*
* JSON for a textarea. Entities keep the braces away from the WRN compiler,
* which would otherwise read them as interpolation and fail the page build,
* while the browser decodes them so the reader still sees valid JSON. The
* span trick used for code samples cannot be used here: a textarea shows its
* markup literally.
*/
const escapeTextareaJson = (value) =>
escapeText(value).replaceAll("{", "&#123;").replaceAll("}", "&#125;");
const escapeAttribute = (value) =>
escapeText(value).replaceAll('"', "&quot;").replaceAll("'", "&#39;");
@@ -415,10 +424,42 @@ function sampleValue(prop, component, variation) {
return undefined;
}
/*
* Object props are hoisted into page state rather than written inline.
*
* A bare {...} attribute is read by the compiler as an interpolation, and
* escaping the braces does not help either: prop coercion runs JSON.parse on
* the raw attribute, which never sees the entities decoded, so the mount threw
* and the demo silently rendered nothing. Binding to state is what the
* playground already does, and it is the only form that survives both.
*
* Arrays start with [ and are unambiguous, so they stay inline.
*/
const hoistedObjects = [];
function resetHoistedObjects() {
hoistedObjects.length = 0;
}
function hoistObjectProp(value) {
const name = `demo_obj_${hoistedObjects.length}`;
// JSON.parse, not a bare object literal: the parser reads a leading brace
// as the start of a block and rejects the rest of the page.
const json = JSON.stringify(JSON.stringify(value));
hoistedObjects.push(` state ${name} = JSON.parse(${json})`);
return name;
}
function hoistedObjectStates() {
if (!hoistedObjects.length) return "";
// playgroundStates has no trailing newline, so lead with one.
return "\n" + hoistedObjects.join("\n");
}
function wrnAttribute(name, value) {
if (typeof value === "object" && value !== null) {
const expression = JSON.stringify(value).replaceAll("'", "\\u0027");
return `${name}='${expression}'`;
if (!Array.isArray(value)) return `${name}='{${hoistObjectProp(value)}}'`;
return `${name}='${JSON.stringify(value).replaceAll("'", "\\u0027")}'`;
}
return `${name}="${escapeAttribute(String(value))}"`;
}
@@ -653,7 +694,7 @@ function playgroundControl(prop, component) {
prop.type === "object" ||
prop.type.includes("[]");
if (structured) {
return `<label class="playground-field" for="${id}"><span><strong>${label}</strong>${meta}</span><textarea id="${id}" name="pg_${escapeAttribute(prop.name)}" rows="5" spellcheck="false" data-playground-json>${escapeText(value)}</textarea><em data-playground-error></em></label>`;
return `<label class="playground-field" for="${id}"><span><strong>${label}</strong>${meta}</span><textarea id="${id}" name="pg_${escapeAttribute(prop.name)}" rows="5" spellcheck="false" data-playground-json>${escapeTextareaJson(value)}</textarea><em data-playground-error></em></label>`;
}
const options = playgroundOptions(prop, component, value);
@@ -1460,6 +1501,8 @@ function eventDocumentation(component) {
}
function detailPage(component, categoryComponents) {
// Names are per page; without this they accumulate across the whole run.
resetHoistedObjects();
const index = categoryComponents.findIndex((item) => item.name === component.name);
const previous = categoryComponents[index - 1];
const next = categoryComponents[index + 1];
@@ -1537,7 +1580,7 @@ function detailPage(component, categoryComponents) {
return `// Generated by scripts/generate-showcase.mjs. Do not edit directly.
page ${component.name.replace(/[^A-Za-z0-9_]/g, "")}Detail {
layout = "showcase"
${playgroundStates(component)}
${playgroundStates(component)}${hoistedObjectStates()}
seo {
title = "${escapeAttribute(displayName(component.name))}"
description = "${escapeAttribute(component.purpose)}"
@@ -253,12 +253,99 @@ const DATATABLE_ROWS =
'[{"id": 1, "name": "Northwind", "plan": "Scale", "owner": "A. Okafor", "seats": 6, "status": "Active", "statusHtml": "<span class=\\"showcase-pill showcase-pill--success\\">Active</span>"}, {"id": 2, "name": "Acme Industrial", "plan": "Team", "owner": "R. Silva", "seats": 13, "status": "Trial", "statusHtml": "<span class=\\"showcase-pill showcase-pill--info\\">Trial</span>"}, {"id": 3, "name": "Globex", "plan": "Enterprise", "owner": "M. Chen", "seats": 20, "status": "Past due", "statusHtml": "<span class=\\"showcase-pill showcase-pill--danger\\">Past due</span>"}, {"id": 4, "name": "Initech", "plan": "Starter", "owner": "J. Dubois", "seats": 27, "status": "Active", "statusHtml": "<span class=\\"showcase-pill showcase-pill--success\\">Active</span>"}, {"id": 5, "name": "Umbrella", "plan": "Scale", "owner": "P. Novak", "seats": 34, "status": "Trial", "statusHtml": "<span class=\\"showcase-pill showcase-pill--info\\">Trial</span>"}, {"id": 6, "name": "Stark Labs", "plan": "Team", "owner": "A. Okafor", "seats": 41, "status": "Past due", "statusHtml": "<span class=\\"showcase-pill showcase-pill--danger\\">Past due</span>"}, {"id": 7, "name": "Wayne Foods", "plan": "Enterprise", "owner": "R. Silva", "seats": 48, "status": "Active", "statusHtml": "<span class=\\"showcase-pill showcase-pill--success\\">Active</span>"}, {"id": 8, "name": "Soylent", "plan": "Starter", "owner": "M. Chen", "seats": 55, "status": "Trial", "statusHtml": "<span class=\\"showcase-pill showcase-pill--info\\">Trial</span>"}, {"id": 9, "name": "Hooli", "plan": "Scale", "owner": "J. Dubois", "seats": 62, "status": "Past due", "statusHtml": "<span class=\\"showcase-pill showcase-pill--danger\\">Past due</span>"}, {"id": 10, "name": "Vehement", "plan": "Team", "owner": "P. Novak", "seats": 69, "status": "Active", "statusHtml": "<span class=\\"showcase-pill showcase-pill--success\\">Active</span>"}, {"id": 11, "name": "Massive Dynamic", "plan": "Enterprise", "owner": "A. Okafor", "seats": 76, "status": "Trial", "statusHtml": "<span class=\\"showcase-pill showcase-pill--info\\">Trial</span>"}, {"id": 12, "name": "Cyberdyne", "plan": "Starter", "owner": "R. Silva", "seats": 83, "status": "Past due", "statusHtml": "<span class=\\"showcase-pill showcase-pill--danger\\">Past due</span>"}, {"id": 13, "name": "Tyrell", "plan": "Scale", "owner": "M. Chen", "seats": 90, "status": "Active", "statusHtml": "<span class=\\"showcase-pill showcase-pill--success\\">Active</span>"}, {"id": 14, "name": "Aperture", "plan": "Team", "owner": "J. Dubois", "seats": 97, "status": "Trial", "statusHtml": "<span class=\\"showcase-pill showcase-pill--info\\">Trial</span>"}, {"id": 15, "name": "Black Mesa", "plan": "Enterprise", "owner": "P. Novak", "seats": 104, "status": "Past due", "statusHtml": "<span class=\\"showcase-pill showcase-pill--danger\\">Past due</span>"}]';
export const componentProfiles = {
Scrollspy: {
Navbar: {
demos: [
standard(
"Table of contents",
"Each href points at an element on the page. The runtime observes those elements and moves aria-current to the link for whichever one is in view, so the marker follows the reader without any component state.",
"Brand, links and actions",
"The everyday shape: a brand, a row of links with the current page marked, and calls to action on the right. Arrow keys move along the menu bar.",
{
brand: { label: "Northwind", description: "Console", href: "/" },
items: [
{ label: "Overview", href: "/", value: "overview" },
{ label: "Projects", href: "/projects", value: "projects" },
{ label: "Reports", href: "/reports", value: "reports" },
],
actions: [
{ label: "Sign in", href: "/login", variant: "link" },
{ label: "Start free", href: "/signup", variant: "primary" },
],
active: "projects",
label: "Primary navigation",
},
),
advanced(
"Dropdown and mega panel",
"An item carrying children opens a panel built from native details and summary, so it is keyboard operable without any extra script. Give a child its own children to get a titled column inside the panel.",
{
brand: { label: "Northwind", icon: "icon-[lucide--box]", href: "/" },
items: [
{ label: "Overview", href: "/", value: "overview" },
{
label: "Products",
value: "products",
columns: 2,
description: "Everything in the platform.",
children: [
{
label: "Platform",
children: [
{
label: "Runtime",
href: "/runtime",
description: "The browser half.",
icon: "icon-[lucide--cpu]",
},
{
label: "Compiler",
href: "/compiler",
description: "WRN to JavaScript.",
icon: "icon-[lucide--hammer]",
},
],
},
{
label: "Tooling",
children: [
{ label: "CLI", href: "/cli", description: "Scaffold and deploy." },
{ label: "Editor", href: "/editor", description: "Language server." },
],
},
],
},
{ label: "Pricing", href: "/pricing", value: "pricing" },
],
actions: [{ label: "Book a demo", href: "/demo", variant: "primary" }],
active: "overview",
},
),
compact(
"Sticky and compact",
"Sticky keeps the bar pinned while the page scrolls. The toggle appears below the tablet breakpoint and the links collapse behind it.",
{
brand: { label: "Acme", href: "/" },
items: [
{ label: "Docs", href: "/docs", value: "docs" },
{ label: "Support", href: "/support", value: "support" },
],
actions: [{ label: "Dashboard", href: "/app", variant: "primary" }],
active: "docs",
sticky: true,
size: "sm",
mobileLabel: "Toggle navigation",
},
),
],
},
Scrollspy: {
demos: [
{
eyebrow: "Recommended",
title: "Follows the reader",
description:
"Scroll the page and the marker moves to whichever section is in view. The sections below are real page content, because the runtime observes against the viewport -- a table of contents inside a small scrolling box would have nothing to react to.",
before:
'<div class="showcase-spy-doc"><section id="overview" class="showcase-spy-section"><h3>Overview</h3><p>Scroll this page and watch the marker in the list move. The runtime observes these sections against the viewport, so the current link follows whatever you are reading.</p></section><section id="installation" class="showcase-spy-section"><h3>Installation</h3><p>Each link points at one of these ids. Nothing is wired up by hand -- the component only renders the links, and the runtime moves aria-current.</p></section><section id="usage" class="showcase-spy-section"><h3>Usage</h3><p>The active link is marked with aria-current="location", which is what a screen reader announces, and styled through data-active.</p></section><section id="api" class="showcase-spy-section"><h3>API</h3><p>Clicking a link jumps to its section and marks it immediately, so the control responds even before the scroll settles.</p></section></div>',
props: {
heading: "On this page",
items: [
{ label: "Overview", href: "#overview" },
@@ -268,7 +355,8 @@ export const componentProfiles = {
],
active: "#overview",
},
),
slots: {},
},
advanced(
"Compact rail",
"On a phone the rail becomes a horizontal strip that scrolls, so a long contents list costs one line rather than a screenful.",
@@ -276,11 +364,11 @@ export const componentProfiles = {
heading: "Sections",
size: "sm",
items: [
{ label: "Getting started", href: "#getting-started" },
{ label: "Configuration", href: "#configuration" },
{ label: "Troubleshooting", href: "#troubleshooting" },
{ label: "Overview", href: "#overview" },
{ label: "Installation", href: "#installation" },
{ label: "Usage", href: "#usage" },
],
active: "#configuration",
active: "#installation",
},
),
],
@@ -470,6 +558,15 @@ export const componentProfiles = {
{ label: "Confirm", description: "Review and submit" },
],
active: 1,
clickable: false,
showPanel: false,
controls: false,
allowSkip: false,
nextDisabled: false,
backLabel: "Back",
nextLabel: "Next",
skipLabel: "Skip",
finishLabel: "Finish",
},
),
standard(
@@ -483,6 +580,56 @@ export const componentProfiles = {
],
active: 2,
orientation: "vertical",
clickable: false,
showPanel: false,
controls: false,
allowSkip: false,
nextDisabled: false,
backLabel: "Back",
nextLabel: "Next",
skipLabel: "Skip",
finishLabel: "Finish",
},
),
advanced(
"Wizard with content and controls",
"showPanel renders each step body and shows only the active one, the same contract Tabs uses. controls adds Back, Skip and Next, which becomes Finish on the last step.",
{
steps: [
{ label: "Account", title: "Your details", content: "Name, email and a password." },
{ label: "Billing", title: "How you pay", content: "Card or invoice." },
{ label: "Confirm", title: "Review", content: "Check everything before submitting." },
],
active: 1,
clickable: false,
showPanel: true,
controls: true,
allowSkip: true,
nextDisabled: false,
backLabel: "Back",
nextLabel: "Next",
skipLabel: "Skip",
finishLabel: "Finish",
},
),
advanced(
"Held until the step is valid",
"The same wizard with nextDisabled set. The component never validates anything itself: the page owns the form, sets this while the step is incomplete, and clears it once the step passes.",
{
steps: [
{ label: "Account", title: "Your details", content: "This step is not complete yet." },
{ label: "Billing", title: "How you pay", content: "Card or invoice." },
],
active: 0,
clickable: false,
showPanel: true,
controls: true,
allowSkip: false,
nextDisabled: true,
backLabel: "Back",
nextLabel: "Next",
skipLabel: "Skip",
finishLabel: "Finish",
},
),
advanced(
@@ -492,6 +639,14 @@ export const componentProfiles = {
steps: [{ label: "One" }, { label: "Two" }, { label: "Three" }],
active: 0,
clickable: true,
showPanel: false,
controls: false,
allowSkip: false,
nextDisabled: false,
backLabel: "Back",
nextLabel: "Next",
skipLabel: "Skip",
finishLabel: "Finish",
},
),
],
@@ -2,7 +2,7 @@
"generatedFrom": "packages/ui/component-reference.json",
"componentCount": 108,
"categoryCount": 11,
"totalDemoCount": 419,
"totalDemoCount": 421,
"components": [
{
"name": "Accordion",
@@ -850,7 +850,7 @@
"propCount": 13,
"slots": ["topbar", "actions"],
"events": ["toggle", "open", "close", "select", "action"],
"profiled": false
"profiled": true
},
{
"name": "PageHeader",
@@ -1110,10 +1110,10 @@
"slug": "stepper",
"category": "navigation",
"purpose": "Theme-aware, responsive stepper component.",
"demoCount": 3,
"propCount": 8,
"slots": ["step-{index}", "default"],
"events": ["change"],
"demoCount": 5,
"propCount": 16,
"slots": ["step-{index}", "panel-{index}", "default"],
"events": ["change", "back", "next", "skip", "finish"],
"profiled": true
},
{
+53 -117
View File
@@ -2360,6 +2360,11 @@ export const REACTIVE_RUNTIME = String.raw`
while ((textNode = walker.nextNode())) {
var template = textNode.nodeValue;
if (template.indexOf("{") === -1) continue;
// Text in these is data, not a template: a JSON sample sitting in a
// textarea would otherwise be read as mustaches and eaten.
var owner = textNode.parentNode;
var ownerName = owner ? owner.nodeName : "";
if (ownerName === "TEXTAREA" || ownerName === "SCRIPT" || ownerName === "STYLE") continue;
if (!owns(textNode)) continue;
(function (node, tpl) {
reactive(function () {
@@ -2886,6 +2891,32 @@ export const REACTIVE_RUNTIME = String.raw`
});
}
/*
* One document observer, several subscribers. The filter stays explicit:
* observing every attribute would see the tabindex the roving code writes
* and loop on its own output.
*/
var documentWatchers = [];
function watchDocument(handler) {
documentWatchers.push(handler);
}
function startDocumentWatch() {
if (window.__wrnexusDocWatchBound || typeof MutationObserver !== "function") return;
window.__wrnexusDocWatchBound = true;
new MutationObserver(function () {
for (var index = 0; index < documentWatchers.length; index += 1) documentWatchers[index]();
}).observe(document.documentElement, {
subtree: true,
childList: true,
attributes: true,
// prettier-ignore
attributeFilter: ["data-open","data-show","class","style","hidden",
"data-placement","aria-selected","aria-current","disabled","aria-disabled"],
});
}
function setupAnchoredOverlays() {
if (window.__wrnexusAnchoredBound) return;
window.__wrnexusAnchoredBound = true;
@@ -2894,14 +2925,7 @@ export const REACTIVE_RUNTIME = String.raw`
// root, data-show on the panel, a class), so watch for any attribute or
// structural change and re-measure on the next frame instead of trying to
// enumerate every signal.
if (typeof MutationObserver === "function") {
new MutationObserver(scheduleAnchoredReposition).observe(document.documentElement, {
subtree: true,
childList: true,
attributes: true,
attributeFilter: ["data-open", "data-show", "class", "data-placement"],
});
}
watchDocument(scheduleAnchoredReposition);
window.addEventListener("resize", scheduleAnchoredReposition);
window.addEventListener("scroll", scheduleAnchoredReposition, true);
@@ -2929,6 +2953,15 @@ export const REACTIVE_RUNTIME = String.raw`
if (!dialog || !dialog.isConnected) return false;
if (dialog.hasAttribute("hidden")) return false;
if (dialog.closest('[data-show="false"]')) return false;
/*
* data-open is the signal Modal and Drawer actually publish, and it is the
* only one Drawer can publish: its panel animates open, so it cannot be
* toggled with data-show, which sets display:none. Treating every dialog
* without a data-show="false" ancestor as open meant a closed Drawer held
* the body scroll lock forever and the page could not be scrolled.
*/
var owner = dialog.closest("[data-open]");
if (owner) return owner.getAttribute("data-open") === "true";
return true;
}
@@ -3027,19 +3060,11 @@ export const REACTIVE_RUNTIME = String.raw`
if (window.__wrnexusDialogsBound) return;
window.__wrnexusDialogsBound = true;
if (typeof MutationObserver === "function") {
new MutationObserver(function () {
// Same deferral as the anchored clamp: the mutation that opens a
// dialog is the one that makes it visible, so it still measures as
// hidden until the panel has been laid out.
window.setTimeout(syncDialogs, 0);
}).observe(document.documentElement, {
subtree: true,
childList: true,
attributes: true,
attributeFilter: ["data-open", "data-show", "class", "style", "hidden"],
});
}
// Deferred: the mutation that opens a dialog is the one that makes it
// visible, so it is not laid out yet when the record arrives.
watchDocument(function () {
window.setTimeout(syncDialogs, 0);
});
document.addEventListener("keydown", trapDialogTab, true);
syncDialogs();
@@ -3157,16 +3182,9 @@ export const REACTIVE_RUNTIME = String.raw`
document.addEventListener("keydown", handleRovingKeydown, true);
if (typeof MutationObserver === "function") {
new MutationObserver(function () {
window.setTimeout(syncRovingGroups, 0);
}).observe(document.documentElement, {
subtree: true,
childList: true,
attributes: true,
attributeFilter: ["aria-selected", "aria-current", "disabled", "aria-disabled", "hidden"],
});
}
watchDocument(function () {
window.setTimeout(syncRovingGroups, 0);
});
syncRovingGroups();
}
@@ -3240,11 +3258,9 @@ export const REACTIVE_RUNTIME = String.raw`
for (var index = 0; index < navs.length; index += 1) wireScrollspy(navs[index]);
};
wireAll();
if (typeof MutationObserver === "function") {
new MutationObserver(function () {
window.setTimeout(wireAll, 0);
}).observe(document.documentElement, { subtree: true, childList: true });
}
watchDocument(function () {
window.setTimeout(wireAll, 0);
});
}
function hydrateScopes(root) {
@@ -3270,93 +3286,12 @@ export const REACTIVE_RUNTIME = String.raw`
ensureBehaviorObserver();
hydrateNavbarControllers(host);
hydratePreferenceControllers(host);
hydrateSidebarControllers(host);
hydrateDropdownControllers(host);
hydrateSelectControllers(host);
hydratePinInputControllers(host);
}
var navbarOutsideClickBound = false;
var preferenceOutsideClickBound = false;
var dropdownOutsideClickBound = false;
function hydrateSidebarControllers(root) {
var host = root || document;
var sidebars = [];
if (host.nodeType === 1 && host.matches && host.matches(".wire-sidebar-shell")) {
sidebars.push(host);
}
if (host.querySelectorAll) {
Array.prototype.push.apply(sidebars, host.querySelectorAll(".wire-sidebar-shell"));
}
sidebars.forEach(function (sidebar) {
var current = window.location.pathname.replace(/\/+$/, "") || "/";
var best = null;
var bestLength = -1;
sidebar.querySelectorAll(".wire-sidebar-items a[href]").forEach(function (link) {
var url;
try { url = new URL(link.getAttribute("href"), window.location.origin); } catch (_) { return; }
var path = url.pathname.replace(/\/+$/, "") || "/";
var matches = path === current || (path !== "/" && current.indexOf(path + "/") === 0);
link.classList.remove("is-active");
if (!matches || path.length <= bestLength) return;
best = link;
bestLength = path.length;
});
sidebar.querySelectorAll(".wire-sidebar-items a[aria-current='page']").forEach(function (link) {
if (link !== best) link.removeAttribute("aria-current");
});
sidebar.querySelectorAll(".wire-sidebar-group.has-active").forEach(function (group) {
group.classList.remove("has-active");
});
if (best) {
best.classList.add("is-active");
best.setAttribute("aria-current", "page");
var group = best.closest(".wire-sidebar-group");
if (group) {
group.setAttribute("open", "");
group.classList.add("has-active");
}
}
});
}
function hydrateDropdownControllers(root) {
var host = root || document;
var dropdowns = [];
if (host.nodeType === 1 && host.matches && host.matches("[data-wrn-dropdown]")) {
dropdowns.push(host);
}
if (host.querySelectorAll) {
Array.prototype.push.apply(dropdowns, host.querySelectorAll("[data-wrn-dropdown]"));
}
dropdowns.forEach(function (dropdown) {
if (dropdown.dataset.wrnDropdownBound === "true") return;
dropdown.dataset.wrnDropdownBound = "true";
dropdown.addEventListener("toggle", function () {
if (!dropdown.open) return;
document.querySelectorAll("[data-wrn-dropdown][open]").forEach(function (candidate) {
if (candidate !== dropdown) candidate.removeAttribute("open");
});
});
});
if (!dropdownOutsideClickBound) {
dropdownOutsideClickBound = true;
document.addEventListener("pointerdown", function (event) {
document.querySelectorAll("[data-wrn-dropdown][open]").forEach(function (dropdown) {
if (!dropdown.contains(event.target)) dropdown.removeAttribute("open");
});
});
document.addEventListener("keydown", function (event) {
if (event.key !== "Escape") return;
document.querySelectorAll("[data-wrn-dropdown][open]").forEach(function (dropdown) {
dropdown.removeAttribute("open");
var summary = dropdown.querySelector(":scope > summary");
if (summary) summary.focus();
});
});
}
}
function hydratePreferenceControllers(root) {
var host = root || document;
@@ -5466,6 +5401,7 @@ export const REACTIVE_RUNTIME = String.raw`
setupModalDialogs();
setupRovingFocus();
setupScrollspy();
startDocumentWatch();
window.__wrnexusRepositionAnchored = repositionAnchored;
window.__wrnexusHydrateScopes = hydrateScopes;
window.__wrnexusInvalidateClientModule = function (url) { clientModuleCache.delete(url); };
+58
View File
@@ -1052,3 +1052,61 @@ test("an empty or false roving attribute opts the group out entirely", () => {
a.dispatchEvent(keydown(win, "ArrowRight"));
expect(doc.activeElement!.id).toBe("a");
});
test("json inside a textarea is left alone, not read as mustaches", () => {
const win = mount(
`<div data-scope="count: 7">
<textarea id="editor">{"id":"a-1","count":3}</textarea>
<span id="out">{count}</span>
</div>`,
);
const doc = win.document;
// The surrounding scope still interpolates normally...
expect(doc.querySelector("#out")!.textContent).toBe("7");
// ...but the textarea holds data, and an expression engine would have
// evaluated {"id":"a-1","count":3} away and left it empty.
expect(doc.querySelector("#editor")!.textContent).toBe('{"id":"a-1","count":3}');
});
test("a closed drawer does not hold the body scroll lock", () => {
const win = mount(
`<div data-ui-component="Drawer" data-open="false">
<div class="layer">
<section role="dialog" aria-modal="true" tabindex="-1">
<button id="inside">Inside</button>
</section>
</div>
</div>`,
);
const doc = win.document;
/*
* A drawer animates open, so its panel cannot be hidden with data-show --
* display:none is not transitionable. It publishes data-open instead. Reading
* only data-show made every closed drawer look open, which locked the body
* and left the page unscrollable.
*/
expect(doc.body.style.overflow).not.toBe("hidden");
const outside = doc.querySelector("#inside") as unknown as HTMLElement;
outside.focus();
outside.dispatchEvent(keydown(win, "Tab"));
// No trap either: focus is free to leave a closed dialog.
expect(doc.activeElement!.id).toBe("inside");
});
test("an open drawer locks the body scroll and traps Tab", () => {
const win = mount(
`<div data-ui-component="Drawer" data-open="true">
<section role="dialog" aria-modal="true" tabindex="-1">
<button id="first">First</button>
<button id="last">Last</button>
</section>
</div>`,
);
const doc = win.document;
expect(doc.body.style.overflow).toBe("hidden");
const last = doc.querySelector("#last") as unknown as HTMLElement;
last.focus();
last.dispatchEvent(keydown(win, "Tab"));
expect(doc.activeElement!.id).toBe("first");
});
+3 -3
View File
@@ -916,9 +916,9 @@ Theme-aware, responsive sidebar component.
Theme-aware, responsive stepper component.
- Mount: `data-component="Stepper"`
- Props: `color: string = "primary"`, `size: string = "default"`, `steps: unknown[] = []`, `active: number = 0`, `orientation: string = "horizontal"`, `clickable: boolean = false`, `label: string = "Progress"`, `class: string = ""`
- Slots: `step-{index}`, `default`
- Outputs: `change({ index: number; step: object })`
- Props: `color: string = "primary"`, `size: string = "default"`, `steps: unknown[] = []`, `active: number = 0`, `orientation: string = "horizontal"`, `clickable: boolean = false`, `label: string = "Progress"`, `showPanel: boolean = false`, `controls: boolean = false`, `allowSkip: boolean = false`, `nextDisabled: boolean = false`, `backLabel: string = "Back"`, `nextLabel: string = "Next"`, `skipLabel: string = "Skip"`, `finishLabel: string = "Finish"`, `class: string = ""`
- Slots: `step-{index}`, `panel-{index}`, `default`
- Outputs: `change({ index: number; step: object })`, `back({ index: number; step: object })`, `next({ index: number; step: object })`, `skip({ index: number; step: object })`, `finish({ index: number; step: object })`
### Tabs
+74 -2
View File
@@ -11783,6 +11783,62 @@
"default": "\"Progress\"",
"options": []
},
{
"name": "showPanel",
"type": "boolean",
"required": false,
"default": "false",
"options": []
},
{
"name": "controls",
"type": "boolean",
"required": false,
"default": "false",
"options": []
},
{
"name": "allowSkip",
"type": "boolean",
"required": false,
"default": "false",
"options": []
},
{
"name": "nextDisabled",
"type": "boolean",
"required": false,
"default": "false",
"options": []
},
{
"name": "backLabel",
"type": "string",
"required": false,
"default": "\"Back\"",
"options": []
},
{
"name": "nextLabel",
"type": "string",
"required": false,
"default": "\"Next\"",
"options": []
},
{
"name": "skipLabel",
"type": "string",
"required": false,
"default": "\"Skip\"",
"options": []
},
{
"name": "finishLabel",
"type": "string",
"required": false,
"default": "\"Finish\"",
"options": []
},
{
"name": "class",
"type": "string",
@@ -11791,14 +11847,30 @@
"options": []
}
],
"slots": ["step-{index}", "default"],
"slots": ["step-{index}", "panel-{index}", "default"],
"outputs": [
{
"name": "change",
"payloadType": "{ index: number; step: object }"
},
{
"name": "back",
"payloadType": "{ index: number; step: object }"
},
{
"name": "next",
"payloadType": "{ index: number; step: object }"
},
{
"name": "skip",
"payloadType": "{ index: number; step: object }"
},
{
"name": "finish",
"payloadType": "{ index: number; step: object }"
}
],
"events": ["change"],
"events": ["change", "back", "next", "skip", "finish"],
"source": "components/Stepper.wrn"
},
{
+15
View File
@@ -214,6 +214,21 @@ component MegaMenu {
transform: rotate(90deg);
}
/*
* The panel is offset below the trigger for looks, which used to close the
* menu on the way to it: that offset is dead space belonging to neither
* element, so crossing it fired mouseleave on the root. The bridge below
* covers the gap with a descendant, so the pointer never actually leaves.
*/
.wire-mega__panel::before {
content: "";
position: absolute;
left: 0;
right: 0;
bottom: 100%;
height: 0.6rem;
}
.wire-mega__panel {
position: absolute;
z-index: 40;
+436
View File
@@ -140,4 +140,440 @@ size: string = "default"
</div>
</header>
}
style {
/* Full application navigation */
.wire-navbar {
position: relative;
z-index: 40;
width: 100%;
color: var(--wire-color-text);
background: color-mix(in srgb, var(--wire-color-surface) 96%, transparent);
border-bottom: 1px solid var(--wire-color-border);
}
.wire-navbar--sticky {
position: sticky;
top: 0;
backdrop-filter: blur(16px);
}
.wire-navbar__topbar:empty,
.wire-navbar__topbar:not(:has(*)) {
display: none;
}
.wire-navbar__topbar:not(:empty) {
display: flex;
min-height: 2.25rem;
align-items: center;
justify-content: space-between;
gap: 1rem;
padding: 0.35rem clamp(1rem, 4vw, 3rem);
color: var(--wire-color-muted);
background: var(--wire-color-surface-2);
border-bottom: 1px solid var(--wire-color-border);
font-size: 0.75rem;
font-weight: 400;
}
.wire-navbar__main {
display: flex;
min-height: 4.25rem;
width: min(100%, 90rem);
margin-inline: auto;
padding: 0.75rem clamp(1rem, 4vw, 3rem);
align-items: center;
gap: 1.5rem;
}
.wire-navbar--width-full .wire-navbar__main {
width: 100%;
max-width: none;
}
.wire-navbar--width-compact .wire-navbar__main {
width: min(86%, 80rem);
}
.wire-navbar__brand,
.wire-navbar__menu-link,
.wire-navbar__dropdown summary,
.wire-navbar__action,
.wire-navbar__panel a {
color: inherit;
text-decoration: none;
}
.wire-navbar__brand {
display: inline-flex;
min-width: 0;
align-items: center;
gap: 0.75rem;
flex: 0 0 auto;
}
.wire-navbar__brand-logo {
display: block;
width: auto;
max-width: 11rem;
height: 2.5rem;
object-fit: contain;
}
.wire-navbar__brand-icon {
width: 2.5rem;
height: 2.5rem;
color: var(--wire-component-color, var(--wire-color-primary));
}
.wire-navbar__brand-copy {
display: grid;
min-width: 0;
line-height: 1.2;
}
.wire-navbar__brand-copy strong {
font-size: 0.9rem;
font-weight: 600;
}
.wire-navbar__brand-copy small {
margin-top: 0.2rem;
color: var(--wire-color-muted);
font-size: 0.6875rem;
font-weight: 400;
}
.wire-navbar__collapse,
.wire-navbar__menus,
.wire-navbar__actions {
display: flex;
align-items: center;
}
.wire-navbar__collapse {
min-width: 0;
flex: 1;
gap: 1rem;
}
.wire-navbar__menus {
justify-content: center;
flex: 1;
gap: 0.25rem;
}
.wire-navbar__actions {
justify-content: flex-end;
gap: 0.5rem;
}
.wire-navbar__menu-link,
.wire-navbar__dropdown > summary,
.wire-navbar__action {
display: inline-flex;
min-height: 2.75rem;
padding: 0.65rem 0.8rem;
align-items: center;
gap: 0.45rem;
border-radius: 0.65rem;
cursor: pointer;
font-size: 0.8125rem;
font-weight: 500;
white-space: nowrap;
}
.wire-navbar__menu-link:hover,
.wire-navbar__dropdown > summary:hover {
color: var(--wire-color-text);
background: var(--wire-color-surface-2);
}
.wire-navbar__menu-link[aria-current="page"],
.wire-navbar__dropdown > summary[aria-current="page"] {
color: var(--wire-component-color, var(--wire-color-primary));
font-weight: 600;
background: color-mix(
in srgb,
var(--wire-component-color, var(--wire-color-primary)) 12%,
transparent
);
box-shadow: inset 0 -2px 0 var(--wire-component-color, var(--wire-color-primary));
}
.wire-navbar__menu-link[aria-current="page"]:hover,
.wire-navbar__dropdown > summary[aria-current="page"]:hover {
color: var(--wire-component-color, var(--wire-color-primary));
background: color-mix(
in srgb,
var(--wire-component-color, var(--wire-color-primary)) 16%,
transparent
);
}
.wire-navbar__dropdown {
position: relative;
}
.wire-navbar__dropdown > summary {
list-style: none;
}
.wire-navbar__dropdown > summary::-webkit-details-marker {
display: none;
}
.wire-navbar__chevron {
width: 0.45rem;
height: 0.45rem;
border-right: 1.5px solid currentColor;
border-bottom: 1.5px solid currentColor;
transform: rotate(45deg) translateY(-0.15rem);
transition: transform var(--wire-motion-fast, 150ms) ease;
}
.wire-navbar__dropdown[open] .wire-navbar__chevron {
transform: rotate(225deg) translate(-0.1rem, -0.1rem);
}
.wire-navbar__panel {
position: absolute;
top: calc(100% + 0.55rem);
left: 50%;
display: grid;
width: max-content;
min-width: 15rem;
max-width: min(90vw, 64rem);
padding: 0.65rem;
gap: 0.45rem;
border: 1px solid var(--wire-color-border);
border-radius: 0.9rem;
color: var(--wire-color-text);
background: var(--wire-color-surface);
box-shadow: 0 18px 48px rgb(15 23 42 / 0.16);
opacity: 1;
transform: translateX(-50%) translateY(0) scale(1);
transform-origin: top center;
transition:
opacity 180ms ease,
transform 180ms cubic-bezier(0.22, 1, 0.36, 1),
display 180ms allow-discrete;
}
.wire-navbar__panel::before {
position: absolute;
right: 0;
bottom: 100%;
left: 0;
height: 0.65rem;
content: "";
}
.wire-navbar__dropdown:not([open]) > .wire-navbar__panel {
display: none;
opacity: 0;
transform: translateX(-50%) translateY(-0.5rem) scale(0.98);
}
@starting-style {
.wire-navbar__dropdown[open] > .wire-navbar__panel {
opacity: 0;
transform: translateX(-50%) translateY(-0.5rem) scale(0.98);
}
}
.wire-navbar__dropdown--mega {
position: static;
}
.wire-navbar__dropdown--mega .wire-navbar__panel {
right: auto;
left: 50%;
width: min(calc(100vw - 2rem), 64rem);
}
.wire-navbar__panel--columns-2 {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.wire-navbar__panel--columns-3 {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.wire-navbar__panel--columns-4 {
grid-template-columns: repeat(4, minmax(0, 1fr));
}
.wire-navbar__panel-intro {
grid-column: 1 / -1;
margin: 0;
padding: 0.5rem 0.65rem;
color: var(--wire-color-muted);
font-size: 0.8125rem;
font-weight: 400;
}
.wire-navbar__group {
display: grid;
align-content: start;
gap: 0.25rem;
}
.wire-navbar__group-title {
padding: 0.55rem 0.65rem 0.25rem;
font-size: 0.7rem;
font-weight: 600;
letter-spacing: 0.04em;
text-transform: uppercase;
}
.wire-navbar__group > small {
padding: 0 0.65rem 0.4rem;
color: var(--wire-color-muted);
font-size: 0.7rem;
font-weight: 400;
}
.wire-navbar__panel a {
display: flex;
min-height: 2.75rem;
padding: 0.65rem;
align-items: flex-start;
gap: 0.65rem;
border-radius: 0.6rem;
font-size: 0.8rem;
font-weight: 450;
}
.wire-navbar__panel a:hover {
background: var(--wire-color-surface-2);
}
.wire-navbar__panel a span:last-child {
display: grid;
gap: 0.15rem;
}
.wire-navbar__panel a strong {
font-weight: 500;
}
.wire-navbar__panel a small {
color: var(--wire-color-muted);
font-size: 0.7rem;
font-weight: 400;
}
.wire-navbar__action {
border: 1px solid transparent;
}
.wire-navbar__action--primary {
color: var(--wire-color-on-primary, #fff);
background: var(--wire-component-color, var(--wire-color-primary));
font-weight: 600;
}
.wire-navbar__action--outline {
border-color: var(--wire-color-border);
}
.wire-navbar__toggle {
display: none;
width: 2.75rem;
height: 2.75rem;
margin-left: auto;
padding: 0.65rem;
border: 1px solid var(--wire-color-border);
border-radius: 0.65rem;
color: inherit;
background: var(--wire-color-surface);
}
.wire-navbar__toggle span {
display: block;
height: 2px;
margin: 0.25rem 0;
background: currentColor;
}
@media (max-width: 900px) {
.wire-navbar--width-compact .wire-navbar__main {
width: 100%;
}
.wire-navbar__toggle {
display: block;
}
.wire-navbar__collapse {
position: absolute;
top: 100%;
right: 0;
left: 0;
display: none;
padding: 0.75rem 1rem 1rem;
align-items: stretch;
flex-direction: column;
background: var(--wire-color-surface);
border-bottom: 1px solid var(--wire-color-border);
box-shadow: 0 16px 32px rgb(15 23 42 / 0.12);
max-height: calc(100dvh - 4rem);
overflow-x: hidden;
overflow-y: auto;
overscroll-behavior: contain;
}
.wire-navbar__collapse.is-open {
display: flex;
}
.wire-navbar__menus,
.wire-navbar__actions {
width: 100%;
align-items: stretch;
flex-direction: column;
}
.wire-navbar__menu-link,
.wire-navbar__dropdown > summary,
.wire-navbar__action {
width: 100%;
}
.wire-navbar__panel,
.wire-navbar__dropdown--mega .wire-navbar__panel {
position: static;
width: 100%;
max-width: none;
margin-top: 0.25rem;
box-shadow: none;
transform: none;
overflow: hidden;
animation: wire-navbar-mobile-panel 180ms ease both;
}
.wire-navbar__dropdown:not([open]) > .wire-navbar__panel,
.wire-navbar__dropdown[open] > .wire-navbar__panel {
transform: none;
}
.wire-navbar__panel[class*="wire-navbar__panel--columns-"] {
grid-template-columns: 1fr;
}
.wire-navbar__panel::before {
display: none;
}
}
@media (max-width: 600px) {
.wire-navbar__brand-copy small {
display: none;
}
}
@keyframes wire-navbar-mobile-panel {
from {
opacity: 0;
transform: translateY(-0.35rem);
}
to {
opacity: 1;
transform: translateY(0);
}
}
}
}
+195 -4
View File
@@ -14,6 +14,10 @@
component Stepper {
outputs {
change(payload: { index: number; step: object })
back(payload: { index: number; step: object })
next(payload: { index: number; step: object })
skip(payload: { index: number; step: object })
finish(payload: { index: number; step: object })
}
props {
@@ -24,6 +28,19 @@ component Stepper {
orientation: string = "horizontal"
clickable: boolean = false
label: string = "Progress"
// Render each step body, showing only the active one -- same contract as
// Tabs, so a wizard does not have to hand-roll the panel switching.
showPanel: boolean = false
controls: boolean = false
allowSkip: boolean = false
// Lets a form hold the step. The component never validates anything
// itself: the page owns the form, so it sets this while the step is
// incomplete and clears it once the step passes.
nextDisabled: boolean = false
backLabel: string = "Back"
nextLabel: string = "Next"
skipLabel: string = "Skip"
finishLabel: string = "Finish"
class: string = ""
}
@@ -63,6 +80,48 @@ component Stepper {
return orientation === "vertical" ? "vertical" : "horizontal"
}
shared function isActiveStep(index) {
return index === activeIndex()
}
shared function lastIndex() {
return Math.max(0, stepList().length - 1)
}
shared function onLastStep() {
return activeIndex() >= lastIndex()
}
shared function activeStep() {
var list = stepList()
return list.length ? list[activeIndex()] : {}
}
client function goBack() {
var target = Math.max(0, activeIndex() - 1)
output.back({ index: target, step: stepList()[target] || {} })
output.change({ index: target, step: stepList()[target] || {} })
}
client function goNext() {
if (nextDisabled) {
return
}
if (onLastStep()) {
output.finish({ index: activeIndex(), step: activeStep() })
return
}
var target = Math.min(lastIndex(), activeIndex() + 1)
output.next({ index: target, step: stepList()[target] || {} })
output.change({ index: target, step: stepList()[target] || {} })
}
client function goSkip() {
var target = Math.min(lastIndex(), activeIndex() + 1)
output.skip({ index: target, step: stepList()[target] || {} })
output.change({ index: target, step: stepList()[target] || {} })
}
client function selectStep(index, step) {
if (!clickable) {
return
@@ -72,7 +131,7 @@ component Stepper {
}
view {
<ol
<div
{...attrs}
data-ui-component="Stepper"
class='wire-stepper {class}'
@@ -80,6 +139,9 @@ component Stepper {
data-color='{color}'
data-size='{size}'
data-clickable='{clickable}'
>
<ol
class="wire-stepper__list"
data-wrn-roving='{rovingAxis()}'
aria-label='{label}'
>
@@ -111,13 +173,62 @@ component Stepper {
</span>
</li>
{/each}
<slot />
</ol>
<div class="wire-stepper__panels" data-show="showPanel">
{#each stepList() as step, index}
<div
class="wire-stepper__panel"
data-show='isActiveStep(index)'
aria-hidden='{index === activeIndex() ? "false" : "true"}'
>
<h4 class="wire-stepper__panel-title" data-show="step.title">{step.title}</h4>
<p class="wire-stepper__panel-body" data-show="step.content">{step.content}</p>
<slot name="panel-{index}"></slot>
</div>
{/each}
</div>
<div class="wire-stepper__controls" data-show="controls">
<button
type="button"
class="wire-stepper__button-control wire-stepper__back"
disabled='{activeIndex() === 0}'
@click='goBack()'
>
{backLabel}
</button>
<span class="wire-stepper__controls-spacer"></span>
<button
type="button"
class="wire-stepper__button-control wire-stepper__skip"
data-show="allowSkip && !onLastStep()"
@click='goSkip()'
>
{skipLabel}
</button>
<button
type="button"
class="wire-stepper__button-control wire-stepper__next"
data-primary="true"
disabled='{nextDisabled}'
@click='goNext()'
>
{onLastStep() ? finishLabel : nextLabel}
</button>
</div>
<slot />
</div>
}
style {
.wire-stepper {
--stepper-accent: var(--wire-color-primary);
max-width: 100%;
}
.wire-stepper__list {
display: flex;
gap: 0.5rem;
margin: 0;
@@ -150,7 +261,7 @@ component Stepper {
font-size: 1rem;
}
.wire-stepper[data-orientation="vertical"] {
.wire-stepper[data-orientation="vertical"] .wire-stepper__list {
flex-direction: column;
}
@@ -241,9 +352,89 @@ component Stepper {
color: var(--wire-color-text-muted);
}
.wire-stepper__panels {
margin-top: 1rem;
}
.wire-stepper__panel {
padding: 1rem;
border: 1px solid var(--wire-color-border);
border-radius: var(--wire-radius-md);
background: var(--wire-color-surface);
animation: wire-stepper-in 200ms ease both;
}
.wire-stepper__panel-title {
margin: 0 0 0.35rem;
font-size: 0.95rem;
font-weight: 700;
}
.wire-stepper__panel-body {
margin: 0;
color: var(--wire-color-text-muted);
line-height: 1.6;
}
.wire-stepper__controls {
display: flex;
align-items: center;
gap: 0.5rem;
margin-top: 0.85rem;
}
.wire-stepper__controls-spacer {
flex: 1 1 auto;
}
.wire-stepper__button-control {
appearance: none;
padding: 0.45rem 0.9rem;
border: 1px solid var(--wire-color-border);
border-radius: var(--wire-radius-sm);
background: var(--wire-color-surface);
color: var(--wire-color-text);
font: inherit;
font-size: 0.86rem;
font-weight: 600;
cursor: pointer;
}
.wire-stepper__button-control:hover:not(:disabled) {
background: var(--wire-color-surface-soft);
}
.wire-stepper__button-control:focus-visible {
outline: 2px solid var(--stepper-accent);
outline-offset: 2px;
}
.wire-stepper__button-control[data-primary="true"] {
border-color: var(--stepper-accent);
background: var(--stepper-accent);
color: var(--wire-color-primary-contrast);
}
/* A held step has to look held, or the button reads as broken. */
.wire-stepper__button-control:disabled {
opacity: 0.45;
cursor: not-allowed;
}
@keyframes wire-stepper-in {
from {
opacity: 0;
transform: translateX(0.75rem);
}
to {
opacity: 1;
transform: none;
}
}
/* A horizontal stepper cannot stay side by side on a phone. */
@media (max-width: 639px) {
.wire-stepper {
.wire-stepper__list {
flex-direction: column;
}
}
+35 -3
View File
@@ -28,6 +28,9 @@ component Tabs {
}
state activeValue = ""
// Which way the panel should slide in. Set on every change so the animation
// follows the direction of travel rather than always coming from one side.
state slideFrom = "forward"
functions {
shared function itemList() {
@@ -80,6 +83,14 @@ component Tabs {
return
}
var value = valueOf(item, index)
var list = itemList()
var previous = -1
for (var scan = 0; scan < list.length; scan += 1) {
if (valueOf(list[scan], scan) === currentValue()) {
previous = scan
}
}
slideFrom = previous > index ? "back" : "forward"
activeValue = value
if (mode === "url" && window.history && window.history.pushState) {
@@ -101,6 +112,7 @@ component Tabs {
data-orientation='{orientation}'
data-color='{color}'
data-size='{size}'
data-slide='{slideFrom}'
data-mode='{mode}'
data-param='{param}'
>
@@ -272,7 +284,16 @@ component Tabs {
.wire-tabs__panel {
outline: none;
animation: wire-tabs-in 200ms ease both;
animation: wire-tabs-slide-forward 220ms cubic-bezier(0.22, 1, 0.36, 1) both;
}
.wire-tabs[data-slide="back"] .wire-tabs__panel {
animation-name: wire-tabs-slide-back;
}
/* The panels clip their own slide so it never widens the page. */
.wire-tabs__panels {
overflow-x: clip;
}
.wire-tabs__panel:focus-visible {
@@ -297,10 +318,21 @@ component Tabs {
margin-top: 0.6rem;
}
@keyframes wire-tabs-in {
@keyframes wire-tabs-slide-forward {
from {
opacity: 0;
transform: translateY(4px);
transform: translateX(1.25rem);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes wire-tabs-slide-back {
from {
opacity: 0;
transform: translateX(-1.25rem);
}
to {
opacity: 1;
+79 -3
View File
@@ -436,10 +436,17 @@ test("component-system CSS includes responsive, theme-token, focus, and reduced-
expect(css).toContain(".wire-next--field");
expect(css).toContain('[data-show="false"]');
expect(css).toContain("display: none !important");
expect(css).toMatch(
/*
* Navbar styles now ship with the component rather than from ui.css, so the
* whole navigation group follows one convention. The rules themselves are
* unchanged; only where they live moved.
*/
const navbarSource = readFileSync(uiComponentPath("Navbar"), "utf8");
expect(css).not.toContain(".wire-navbar");
expect(navbarSource).toMatch(
/\.wire-navbar__brand-copy strong\s*\{[^}]*font-size: 0\.9rem;[^}]*font-weight: 600;/s,
);
expect(css).toMatch(
expect(navbarSource).toMatch(
/\.wire-navbar__menu-link,[\s\S]*?font-size: 0\.8125rem;[\s\S]*?font-weight: 500;/,
);
expect(css).toMatch(
@@ -2515,7 +2522,10 @@ test("stepper marks complete, current and upcoming steps", async () => {
expect(items[1]!.getAttribute("data-status")).toBe("current");
expect(items[2]!.getAttribute("data-status")).toBe("upcoming");
expect(items[1]!.getAttribute("aria-current")).toBe("step");
expect(dom.querySelector(".wire-stepper")!.tagName.toLowerCase()).toBe("ol");
// One root wraps the list, the panels and the controls; the steps
// themselves are still an ordered list, which is what carries the semantics.
expect(dom.querySelector(".wire-stepper")!.tagName.toLowerCase()).toBe("div");
expect(dom.querySelector(".wire-stepper__list")!.tagName.toLowerCase()).toBe("ol");
});
test("stepper renders vertically and clamps an out-of-range active index", async () => {
@@ -2868,3 +2878,69 @@ test("breadcrumb marks the trail end without emitting an empty aria-current", as
expect(dom.querySelector(".wire-breadcrumb")!.getAttribute("aria-label")).toBeTruthy();
expect(dom.querySelectorAll(".wire-breadcrumb__item").length).toBeGreaterThanOrEqual(3);
});
test("mega menu bridges the gap between its trigger and panel", async () => {
const source = readFileSync(uiComponentPath("MegaMenu"), "utf8");
/*
* The panel is offset below the trigger, and that offset is dead space
* belonging to neither element: travelling to the panel fired mouseleave on
* the root and closed the menu before the pointer arrived. A descendant
* covering the gap keeps the pointer inside the component.
*/
expect(source).toContain(".wire-mega__panel::before");
expect(source).toMatch(/\.wire-mega__panel::before \{[^}]*bottom: 100%/s);
});
test("stepper shows only the active step content and offers back, next and skip", async () => {
const source = readFileSync(uiComponentPath("Stepper"), "utf8");
const html = await renderComponent(source, {
steps: [
{ label: "Account", content: "ACCOUNT BODY" },
{ label: "Billing", content: "BILLING BODY" },
{ label: "Confirm", content: "CONFIRM BODY" },
],
active: 1,
showPanel: true,
controls: true,
allowSkip: true,
});
const dom = mountHtml(html);
const panels = [...dom.querySelectorAll(".wire-stepper__panel")];
expect(panels).toHaveLength(3);
/*
* Asserted through aria-hidden rather than data-show. data-show is emitted
* verbatim for the client runtime to evaluate, so its server-rendered value
* is not a reliable statement about which step is showing; aria-hidden is
* interpolated at render and says exactly that.
*/
expect(panels.map((p) => p.getAttribute("aria-hidden"))).toEqual(["true", "false", "true"]);
expect(dom.querySelector(".wire-stepper__back")).not.toBeNull();
expect(dom.querySelector(".wire-stepper__next")).not.toBeNull();
expect(dom.querySelector(".wire-stepper__skip")).not.toBeNull();
});
test("stepper back is disabled on the first step and next becomes finish on the last", async () => {
const source = readFileSync(uiComponentPath("Stepper"), "utf8");
const steps = [{ label: "One" }, { label: "Two" }];
const first = mountHtml(await renderComponent(source, { steps, active: 0, controls: true }));
expect(first.querySelector(".wire-stepper__back")!.getAttribute("disabled")).not.toBeNull();
expect(first.querySelector(".wire-stepper__next")!.textContent).toContain("Next");
const last = mountHtml(await renderComponent(source, { steps, active: 1, controls: true }));
expect(last.querySelector(".wire-stepper__next")!.textContent).toContain("Finish");
});
test("stepper next can be gated so a form can hold it until the step validates", async () => {
const source = readFileSync(uiComponentPath("Stepper"), "utf8");
const html = await renderComponent(source, {
steps: [{ label: "One" }, { label: "Two" }],
active: 0,
controls: true,
nextDisabled: true,
});
const dom = mountHtml(html);
expect(dom.querySelector(".wire-stepper__next")!.getAttribute("disabled")).not.toBeNull();
});
-2012
View File
File diff suppressed because it is too large Load Diff
+57
View File
@@ -0,0 +1,57 @@
/**
* Report the minified size of each browser runtime, as JSON on stdout.
*
* Run under Bun because minifying is what the production build does, and this
* has to measure the same thing. The security audit runs under Node and shells
* out to this.
*
* Measuring the raw source instead would count comments, which the production
* minifier strips -- so they cost a visitor nothing while still consuming the
* budget. That made the old metric reward deleting explanatory comments over
* writing smaller code.
*/
import {
getReactiveRuntime,
getNavRuntime,
getRealtimeRuntime,
} from "../../packages/csr/src/index.ts";
const runtimes: Record<string, string> = {
"reactive-runtime.ts": getReactiveRuntime(),
"nav-runtime.ts": getNavRuntime(),
"realtime-runtime.ts": getRealtimeRuntime(),
};
const sizes: Record<string, number> = {};
for (const [name, source] of Object.entries(runtimes)) {
const built = await Bun.build({
// A blob entrypoint keeps this off the filesystem, so a failed run cannot
// leave scratch files behind in the repository.
entrypoints: ["runtime.js"],
target: "browser",
format: "esm",
minify: true,
plugins: [
{
name: "inline-runtime",
setup(build) {
build.onResolve({ filter: /^runtime\.js$/ }, () => ({
path: "runtime.js",
namespace: "inline",
}));
build.onLoad({ filter: /.*/, namespace: "inline" }, () => ({
contents: source,
loader: "js",
}));
},
},
],
});
if (!built.success || !built.outputs.length) {
throw new Error(`Failed to minify ${name}:\n${built.logs.map(String).join("\n")}`);
}
sizes[name] = (await built.outputs[0]!.text()).length;
}
process.stdout.write(JSON.stringify(sizes));
+27 -10
View File
@@ -155,21 +155,38 @@ addCheck(
dynamicCode.join(", ") || "No dynamic code execution in security foundation packages.",
);
/*
* Runtime budgets are measured on the code that actually ships.
*
* These used to measure the raw source, which counts comments -- and comments
* are stripped by the production minifier, so they cost a user nothing. The
* old metric therefore paid people to delete explanatory comments in exchange
* for no real saving, while a genuine feature and a wall of prose looked
* identical to it.
*
* The runtime is served from /__wrnexus/reactive.js as its own file, minified
* and sent with an immutable year-long cache, so what a visitor pays is the
* minified transfer once. That is the number worth defending.
*/
const runtimeBudgets = {
// Raised for the 9.0 release: the reactive runtime took on anchored-overlay
// clamping, modal dialog focus/scroll behaviour, the toaster and the client
// half of DataTable. This is a deliberate ceiling, not a rubber stamp --
// raise it again only alongside a decision about what the runtime should own.
"reactive-runtime.ts": 175_000,
"nav-runtime.ts": 25_000,
"realtime-runtime.ts": 15_000,
"reactive-runtime.ts": 80_000,
"nav-runtime.ts": 12_000,
"realtime-runtime.ts": 8_000,
};
const minifiedSizes = JSON.parse(
execFileSync(
process.platform === "win32" ? "bun.exe" : "bun",
[join(root, "scripts", "lib", "measure-runtime-size.ts")],
{ cwd: root, encoding: "utf8" },
),
);
for (const [file, budget] of Object.entries(runtimeBudgets)) {
const bytes = statSync(join(root, "packages", "csr", "src", file)).size;
const bytes = minifiedSizes[file];
const raw = statSync(join(root, "packages", "csr", "src", file)).size;
addCheck(
`PERF-RUNTIME-SIZE-${file.replace(/-runtime\.ts$/, "").toUpperCase()}`,
bytes <= budget,
`${file} is ${bytes} bytes (budget ${budget}).`,
typeof bytes === "number" && bytes <= budget,
`${file} minifies to ${bytes} bytes (budget ${budget}, ${raw} raw).`,
);
}
addCheck(